demo
Before Width: | Height: | Size: 310 B After Width: | Height: | Size: 310 B |
Before Width: | Height: | Size: 387 B After Width: | Height: | Size: 387 B |
Before Width: | Height: | Size: 328 B After Width: | Height: | Size: 328 B |
Before Width: | Height: | Size: 321 B After Width: | Height: | Size: 321 B |
|
@ -0,0 +1,98 @@
|
||||||
|
<span class="step" ng-if="steps[step].slug === 'download'"><!--
|
||||||
|
|
||||||
|
step: download
|
||||||
|
|
||||||
|
--><ol>
|
||||||
|
<li>
|
||||||
|
<strong>Download</strong> generated config: <strong><a href="#" ng-click="downloadZip()">nginxconfig.io-{{ getDomains().join(',') }}.zip</a></strong>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<strong>Upload</strong> to server's <code>{{ data.directory_nginx.replace(endingSlashRegex, '') }}</code> directory<br>
|
||||||
|
or <strong>Copy</strong> as Base64 string: <strong><a href="#" ng-mouseenter="prepareBase64()" ng-click="copyAsBase64()" ngclipboard data-clipboard-target="#base64-zip-line" ngclipboard-success="clipboardSuccess('base64-zip-line')">Copy to clipboard</a></strong> and <strong>Paste</strong> from clipboard and run the command<br>
|
||||||
|
(<code>echo 'BASE64' | base64 --decode > {{ data.directory_nginx }}nginxconfig.io-{{ getDomains().join(',') }}.zip</code>)
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Go to NGINX directory (over SSH):<br>
|
||||||
|
<code><span class="hljs-section">cd</span> {{ data.directory_nginx.replace(endingSlashRegex, '') }}</code>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<strong>Backup</strong> current configuration:<br>
|
||||||
|
<code><span class="hljs-section">tar</span> <span class="hljs-attribute">-czvf</span> nginx_$(date +'%F_%H-%M-%S').tar.gz nginx.conf sites-available/ sites-enabled/ nginxconfig.io/</code>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<strong>Unzip</strong> the uploaded archive:<br>
|
||||||
|
<code><span class="hljs-section">unzip</span> <span class="hljs-attribute">-o</span> nginxconfig.io-{{ getDomains().join(',') }}.zip</code><br>
|
||||||
|
(you probably need to install <strong>unzip</strong>: <code><span class="hljs-section"></span><strong>sudo</strong> <span class="hljs-section">apt-get</span> <span class="hljs-attribute">install</span> unzip</code>)
|
||||||
|
</li>
|
||||||
|
</ol></span><!--
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--><span class="step" ng-if="steps[step].slug === 'ssl'"><ol><!--
|
||||||
|
|
||||||
|
step: ssl
|
||||||
|
|
||||||
|
--><!--
|
||||||
|
|
||||||
|
✔ SSL DH required --><li ng-if="isSSLDHRequired()">Generate <strong>Diffie-Hellman keys</strong>:<br>
|
||||||
|
<code><span class="hljs-section">openssl</span> <span class="hljs-attribute">dhparam</span> <span class="hljs-attribute">-out</span> {{ data.directory_nginx }}dhparam.pem <span class="hljs-number">{{ sslProfiles[ data.ssl_profile ].dh_param_size }}</span></code>
|
||||||
|
</li><!--
|
||||||
|
|
||||||
|
✔ Let's Encrypt
|
||||||
|
--><li ng-if="hasCertLetsEncrypt()">Create a common <strong>ACME-challenge</strong> directory (for <strong>Let's Encrypt</strong>):<br>
|
||||||
|
<code><span class="hljs-section">mkdir</span> <span class="hljs-attribute">-p</span> {{ data.directory_letsencrypt.replace(endingSlashRegex, '') }}</code><br>
|
||||||
|
<code><span class="hljs-section">chown</span> <span class="hljs-attribute">{{ data.user }}</span> {{ data.directory_letsencrypt.replace(endingSlashRegex, '') }}</code></li></ol></span><!--
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--><span class="step" ng-if="steps[step].slug === 'certbot'"><!--
|
||||||
|
|
||||||
|
step: certbot
|
||||||
|
|
||||||
|
--><ol>
|
||||||
|
<li>
|
||||||
|
Comment out SSL related directives in configuration:<br>
|
||||||
|
<code><span class="hljs-section">sed</span> <span class="hljs-attribute">-i -r</span> 's/(listen .*443)/\1;#/g; s/(ssl_(certificate|certificate_key|trusted_certificate) )/#;#\1/g'<span ng-if="isUnified()"><!--
|
||||||
|
--> {{ data.directory_nginx }}nginx.conf</span><span ng-if="isModularized()"><span ng-repeat="(_site, _domain) in getDomains() track by $index" ng-if="isCertLetsEncrypt(_site)"><!--
|
||||||
|
--> {{ data.directory_nginx }}sites-{{ isSymlink() ? 'available' : 'enabled' }}/{{ _domain }}.conf</span></span></code>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Reload NGINX:<br>
|
||||||
|
<code><strong>sudo</strong> <span class="hljs-section">nginx</span> <span class="hljs-attribute">-t</span> && <strong>sudo</strong> <span class="hljs-section">systemctl</span> <span class="hljs-attribute">reload</span> nginx</code>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Obtain certificate{{ getDomains().length > 1 ? 's' : '' }}:<br>
|
||||||
|
<div ng-repeat="(_site, _domain) in getDomains() track by $index" ng-if="isCertLetsEncrypt(_site)"><code>
|
||||||
|
<span class="hljs-section">certbot</span> <!--
|
||||||
|
--><span class="hljs-attribute">certonly</span> <!--
|
||||||
|
--><span class="hljs-attribute">--webroot</span> <!--
|
||||||
|
--><span ng-if="isNonWWW(_site) || isRedirect(_site)"><span class="hljs-attribute" tooltips tooltip-template="--domain" tooltip-side="top">-d</span> {{ _domain.indexOf('-') !== -1 ? '"' + _domain + '"' : _domain }} </span><!--
|
||||||
|
--><span ng-if="isWWW(_site) || isRedirect(_site)"><span class="hljs-attribute" tooltips tooltip-template="--domain" tooltip-side="top">-d</span> {{ _domain.indexOf('-') !== -1 ? '"' : '' }}www.{{ _domain }}{{ _domain.indexOf('-') !== -1 ? '"' : '' }} </span><!--
|
||||||
|
--><span ng-if="isCDN(_site)"><span class="hljs-attribute" tooltips tooltip-template="--domain" tooltip-side="top">-d</span> {{ _domain.indexOf('-') !== -1 ? '"' : '' }}cdn.{{ _domain }}{{ _domain.indexOf('-') !== -1 ? '"' : '' }} </span><!--
|
||||||
|
--><span class="hljs-attribute">--email</span> {{ data.sites[_site].email ? data.sites[_site].email : 'info@' + _domain }} <!--
|
||||||
|
--><span class="hljs-attribute" tooltips tooltip-template="--webroot-path" tooltip-side="top">-w</span> {{ data.directory_letsencrypt.replace(endingSlashRegex, '') }} <!--
|
||||||
|
--><span class="hljs-attribute" tooltips tooltip-template="--non-interactive" tooltip-side="top">-n</span> <!--
|
||||||
|
--><span class="hljs-attribute">--agree-tos</span> <!--
|
||||||
|
--><span class="hljs-attribute">--force-renewal</span></code></div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Reload NGINX:<br>
|
||||||
|
<code><strong>sudo</strong> <span class="hljs-section">nginx</span> <span class="hljs-attribute">-t</span> && <strong>sudo</strong> <span class="hljs-section">systemctl</span> <span class="hljs-attribute">reload</span> nginx</code>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Configure Certbot to reload NGINX after success renew:<br>
|
||||||
|
<code><span class="hljs-section">echo</span> <span class="hljs-attribute">-e</span> '#!/bin/bash\nnginx -t && systemctl reload nginx' | <strong>sudo</strong> <span class="hljs-section">tee</span> /etc/letsencrypt/renewal-hooks/post/nginx-reload.sh</code><br>
|
||||||
|
<code><strong>sudo</strong> <span class="hljs-section">chmod</span> <span class="hljs-attribute">a+x</span> /etc/letsencrypt/renewal-hooks/post/nginx-reload.sh</code>
|
||||||
|
</li>
|
||||||
|
</ol></span><!--
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--><span class="step" ng-if="steps[step].slug === 'live'"><ol><!--
|
||||||
|
|
||||||
|
step: live
|
||||||
|
|
||||||
|
--><li>
|
||||||
|
Reload NGINX:<br>
|
||||||
|
<code><strong>sudo</strong> <span class="hljs-section">nginx</span> <span class="hljs-attribute">-t</span> && <strong>sudo</strong> <span class="hljs-section">systemctl</span> <span class="hljs-attribute">reload</span> nginx</code>
|
||||||
|
</li></ol></span>
|
|
@ -1,4 +1,4 @@
|
||||||
<span class="step" ng-if="activeStep === 'download'"><!--
|
<span class="step" ng-if="steps[step].slug === 'download'"><!--
|
||||||
|
|
||||||
step: download
|
step: download
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--><span class="step" ng-if="activeStep === 'ssl'"><!--
|
--><span class="step" ng-if="steps[step].slug === 'ssl'"><!--
|
||||||
|
|
||||||
step: ssl
|
step: ssl
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--><span class="step" ng-if="activeStep === 'certbot'"><!--
|
--><span class="step" ng-if="steps[step].slug === 'certbot'"><!--
|
||||||
|
|
||||||
step: certbot
|
step: certbot
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--><span class="step" ng-if="activeStep === 'live'"><!--
|
--><span class="step" ng-if="steps[step].slug === 'live'"><!--
|
||||||
|
|
||||||
step: live
|
step: live
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
<div class="tab-content common-content">
|
<div class="tab-content common-content">
|
||||||
<ul ng-if="layout === 'do'" class="nav nav-pills nav-fill" role="tablist">
|
<ul ng-if="layout === 'do'" class="nav nav-pills nav-fill" role="tablist">
|
||||||
<li ng-repeat="(key, tab) in tabs_common" class="nav-item">
|
<li ng-repeat="(key, tab) in tabs_common" class="nav-item">
|
||||||
<a class="nav-link" ng-mouseenter="setTabCommon(key)" ng-class="{ 'active': tab_common === key, 'changed': commonChanges[tab.slug], 'visited': key < tab_common }">{{ tab.name }}<small ng-cloak>({{ commonChanges[tab.slug] }})</small></a>
|
<a class="nav-link" ng-click="setTabCommon(key)" ng-class="{ 'active': tab_common === key, 'changed': commonChanges[tab.slug], 'visited': key < tab_common }">{{ tab.name }}<small ng-cloak>({{ commonChanges[tab.slug] }})</small></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="tab-pane tab-https" ng-class="{ 'active': tabs_common[tab_common].slug === 'https' }">
|
<div class="tab-pane tab-https" ng-class="{ 'active': tabs_common[tab_common].slug === 'https' }">
|
||||||
|
@ -399,7 +399,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="tab-navigation-buttons" ng-if="layout === 'do'">
|
<div class="tab-navigation-buttons" ng-if="layout === 'do'">
|
||||||
<button class="btn btn-outline-secondary" ng-click="setTabCommonBack()">Back</button>
|
<button class="btn btn-outline-secondary" ng-click="setTabCommonBack()" ng-class="{ disabled: tab_common === 0 }">Back</button>
|
||||||
<button class="btn btn-primary" ng-click="setTabCommonNext()">Next</button>
|
<button class="btn btn-primary" ng-click="setTabCommonNext()" ng-class="{ disabled: tab_common === tabs_common.length - 1 }">Next</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
<div class="tab-content site-content">
|
<div class="tab-content site-content">
|
||||||
<ul ng-if="layout === 'do'" class="nav nav-pills nav-fill" role="tablist">
|
<ul ng-if="layout === 'do'" class="nav nav-pills nav-fill" role="tablist">
|
||||||
<li ng-repeat="(key, tab) in tabs_site" class="nav-item">
|
<li ng-repeat="(key, tab) in tabs_site" class="nav-item">
|
||||||
<a class="nav-link" ng-mouseenter="setTabSite(key)" ng-class="{ 'active': tab_site === key, 'changed': getSiteTabChanges(tab.slug), 'visited': key < tab_site }">{{ tab.name }}<small ng-cloak>({{ getSiteTabChanges('php') }})</small></a>
|
<a class="nav-link" ng-click="setTabSite(key)" ng-class="{ 'active': tab_site === key, 'changed': getSiteTabChanges(tab.slug), 'visited': key < tab_site }">{{ tab.name }}<small ng-cloak>({{ getSiteTabChanges('php') }})</small></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="tab-pane tab-presets" ng-class="{ 'active': tabs_site[tab_site].slug === 'presets' }">
|
<div class="tab-pane tab-presets" ng-class="{ 'active': tabs_site[tab_site].slug === 'presets' }">
|
||||||
|
@ -426,7 +426,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="tab-navigation-buttons" ng-if="layout === 'do'">
|
<div class="tab-navigation-buttons" ng-if="layout === 'do'">
|
||||||
<button class="btn btn-outline-secondary" ng-click="setTabSiteBack()">Back</button>
|
<button class="btn btn-outline-secondary" ng-click="setTabSiteBack()" ng-class="{ disabled: tab_site === 0 }">Back</button>
|
||||||
<button class="btn btn-primary" ng-click="setTabSiteNext()">Next</button>
|
<button class="btn btn-primary" ng-click="setTabSiteNext()" ng-class="{ disabled: tab_site === tabs_site.length - 1 }">Next</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -66,7 +66,11 @@
|
||||||
</section>
|
</section>
|
||||||
<section class="steps">
|
<section class="steps">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div ng-if="layout === 'do'">
|
||||||
|
<h5>Setup and Files</h5>
|
||||||
|
<div class="card" ng-include="'partials/steps-do.html'"></div>
|
||||||
|
</div>
|
||||||
|
<div ng-if="layout === 'default'" class="row">
|
||||||
<div class="col-xl-10 offset-xl-1">
|
<div class="col-xl-10 offset-xl-1">
|
||||||
<div ng-include="'partials/steps.html'"></div>
|
<div ng-include="'partials/steps.html'"></div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -75,17 +79,18 @@
|
||||||
</section>
|
</section>
|
||||||
<main ng-class="{ 'active': masonryInit }">
|
<main ng-class="{ 'active': masonryInit }">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="col-xl-10 offset-xl-1">
|
|
||||||
<div class="commands" ng-cloak>
|
|
||||||
<pre><code class="hljs bash" ng-include="'templates/commands.html?v=COMMIT_HASH'"></code></pre>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row grid">
|
<div class="row grid">
|
||||||
<div class="grid-sizer col-xl-6"></div>
|
<div class="grid-sizer col-xl-6"></div>
|
||||||
<div class="grid-item col-xl-12 mb-3 text-center" ng-cloak>
|
<div class="grid-item col-xl-12 mb-3" ng-cloak>
|
||||||
|
<div ng-if="layout === 'default'" class="text-center">
|
||||||
<button class="btn btn-primary btn-sm btn-download" ng-click="downloadZip()"><img src="assets/img/download.svg" alt="Download"> Generated config <small>(.zip)</small></button>
|
<button class="btn btn-primary btn-sm btn-download" ng-click="downloadZip()"><img src="assets/img/download.svg" alt="Download"> Generated config <small>(.zip)</small></button>
|
||||||
<button class="btn btn-success btn-sm btn-download btn-base64" ng-mouseenter="prepareBase64()" ng-click="copyAsBase64()" ngclipboard data-clipboard-target="#base64-zip-line" ngclipboard-success="clipboardSuccess('base64-zip-line')"><img src="assets/img/download.svg" alt="Download"> Copy Base64 <small>(inline)</small></button>
|
<button class="btn btn-success btn-sm btn-download btn-base64" ng-mouseenter="prepareBase64()" ng-click="copyAsBase64()" ngclipboard data-clipboard-target="#base64-zip-line" ngclipboard-success="clipboardSuccess('base64-zip-line')"><img src="assets/img/download.svg" alt="Download"> Copy Base64 <small>(inline)</small></button>
|
||||||
</div>
|
</div>
|
||||||
|
<div ng-if="layout === 'do'" class="text-center buttons">
|
||||||
|
<button class="btn btn-success btn-download" ng-click="downloadZip()">Download Config</button>
|
||||||
|
<button class="btn btn-primary btn-download btn-base64" ng-mouseenter="prepareBase64()" ng-click="copyAsBase64()" ngclipboard data-clipboard-target="#base64-zip-line" ngclipboard-success="clipboardSuccess('base64-zip-line')">Copy Base64</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="base64-zip-line-container">
|
<div class="base64-zip-line-container">
|
||||||
<div id="base64-zip-line">{{ base64 }}</div>
|
<div id="base64-zip-line">{{ base64 }}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
<ul class="nav nav-pills nav-fill" role="tablist">
|
||||||
|
<li class="nav-item" ng-repeat="(key, _step) in steps" ng-class="[_step.slug, !_step.active() ? 'disabled' : '']">
|
||||||
|
<a class="nav-link" ng-class="{ active: key === step, visited: key < step }" ng-click="setActiveStep(key)">{{ _step.name }}</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div class="commands-do" ng-include="'partials/commands-do.html?v=COMMIT_HASH'" ng-cloak></div>
|
||||||
|
|
||||||
|
<div class="tab-navigation-buttons" ng-if="layout === 'do'">
|
||||||
|
<button class="btn btn-outline-secondary" ng-click="setStepBack()" ng-class="{ disabled: step === 0 }">Back</button>
|
||||||
|
<button class="btn btn-primary" ng-click="setStepNext()" ng-class="{ disabled: step === steps.length - 1 }">Next</button>
|
||||||
|
</div>
|
|
@ -1,30 +1,14 @@
|
||||||
<ol ng-attr-data-active-step="{{ activeStep }}">
|
<ol class="step-icons" ng-attr-data-active-step="{{ steps[step].slug }}">
|
||||||
<li
|
<li
|
||||||
class="download"
|
ng-repeat="(key, step) in steps"
|
||||||
ng-mouseenter="setActiveStep('download')">
|
ng-if="step.active()"
|
||||||
<div class="circle" ng-include="'/assets/img/download-cloud.svg'"></div>
|
ng-class="[step.slug]"
|
||||||
<span class="counter"></span>Download
|
ng-mouseenter="setActiveStep(key)">
|
||||||
</li>
|
<div class="circle" ng-include="'/assets/img/steps/' + step.slug + '.svg'"></div>
|
||||||
<li
|
<span class="counter"></span>{{ step.name }}
|
||||||
class="ssl"
|
|
||||||
ng-if="isHTTPS() && (isSSLDHRequired() || isCertLetsEncrypt())"
|
|
||||||
ng-mouseenter="setActiveStep('ssl')">
|
|
||||||
<div class="circle" ng-include="'/assets/img/lock.svg'"></div>
|
|
||||||
<span class="counter"></span>SSL init
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li
|
|
||||||
class="certbot"
|
|
||||||
ng-if="isHTTPS() && isCertLetsEncrypt()"
|
|
||||||
ng-mouseenter="setActiveStep('certbot')">
|
|
||||||
<div class="circle" ng-include="'/assets/img/terminal.svg'"></div>
|
|
||||||
<span class="counter"></span>Certbot
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li
|
|
||||||
class="live"
|
|
||||||
ng-mouseenter="setActiveStep('live')">
|
|
||||||
<div class="circle" ng-include="'/assets/img/check-circle.svg'"></div>
|
|
||||||
<span class="counter"></span>Go Live!
|
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
|
<div class="commands" ng-cloak>
|
||||||
|
<pre><code class="hljs bash" ng-include="'partials/commands.html?v=COMMIT_HASH'"></code></pre>
|
||||||
|
</div>
|
||||||
|
|
|
@ -370,6 +370,7 @@
|
||||||
$scope.site = 0;
|
$scope.site = 0;
|
||||||
$scope.tab_site = 0;
|
$scope.tab_site = 0;
|
||||||
$scope.tab_common = 0;
|
$scope.tab_common = 0;
|
||||||
|
$scope.step = 0;
|
||||||
|
|
||||||
$scope.tabs_site = [
|
$scope.tabs_site = [
|
||||||
{
|
{
|
||||||
|
@ -445,26 +446,36 @@
|
||||||
{
|
{
|
||||||
name: 'Download',
|
name: 'Download',
|
||||||
slug: 'download',
|
slug: 'download',
|
||||||
|
active: function() {
|
||||||
|
return true;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'SSL init',
|
name: 'SSL init',
|
||||||
slug: 'ssl',
|
slug: 'ssl',
|
||||||
|
active: function() {
|
||||||
|
return $scope.isHTTPS() && ($scope.isSSLDHRequired() || $scope.isCertLetsEncrypt());
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Cerbot',
|
name: 'Cerbot',
|
||||||
slug: 'certbot',
|
slug: 'certbot',
|
||||||
|
active: function() {
|
||||||
|
return $scope.isHTTPS() && $scope.isCertLetsEncrypt();
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Go Live!',
|
name: 'Go Live!',
|
||||||
slug: 'live',
|
slug: 'live',
|
||||||
|
active: function() {
|
||||||
|
return true;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
$scope.siteChanges = {};
|
$scope.siteChanges = {};
|
||||||
$scope.commonChanges = {};
|
$scope.commonChanges = {};
|
||||||
|
|
||||||
$scope.activeStep = 'download';
|
|
||||||
|
|
||||||
$scope.base64 = '';
|
$scope.base64 = '';
|
||||||
|
|
||||||
$scope.gzipTypes = 'text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml';
|
$scope.gzipTypes = 'text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml';
|
||||||
|
@ -711,9 +722,21 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.setActiveStep = function(step) {
|
$scope.setActiveStep = function(step) {
|
||||||
$scope.activeStep = step;
|
$scope.step = step;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
$scope.setStepBack = function() {
|
||||||
|
if ($scope.step > 0) {
|
||||||
|
$scope.step--;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.setStepNext = function() {
|
||||||
|
if ($scope.step < $scope.steps.length - 1) {
|
||||||
|
$scope.step++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$scope.getSiteChanges = function(site) {
|
$scope.getSiteChanges = function(site) {
|
||||||
if ($scope.siteChanges[site] === undefined) {
|
if ($scope.siteChanges[site] === undefined) {
|
||||||
return undefined;
|
return undefined;
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
main .file .code,
|
||||||
|
section.steps .commands {
|
||||||
|
overflow-x: auto;
|
||||||
|
font-size: 0.75rem;
|
||||||
|
line-height: 1.25;
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
border: 1px solid #e8e8e8;
|
||||||
|
|
||||||
|
pre {
|
||||||
|
margin-bottom: 0;
|
||||||
|
font-size: inherit;
|
||||||
|
|
||||||
|
code {
|
||||||
|
display: block;
|
||||||
|
padding: 8px 8px 12px;
|
||||||
|
-moz-tab-size: 4;
|
||||||
|
tab-size: 4;
|
||||||
|
overflow: visible;
|
||||||
|
overflow-x: visible;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -257,29 +257,6 @@ main {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.commands {
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
line-height: 1.35;
|
|
||||||
|
|
||||||
.step {
|
|
||||||
counter-reset: step-command-counter;
|
|
||||||
|
|
||||||
.counter {
|
|
||||||
display: inline-block;
|
|
||||||
margin-top: 0.15rem;
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
counter-increment: step-command-counter;
|
|
||||||
content: counter(step-command-counter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
& > span:first-of-type .counter {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.file {
|
.file {
|
||||||
margin-bottom: 2rem;
|
margin-bottom: 2rem;
|
||||||
|
|
||||||
|
@ -301,27 +278,4 @@ main {
|
||||||
left: -9999px;
|
left: -9999px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.commands,
|
|
||||||
.file .code {
|
|
||||||
overflow-x: auto;
|
|
||||||
font-size: 0.75rem;
|
|
||||||
line-height: 1.25;
|
|
||||||
background-color: #f8f8f8;
|
|
||||||
border: 1px solid #e8e8e8;
|
|
||||||
|
|
||||||
pre {
|
|
||||||
margin-bottom: 0;
|
|
||||||
font-size: inherit;
|
|
||||||
|
|
||||||
code {
|
|
||||||
display: block;
|
|
||||||
padding: 8px 8px 12px;
|
|
||||||
-moz-tab-size: 4;
|
|
||||||
tab-size: 4;
|
|
||||||
overflow: visible;
|
|
||||||
overflow-x: visible;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
section.steps {
|
section.steps {
|
||||||
ol {
|
ol.step-icons {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
list-style: none;
|
list-style: none;
|
||||||
|
@ -165,4 +165,27 @@ section.steps {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.commands {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
line-height: 1.35;
|
||||||
|
|
||||||
|
.step {
|
||||||
|
counter-reset: step-command-counter;
|
||||||
|
|
||||||
|
.counter {
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: 0.15rem;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
counter-increment: step-command-counter;
|
||||||
|
content: counter(step-command-counter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > span:first-of-type .counter {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
@import 'header';
|
@import 'header';
|
||||||
@import 'steps';
|
@import 'steps';
|
||||||
@import 'main';
|
@import 'main';
|
||||||
|
@import 'codes';
|
||||||
@import 'sidebar';
|
@import 'sidebar';
|
||||||
@import 'footer';
|
@import 'footer';
|
||||||
|
|
||||||
|
|
|
@ -56,6 +56,62 @@
|
||||||
background-color: #e5e5e5;
|
background-color: #e5e5e5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.nav-pills {
|
||||||
|
margin: 25px 0;
|
||||||
|
background-color: #ffffff;
|
||||||
|
border: 1px solid #dde1e8;
|
||||||
|
border-radius: 5px;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.nav-item {
|
||||||
|
&:first-child {
|
||||||
|
.nav-link {
|
||||||
|
|
||||||
|
border-top-left-radius: 3px;
|
||||||
|
border-bottom-left-radius: 3px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
.nav-link {
|
||||||
|
border-top-right-radius: 3px;
|
||||||
|
border-bottom-right-radius: 3px;
|
||||||
|
border-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.disabled {
|
||||||
|
pointer-events: none;
|
||||||
|
user-select: none;
|
||||||
|
opacity: 0.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-link {
|
||||||
|
cursor: pointer;
|
||||||
|
position: relative;
|
||||||
|
border-right: 1px solid #dde1e8;
|
||||||
|
border-radius: 0;
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
background-color: #0069ff;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.visited {
|
||||||
|
background-color: #dfeeff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.tab-navigation-buttons {
|
||||||
|
margin: 20px 0 32px;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
header {
|
header {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
background-color: #031b4e;
|
background-color: #031b4e;
|
||||||
|
@ -220,44 +276,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-pills {
|
.nav-pills .nav-item .nav-link {
|
||||||
margin: 25px 0;
|
|
||||||
background-color: #ffffff;
|
|
||||||
border: 1px solid #dde1e8;
|
|
||||||
border-radius: 5px;
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
.nav-item {
|
|
||||||
&:first-child {
|
|
||||||
.nav-link {
|
|
||||||
|
|
||||||
border-top-left-radius: 3px;
|
|
||||||
border-bottom-left-radius: 3px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
.nav-link {
|
|
||||||
border-top-right-radius: 3px;
|
|
||||||
border-bottom-right-radius: 3px;
|
|
||||||
border-right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-link {
|
|
||||||
cursor: pointer;
|
|
||||||
position: relative;
|
|
||||||
border-right: 1px solid #dde1e8;
|
|
||||||
border-radius: 0;
|
|
||||||
|
|
||||||
&.active {
|
|
||||||
background-color: #0069ff;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.changed {
|
&.changed {
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
|
|
||||||
|
@ -272,10 +291,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.visited {
|
|
||||||
background-color: #dfeeff;
|
|
||||||
}
|
|
||||||
|
|
||||||
small {
|
small {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
|
@ -288,8 +303,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-group {
|
.form-group {
|
||||||
.form-control-sm,
|
.form-control-sm,
|
||||||
|
@ -324,11 +337,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.tab-navigation-buttons {
|
|
||||||
margin: 20px 0 32px;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-outline-light {
|
.btn-outline-light {
|
||||||
box-shadow: none !important;
|
box-shadow: none !important;
|
||||||
color: #666;
|
color: #666;
|
||||||
|
@ -354,4 +362,44 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
section.steps {
|
||||||
|
margin-top: 53px;
|
||||||
|
margin-bottom: 37px;
|
||||||
|
|
||||||
|
.card {
|
||||||
|
border: 1px solid #dee2e6;
|
||||||
|
background-color: #fafafa;
|
||||||
|
padding: 0.5rem 40px 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.commands-do {
|
||||||
|
ol {
|
||||||
|
li + li{
|
||||||
|
margin-top: 1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
code {
|
||||||
|
background-color: #e5e8ed;
|
||||||
|
color: #3b4e76;
|
||||||
|
border: 1px solid #cbcdd3;
|
||||||
|
border-radius: 3px;
|
||||||
|
font-style: italic;
|
||||||
|
padding-left: 3px;
|
||||||
|
padding-right: 3px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main .buttons {
|
||||||
|
margin-bottom: 30px;
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
margin: 0 10px;
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 1rem;
|
||||||
|
padding-top: 0.5rem;
|
||||||
|
padding-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|