From 4f6d355a978b30f436623d2c4cb46cf1370802a8 Mon Sep 17 00:00:00 2001 From: Matthew Holt Date: Thu, 16 Jul 2020 15:51:46 -0600 Subject: [PATCH] Account portal, download page, non-standard module docs This ends v1 on the website. Docs archive still available through a sidebar nav link in the docs. --- src/account/create.html | 28 ++ src/account/index.html | 32 ++ src/account/login.html | 25 ++ src/account/logout.html | 11 + src/account/register-package.html | 42 +++ src/account/reset-password.html | 38 +++ src/account/verify.html | 24 ++ src/download.html | 88 ++++++ src/includes/account-head.html | 5 + src/includes/account-nav.html | 16 + src/includes/docs-details.html | 8 + src/includes/docs-header.html | 1 - src/includes/docs-nav.html | 2 + src/includes/header-nav.html | 6 +- src/includes/v1-banner.html | 1 - src/index.html | 21 +- src/resources/css/account/common.css | 289 ++++++++++++++++++ src/resources/css/account/dashboard.css | 13 + src/resources/css/common.css | 51 +++- src/resources/css/docs.css | 37 +++ src/resources/css/download.css | 303 +++++++++++++++++++ src/resources/images/caddy-lock.png | Bin 0 -> 73543 bytes src/resources/js/account/common.js | 63 ++++ src/resources/js/account/create.js | 28 ++ src/resources/js/account/dashboard.js | 125 ++++++++ src/resources/js/account/login.js | 24 ++ src/resources/js/account/logout.js | 1 + src/resources/js/account/register-package.js | 27 ++ src/resources/js/account/reset-password.js | 80 +++++ src/resources/js/account/verify.js | 36 +++ src/resources/js/common.js | 24 ++ src/resources/js/docs-api.js | 44 ++- src/resources/js/download.js | 221 ++++++++++++++ src/resources/js/json-docs.js | 2 +- src/resources/js/module-docs.js | 13 +- src/resources/js/sweetalert.min.js | 1 + src/v2.html | 4 +- 37 files changed, 1678 insertions(+), 56 deletions(-) create mode 100644 src/account/create.html create mode 100644 src/account/index.html create mode 100644 src/account/login.html create mode 100644 src/account/logout.html create mode 100644 src/account/register-package.html create mode 100644 src/account/reset-password.html create mode 100644 src/account/verify.html create mode 100644 src/download.html create mode 100644 src/includes/account-head.html create mode 100644 src/includes/account-nav.html delete mode 100644 src/includes/v1-banner.html create mode 100644 src/resources/css/account/common.css create mode 100644 src/resources/css/account/dashboard.css create mode 100644 src/resources/css/download.css create mode 100644 src/resources/images/caddy-lock.png create mode 100644 src/resources/js/account/common.js create mode 100644 src/resources/js/account/create.js create mode 100644 src/resources/js/account/dashboard.js create mode 100644 src/resources/js/account/login.js create mode 100644 src/resources/js/account/logout.js create mode 100644 src/resources/js/account/register-package.js create mode 100644 src/resources/js/account/reset-password.js create mode 100644 src/resources/js/account/verify.js create mode 100644 src/resources/js/download.js create mode 100644 src/resources/js/sweetalert.min.js diff --git a/src/account/create.html b/src/account/create.html new file mode 100644 index 0000000..fa24bc2 --- /dev/null +++ b/src/account/create.html @@ -0,0 +1,28 @@ + + + + Create Account - Caddy + {{include "/includes/account-head.html"}} + + + +
+
+ +
+
+

Create Account

+ or log in +
+ + + + +

+ We will send you an email to verify your account. +

+
+
+
+ + \ No newline at end of file diff --git a/src/account/index.html b/src/account/index.html new file mode 100644 index 0000000..966985a --- /dev/null +++ b/src/account/index.html @@ -0,0 +1,32 @@ + + + + Dashboard - Caddy + {{include "/includes/account-head.html"}} + + + + +
+ {{include "/includes/account-nav.html"}} +
+
+

Your packagesRegister package

+ + + + + + + + + +
Import pathListedAvailableDownloads
+ +
+
+
+ + \ No newline at end of file diff --git a/src/account/login.html b/src/account/login.html new file mode 100644 index 0000000..98c7cfd --- /dev/null +++ b/src/account/login.html @@ -0,0 +1,25 @@ + + + + Log In - Caddy + {{include "/includes/account-head.html"}} + + + +
+
+ +
+
+

Log In

+ or create account +
+ + + + Reset password +
+
+
+ + \ No newline at end of file diff --git a/src/account/logout.html b/src/account/logout.html new file mode 100644 index 0000000..09fe3f1 --- /dev/null +++ b/src/account/logout.html @@ -0,0 +1,11 @@ + + + + Logout - Caddy + {{include "/includes/account-head.html"}} + + + + Logging out... + + \ No newline at end of file diff --git a/src/account/register-package.html b/src/account/register-package.html new file mode 100644 index 0000000..ee9ae17 --- /dev/null +++ b/src/account/register-package.html @@ -0,0 +1,42 @@ + + + + Register Package - Caddy + {{include "/includes/account-head.html"}} + + + +
+ {{include "/includes/account-nav.html"}} +
+
+
+
+
+ +
+ You must use semantic import versioning. Basically, this means if your module is at v2 or higher the import path must be suffixed with /vN (where N is the major version number). +
+
+
+ +
+ Optional. Any version string recognized by Go module tooling is acceptable. +
+
+
+ +
+
+
+
+
+
+ + \ No newline at end of file diff --git a/src/account/reset-password.html b/src/account/reset-password.html new file mode 100644 index 0000000..72a4aa7 --- /dev/null +++ b/src/account/reset-password.html @@ -0,0 +1,38 @@ + + + + Reset Password - Caddy + {{include "/includes/account-head.html"}} + + + +
+
+ +
+
+

Reset Password

+ I already have a reset token +
+ + +
+
+
+
+
+ +
+
+

Reset Password

+ I still need a reset token +
+ + + + +
+
+
+ + \ No newline at end of file diff --git a/src/account/verify.html b/src/account/verify.html new file mode 100644 index 0000000..1977ede --- /dev/null +++ b/src/account/verify.html @@ -0,0 +1,24 @@ + + + + Confirm Account - Caddy + {{include "/includes/account-head.html"}} + + + +
+
+ +
+
+

Confirm Account

+ or log in +
+ + + +
+
+
+ + \ No newline at end of file diff --git a/src/download.html b/src/download.html new file mode 100644 index 0000000..e35b62b --- /dev/null +++ b/src/download.html @@ -0,0 +1,88 @@ + + + + Download Caddy + {{include "/includes/head.html"}} + + + + + + +
+
+
+ +
+ {{include "/includes/header-nav.html"}} +
+ +
+
+
+ Platform: + +
+
+
+
+ Additional packages: 0 +
+
+
+ Download +
+
+ +
+ Always comes with all standard Caddy modules. +

+ Optionally select additional packages to include in your build: ⚠️ Only choose plugins you need and trust +
+ +
+ + + + + + + +
PackageVersionModules
+
+ +
+ {{include "/includes/footer.html"}} + + diff --git a/src/includes/account-head.html b/src/includes/account-head.html new file mode 100644 index 0000000..c95ac06 --- /dev/null +++ b/src/includes/account-head.html @@ -0,0 +1,5 @@ +{{include "/includes/head.html"}} + + + + \ No newline at end of file diff --git a/src/includes/account-nav.html b/src/includes/account-nav.html new file mode 100644 index 0000000..60b2d6c --- /dev/null +++ b/src/includes/account-nav.html @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/src/includes/docs-details.html b/src/includes/docs-details.html index bc80e01..4125c81 100644 --- a/src/includes/docs-details.html +++ b/src/includes/docs-details.html @@ -1,3 +1,11 @@ +
+
+ This module does not come with Caddy. It can be added by using xcaddy or our download page. Non-standard modules may be developed by the community and are not officially endorsed or maintained by the Caddy project. The documentation is shown here only as a courtesy. +

+ Module repository: +
+
+

Description

diff --git a/src/includes/docs-header.html b/src/includes/docs-header.html index c0b252c..c12d052 100644 --- a/src/includes/docs-header.html +++ b/src/includes/docs-header.html @@ -1,4 +1,3 @@ -{{include "/includes/v1-banner.html"}}
diff --git a/src/includes/docs-nav.html b/src/includes/docs-nav.html index 5e2765b..720922a 100644 --- a/src/includes/docs-nav.html +++ b/src/includes/docs-nav.html @@ -56,5 +56,7 @@
  • Module Namespaces
  • +
    +
  • v1 Docs
  • \ No newline at end of file diff --git a/src/includes/header-nav.html b/src/includes/header-nav.html index 921ba1a..dcd7643 100644 --- a/src/includes/header-nav.html +++ b/src/includes/header-nav.html @@ -2,10 +2,10 @@ \ No newline at end of file diff --git a/src/includes/v1-banner.html b/src/includes/v1-banner.html deleted file mode 100644 index 584d340..0000000 --- a/src/includes/v1-banner.html +++ /dev/null @@ -1 +0,0 @@ -This page is about Caddy 2. If you still need v1 docs for a limited time, click here. \ No newline at end of file diff --git a/src/index.html b/src/index.html index 32da431..ceb15ba 100644 --- a/src/index.html +++ b/src/index.html @@ -9,7 +9,6 @@
    - {{include "/includes/v1-banner.html"}}
    @@ -24,13 +23,11 @@
    - Download -
    - then learn how to get started -


    - Download v1.0 (obsolete) + Download
    + then learn how to get started +

    Caddy is licensed with the Apache 2.0 open source license.
    @@ -74,7 +71,7 @@ -

    Download

    +

    Download

    Caddy is the only server to use HTTPS automatically and by default
    @@ -113,7 +110,7 @@

    Or use it as a dynamic reverse proxy to any number of backends, complete with active and passive health checks, load balancing, circuit breaking, caching, and more.

    -

    Download

    +

    Download

    Caddy is the only server to use HTTPS automatically and by default
    @@ -151,7 +148,7 @@
    @@ -208,7 +205,7 @@
    @@ -267,7 +264,7 @@ All changes made through the API are persisted to disk so they can continue to be used after restarts. - Download + Download API Docs Tutorial @@ -998,7 +995,7 @@
    diff --git a/src/resources/css/account/common.css b/src/resources/css/account/common.css new file mode 100644 index 0000000..38859ca --- /dev/null +++ b/src/resources/css/account/common.css @@ -0,0 +1,289 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html, body { + min-height: 100%; +} + +html { + /* by setting the min-height of both html and body to 100%, + it ensures that flex items are centered on screen, but + also allows body to overflow screen height for tall content */ + height: 100%; +} + +body { + font: 16px sans-serif; + -webkit-font-smoothing: antialiased; + background: #e8ebf0; + display: flex; +} + +a { + color: #2b9cff; + text-decoration: none; +} + +a:hover { + color: #0f6ab9; +} + +.card { + background: white; + margin: auto; + box-shadow: 0 20px 40px rgba(0, 0, 0, .1); + display: flex; + border-radius: 5px; + width: 100%; + max-width: 800px; +} + +.card section { + padding: 50px; + text-align: center; + flex-grow: 1; +} + +.card section.head { + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + flex-grow: 0; + background: #f3f7ff; + border-right: 1px solid #e8ebf0; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; +} + +.card p { + margin: 0 auto; + max-width: 400px; + line-height: 1.25em; + font-size: 14px; +} + +.card .logo { + width: 100%; + max-width: 100px; + display: block; +} + +.card h1 { + font-size: 42px; + margin-bottom: 10px; +} + +.form-fields { + padding: 20px 0; +} + +input { + font-size: 16px; + font-family: 'PT Mono', 'Source Code Pro', monospace; +} + +.card input, +.card button { + display: block; + margin: 1em auto; + padding: 8px; +} + +.card input[type=text], +.card input[type=email], +.card input[type=password] { + width: 100%; + max-width: 400px; +} + +.card button { + font-size: 16px; + font-weight: bold; + padding: 10px 20px; +} + +@media (max-width: 800px) { + .card { + flex-direction: column; + } +} + +.swal-content p { + margin: .5em 0; +} + +#reset-password-step2 { + display: none; +} + + + + + + + + + + + + + + + + + + + + +.logo-container { + text-align: center; + margin: 20px auto; +} + +.logo { + max-width: 100px; +} + +.help { + border-bottom: 1px dotted #222; + cursor: help; +} + +.beta { + font-size: 12px; +} + + +.container { + display: flex; + flex-grow: 1; + justify-content: space-between; + font-family: Maven Pro, sans-serif; +} + +.container > nav { + background: #f8faff; + width: 25%; + max-width: 250px; +} + +.container > nav ul { + list-style: none; +} + +.container > nav ul a { + display: block; + padding: 10px 20px; + color: #546c75; +} + +.container > nav ul a:hover { + color: #01324b; + background-color: #ebf3fb; +} + +.container > nav ul a.current { + background-color: #e0ecfb; + font-weight: bold; + color: #01324b; +} + +.container > main { + display: flex; + flex: 1; + align-items: center; + justify-content: center; +} + +.container > main.dashboard { + align-items: flex-start; + justify-content: flex-start; +} + +.container section { + background: white; + border-radius: 5px; + box-shadow: 0 2px 5px rgba(0, 0, 0, .08); + margin: 25px; +} + + + +input[type=text], +input[type=email], +input[type=password] { + padding: 8px; + width: 100%; + max-width: 400px; + border: 1px solid #ccc; +} + +form .field { + padding: 0 20px 20px; + max-width: 600px; + margin: 0 auto 20px auto; + border-bottom: 1px solid #eee; +} + +form label b { + display: block; + margin-bottom: 10px; +} + +form .description { + font-size: 14px; + color: #777; + margin-top: 5px; +} + +form button, +form input[type=submit] { + font-size: 16px; + margin: 0 auto; +} + +input[type=checkbox] { + cursor: pointer; + transform: scale(1.25); +} + + + +section .pad { + margin: 15px 20px; +} + +section button:not([type=submit]), +section .button:not([type=submit]) { + font-size: 14px; + padding: 6px 15px; + margin: auto; +} + + +section h1 { + font-size: 22px; + font-weight: normal; +} + +table { + border-collapse: collapse; +} + +tr { + border-bottom: 1px solid #ddd; +} + +th, +td { + padding: 10px; +} + +th { + background-color: #ebf3ff; + text-align: left; +} \ No newline at end of file diff --git a/src/resources/css/account/dashboard.css b/src/resources/css/account/dashboard.css new file mode 100644 index 0000000..711f556 --- /dev/null +++ b/src/resources/css/account/dashboard.css @@ -0,0 +1,13 @@ +input[name=path] { + font-size: 14px; + padding: 4px; + border-radius: 4px; + width: auto; + /* max-width: 450px; */ + max-width: none; +} + +a.disabled { + color: #aaa; + cursor: not-allowed; +} \ No newline at end of file diff --git a/src/resources/css/common.css b/src/resources/css/common.css index 83fc071..beee22a 100644 --- a/src/resources/css/common.css +++ b/src/resources/css/common.css @@ -12,20 +12,6 @@ body { -moz-tab-size: 4; } -#v1-banner { - display: block; - background: #5c92a4; - color: #fff; - text-align: center; - padding: 10px 20px; - font-size: 14px; - text-decoration: none; -} - -#v1-banner:hover { - background: #457a8c; -} - .wrapper { max-width: 1400px; margin-left: auto; @@ -38,6 +24,14 @@ body { text-align: center; } +.text-right { + text-align: right; +} + +.float-right { + float: right; +} + a { color: #0694f1; text-decoration: none; @@ -64,8 +58,8 @@ header nav { header nav > a { display: inline-block; - padding-left: 10px; - padding-right: 10px; + padding-left: 12px; + padding-right: 12px; text-decoration: none; color: inherit; } @@ -116,6 +110,7 @@ header nav .button { padding-bottom: 2px; } +button, .button { border-radius: 2em; padding: 10px 20px; @@ -124,43 +119,54 @@ header nav .button { transition: all .2s; text-decoration: none; display: inline-block; + border: 0; + cursor: pointer; } +button:hover, .button:hover { transform: scale(1.05); } +button:active, .button:active { transform: translateY(2px); } +button.red, .button.red { background-color: #d9552b; color: white; } +button.red:hover, .button.red:hover { background-color: #fd511a; } +button.blue, .button.blue { background-color: #0082d0; color: white; } +button.blue:hover, .button.blue:hover { background-color: #00aaff; } +button.gray, .button.gray { background-color: #4c6a79; color: white; } +button.gray:hover, .button.gray:hover { background-color: #4f8098; } +button.big, .button.big { font-size: 125%; text-transform: uppercase; @@ -169,11 +175,24 @@ header nav .button { margin-right: 20px; } +button.disabled, +.button.disabled, +button:disabled, +.button:disabled { + background-color: #aaa !important; + color: white !important; + transform: none !important; + cursor: not-allowed; +} + + +p button, p .button { font-size: 18px; padding: 12px 30px; } + article a:hover { text-decoration: underline; } diff --git a/src/resources/css/docs.css b/src/resources/css/docs.css index 332af85..09d4f85 100644 --- a/src/resources/css/docs.css +++ b/src/resources/css/docs.css @@ -431,6 +431,39 @@ iframe { margin: 1em 0 2em; } +.nonstandard-notice { + font-size: 14px; + max-width: 500px; + margin: 25px auto; + border: 1px solid #ecd200; + background: #fffddf; + border-radius: 5px; + padding: 10px; + color: #886c00; + line-height: 1.4em; + display: none; +} + +.nonstandard { + color: rgb(214, 145, 16); +} + +.nonstandard-flag { + cursor: help; + font-size: 8px; + line-height: 1em; + padding: 4px 8px; + text-transform: uppercase; + font-weight: bold; + background-color: rgb(238, 167, 34); + color: white; + border-radius: 4px; + white-space: nowrap; +} + + + + @@ -515,6 +548,10 @@ article .json a { padding-bottom: 0; } +#hovercard .nonstandard-flag { + float: right; +} + #hovercard .module-link { display: block; text-decoration: none; diff --git a/src/resources/css/download.css b/src/resources/css/download.css new file mode 100644 index 0000000..0fd5371 --- /dev/null +++ b/src/resources/css/download.css @@ -0,0 +1,303 @@ +body { + background-color: #f0f6f9; +} + +.download-bar { + display: flex; + justify-content: space-between; + background: white; + border-radius: 4px; + box-shadow: 0 3px 6px rgba(0, 0, 0, .1); + font-size: 20px; + margin-top: 20px; + position: sticky; /* uwu 💓 */ + top: 0; + z-index: 1; +} + +.download-bar > * { + padding: 15px; + display: flex; + align-items: center; +} + +#platform { + padding: 5px 15px; + font-size: 16px; +} + +#download { + margin: 0; + font-size: 16px; + font-weight: bold; +} + +.packages-explanation { + margin: 20px auto; +} + +.warning { + margin-left: 1em; + font-size: 12px; + font-weight: bold; + padding: 2px 15px; + border-radius: 1em; + border: 2px solid rgb(255, 201, 0); + color: rgb(206, 151, 0); +} + +input:disabled, +select:disabled, +#optional-packages.disabled .optpkg label { + cursor: not-allowed !important; +} + + + + + + + +.loader { + display: inline-block; + font-size: 10px; + text-indent: -9999em; + width: 20px; + height: 20px; + border-radius: 50%; + background: #aaa; + background: -moz-linear-gradient(left, #aaa 10%, rgba(255, 255, 255, 0) 42%); + background: -webkit-linear-gradient(left, #aaa 10%, rgba(255, 255, 255, 0) 42%); + background: -o-linear-gradient(left, #aaa 10%, rgba(255, 255, 255, 0) 42%); + background: -ms-linear-gradient(left, #aaa 10%, rgba(255, 255, 255, 0) 42%); + background: linear-gradient(to right, #aaa 10%, rgba(255, 255, 255, 0) 42%); + animation: load3 1.4s infinite linear; + transform: translateZ(0); + vertical-align: middle; + margin-right: .5em; + margin-top: -2px; +} +#signature .loader { + width: 12px; + height: 12px; +} +.loader:before { + width: 50%; + height: 50%; + background: #fff; + border-radius: 100% 0 0 0; + position: absolute; + top: 0; + left: 0; + content: ''; +} +.loader:after { + background: #aaa; + width: 75%; + height: 75%; + border-radius: 50%; + content: ''; + margin: auto; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; +} +@-webkit-keyframes load3 { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@keyframes load3 { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + + + + + + +.table-container { + overflow-x: auto; + box-shadow: 0 2px 4px rgba(0, 0, 0, .1); + border-top-left-radius: 8px; + border-top-right-radius: 8px; +} + +#optional-packages { + width: 100%; + border-spacing: 0; + border-collapse: collapse; +} + +/* #optional-packages tr { + height: 1px; +} */ + +#optional-packages th, +#optional-packages td { + border-bottom: 1px solid #dfeaf0; +} + +#optional-packages th:first-child { border-top-left-radius: 8px; } +#optional-packages th:last-child { border-top-right-radius: 8px; } + +#optional-packages th { + background: #dfe8ec; + text-align: left; + text-transform: uppercase; + letter-spacing: 2px; + color: #54676f; + font-weight: bold; + font-size: 12px; + margin-bottom: 1em; + border-color: #90a2ac; +} + +#optional-packages th:first-child { + padding-left: 4.25em; +} + +#optional-packages td { + background: #fff; + height: 1px; /* TODO: works on Chrome, but not Firefox */ + /* height: 100%; TODO: works on Firefox, but not Chrome */ + /* TODO: + see https://stackoverflow.com/a/34781198/1048862 + (could also do tr with height: 1px which gets ignored, + then td with height: inherit; but this effectively the + same as just doing a td with height: 1px.) + I don't like how either Firefox or Chrome handle this + styling (setting the height of the parent shouldn't be + required at all, the browser is rendering a height + regardless!) but I think I lean toward Firefox's as + being more correct; the hack in Firefox is setting a + flexible 100% height on the parent, rather than the hack + in Chrome which is setting a height that is too small + and stretched or ignored anyway. + */ +} + +#optional-packages th, +#optional-packages .optpkg td:first-child label, +#optional-packages td:not(:first-child) { + padding: 15px; +} + +#optional-packages .optpkg-name { + font-weight: bold; +} + +#optional-packages .optpkg input[type=checkbox] { + transform: scale(1.5); + cursor: pointer; + margin-right: 2em; +} + +#optional-packages .optpkg label { + display: flex; + align-items: center; + height: 100%; + line-height: 1em; + cursor: pointer; +} + +#optional-packages:not(.disabled) .optpkg label:hover { + background: linear-gradient(90deg, rgba(242,248,253,1) 75%, rgba(242,248,253,0) 100%); +} + +#optional-packages .optpkg.selected td { + background-color: #f2f8fd; +} + +#optional-packages .optpkg input[type=text] { + font-size: 12px; + padding: 6px; + outline: none; + text-align: center; + border: 1px solid #ccc; + border-radius: 4px; +} + +#optional-packages .optpkg input[type=text]::placeholder { + font-style: italic; +} + +#optional-packages .optpkg-no-modules { + font-size: 12px; + font-style: italic; + color: #555; +} + +#optional-packages .optpkg-module { + margin-top: .5em; + margin-bottom: .5em; +} + +#optional-packages .optpkg-module .module-name { + font-weight: bold; + font-family: 'PT Mono', monospace; +} + +#optional-packages .optpkg-module .module-description { + color: #444; + margin-left: 1em; + font-size: 14px; +} + + + + + + + +.swal-custom-content { + text-align: left; +} + +.swal-custom-content ol { + margin: 1em 0 1em 2em; +} + +.swal-custom-content li { + margin-bottom: 10px; +} + + + + + + + + + + +@media (max-width: 860px) { + .download-bar { + flex-direction: column; + align-items: center; + } +} + +@media (max-width: 600px) { + .download-bar { + font-size: inherit; + } + + .download-bar > * { + padding: 5px; + } +} diff --git a/src/resources/images/caddy-lock.png b/src/resources/images/caddy-lock.png new file mode 100644 index 0000000000000000000000000000000000000000..d0d33ccf110236e2459037b87b52210855e918fd GIT binary patch literal 73543 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 R_=x}j002ovPDHLkV1g~fPU`>w literal 0 HcmV?d00001 diff --git a/src/resources/js/account/common.js b/src/resources/js/account/common.js new file mode 100644 index 0000000..cc9bd32 --- /dev/null +++ b/src/resources/js/account/common.js @@ -0,0 +1,63 @@ +if (!loggedIn() + && window.location.pathname != '/account/login' + && window.location.pathname != '/account/create' + && window.location.pathname != '/account/verify' + && window.location.pathname != '/account/reset-password') { + window.location = '/account/login?redir='+encodeURIComponent(window.location); +} + +$(function() { + // highlight current page in left nav + var $currentPageLink = $('.container > nav a[href="'+window.location.pathname+'"]'); + $currentPageLink.addClass('current'); + + // shortcut any logout links to make the POST directly + $('a[href="/account/logout"]').click(function() { + logout(); + return false; + }); +}); + + + +function loggedIn() { + return document.cookie.indexOf('user=') > -1; +} + +function logout() { + $.post('/api/logout').done(function() { + window.location = '/'; + }).fail(function(jqxhr, status, error) { + document.cookie = 'user=; Path=/; expires=Thu, 01 Jan 1970 00:00:01 GMT;'; + swal({ + icon: "error", + title: error, + content: errorContent(jqxhr) + }).then(function() { + window.location = '/account/' + }); + }); +} + +function errorContent(jqxhr) { + var div = document.createElement('div'); + var p1 = document.createElement('p'); + p1.appendChild(document.createTextNode("Sorry, something went wrong:")); + div.appendChild(p1); + + var p2 = document.createElement('p'); + var p2b = document.createElement('b'); + p2b.appendChild(document.createTextNode(jqxhr.responseJSON ? jqxhr.responseJSON.error.message : jqxhr.status + " " + jqxhr.statusText)); + p2.appendChild(p2b) + div.appendChild(p2); + + if (jqxhr.responseJSON) { + var p3 = document.createElement('p'); + p3.appendChild(document.createTextNode("Please include this error ID if reporting:")); + p3.appendChild(document.createElement('br')); + p3.appendChild(document.createTextNode(jqxhr.responseJSON.error.id)); + div.appendChild(p3); + } + + return div; +} \ No newline at end of file diff --git a/src/resources/js/account/create.js b/src/resources/js/account/create.js new file mode 100644 index 0000000..754e830 --- /dev/null +++ b/src/resources/js/account/create.js @@ -0,0 +1,28 @@ +if (loggedIn()) window.location = '/account/'; + +$(function() { + $('form input').first().focus(); + + $('form').submit(function(event) { + $('#submit').prop('disabled', true); + + $.post($(this).prop("action"), $(this).serialize()).done(function() { + swal({ + icon: "success", + title: "Check your email", + text: "We've sent you an email with a link that expires in 48 hours. Please verify your account before you can use it." + }).then(function() { + window.location = '/account/verify'; + }); + }).fail(function(jqxhr, status, error) { + swal({ + icon: "error", + titleText: "Error", + content: errorContent(jqxhr) + }); + $('#submit').prop('disabled', false); + }); + + return false; + }); +}); \ No newline at end of file diff --git a/src/resources/js/account/dashboard.js b/src/resources/js/account/dashboard.js new file mode 100644 index 0000000..7396a73 --- /dev/null +++ b/src/resources/js/account/dashboard.js @@ -0,0 +1,125 @@ +// download package list as soon as possible +$.get("/api/user-packages").done(function(json) { + var packageList = json.result; + + // wait until the DOM has finished loading before rendering the results + $(function() { + // trying out this fancy new syntax: + // https://twitter.com/joshmanders/status/1282395540970496001 + packageList.forEach(pkg => { + var $tdPath = $(''); + var $tdListed = $(''); + var $tdAvail = $(''); + var $tdDownloads = $(''); + var $tdLinks = $('Rescan   Delete'); + + if (pkg.listed) { + $('input', $tdListed).prop('checked', true); + } + if (pkg.available) { + $('input', $tdAvail).prop('checked', true); + } + var $pathInput = $('input', $tdPath); + $pathInput.val(pkg.path).attr('size', pkg.path.length); + + var $tr = $(''); + $tr.append($tdPath) + .append($tdListed) + .append($tdAvail) + .append($tdDownloads) + .append($tdLinks); + + $('#user-packages').append($tr); + + // scroll package paths to the left so if they get + // cut off, the leaf package name is still visible + $pathInput.scrollLeft($pathInput.width()); + }); + }); +}); + +$(function() { + + // update packages when fields change + $('#user-packages').on('change', 'input', function() { + $tr = $(this).closest('tr'); + $('input', $tr).prop('disabled', true); + $.post('/api/update-package', { + id: $tr.data('package-id'), + listed: $('[name=listed]', $tr).prop('checked') ? 1 : 0, + available: $('[name=available]', $tr).prop('checked') ? 1 : 0, + path: $('[name=path]', $tr).val() + }).fail(function(jqxhr, status, error) { + swal({ + icon: "error", + title: "Could not save changes", + content: errorContent(jqxhr) + }); + }).always(function() { + $('input', $tr).prop('disabled', false); + }); + }); + + // rescan package + $('#user-packages').on('click', '.rescan-package', function() { + if ($(this).hasClass('disabled')) return; + + $tr = $(this).closest('tr'); + $('a', $tr).addClass('disabled'); + + $.post('/api/rescan-package', { + package_id: $tr.data('package-id') + }).done(function(jqxhr, status, error) { + swal({ + icon: "success", + title: "Rescan Complete", + text: "Package has been re-scanned and its documentation has been updated." + }); + }).fail(function(jqxhr, status, error) { + swal({ + icon: "error", + title: "Rescan failed", + content: errorContent(jqxhr) + }); + }).always(function() { + $('a', $tr).removeClass('disabled'); + }); + }); + + // delete package + $('#user-packages').on('click', '.delete-package', function() { + if ($(this).hasClass('disabled')) return; + + swal({ + title: "Delete package?", + text: "Deleting the package will remove it from our website.", + icon: "warning", + buttons: true, + dangerMode: true, + }).then((willDelete) => { + // abort if user cancelled + if (!willDelete) return; + + $tr = $(this).closest('tr'); + $('input', $tr).prop('disabled', true); + $.post('/api/delete-package', { + id: $tr.data('package-id') + }).done(function(jqxhr, status, error) { + $tr.remove(); + swal({ + icon: "success", + title: "Package deleted" + }); + }).fail(function(jqxhr, status, error) { + swal({ + icon: "error", + title: "Delete failed", + content: errorContent(jqxhr) + }); + }).always(function() { + $('input', $tr).prop('disabled', false); + }); + }); + }); + +}); \ No newline at end of file diff --git a/src/resources/js/account/login.js b/src/resources/js/account/login.js new file mode 100644 index 0000000..4a82e15 --- /dev/null +++ b/src/resources/js/account/login.js @@ -0,0 +1,24 @@ +if (loggedIn()) window.location = '/account/'; + +$(function() { + $('form input').first().focus(); + + $('form').submit(function(event) { + $('#submit').prop('disabled', true); + + $.post($(this).prop("action"), $(this).serialize()).done(function() { + var qsParams = new URLSearchParams(window.location.search); + var destination = qsParams.get('redir'); + window.location = destination ? destination : '/account/'; + }).fail(function(jqxhr, msg, error) { + swal({ + icon: "error", + title: "Bad credentials", + content: errorContent(jqxhr) + }); + $('#submit').prop('disabled', false); + }); + + return false; + }); +}); \ No newline at end of file diff --git a/src/resources/js/account/logout.js b/src/resources/js/account/logout.js new file mode 100644 index 0000000..f9ff2f0 --- /dev/null +++ b/src/resources/js/account/logout.js @@ -0,0 +1 @@ +logout(); \ No newline at end of file diff --git a/src/resources/js/account/register-package.js b/src/resources/js/account/register-package.js new file mode 100644 index 0000000..9f199b0 --- /dev/null +++ b/src/resources/js/account/register-package.js @@ -0,0 +1,27 @@ +$(function() { + $('form input').first().focus(); + + $('form').submit(function(event) { + $('#submit').prop('disabled', true); + + $.post($(this).prop("action"), $(this).serialize()).done(function() { + swal({ + icon: "success", + title: "It's yours", + text: "Package claimed. Its documentation is now available on our website and you are responsible for maintaining it. Thank you!" + }).then(function() { + // TODO: ... + // window.location = "/account/login"; + }); + }).fail(function(jqxhr, status, error) { + swal({ + icon: "error", + title: error, + content: errorContent(jqxhr) + }); + $('#submit').prop('disabled', false); + }); + + return false; + }); +}); \ No newline at end of file diff --git a/src/resources/js/account/reset-password.js b/src/resources/js/account/reset-password.js new file mode 100644 index 0000000..7df05f0 --- /dev/null +++ b/src/resources/js/account/reset-password.js @@ -0,0 +1,80 @@ +if (loggedIn()) window.location = '/account/'; + +$(function() { + var qsParams = new URLSearchParams(window.location.search); + var email = qsParams.get("email"); + var token = qsParams.get("token"); + $('input[name=email]').val(email); + $('input[name=token]').val(token); + if (email && token) showStep2(); + + $('form input:visible').first().focus(); + + $('#reset-password-step1').submit(function(event) { + $('button').prop('disabled', false); + + $.post($(this).prop("action"), $(this).serialize()).done(function() { + swal({ + icon: "info", + title: "Check your email", + text: "If we have an account with that email address, we just sent you some instructions." + }).then(function() { + window.location = '/'; + }); + }).fail(function(jqxhr, status, error) { + swal({ + icon: "error", + title: error, + content: errorContent(jqxhr) + }); + $('button').prop('disabled', false); + }); + + return false; + }); + + $('#reset-password-step2').submit(function(event) { + $('button').prop('disabled', false); + + $.post($(this).prop("action"), $(this).serialize()).done(function() { + swal({ + icon: "success", + title: "Reset completed", + text: "You may now log in with your new password." + }).then(function() { + window.location = '/account/login'; + }); + }).fail(function(jqxhr, status, error) { + swal({ + icon: "error", + title: "Error", + content: errorContent(jqxhr) + }); + $('button').prop('disabled', false); + }); + + return false; + }); + + $('#goto-step1').click(function(event) { + $('#reset-password-step2').hide('fast'); + $('#reset-password-step1').show('fast', function() { + $('input:visible').first().focus(); + }); + return false; + }); + $('#goto-step2').click(function(event) { + showStep2(); + return false; + }); +}); + +function showStep2() { + $('#reset-password-step1').hide('fast'); + $('#reset-password-step2').show('fast', function() { + if ($('input[name=token]').val() != "") + $('input[name=password]').focus(); + else + $('input:visible').first().focus(); + }); +} \ No newline at end of file diff --git a/src/resources/js/account/verify.js b/src/resources/js/account/verify.js new file mode 100644 index 0000000..d085f1e --- /dev/null +++ b/src/resources/js/account/verify.js @@ -0,0 +1,36 @@ +if (loggedIn()) window.location = '/account/'; + +$(function() { + $('form input').first().focus(); + + $('form').submit(function(event) { + $('#submit').prop('disabled', true); + + $.post($(this).prop("action"), $(this).serialize()).done(function() { + swal({ + icon: "success", + title: "Account confirmed", + text: "Thank you. You may now log in and use your account!" + }).then(function() { + window.location = "/account/login"; + }); + }).fail(function(jqxhr, status, error) { + swal({ + icon: "error", + title: error, + content: errorContent(jqxhr) + }); + $('#submit').prop('disabled', false); + }); + + return false; + }); + + // if info is in the query string, fill use and submit it + var qsParams = new URLSearchParams(window.location.search); + var email = qsParams.get("email"); + var acct = qsParams.get("code"); + $('input[name=email]').val(email); + $('input[name=account_id]').val(acct); + if (email && acct) $('form').submit(); +}); \ No newline at end of file diff --git a/src/resources/js/common.js b/src/resources/js/common.js index 995d20a..81578b8 100644 --- a/src/resources/js/common.js +++ b/src/resources/js/common.js @@ -7,3 +7,27 @@ document.addEventListener('DOMContentLoaded', function() { debug: false // Set debug to true if you want to inspect the dropdown }); }); + +const caddyImportPath = 'github.com/caddyserver/caddy/v2'; + +function isStandard(packagePath) { + return packagePath.startsWith(caddyImportPath); +} + +function substrBeforeLastDot(s) { + return s.substr(0, s.lastIndexOf('.')) +} + +function substrAfterLastDot(s) { + return s.substr(s.lastIndexOf('.')) +} + +function truncate(str, len) { + if (!str) return ""; + var startLen = str.length; + str = str.substring(0, len); + if (startLen > len) { + str += "..."; + } + return str; +} diff --git a/src/resources/js/docs-api.js b/src/resources/js/docs-api.js index 08b7ae6..7b43cc3 100644 --- a/src/resources/js/docs-api.js +++ b/src/resources/js/docs-api.js @@ -4,6 +4,8 @@ var pageData = {}, pageDocs = {}; var $renderbox, $hovercard; +const nonStandardFlag = 'Non-standard'; + $(function() { $renderbox = $('#renderbox'); $hovercard = $('#hovercard'); @@ -61,7 +63,12 @@ $(function() { for (var i = 0; i < pageData.namespaces[modNamespace].length; i++) { var modInfo = pageData.namespaces[modNamespace][i]; var href = canTraverse() ? '.'+elemPath+'/'+modInfo.name+'/' : './'+modNamespace+'.'+modInfo.name; - $list.append(''+modInfo.name+''+truncate(modInfo.docs, 115)+''); + var content = ' '+modInfo.name; + if (!isStandard(modInfo.package)) { + content += nonStandardFlag; + } + content += ''+truncate(modInfo.docs, 115)+''; + $list.append(content); } } $('#hovercard-module-list').html($list); @@ -88,7 +95,7 @@ $(function() { case "struct": for (var j = 0; j < bcVal.struct_fields.length; j++) { var sf = bcVal.struct_fields[j]; - bcSiblings.push({name: sf.key, path: siblingPath}) + bcSiblings.push({name: sf.key, path: siblingPath, isStandard: isStandard(bcVal.type_name)}) } break; @@ -96,7 +103,7 @@ $(function() { case "module_map": for (var j = 0; j < pageData.namespaces[bcVal.module_namespace].length; j++) { var mod = pageData.namespaces[bcVal.module_namespace][j]; - bcSiblings.push({name: mod.name, path: siblingPath}) + bcSiblings.push({name: mod.name, path: siblingPath, isStandard: isStandard(mod.package)}) } } @@ -108,7 +115,12 @@ $(function() { sibPath += "/"; } sibPath += sib.name+"/"; - $siblings.append(''+sib.name+''); + var aTag = ''; + $siblings.append(aTag); } $('#hovercard-breadcrumb-siblings').html($siblings).show(); @@ -147,6 +159,14 @@ function beginRendering(json) { pageData = json; console.log("DATA:", pageData); + // show notice if module is non-standard + if (!isStandard(pageData.structure.type_name)) { + var projectHref = 'https://'+pageData.structure.type_name; + projectHref = substrBeforeLastDot(projectHref); + $('.nonstandard-project-link').attr('href', projectHref).text(projectHref); + $('.nonstandard-notice').prepend(nonStandardFlag).show(); + } + if (pageData.structure.doc) { // for most types, just render their docs $('#top-doc').html(markdown(pageData.structure.doc)); @@ -308,16 +328,6 @@ function indent(nesting, $group) { $group.append($span); } -function truncate(str, len) { - if (!str) return ""; - var startLen = str.length; - str = str.substring(0, len); - if (startLen > len) { - str += "..."; - } - return str; -} - function makeSubmoduleList(path, value) { while (value.elems) { value = value.elems; @@ -330,7 +340,11 @@ function makeSubmoduleList(path, value) { for (var j = 0; j < pageData.namespaces[value.module_namespace].length; j++) { var submod = pageData.namespaces[value.module_namespace][j]; var href = canTraverse() ? '.'+path+'/'+submod.name+'/' : './'+value.module_namespace+'.'+submod.name; - submodList += '

  • '+submod.name+'
  • '; + var submodLink = ''+submod.name+''; + if (!isStandard(submod.package)) { + submodLink += ' '+nonStandardFlag; + } + submodList += '
  • '+submodLink+'
  • '; } } submodList += ''; diff --git a/src/resources/js/download.js b/src/resources/js/download.js new file mode 100644 index 0000000..2649d7d --- /dev/null +++ b/src/resources/js/download.js @@ -0,0 +1,221 @@ +// download package list as soon as possible +$.get("/api/packages").done(function(json) { + var packageList = json.result; + + // wait until the DOM has finished loading before rendering the results + $(function() { + const optpkgTemplate = + ''+ + ' '+ + ' '+ + ' '+ + ''; + + const optpkgModuleTemplate = + '
    '+ + ' '+ + ' '+ + '
    '; + + for (var i = 0; i < packageList.length; i++) { + var pkg = packageList[i]; + if (isStandard(pkg.path)) { + // not necessary to show, since these packages + // come with standard distribution + continue; + } + + var $optpkg = $(optpkgTemplate); + $('.optpkg-name', $optpkg).text(pkg.path); + + if (pkg.modules && pkg.modules.length > 0) { + for (var j = 0; j < pkg.modules.length; j++) { + var mod = pkg.modules[j]; + var $mod = $(optpkgModuleTemplate); + $('.module-name', $mod).attr('href', '/docs/modules/'+mod.name).text(mod.name); + $('.module-description', $mod).text(truncate(mod.docs, 120)); + $('.optpkg-modules', $optpkg).append($mod); + } + } else { + $('.optpkg-modules', $optpkg) + .addClass("optpkg-no-modules") + .text('This package does not add any modules. Either it is another kind of plugin (such as a config adapter) or this listing is in error.'); + } + $('#optional-packages').append($optpkg); + } + }); +}).fail(function(jqxhr, status, error) { + swal({ + icon: "error", + title: "Unavailable", + content: $('
    Sorry, the build server is down for maintenance right now. You can try again later or download pre-built Caddy binaries from GitHub any time.
    ')[0] + }); + $(function() { + disableFields(false); + }); +}); + +$(function() { + autoPlatform(); + + downloadButtonHtml = $('#download').html(); + + // update the page, including the download link, when form fields change + $('#optional-packages').on('change', 'input[type=checkbox]', function() { + $(this).closest('.optpkg').toggleClass('selected'); + updatePage(); + }); + $('#optional-packages').on('change keyup', 'input[name=version]', function() { + updatePage(); + }); + $('#platform').change(function() { + updatePage(); + }); + + $('#download').click(function(event) { + if ($(this).hasClass('disabled')) { + return false; + } + + disableFields(true); + + fathom.trackGoal('U9K2UTFV', 0); + + $.ajax($(this).attr('href'), { method: "HEAD" }).done(function(data, status, jqxhr) { + window.onbeforeunload = null; // disable exit confirmation before "redirecting" to download + window.location = jqxhr.getResponseHeader("Location"); + }).fail(function(jqxhr, status, error) { + handleBuildError(jqxhr, status, error); + }).always(function() { + enableFields(); + }); + + return false; + }); +}) + +// autoPlatform choooses the platform in the list that best +// matches the user's browser, if it's available. +function autoPlatform() { + // assume 32-bit linux, then change OS and architecture if justified + var os = "linux", arch = "386", arm = ""; + + // change os + if (/Macintosh/i.test(navigator.userAgent)) { + os = "darwin"; + } else if (/Windows/i.test(navigator.userAgent)) { + os = "windows"; + } else if (/FreeBSD/i.test(navigator.userAgent)) { + os = "freebsd"; + } else if (/OpenBSD/i.test(navigator.userAgent)) { + os = "openbsd"; + } + + // change architecture + if (os == "darwin" || /amd64|x64|x86_64|Win64|WOW64|i686|64-bit/i.test(navigator.userAgent)) { + arch = "amd64"; + } else if (/arm64/.test(navigator.userAgent)) { + arch = "arm64"; + } else if (/ ARM| armv/.test(navigator.userAgent)) { + arch = "arm"; + } + + // change arm version + if (arch == "arm") { + arm = "7"; // assume version 7 by default + if (/armv6/.test(navigator.userAgent)) { + arm = "6"; + } else if (/armv5/.test(navigator.userAgent)) { + arm = "5"; + } + } + + var selString = os+"-"+arch; + if (arm != "") { + selString += "-"+arm; + } + + $('#platform').val(selString); + updatePage(); +} + +function getDownloadLink() { + // get platform components + var platformParts = $('#platform').val().split("-"); + var os = platformParts[0]; + var arch = platformParts[1]; + var arm = platformParts.length > 2 ? platformParts[2] : ""; + + var qs = new URLSearchParams(); + if (os) qs.set("os", os); + if (arch) qs.set("arch", arch); + if (arm) qs.set("arm", arm); + + // get plugins and their versions + $('#optional-packages .selected').each(function() { + // get package path + var p = $('.optpkg-name', this).text().trim(); + + // get package version, if user specified one + var ver = $('input[name=version]', this).val().trim(); + if (ver) { + p += "@"+ver; + } + + qs.append("p", p); + }); + + var idempotencyKey = Math.floor(Math.random() * 99999999999999); + qs.append("idempotency", idempotencyKey); + + return "/api/download?"+qs.toString(); +} + +function handleBuildError(jqxhr, status, error) { + var $content = $('
    '); + + if (jqxhr.status == 502) { + swal({ + icon: "error", + title: "Unavailable", + content: $content.html('Sorry, the build server is down for maintenance right now. You can try again later or download pre-built Caddy binaries from GitHub.')[0] + }); + } else { + swal({ + icon: "error", + title: "Build failed", + content: $content.html('The two most common reasons are:
    1. A plugin is not compiling. The developer must release a new version that compiles.
    2. The build configuration is invalid. If you specified any versions, make sure they are correct and within the same major version as the path of the associated package.
    In the meantime, you can download Caddy from GitHub without any plugins.')[0] + }); + } +} + +function updatePage() { + $('#package-count').text($('.optpkg.selected').length); + $('#download').attr('href', getDownloadLink()); +} + +function disableFields(building) { + $('#download, #optional-packages').addClass('disabled'); + $('.download-bar select, #optional-packages input').prop('disabled', true); + if (building) { + $('#download').html('
    Building'); + + // prevent accidentally leaving the page during a build + window.onbeforeunload = function() { + return "Your custom build is in progress."; + }; + } else { + $('#download').html('Builds Unavailable'); + } +} + +function enableFields() { + $('#download, #optional-packages').removeClass('disabled'); + $('.download-bar select, #optional-packages input').prop('disabled', false); + $('#download').html(downloadButtonHtml); + + // allow user to leave page easily + window.onbeforeunload = null; +} + +var downloadButtonHtml; // to restore button to its original contents \ No newline at end of file diff --git a/src/resources/js/json-docs.js b/src/resources/js/json-docs.js index 5205e2d..e365cad 100644 --- a/src/resources/js/json-docs.js +++ b/src/resources/js/json-docs.js @@ -9,7 +9,7 @@ setPageTitle(); $.get("/api/docs/config"+configPath, function(json) { // wait until the DOM has finished loading before rendering the results $(function() { - beginRendering(json); + beginRendering(json.result); // establish the breadcrumb var $bc = $('.breadcrumbs'); diff --git a/src/resources/js/module-docs.js b/src/resources/js/module-docs.js index 89c77c5..7ac483c 100644 --- a/src/resources/js/module-docs.js +++ b/src/resources/js/module-docs.js @@ -9,21 +9,24 @@ if (moduleID) { $(function() { $('#module-docs-container').show(); $('h1').text("Module "+moduleID); - beginRendering(json); + beginRendering(json.result); }); }); } else { // populate the module list - $.get("/api/modules", function(moduleList) { + $.get("/api/modules", function(json) { + var moduleList = json.result; + // wait until the DOM has finished loading before rendering the results $(function() { $('#module-list-container').show(); $table = $('#module-list'); for (modID in moduleList) { - var doc = moduleList[modID]; + var val = moduleList[modID]; + var standard = isStandard(val.type_name); var $tr = $(''); - $tr.append(''+modID+''); - $tr.append(''+markdown(truncate(doc, 200))+''); + $tr.append(''+modID+''+(standard ? '' : ' '+nonStandardFlag)+''); + $tr.append(''+markdown(truncate(val.doc, 200))+''); $table.append($tr); } }); diff --git a/src/resources/js/sweetalert.min.js b/src/resources/js/sweetalert.min.js new file mode 100644 index 0000000..dc8f5e7 --- /dev/null +++ b/src/resources/js/sweetalert.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.swal=e():t.swal=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=8)}([function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o="swal-button";e.CLASS_NAMES={MODAL:"swal-modal",OVERLAY:"swal-overlay",SHOW_MODAL:"swal-overlay--show-modal",MODAL_TITLE:"swal-title",MODAL_TEXT:"swal-text",ICON:"swal-icon",ICON_CUSTOM:"swal-icon--custom",CONTENT:"swal-content",FOOTER:"swal-footer",BUTTON_CONTAINER:"swal-button-container",BUTTON:o,CONFIRM_BUTTON:o+"--confirm",CANCEL_BUTTON:o+"--cancel",DANGER_BUTTON:o+"--danger",BUTTON_LOADING:o+"--loading",BUTTON_LOADER:o+"__loader"},e.default=e.CLASS_NAMES},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getNode=function(t){var e="."+t;return document.querySelector(e)},e.stringToNode=function(t){var e=document.createElement("div");return e.innerHTML=t.trim(),e.firstChild},e.insertAfter=function(t,e){var n=e.nextSibling;e.parentNode.insertBefore(t,n)},e.removeNode=function(t){t.parentElement.removeChild(t)},e.throwErr=function(t){throw t=t.replace(/ +(?= )/g,""),"SweetAlert: "+(t=t.trim())},e.isPlainObject=function(t){if("[object Object]"!==Object.prototype.toString.call(t))return!1;var e=Object.getPrototypeOf(t);return null===e||e===Object.prototype},e.ordinalSuffixOf=function(t){var e=t%10,n=t%100;return 1===e&&11!==n?t+"st":2===e&&12!==n?t+"nd":3===e&&13!==n?t+"rd":t+"th"}},function(t,e,n){"use strict";function o(t){for(var n in t)e.hasOwnProperty(n)||(e[n]=t[n])}Object.defineProperty(e,"__esModule",{value:!0}),o(n(25));var r=n(26);e.overlayMarkup=r.default,o(n(27)),o(n(28)),o(n(29));var i=n(0),a=i.default.MODAL_TITLE,s=i.default.MODAL_TEXT,c=i.default.ICON,l=i.default.FOOTER;e.iconMarkup='\n
    ',e.titleMarkup='\n
    \n',e.textMarkup='\n
    ',e.footerMarkup='\n
    \n'},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1);e.CONFIRM_KEY="confirm",e.CANCEL_KEY="cancel";var r={visible:!0,text:null,value:null,className:"",closeModal:!0},i=Object.assign({},r,{visible:!1,text:"Cancel",value:null}),a=Object.assign({},r,{text:"OK",value:!0});e.defaultButtonList={cancel:i,confirm:a};var s=function(t){switch(t){case e.CONFIRM_KEY:return a;case e.CANCEL_KEY:return i;default:var n=t.charAt(0).toUpperCase()+t.slice(1);return Object.assign({},r,{text:n,value:t})}},c=function(t,e){var n=s(t);return!0===e?Object.assign({},n,{visible:!0}):"string"==typeof e?Object.assign({},n,{visible:!0,text:e}):o.isPlainObject(e)?Object.assign({visible:!0},n,e):Object.assign({},n,{visible:!1})},l=function(t){for(var e={},n=0,o=Object.keys(t);n=0&&w.splice(e,1)}function s(t){var e=document.createElement("style");return t.attrs.type="text/css",l(e,t.attrs),i(t,e),e}function c(t){var e=document.createElement("link");return t.attrs.type="text/css",t.attrs.rel="stylesheet",l(e,t.attrs),i(t,e),e}function l(t,e){Object.keys(e).forEach(function(n){t.setAttribute(n,e[n])})}function u(t,e){var n,o,r,i;if(e.transform&&t.css){if(!(i=e.transform(t.css)))return function(){};t.css=i}if(e.singleton){var l=h++;n=g||(g=s(e)),o=f.bind(null,n,l,!1),r=f.bind(null,n,l,!0)}else t.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=c(e),o=p.bind(null,n,e),r=function(){a(n),n.href&&URL.revokeObjectURL(n.href)}):(n=s(e),o=d.bind(null,n),r=function(){a(n)});return o(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap)return;o(t=e)}else r()}}function f(t,e,n,o){var r=n?"":o.css;if(t.styleSheet)t.styleSheet.cssText=x(e,r);else{var i=document.createTextNode(r),a=t.childNodes;a[e]&&t.removeChild(a[e]),a.length?t.insertBefore(i,a[e]):t.appendChild(i)}}function d(t,e){var n=e.css,o=e.media;if(o&&t.setAttribute("media",o),t.styleSheet)t.styleSheet.cssText=n;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(n))}}function p(t,e,n){var o=n.css,r=n.sourceMap,i=void 0===e.convertToAbsoluteUrls&&r;(e.convertToAbsoluteUrls||i)&&(o=y(o)),r&&(o+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(r))))+" */");var a=new Blob([o],{type:"text/css"}),s=t.href;t.href=URL.createObjectURL(a),s&&URL.revokeObjectURL(s)}var m={},b=function(t){var e;return function(){return void 0===e&&(e=t.apply(this,arguments)),e}}(function(){return window&&document&&document.all&&!window.atob}),v=function(t){var e={};return function(n){return void 0===e[n]&&(e[n]=t.call(this,n)),e[n]}}(function(t){return document.querySelector(t)}),g=null,h=0,w=[],y=n(15);t.exports=function(t,e){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");e=e||{},e.attrs="object"==typeof e.attrs?e.attrs:{},e.singleton||(e.singleton=b()),e.insertInto||(e.insertInto="head"),e.insertAt||(e.insertAt="bottom");var n=r(t,e);return o(n,e),function(t){for(var i=[],a=0;athis.length)&&-1!==this.indexOf(t,e)}),Array.prototype.includes||Object.defineProperty(Array.prototype,"includes",{value:function(t,e){if(null==this)throw new TypeError('"this" is null or not defined');var n=Object(this),o=n.length>>>0;if(0===o)return!1;for(var r=0|e,i=Math.max(r>=0?r:o-Math.abs(r),0);i=0&&(t._idleTimeoutId=setTimeout(function(){t._onTimeout&&t._onTimeout()},e))},n(19),e.setImmediate=setImmediate,e.clearImmediate=clearImmediate},function(t,e,n){(function(t,e){!function(t,n){"use strict";function o(t){"function"!=typeof t&&(t=new Function(""+t));for(var e=new Array(arguments.length-1),n=0;n1)for(var n=1;n
    ',e.default=e.modalMarkup},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),r=o.default.OVERLAY,i='
    \n
    ';e.default=i},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),r=o.default.ICON;e.errorIconMarkup=function(){var t=r+"--error",e=t+"__line";return'\n
    \n \n \n
    \n '},e.warningIconMarkup=function(){var t=r+"--warning";return'\n \n \n \n '},e.successIconMarkup=function(){var t=r+"--success";return'\n \n \n\n
    \n
    \n '}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),r=o.default.CONTENT;e.contentMarkup='\n
    \n\n
    \n'},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),r=o.default.BUTTON_CONTAINER,i=o.default.BUTTON,a=o.default.BUTTON_LOADER;e.buttonMarkup='\n
    \n\n \n\n
    \n
    \n
    \n
    \n
    \n\n
    \n'},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(4),r=n(2),i=n(0),a=i.default.ICON,s=i.default.ICON_CUSTOM,c=["error","warning","success","info"],l={error:r.errorIconMarkup(),warning:r.warningIconMarkup(),success:r.successIconMarkup()},u=function(t,e){var n=a+"--"+t;e.classList.add(n);var o=l[t];o&&(e.innerHTML=o)},f=function(t,e){e.classList.add(s);var n=document.createElement("img");n.src=t,e.appendChild(n)},d=function(t){if(t){var e=o.injectElIntoModal(r.iconMarkup);c.includes(t)?u(t,e):f(t,e)}};e.default=d},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(2),r=n(4),i=function(t){navigator.userAgent.includes("AppleWebKit")&&(t.style.display="none",t.offsetHeight,t.style.display="")};e.initTitle=function(t){if(t){var e=r.injectElIntoModal(o.titleMarkup);e.textContent=t,i(e)}},e.initText=function(t){if(t){var e=document.createDocumentFragment();t.split("\n").forEach(function(t,n,o){e.appendChild(document.createTextNode(t)),n0}).forEach(function(t){b.classList.add(t)})}n&&t===c.CONFIRM_KEY&&b.classList.add(s),b.textContent=r;var g={};return g[t]=i,f.setActionValue(g),f.setActionOptionsFor(t,{closeModal:p}),b.addEventListener("click",function(){return u.onAction(t)}),m},p=function(t,e){var n=r.injectElIntoModal(l.footerMarkup);for(var o in t){var i=t[o],a=d(o,i,e);i.visible&&n.appendChild(a)}0===n.children.length&&n.remove()};e.default=p},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(3),r=n(4),i=n(2),a=n(5),s=n(6),c=n(0),l=c.default.CONTENT,u=function(t){t.addEventListener("input",function(t){var e=t.target,n=e.value;a.setActionValue(n)}),t.addEventListener("keyup",function(t){if("Enter"===t.key)return s.onAction(o.CONFIRM_KEY)}),setTimeout(function(){t.focus(),a.setActionValue("")},0)},f=function(t,e,n){var o=document.createElement(e),r=l+"__"+e;o.classList.add(r);for(var i in n){var a=n[i];o[i]=a}"input"===e&&u(o),t.appendChild(o)},d=function(t){if(t){var e=r.injectElIntoModal(i.contentMarkup),n=t.element,o=t.attributes;"string"==typeof n?f(e,n,o):e.appendChild(n)}};e.default=d},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1),r=n(2),i=function(){var t=o.stringToNode(r.overlayMarkup);document.body.appendChild(t)};e.default=i},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(5),r=n(6),i=n(1),a=n(3),s=n(0),c=s.default.MODAL,l=s.default.BUTTON,u=s.default.OVERLAY,f=function(t){t.preventDefault(),v()},d=function(t){t.preventDefault(),g()},p=function(t){if(o.default.isOpen)switch(t.key){case"Escape":return r.onAction(a.CANCEL_KEY)}},m=function(t){if(o.default.isOpen)switch(t.key){case"Tab":return f(t)}},b=function(t){if(o.default.isOpen)return"Tab"===t.key&&t.shiftKey?d(t):void 0},v=function(){var t=i.getNode(l);t&&(t.tabIndex=0,t.focus())},g=function(){var t=i.getNode(c),e=t.querySelectorAll("."+l),n=e.length-1,o=e[n];o&&o.focus()},h=function(t){t[t.length-1].addEventListener("keydown",m)},w=function(t){t[0].addEventListener("keydown",b)},y=function(){var t=i.getNode(c),e=t.querySelectorAll("."+l);e.length&&(h(e),w(e))},x=function(t){if(i.getNode(u)===t.target)return r.onAction(a.CANCEL_KEY)},_=function(t){var e=i.getNode(u);e.removeEventListener("click",x),t&&e.addEventListener("click",x)},k=function(t){o.default.timer&&clearTimeout(o.default.timer),t&&(o.default.timer=window.setTimeout(function(){return r.onAction(a.CANCEL_KEY)},t))},O=function(t){t.closeOnEsc?document.addEventListener("keyup",p):document.removeEventListener("keyup",p),t.dangerMode?v():g(),y(),_(t.closeOnClickOutside),k(t.timer)};e.default=O},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1),r=n(3),i=n(37),a=n(38),s={title:null,text:null,icon:null,buttons:r.defaultButtonList,content:null,className:null,closeOnClickOutside:!0,closeOnEsc:!0,dangerMode:!1,timer:null},c=Object.assign({},s);e.setDefaults=function(t){c=Object.assign({},s,t)};var l=function(t){var e=t&&t.button,n=t&&t.buttons;return void 0!==e&&void 0!==n&&o.throwErr("Cannot set both 'button' and 'buttons' options!"),void 0!==e?{confirm:e}:n},u=function(t){return o.ordinalSuffixOf(t+1)},f=function(t,e){o.throwErr(u(e)+" argument ('"+t+"') is invalid")},d=function(t,e){var n=t+1,r=e[n];o.isPlainObject(r)||void 0===r||o.throwErr("Expected "+u(n)+" argument ('"+r+"') to be a plain object")},p=function(t,e){var n=t+1,r=e[n];void 0!==r&&o.throwErr("Unexpected "+u(n)+" argument ("+r+")")},m=function(t,e,n,r){var i=typeof e,a="string"===i,s=e instanceof Element;if(a){if(0===n)return{text:e};if(1===n)return{text:e,title:r[0]};if(2===n)return d(n,r),{icon:e};f(e,n)}else{if(s&&0===n)return d(n,r),{content:e};if(o.isPlainObject(e))return p(n,r),e;f(e,n)}};e.getOpts=function(){for(var t=[],e=0;eStill the only web server to use TLS automatically and by default. Deploy and scale HTTPS effortlessly with Caddy 2.
    - Download + Download Get Started
    Caddy uses only the Apache 2.0 open source license. @@ -470,7 +470,7 @@ http://localhost {