Move new site into src folder
19
Caddyfile
|
@ -3,15 +3,22 @@ localhost
|
|||
root * src
|
||||
|
||||
file_server
|
||||
templates
|
||||
encode gzip
|
||||
templates {
|
||||
extensions {
|
||||
hitCounter {
|
||||
style bright_green
|
||||
pad_digits 6
|
||||
}
|
||||
}
|
||||
}
|
||||
encode zstd gzip
|
||||
|
||||
try_files {path}.html {path}
|
||||
|
||||
redir /docs/json /docs/json/
|
||||
redir /docs/modules /docs/modules/
|
||||
rewrite /docs/json/* /docs/json/index.html
|
||||
redir /docs/json /docs/json/
|
||||
redir /docs/modules /docs/modules/
|
||||
rewrite /docs/json/* /docs/json/index.html
|
||||
rewrite /docs/modules/* /docs/modules/index.html
|
||||
rewrite /docs/* /docs/index.html
|
||||
rewrite /docs/* /docs/index.html
|
||||
|
||||
reverse_proxy /api/* localhost:4444
|
||||
|
|
|
@ -6,7 +6,8 @@ This is the source of the Caddy website, [caddyserver.com](https://caddyserver.c
|
|||
|
||||
## Requirements
|
||||
|
||||
- Caddy 2 (installed in your PATH as `caddy`)
|
||||
- Caddy v2.7.6 or newer (installed in your PATH as `caddy`)
|
||||
- To display the retro hit counter (just for fun), the [caddy-hitcounter](https://github.com/mholt/caddy-hitcounter) plugin.
|
||||
|
||||
|
||||
## Quick start
|
||||
|
|
|
@ -4,7 +4,14 @@
|
|||
|
||||
localhost {
|
||||
file_server
|
||||
templates
|
||||
templates {
|
||||
extensions {
|
||||
hitCounter {
|
||||
style bright_green
|
||||
pad_digits 6
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
try_files {path}.html {path}
|
||||
|
||||
|
|
|
@ -1,49 +0,0 @@
|
|||
<footer>
|
||||
<div class="wrapper">
|
||||
<div class="logo-area">
|
||||
<img src="/resources/images/logo-dark.svg" class="logo" alt="Caddy web server">
|
||||
<p>
|
||||
A free <a href="https://github.com/caddyserver/caddy">open source</a> project
|
||||
that relies on <a href="/sponsor">sponsors</a>.
|
||||
</p>
|
||||
<p>
|
||||
<a href="https://usefathom.com/ref/AUKNWU">Privacy-respecting analytics</a> by Fathom
|
||||
</p>
|
||||
<br>
|
||||
<p>
|
||||
© {{now | date "2006"}} ZeroSSL. All rights reserved.
|
||||
</p>
|
||||
</div>
|
||||
<div class="link-col">
|
||||
<div class="col-header">Project</div>
|
||||
<a href="/features">Features</a>
|
||||
<a href="/download">Download</a>
|
||||
<a href="/docs">Documentation</a>
|
||||
</div>
|
||||
<div class="link-col">
|
||||
<div class="col-header">Business services</div>
|
||||
<a href="/support">Support</a>
|
||||
<a href="/sponsor">Sponsorships</a>
|
||||
</div>
|
||||
<div class="link-col">
|
||||
<div class="col-header">Community</div>
|
||||
<a href="https://caddy.community">Forum</a>
|
||||
<a href="https://github.com/caddyserver">GitHub</a>
|
||||
<a href="https://twitter.com/caddyserver">Twitter / X</a>
|
||||
<a href="https://scholar.google.com/scholar?q=caddy+web+server">Research</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wrapper nostalgia">
|
||||
<p>Caddy supports an open Web that promotes privacy, preserves data ownership, fosters innovation, freely allows varieties of client software, and safeguards human sanctity.</p>
|
||||
<div class="nostalgia-badges">
|
||||
<img src="/resources/images/nostalgia/get.gif" title="Honoring early Web clients">
|
||||
<img src="/resources/images/nostalgia/microsoft-ie.gif" title="Honoring early Web clients">
|
||||
<img src="/resources/images/nostalgia/now_anim.gif" title="Honoring early Web clients">
|
||||
<div class="w3c">
|
||||
<img src="/resources/images/nostalgia/valid_html5_yellow.png" title="This site uses HTML 5">
|
||||
<img src="/resources/images/nostalgia/valid_css3_blue.png" title="This site uses CSS 3">
|
||||
</div>
|
||||
<div title="Don't forget to sign our guestbook!">{{ maybe "hitCounter" .OriginalReq.URL.Path }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
715
new/index.html
|
@ -1,715 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Caddy - The Ultimate Server with Automatic HTTPS</title>
|
||||
{{import "/includes/head.html"}}
|
||||
{{template "head"}}
|
||||
<link rel="stylesheet" href="/resources/css/vendor/asciinema-player-3.6.1.css{{template "cacheBust"}}">
|
||||
<script src="/resources/js/vendor/asciinema-player-3.6.1.min.js{{template "cacheBust"}}"></script>
|
||||
<script src="/resources/js/home.js{{template "cacheBust"}}"></script>
|
||||
|
||||
<link rel="stylesheet" href="/resources/css/marketing.css{{template "cacheBust"}}">
|
||||
<link rel="stylesheet" href="/resources/css/home.css{{template "cacheBust"}}">
|
||||
|
||||
<!-- <meta property="og:title" content="Caddy 2 - The Ultimate Server with Automatic HTTPS">
|
||||
<meta name="twitter:title" value="Caddy 2 - The Ultimate Server with Automatic HTTPS"> -->
|
||||
</head>
|
||||
<body>
|
||||
<div class="hero">
|
||||
{{include "/includes/header.html" "dark-header"}}
|
||||
|
||||
<div class="wrapper">
|
||||
<div class="hero-content">
|
||||
<div class="asides">
|
||||
<div>
|
||||
<h1>
|
||||
<div class="color-dodge">
|
||||
<div class="the">The</div>
|
||||
Ultimate Server
|
||||
</div>
|
||||
<div class="subheading">
|
||||
makes your sites more <b>secure</b>, more <b>reliable</b>, and more <b>scalable</b> than any other solution.
|
||||
</div>
|
||||
</h1>
|
||||
|
||||
<div class="action-buttons">
|
||||
<a href="/download" class="button primary">Download</a>
|
||||
<a href="/docs/" class="button cool">Docs<sh></sh></a>
|
||||
<iframe src="https://ghbtns.com/github-btn.html?user=caddyserver&repo=caddy&type=star&count=true&size=large" frameborder="0" scrolling="0" width="160px" height="30px" class="github-stars"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="display right">
|
||||
<div class="caption">
|
||||
<div id="video-demo"></div>
|
||||
Play screencast to see Caddy serve HTTPS in < 1 minute.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sponsors-leaders">
|
||||
<!-- <h3>Trusted, used, and sponsored by <b>leaders</b></h3> -->
|
||||
<h3>Sponsored by <b>leaders</b></h3>
|
||||
|
||||
<!--
|
||||
Images are not in any particular order except the top row is featured (higher-tier) sponsors.
|
||||
Images are individually adjusted to appear roughly equally sized and weighted along their row.
|
||||
-->
|
||||
|
||||
<div class="sponsor-logos">
|
||||
<a href="https://zerossl.com" target="_blank">
|
||||
<img src="/resources/images/sponsors/zerossl.svg" alt="ZeroSSL" title="ZeroSSL" height="45">
|
||||
</a>
|
||||
<a href="https://stripe.com" target="_blank">
|
||||
<img src="/resources/images/sponsors/stripe.svg" alt="Stripe" title="Stripe" class="featured" height="45">
|
||||
</a>
|
||||
</div>
|
||||
<div class="sponsors-divider"></div>
|
||||
<div class="sponsor-logos">
|
||||
<a href="https://opensource.mercedes-benz.com/" target="_blank">
|
||||
<img src="/resources/images/sponsors/mercedes-benz.svg" alt="Mercedes-Benz" title="Mercedes-Benz" height="38">
|
||||
</a>
|
||||
<a href="https://tailscale.com" target="_blank">
|
||||
<img src="/resources/images/sponsors/tailscale.svg" alt="Tailscale" title="Tailscale" height="22">
|
||||
</a>
|
||||
<a href="https://les-tilleuls.coop/" target="_blank">
|
||||
<img src="/resources/images/sponsors/les-tilleuls-white.svg" alt="Les-Tilleuls" title="Les-Tilleuls" height="25">
|
||||
</a>
|
||||
<a href="https://framer.com" target="_blank">
|
||||
<img src="/resources/images/sponsors/framer.svg" alt="Framer" title="Framer" height="32">
|
||||
</a>
|
||||
<a href="https://sourcegraph.com/" target="_blank">
|
||||
<img src="/resources/images/sponsors/sourcegraph.svg" alt="Sourcegraph" title="Sourcegraph" height="30">
|
||||
</a>
|
||||
<a href="https://fusionauth.com" target="_blank">
|
||||
<img src="/resources/images/sponsors/fusionauth.svg" alt="FusionAuth" title="FusionAuth" height="35">
|
||||
</a>
|
||||
<a href="https://www.aryeo.com" target="_blank">
|
||||
<img src="/resources/images/sponsors/aryeo.svg" alt="Aryeo" title="Aryeo" height="26">
|
||||
</a>
|
||||
<a href="https://checklyhq.com" target="_blank">
|
||||
<img src="/resources/images/sponsors/checkly.svg" alt="Checkly" title="Checkly" height="24" style="position: relative; top: 3px;">
|
||||
</a>
|
||||
<a href="https://appcove.com/" target="_blank">
|
||||
<img src="/resources/images/sponsors/appcove.png" alt="AppCove" title="AppCove" height="24">
|
||||
</a>
|
||||
<a href="https://www.transistor.fm" target="_blank">
|
||||
<img src="/resources/images/sponsors/transistorfm.svg" alt="Transistor" title="Transistor" height="32">
|
||||
</a>
|
||||
<a href="https://photostructure.com/" target="_blank">
|
||||
<img src="/resources/images/sponsors/photostructure.svg" alt="PhotoStructure" title="PhotoStructure" height="30">
|
||||
</a>
|
||||
<a href="https://gitea.com/" target="_blank">
|
||||
<img src="/resources/images/sponsors/gitea.svg" alt="Gitea" title="Gitea" height="25">
|
||||
</a>
|
||||
<a href="https://aniftyco.com/" target="_blank">
|
||||
<img src="/resources/images/sponsors/niftyco.svg" alt="Niftyco" title="Niftyco" height="25">
|
||||
</a>
|
||||
<a href="https://iqm.com/" target="_blank">
|
||||
<img src="/resources/images/sponsors/iqm.svg" alt="IQM" title="IQM" height="24">
|
||||
</a>
|
||||
<a href="https://approximated.app/" target="_blank">
|
||||
<img src="/resources/images/sponsors/approximated.svg" alt="Approximated" title="Approximated" height="20">
|
||||
</a>
|
||||
<a href="/sponsor" class="button purple">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-new-section" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M9 12l6 0"></path>
|
||||
<path d="M12 9l0 6"></path>
|
||||
<path d="M4 6v-1a1 1 0 0 1 1 -1h1m5 0h2m5 0h1a1 1 0 0 1 1 1v1m0 5v2m0 5v1a1 1 0 0 1 -1 1h-1m-5 0h-2m-5 0h-1a1 1 0 0 1 -1 -1v-1m0 -5v-2m0 -5"></path>
|
||||
</svg>
|
||||
Join the ranks
|
||||
</a>
|
||||
</div>
|
||||
<!-- <a href="#">Why a sponsorship</a> -->
|
||||
<!-- <a href="/sponsor" class="button purple">Sponsorship info</a> -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<main>
|
||||
|
||||
<div class="wavy-top">
|
||||
<div class="bgtext">
|
||||
Every<br>
|
||||
<span class="site-on">site on</span><br>
|
||||
HTTPS
|
||||
</div>
|
||||
<h2 id="every-site-https">
|
||||
<b>By default, </b>Caddy <b>automatically obtains</b> and <b>renews</b> TLS certificates for <b>all your sites.</b>
|
||||
</h2>
|
||||
|
||||
<div class="wrapper feature cols">
|
||||
<div class="col">
|
||||
<h3 class="purple">HTTPS/TLS for custom domains</h3>
|
||||
<p>
|
||||
The secret sauce of almost every white-label SaaS is Caddy's original On-Demand TLS feature. Grow your SaaS business by orders of magnitude with ease!
|
||||
</p>
|
||||
</div>
|
||||
<div class="col">
|
||||
<h3 class="green">Dynamically provision certificates</h3>
|
||||
<p>
|
||||
With On-Demand TLS, only Caddy obtains, renews, and maintains certificates on-the-fly during TLS handshakes. Perfect for customer-owned domains.
|
||||
</p>
|
||||
</div>
|
||||
<div class="col">
|
||||
<h3 class="blue">Massively scale your TLS</h3>
|
||||
<p>
|
||||
Other web servers and scripted certificate tools fall over with hundreds of thousands of sites or thousands of instances. Caddy is designed to manage certificates reliably at this scale.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="wrapper">
|
||||
<div class="sponsorship-primer">
|
||||
<h3>sponsored by <b>users like you</b></h3>
|
||||
<p>
|
||||
Caddy is free software and relies on sponsorships to survive. Not just donations: sponsorships ensure ongoing development and provide your business with tangible benefits.
|
||||
</p>
|
||||
<a href="/sponsor" class="button purple">See sponsorships</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<section class="light">
|
||||
<div class="section-upset">
|
||||
<div class="wrapper">
|
||||
<h2 id="most-advanced">The <b>most advanced</b> HTTPS server <b>in the world</b></h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wrapper">
|
||||
|
||||
<div class="feature cols">
|
||||
<div class="col">
|
||||
<h3 class="green">All you need for TLS and PKI 🔐</h3>
|
||||
<p>
|
||||
Caddy securely serves all sites with TLS by default. It can also manage your internal PKI for you across a fleet of servers and clients.
|
||||
</p>
|
||||
</div>
|
||||
<div class="col">
|
||||
<h3 class="purple">On-line config API ⚡️</h3>
|
||||
<p>
|
||||
Caddy's native configuration is a JSON document that you can export and manipulate with a RESTful config API.
|
||||
</p>
|
||||
</div>
|
||||
<div class="col">
|
||||
<h3 class="blue">PCI, HIPAA, and NIST compliant ✅</h3>
|
||||
<p>
|
||||
Caddy's TLS defaults are secure and pass PCI, HIPAA, and NIST compliance requirements. Yes, defaults: no hassle required.
|
||||
</p>
|
||||
</div>
|
||||
<div class="col">
|
||||
<h3 class="purple">HTTPS for localhost 🏠</h3>
|
||||
<p>
|
||||
We mean it when we say Caddy serves every site on HTTPS. Even localhost and internal IPs are served with TLS using the intermediate of a fully-automated, self-managed CA that is automatically installed into most local trust stores.
|
||||
</p>
|
||||
</div>
|
||||
<div class="col">
|
||||
<h3 class="blue">Cluster coordination 🌐</h3>
|
||||
<p>
|
||||
Simply configure multiple Caddy instances with the same storage, and they will automatically coordinate certificate management as a fleet and share resources such as keys and OCSP staples!
|
||||
</p>
|
||||
</div>
|
||||
<div class="col">
|
||||
<h3 class="green">Fewer moving parts ⚙️</h3>
|
||||
<p>
|
||||
Simplify your infrastructure! Caddy saves money, increases developer productivity, and reduces problems in production.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="demobox">
|
||||
<h2 id="on-demand-demo" lang="de">Experience it</h2>
|
||||
<p>
|
||||
<b>Discover Caddy's automagic HTTPS features with our hosted demo.</b>
|
||||
</p>
|
||||
<p>
|
||||
Point DNS records for any subdomain named <b><code>caddydemo</code></b> to either:
|
||||
</p>
|
||||
<p class="demo-ips">
|
||||
<code>
|
||||
<span class="record-type">CNAME</span>
|
||||
<span class="demo-ip">demo.caddyserver.com</span>
|
||||
</code>
|
||||
</p>
|
||||
<p class="or">
|
||||
or:
|
||||
</p>
|
||||
<p class="demo-ips">
|
||||
<code>
|
||||
<span class="record-type">A</span>
|
||||
<span class="demo-ip">138.68.4.62</span>
|
||||
</code>
|
||||
<code>
|
||||
<span class="record-type">AAAA</span>
|
||||
<span class="demo-ip">2604:a880:2:d0::9dd:9001</span>
|
||||
</code>
|
||||
</p>
|
||||
<p>
|
||||
Then <b>visit it</b> in your browser.
|
||||
</p>
|
||||
<p>
|
||||
You'll notice how Caddy <b>provisions a certificate</b> for your domain <b>automatically.</b>
|
||||
</p>
|
||||
<div class="demo-help">
|
||||
<p>
|
||||
<b>Not working?</b> Make sure to use a direct subdomain of a registered domain, not a "sub-subdomain."
|
||||
Verify you have created the public DNS records shown above with the correct values.
|
||||
You may have to allow time for propagation. Consult your DNS provider's documentation or support for assistance.
|
||||
Your browser/client must set the TLS ServerName indication (most do).
|
||||
</p>
|
||||
<p>
|
||||
<b>Example subdomains that could work:</b> <code>caddydemo.example.net</code>, <code>caddydemo.example.com.au</code>
|
||||
</p>
|
||||
<p>
|
||||
Caddy is capable of serving TLS for any domains and IPs. This demo is intentionally restricted.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="diagonal up light gray feature">
|
||||
<div class="wrapper">
|
||||
|
||||
<h2 id="your-own-pki">Deploy your own PKI with Caddy</h2>
|
||||
<p>
|
||||
Not only is Caddy the industry leader in certificate automation, it also sports a fully-featured PKI suite for your own fully-automated internal PKI and private CAs.
|
||||
</p>
|
||||
<!-- <p>
|
||||
Caddy will serve your localhost and internal sites over HTTPS using its own CA. And you can create your own CA to issue certs across your infrastructure. It has a built-in ACME server, powered by Smallstep, to automate your private PKI reliably at scale.
|
||||
</p> -->
|
||||
<p>
|
||||
Powered by open source <a href="https://smallstep.com/certificates/">Smallstep libraries</a>, Caddy becomes a self-managing certificate authority.
|
||||
</p>
|
||||
|
||||
|
||||
<div class="asides">
|
||||
<div>
|
||||
<div class="display left">
|
||||
{{ markdown (include "/includes/examples/local-https.md") }}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="purple">Internal and localhost certificates</h3>
|
||||
<p>
|
||||
If you configure sites with local or internal addresses, Caddy will serve them over HTTPS using a locally-trusted certificate authority with short-lived, auto-renewing certificates. It even offers to install your unique root into your local trust stores for you.
|
||||
</p>
|
||||
<a href="https://smallstep.com" title="Powered by Smallstep"><img src="/resources/images/sponsors/smallstep.svg" alt="Smallstep" class="smallstep"></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="asides">
|
||||
<div>
|
||||
<h3 class="blue">Make and use your own CAs</h3>
|
||||
<p>
|
||||
Caddy lets you define as many CAs as you need. Root and intermediate keys are generated automatically, and intermediates are renewed before they expire.
|
||||
</p>
|
||||
<p>
|
||||
Deploy an instance to act as an ACME server. Then other Caddy instances can use it for their certificates.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<div class="display right">
|
||||
{{ markdown (include "/includes/examples/custom-ca.md") }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="asides">
|
||||
<div>
|
||||
<div class="display left">
|
||||
{{ markdown (include "/includes/examples/json-automate-certs.md") }}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="green">Keep certificates renewed</h3>
|
||||
<p>
|
||||
Caddy is more than just a web server. For example, this config is all it takes to obtain and renew certificates for a set of domain names.
|
||||
</p>
|
||||
<p>
|
||||
Additional config can be written to wire up certificate maintenance events, which can then be used to integrate with external scripts and tooling.
|
||||
</p>
|
||||
<!-- <p>
|
||||
Caddy 2 is a <a href="/docs/extending-caddy">highly extensible</a>, self-hosted platform on which you can build, configure, and deploy long-running services ("apps").
|
||||
</p>
|
||||
<p>
|
||||
Caddy ships with apps for an <a href="/docs/modules/http">HTTPS server</a> (static files, reverse proxying, load balancing, etc.), <a href="/docs/modules/tls">TLS certificate manager</a>, and <a href="/docs/modules/pki">fully-managed internal PKI</a>. Caddy apps collaborate to make complex infrastructure just work with fewer moving parts.
|
||||
</p>
|
||||
<p>
|
||||
<b>For example, the config shown here keeps your TLS certificates renewed for other programs to use;</b> no external tools or HTTP daemon required!
|
||||
</p>
|
||||
<p>
|
||||
Providing a unified configuration, on-line <a href="/docs/api">config API</a>, and <a href="/docs/json/">automatic documentation</a> for all apps, Caddy is nearly infinitely extensible. Thanks to its unique <a href="/docs/architecture">modular architecture</a>, we can offer unlimited features without bloating the code base.
|
||||
</p> -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- <div class="action-buttons">
|
||||
<a href="/download" class="button primary">Download</a>
|
||||
<a href="/docs/" class="button secondary">Docs<sh></sh></a>
|
||||
</div> -->
|
||||
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="light feature">
|
||||
<div class="wrapper">
|
||||
<h2 id="experts-recommend">Recommended by experts</h2>
|
||||
<p>
|
||||
Academic and industry experts recommend Caddy, which has been cited in peer-reviewed journals for its security defaults, best practices, and its uniquely advanced feature set.
|
||||
</p>
|
||||
<div class="cols">
|
||||
<div class="col">
|
||||
<a href="https://doi.org/10.1145/3319535.3363192"><img src="/resources/images/cites/aas.png" class="cite"></a>
|
||||
<p>
|
||||
"Servers running Caddy exhibit nearly ubiquitous HTTPS deployment and use modern TLS configurations. ... We hope to see other popular server software follow Caddy's lead."
|
||||
</p>
|
||||
<p class="cite">
|
||||
—<b>Josh Aas, Richard Barnes, Benton Case, Zakir Durumeric, Peter Eckersley, Alan Flores-López, J. Alex Halderman, Jacob Hoffman-Andrews, James Kasten, Eric Rescorla, Seth Schoen, and Brad Warren.</b> 2019. <i>Let's Encrypt: An Automated Certificate Authority to Encrypt the Entire Web.</i> In Proceedings of the 2019 ACM SIGSAC Conference on Computer and Communications Security (CCS '19). Association for Computing Machinery, New York, NY, USA, 2473–2487. <a href="https://doi.org/10.1145/3319535.3363192">https://doi.org/10.1145/3319535.3363192</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="col">
|
||||
<a href="https://www.usenix.org/conference/usenixsecurity17/technical-sessions/presentation/krombholz"><img src="/resources/images/cites/krombholz.png" class="cite"></a>
|
||||
<p>
|
||||
"TLS must be enabled by default ... and the Caddy web server is a good and usable example."
|
||||
</p>
|
||||
<p class="cite">
|
||||
—<b>Katharina Krombholz, Wilfried Mayer, Martin Schmiedecker, and Edgar Weippl.</b> 2017. <i>"I Have No Idea What I'm Doing" - On the Usability of Deploying HTTPS.</i> In 26th USENIX Security Symposium (USENIX Security 17), USENIX Association, Vancouver, BC, 1339-1356. Retrieved from <a href="https://www.usenix.org/conference/usenixsecurity17/technical-sessions/presentation/krombholz">https://www.usenix.org/conference/usenixsecurity17/technical-sessions/presentation/krombholz</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="col">
|
||||
<a href="https://doi.org/10.1145/2987443.2987480"><img src="/resources/images/cites/springall.png" class="cite"></a>
|
||||
<p>
|
||||
"No popular server software does [session ticket key rotation], with the exception of Caddy."
|
||||
</p>
|
||||
<p class="cite">
|
||||
—<b>Drew Springall, Zakir Durumeric, and J. Alex Halderman.</b> 2016. <i>Measuring the Security Harm of TLS Crypto Shortcuts.</i> In Proceedings of the 2016 Internet Measurement Conference (IMC '16), Association for Computing Machinery, Santa Monica, California, USA, 33-47. <a href="https://doi.org/10.1145/2987443.2987480">https://doi.org/10.1145/2987443.2987480</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="diagonal down dark feature">
|
||||
<div class="wrapper">
|
||||
<h2 id="reverse-proxy">A forward-thinking reverse proxy</h2>
|
||||
<p>
|
||||
Caddy's proxy was designed to be as forward-compatible as possible and has major batteries included: load balancing, active and passive health checks, dynamic upstreams, retries, pluggable transports, and of course, best-in-class TLS security.
|
||||
</p>
|
||||
|
||||
|
||||
<div class="asides asides-40-60">
|
||||
<div class="spacing">
|
||||
<div class="rollover" data-rollover="rollover-php">
|
||||
<h3 class="green">Proxy HTTP, FastCGI, WebSockets, and more</h3>
|
||||
<p>
|
||||
Capable of proxying HTTP and HTTPS, but also WebSockets, gRPC, FastCGI (usually PHP), and more! The underlying transport module is extensible for any custom way to generate an HTTP response.
|
||||
</p>
|
||||
</div>
|
||||
<div class="rollover" data-rollover="rollover-dynamic-backends">
|
||||
<h3 class="purple">Dynamic backends</h3>
|
||||
<p>
|
||||
Provide Caddy with a static list of backends or enable a module to retrieve backends dynamically during each request: ideal for rapidly changing environments. Caddy flows with your infrastructure!
|
||||
</p>
|
||||
</div>
|
||||
<div class="rollover" data-rollover="rollover-ha">
|
||||
<h3 class="blue">High availability</h3>
|
||||
<p>
|
||||
Caddy comes with a whole suite of high availability (HA) features: advanced health checking, graceful (hitless) config changes, circuit breaking, load limiting, on-line retries, and more. The best part? It's all free. No enterprise-level paywalls.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="display right dark">
|
||||
{{ markdown (include "/includes/examples/proxy.md") }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="cols">
|
||||
<div class="col">
|
||||
<div class="sponsorship-primer">
|
||||
<h3>software <b>assurance</b></h3>
|
||||
<p>
|
||||
Without sponsorships, Caddy could stop being developed at any time.
|
||||
With sponsorships, you gain peace of mind knowing that the project will continue to be developed, along with tangible benefits like private support and training.
|
||||
</p>
|
||||
<a href="/sponsor" class="button purple">See sponsorships</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div class="sponsor-experience stripe">
|
||||
<img src="/resources/images/sponsors/stripe.svg" class="experience-logo">
|
||||
<div class="experience-content">
|
||||
<div class="experience-quote">
|
||||
"With its extensible architecture and on-line config API, Caddy powers many of Stripe's internal systems."
|
||||
</div>
|
||||
<!-- <div class="experience-credit">
|
||||
<img src="https://preview.tabler.io/static/avatars/002m.jpg" class="experience-picture">
|
||||
<cite>
|
||||
<b>Sean Lin</b>
|
||||
Example product manager
|
||||
</cite>
|
||||
</div> -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<h2 id="file-server">Production-grade static file server</h2>
|
||||
<p>
|
||||
Serving static files is a tried-and-true method of delivering sites to numerous clients efficiently. Caddy has a robust file server that can be combined with other middleware features for the ultimate effortless website.
|
||||
</p>
|
||||
|
||||
|
||||
<div class="asides asides-40-60">
|
||||
<div class="spacing">
|
||||
<div class="rollover" data-rollover="rollover-compress">
|
||||
<h3 class="blue">Compression</h3>
|
||||
<p>
|
||||
Caddy can compress files on-the-fly or serve precompressed files for extra performance. Caddy is also the first web server to support Zstandard encoding.
|
||||
</p>
|
||||
</div>
|
||||
<div class="rollover" data-rollover="rollover-vfs">
|
||||
<h3 class="green">Virtual file systems</h3>
|
||||
<p>
|
||||
Serve your static site from anything: the local file system, remote cloud storage, a database, or even embedded in the server binary!
|
||||
</p>
|
||||
</div>
|
||||
<div class="rollover" data-rollover="rollover-range">
|
||||
<h3 class="yellow">Range requests, Etags, and more</h3>
|
||||
<p>
|
||||
Unlike many ad-hoc file servers intended for temporary local development, Caddy fully supports Range requests, Etags, and a full production feature set.
|
||||
</p>
|
||||
</div>
|
||||
<div class="rollover" data-rollover="rollover-browse">
|
||||
<h3 class="purple">Directory file browser</h3>
|
||||
<p>
|
||||
If a directory without an index file is requested, Caddy can show an elegant file browser with breadcrumb nav, file size visualizations, filetype icons, and a grid view.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="display right light">
|
||||
{{ markdown (include "/includes/examples/file-server.md") }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="cols rollover" data-rollover="rollover-browse">
|
||||
<div class="col">
|
||||
<img src="/resources/images/file-browser/browse-themes.png" class="gallery">
|
||||
</div>
|
||||
<div class="col">
|
||||
<img src="/resources/images/file-browser/browse-gallery-light.png" class="gallery">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="light feature">
|
||||
<div class="wrapper">
|
||||
<h2 id="flexible-config">Flexible configuration compatible with any workflow</h2>
|
||||
<p>
|
||||
Configure your server your way. Caddy's native configuration format is JSON, and with Caddy's config adapters, you can use any config format you prefer. All configuration is posted through a RESTful admin API, and Caddy's CLI helps you work with config files easily.
|
||||
</p>
|
||||
|
||||
|
||||
<div class="asides">
|
||||
<div>
|
||||
<div class="display left">
|
||||
<code class="dark">$ caddy start --config caddy.json
|
||||
|
||||
$ curl localhost:2019/id/my_handler \
|
||||
-X PATCH \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"handler": "static_response",
|
||||
"body": "Work smarter, not harder."
|
||||
}'
|
||||
|
||||
$ curl localhost:2019/config/ | jq<div class="blinking"></div></code>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h3>JSON config API</h3>
|
||||
<p>
|
||||
Caddy's native config format is JSON, giving you incredible power and flexibility for automated, large-scale deployments.
|
||||
<p>
|
||||
Make dynamic config changes through an <a href="/docs/api">intuitive, programmable REST API</a> that offers ACID guarantees. It is also <b>safely scoped</b>, meaning that the URI path restricts changes, making it impossible to accidentally alter other parts of your config.
|
||||
</p>
|
||||
<!-- <ul>
|
||||
<li><b>Atomic:</b> Multiple changes in a single request are treated as a single unit; any failed change aborts all the other changes.</li>
|
||||
<li><b>Consistent:</b> No invalid configurations can be loaded; your server will never break if a problem is detected at config load.</li>
|
||||
<li><b>Isolated:</b> No config changes rely on another. (It helps that HTTP is a stateless protocol!)</li>
|
||||
<li><b>Durable:</b> Caddy automatically persists the current, valid configuration to disk and can safely resume it after a power cycle if the <code>--resume</code> flag is used.</li>
|
||||
</ul> -->
|
||||
<!-- <a href="/docs/api-tutorial" class="cyan button">API <b>tutorial</b></a>
|
||||
|
||||
<a href="/docs/api" class="gray button">API <b>reference</b></a> -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="asides">
|
||||
<div>
|
||||
<h3>Caddyfile</h3>
|
||||
<p>
|
||||
Although JSON offers ultimate control, most people prefer to use a <a href="/docs/caddyfile">Caddyfile</a> because it lets you get a production-ready site up and running in just a few hand-written lines. It's not uncommon for Caddyfiles to be <a href="https://twitter.com/bwesterb/status/1708903488426512668">just ~15-25% the size of a less-capable nginx config</a>.
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<div class="display right light">
|
||||
{{ markdown (include "/includes/examples/website-caddyfile.md") }}
|
||||
<div class="caption">Actual config used by this site.</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="asides">
|
||||
<div>
|
||||
<div class="display left">
|
||||
<code class="dark">$ caddy run \
|
||||
--config nginx.conf \
|
||||
--adapter nginx<div class="blinking"></div></code>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h3>Config adapters</h3>
|
||||
<p>
|
||||
Power Caddy with anything, even NGINX config files!
|
||||
</p>
|
||||
<p>
|
||||
With first-class support for <a href="/docs/config-adapters">config adaptation</a>, you can configure your web server with your favorite format: YAML, TOML, CUE, NGINX, HCL, Dhall, JSON with comments, or even a MySQL database... or anything else. The Caddyfile is a built-in config adapter.
|
||||
</p>
|
||||
<!-- <p>
|
||||
Fewer moving parts means fewer failures, lower costs, and less sunk time.
|
||||
</p> -->
|
||||
<!-- <a href="/docs/config-adapters" class="gray button">Config adapters</a> -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
<section class="diagonal up light gray feature">
|
||||
<div class="wrapper">
|
||||
<h2 id="extensibility">Unparalleled extensibility</h2>
|
||||
<p>
|
||||
Caddy is the only server in the world with its novel, modular architecture. At its core, Caddy is a configuration manager that runs apps like an HTTP server, internal certificate authority, TLS certificate manager, process supervisor, and more.
|
||||
</p>
|
||||
<p>
|
||||
And because of its unique design, we can offer unlimited features without bloating the code base. Only compile in what you need.
|
||||
</p>
|
||||
<div class="cols">
|
||||
<div class="col">
|
||||
<h3 class="green"><a href="https://i.giphy.com/media/xUA7ba9aksCuKR9dgA/giphy.webp" target="_blank" title="Important visualization">Unlimited power</a></h3>
|
||||
<p>
|
||||
Nearly every part of the config that "does something" is pluggable. Caddy offers unlimited capabilities in such a lean package.
|
||||
</p>
|
||||
</div>
|
||||
<div class="col">
|
||||
<h3 class="purple">Native CPU performance</h3>
|
||||
<p>
|
||||
No RPC calls or flimsy dependency management. Plugins are compiled into the static binary, making successful deployments certain and runtimes blazing fast.
|
||||
</p>
|
||||
</div>
|
||||
<div class="col">
|
||||
<h3 class="blue">Easy to develop</h3>
|
||||
<p>
|
||||
Writing Caddy plugins is as easy as writing a Go package. It's a comfortable and familiar process for any Go programmer.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
<section class="diagonal down light feature">
|
||||
<div class="wrapper">
|
||||
<h2 id="gold-standard">The <span class="gold">gold standard</span> web server</h2>
|
||||
<p>
|
||||
Caddy has the most robust TLS stack on the market. With stronger memory safety guarantees than OpenSSL (Apache & NGINX) and more advanced certificate automation logic than any other server or utility, Caddy keeps your sites online through problems when other servers... won't.
|
||||
</p>
|
||||
<p>
|
||||
Caddy was the first server to fully automate public certificate management—so we've been doing this longer than anyone. With more than 50 million certificates under management, Caddy has set the gold standard for other servers to live up to.
|
||||
</p>
|
||||
<div class="cols">
|
||||
<div class="col">
|
||||
<h3 class="green">OCSP stapling saves the day</h3>
|
||||
<p>
|
||||
Caddy automatically staples OCSP responses and caches them to weather outages. In 2018, many popular sites went down for users of mainstream browsers because crucial OCSP infrastructure had an extended outage. Only Caddy staples and caches OCSP responses by default, so all Caddy sites were unaffected.
|
||||
</p>
|
||||
</div>
|
||||
<div class="col">
|
||||
<h3 class="purple">On guard against revocation</h3>
|
||||
<p>
|
||||
In 2020, a mass certificate revocation event left many sysadmins scrambling to renew their certificates ahead of schedule. Caddy automatically renews certificates that get revoked, and all Caddy sites were unaffected. (This was before ARI existed.)
|
||||
</p>
|
||||
</div>
|
||||
<div class="col">
|
||||
<h3 class="blue">Stands tall during audits</h3>
|
||||
<p>
|
||||
Companies have deployed Caddy in front of their site just hours before important audits—potentially saving their compliance status—because of Caddy's safe defaults and "batteries included" approach.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="light gray feature">
|
||||
<div class="wrapper">
|
||||
<h2>Take everyone's word for it</h2>
|
||||
<p>
|
||||
We're biased. But Caddy is widely relied upon and praised by a diverse global user base because of its ease of use, secure defaults, powerful feature set, and business-changing cost reductions.
|
||||
</p>
|
||||
<div class="testimonials-container">
|
||||
<div class="testimonials">
|
||||
<div class="testimonial-col"></div>
|
||||
<div class="testimonial-col"></div>
|
||||
<div class="testimonial-col"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
|
||||
|
||||
{{include "/includes/footer.html"}}
|
||||
|
||||
|
||||
<template id="tpl-testimonial">
|
||||
<div class="testimonial">
|
||||
<img class="testimonial-picture">
|
||||
<div class="testimonial-content">
|
||||
<div class="testimonial-quote">
|
||||
|
||||
</div>
|
||||
<a class="testimonial-name" target="_blank">
|
||||
|
||||
</a>
|
||||
<div class="testimonial-role">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
AsciinemaPlayer.create('/resources/321140.cast', $_('#video-demo'), {
|
||||
preload: true,
|
||||
autoPlay: true,
|
||||
controls: true
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -1,161 +0,0 @@
|
|||
/*
|
||||
Derived from https://gist.github.com/nicolashery/5765395
|
||||
Adjusted to be high-contrast
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
Solarized Light (High Contrast)
|
||||
Derived from http://ethanschoonover.com/solarized
|
||||
*/
|
||||
.chroma {
|
||||
background: linear-gradient(0deg, #f8fbfd 0%, #edf5fd 100%);
|
||||
color: #254048;
|
||||
}
|
||||
.chroma .c { color: #93a1a1 } /* Comment */
|
||||
.chroma .err { color: #586e75 } /* Error */
|
||||
.chroma .g { color: #586e75 } /* Generic */
|
||||
.chroma .k { color: #577b00 } /* Keyword */
|
||||
.chroma .l { color: #586e75 } /* Literal */
|
||||
.chroma .n { color: #586e75 } /* Name */
|
||||
.chroma .o { color: #577b00 } /* Operator */
|
||||
.chroma .x { color: #d03d00 } /* Other */
|
||||
.chroma .p { color: #586e75 } /* Punctuation */
|
||||
.chroma .cm { color: #93a1a1 } /* Comment.Multiline */
|
||||
.chroma .cp { color: #577b00 } /* Comment.Preproc */
|
||||
.chroma .c1 { color: #93a1a1 } /* Comment.Single */
|
||||
.chroma .cs { color: #577b00 } /* Comment.Special */
|
||||
.chroma .gd { color: #dc322f; background-color: #efdede } /* Generic.Deleted */
|
||||
.chroma .ge { color: #586e75; font-style: italic } /* Generic.Emph */
|
||||
.chroma .gr { color: #dc322f } /* Generic.Error */
|
||||
.chroma .gh { color: #d03d00 } /* Generic.Heading */
|
||||
.chroma .gi { color: #577b00; background-color: #ddecdc } /* Generic.Inserted */
|
||||
.chroma .go { color: #586e75 } /* Generic.Output */
|
||||
.chroma .gp { color: #586e75 } /* Generic.Prompt */
|
||||
.chroma .gs { color: #586e75; font-weight: bold } /* Generic.Strong */
|
||||
.chroma .gu { color: #d03d00 } /* Generic.Subheading */
|
||||
.chroma .gt { color: #586e75 } /* Generic.Traceback */
|
||||
.chroma .kc { color: #d03d00 } /* Keyword.Constant */
|
||||
.chroma .kd { color: #0673bf } /* Keyword.Declaration */
|
||||
.chroma .kn { color: #577b00 } /* Keyword.Namespace */
|
||||
.chroma .kp { color: #577b00 } /* Keyword.Pseudo */
|
||||
.chroma .kr { color: #0673bf } /* Keyword.Reserved */
|
||||
.chroma .kt { color: #dc322f } /* Keyword.Type */
|
||||
.chroma .ld { color: #586e75 } /* Literal.Date */
|
||||
.chroma .m { color: #008076 } /* Literal.Number */
|
||||
.chroma .s { color: #008076 } /* Literal.String */
|
||||
.chroma .na { color: #586e75 } /* Name.Attribute */
|
||||
.chroma .nb { color: #B58900 } /* Name.Builtin */
|
||||
.chroma .nc { color: #0673bf } /* Name.Class */
|
||||
.chroma .no { color: #d03d00 } /* Name.Constant */
|
||||
.chroma .nd { color: #0673bf } /* Name.Decorator */
|
||||
.chroma .ni { color: #d03d00 } /* Name.Entity */
|
||||
.chroma .ne { color: #d03d00 } /* Name.Exception */
|
||||
.chroma .nf { color: #0673bf } /* Name.Function */
|
||||
.chroma .nl { color: #586e75 } /* Name.Label */
|
||||
.chroma .nn { color: #586e75 } /* Name.Namespace */
|
||||
.chroma .nx { color: #586e75 } /* Name.Other */
|
||||
.chroma .py { color: #586e75 } /* Name.Property */
|
||||
.chroma .nt { color: #0673bf } /* Name.Tag */
|
||||
.chroma .nv { color: #0673bf } /* Name.Variable */
|
||||
.chroma .ow { color: #577b00 } /* Operator.Word */
|
||||
.chroma .w { color: #586e75 } /* Text.Whitespace */
|
||||
.chroma .mf { color: #008076 } /* Literal.Number.Float */
|
||||
.chroma .mh { color: #008076 } /* Literal.Number.Hex */
|
||||
.chroma .mi { color: #008076 } /* Literal.Number.Integer */
|
||||
.chroma .mo { color: #008076 } /* Literal.Number.Oct */
|
||||
.chroma .sb { color: #93a1a1 } /* Literal.String.Backtick */
|
||||
.chroma .sc { color: #008076 } /* Literal.String.Char */
|
||||
.chroma .sd { color: #586e75 } /* Literal.String.Doc */
|
||||
.chroma .s2 { color: #008076 } /* Literal.String.Double */
|
||||
.chroma .se { color: #d03d00 } /* Literal.String.Escape */
|
||||
.chroma .sh { color: #586e75 } /* Literal.String.Heredoc */
|
||||
.chroma .si { color: #008076 } /* Literal.String.Interpol */
|
||||
.chroma .sx { color: #008076 } /* Literal.String.Other */
|
||||
.chroma .sr { color: #dc322f } /* Literal.String.Regex */
|
||||
.chroma .s1 { color: #008076 } /* Literal.String.Single */
|
||||
.chroma .ss { color: #008076 } /* Literal.String.Symbol */
|
||||
.chroma .bp { color: #0673bf } /* Name.Builtin.Pseudo */
|
||||
.chroma .vc { color: #0673bf } /* Name.Variable.Class */
|
||||
.chroma .vg { color: #0673bf } /* Name.Variable.Global */
|
||||
.chroma .vi { color: #0673bf } /* Name.Variable.Instance */
|
||||
.chroma .il { color: #008076 } /* Literal.Number.Integer.Long */
|
||||
|
||||
|
||||
|
||||
/*
|
||||
Solarized Dark (High Contrast)
|
||||
Derived from http://ethanschoonover.com/solarized
|
||||
*/
|
||||
.dark .chroma:not(.light) {
|
||||
background: linear-gradient(to bottom, #24454f, transparent);
|
||||
color: #93a1a1;
|
||||
}
|
||||
.dark .chroma:not(.light) .c { color: #586e75 } /* Comment */
|
||||
.dark .chroma:not(.light) .err { color: #93a1a1 } /* Error */
|
||||
.dark .chroma:not(.light) .g { color: #93a1a1 } /* Generic */
|
||||
.dark .chroma:not(.light) .k { color: #76a507 } /* Keyword */
|
||||
.dark .chroma:not(.light) .l { color: #93a1a1 } /* Literal */
|
||||
.dark .chroma:not(.light) .n { color: #93a1a1 } /* Name */
|
||||
.dark .chroma:not(.light) .o { color: #76a507 } /* Operator */
|
||||
.dark .chroma:not(.light) .x { color: #ec662e } /* Other */
|
||||
.dark .chroma:not(.light) .p { color: #93a1a1 } /* Punctuation */
|
||||
.dark .chroma:not(.light) .cm { color: #586e75 } /* Comment.Multiline */
|
||||
.dark .chroma:not(.light) .cp { color: #76a507 } /* Comment.Preproc */
|
||||
.dark .chroma:not(.light) .c1 { color: #586e75 } /* Comment.Single */
|
||||
.dark .chroma:not(.light) .cs { color: #76a507 } /* Comment.Special */
|
||||
.dark .chroma:not(.light) .gd { color: #dc322f; background-color: #efdede } /* Generic.Deleted */
|
||||
.dark .chroma:not(.light) .ge { color: #93a1a1; font-style: italic } /* Generic.Emph */
|
||||
.dark .chroma:not(.light) .gr { color: #dc322f } /* Generic.Error */
|
||||
.dark .chroma:not(.light) .gh { color: #ec662e } /* Generic.Heading */
|
||||
.dark .chroma:not(.light) .gi { color: #76a507 } /* Generic.Inserted */
|
||||
.dark .chroma:not(.light) .go { color: #93a1a1 } /* Generic.Output */
|
||||
.dark .chroma:not(.light) .gp { color: #93a1a1 } /* Generic.Prompt */
|
||||
.dark .chroma:not(.light) .gs { color: #93a1a1; font-weight: bold } /* Generic.Strong */
|
||||
.dark .chroma:not(.light) .gu { color: #ec662e } /* Generic.Subheading */
|
||||
.dark .chroma:not(.light) .gt { color: #93a1a1 } /* Generic.Traceback */
|
||||
.dark .chroma:not(.light) .kc { color: #ec662e } /* Keyword.Constant */
|
||||
.dark .chroma:not(.light) .kd { color: #0090f5 } /* Keyword.Declaration */
|
||||
.dark .chroma:not(.light) .kn { color: #76a507 } /* Keyword.Namespace */
|
||||
.dark .chroma:not(.light) .kp { color: #76a507 } /* Keyword.Pseudo */
|
||||
.dark .chroma:not(.light) .kr { color: #0090f5 } /* Keyword.Reserved */
|
||||
.dark .chroma:not(.light) .kt { color: #dc322f } /* Keyword.Type */
|
||||
.dark .chroma:not(.light) .ld { color: #93a1a1 } /* Literal.Date */
|
||||
.dark .chroma:not(.light) .m { color: #09a598 } /* Literal.Number */
|
||||
.dark .chroma:not(.light) .s { color: #09a598 } /* Literal.String */
|
||||
.dark .chroma:not(.light) .na { color: #93a1a1 } /* Name.Attribute */
|
||||
.dark .chroma:not(.light) .nb { color: #B58900 } /* Name.Builtin */
|
||||
.dark .chroma:not(.light) .nc { color: #0090f5 } /* Name.Class */
|
||||
.dark .chroma:not(.light) .no { color: #ec662e } /* Name.Constant */
|
||||
.dark .chroma:not(.light) .nd { color: #0090f5 } /* Name.Decorator */
|
||||
.dark .chroma:not(.light) .ni { color: #ec662e } /* Name.Entity */
|
||||
.dark .chroma:not(.light) .ne { color: #ec662e } /* Name.Exception */
|
||||
.dark .chroma:not(.light) .nf { color: #0090f5 } /* Name.Function */
|
||||
.dark .chroma:not(.light) .nl { color: #93a1a1 } /* Name.Label */
|
||||
.dark .chroma:not(.light) .nn { color: #93a1a1 } /* Name.Namespace */
|
||||
.dark .chroma:not(.light) .nx { color: #93a1a1 } /* Name.Other */
|
||||
.dark .chroma:not(.light) .py { color: #93a1a1 } /* Name.Property */
|
||||
.dark .chroma:not(.light) .nt { color: #0090f5 } /* Name.Tag */
|
||||
.dark .chroma:not(.light) .nv { color: #0090f5 } /* Name.Variable */
|
||||
.dark .chroma:not(.light) .ow { color: #76a507 } /* Operator.Word */
|
||||
.dark .chroma:not(.light) .w { color: #93a1a1 } /* Text.Whitespace */
|
||||
.dark .chroma:not(.light) .mf { color: #09a598 } /* Literal.Number.Float */
|
||||
.dark .chroma:not(.light) .mh { color: #09a598 } /* Literal.Number.Hex */
|
||||
.dark .chroma:not(.light) .mi { color: #09a598 } /* Literal.Number.Integer */
|
||||
.dark .chroma:not(.light) .mo { color: #09a598 } /* Literal.Number.Oct */
|
||||
.dark .chroma:not(.light) .sb { color: #586e75 } /* Literal.String.Backtick */
|
||||
.dark .chroma:not(.light) .sc { color: #09a598 } /* Literal.String.Char */
|
||||
.dark .chroma:not(.light) .sd { color: #93a1a1 } /* Literal.String.Doc */
|
||||
.dark .chroma:not(.light) .s2 { color: #09a598 } /* Literal.String.Double */
|
||||
.dark .chroma:not(.light) .se { color: #ec662e } /* Literal.String.Escape */
|
||||
.dark .chroma:not(.light) .sh { color: #93a1a1 } /* Literal.String.Heredoc */
|
||||
.dark .chroma:not(.light) .si { color: #09a598 } /* Literal.String.Interpol */
|
||||
.dark .chroma:not(.light) .sx { color: #09a598 } /* Literal.String.Other */
|
||||
.dark .chroma:not(.light) .sr { color: #dc322f } /* Literal.String.Regex */
|
||||
.dark .chroma:not(.light) .s1 { color: #09a598 } /* Literal.String.Single */
|
||||
.dark .chroma:not(.light) .ss { color: #09a598 } /* Literal.String.Symbol */
|
||||
.dark .chroma:not(.light) .bp { color: #0090f5 } /* Name.Builtin.Pseudo */
|
||||
.dark .chroma:not(.light) .vc { color: #0090f5 } /* Name.Variable.Class */
|
||||
.dark .chroma:not(.light) .vg { color: #0090f5 } /* Name.Variable.Global */
|
||||
.dark .chroma:not(.light) .vi { color: #0090f5 } /* Name.Variable.Instance */
|
||||
.dark .chroma:not(.light) .il { color: #09a598 } /* Literal.Number.Integer.Long */
|
|
@ -1,691 +0,0 @@
|
|||
:root,
|
||||
.light {
|
||||
--body-bg: white;
|
||||
--text-color: #2c2c2c;
|
||||
--text-color-muted: #7087a0;
|
||||
--header-bg: rgba(118, 179, 194, 0.11);
|
||||
--header-border-color: #ebf0f2;
|
||||
--topbar-link-color-hover: black;
|
||||
--topbar-link-bg-hover: rgb(244, 249, 251);
|
||||
--main-nav-link-color: #546c75;
|
||||
--main-nav-link-hover-color: #01324b;
|
||||
--link-color: #0097f2;
|
||||
--link-decoration-color: #ddd;
|
||||
--link-hover-color: rgb(27, 170, 70);
|
||||
--heading-color: var(--text-color);
|
||||
--code-bg: #f2f8f9;
|
||||
--dropdown-bg: #e8ecef;
|
||||
--dropdown-linkbox: white;
|
||||
--dropdown-link-title-color: #384f61;
|
||||
--dropdown-link-color: #647687;
|
||||
--dropdown-link-hover-bg: rgb(239, 244, 248);
|
||||
--dropdown-link-hover-color: #142633;
|
||||
--dropdown-featured-bg: linear-gradient(to bottom, rgb(239 244 247), transparent);
|
||||
--dropdown-featured-hover-bg: rgb(223, 233, 238); /* rgb(232, 255, 254); */
|
||||
--dropdown-shadow-color: rgb(0 0 0 / .25);
|
||||
--box-bg: var(--header-border-color);
|
||||
}
|
||||
|
||||
.dark {
|
||||
--body-bg: #0d171a;
|
||||
--text-color: #cbe2e4; /* #a4c0c2 */
|
||||
--text-color-muted: #92b2d5;
|
||||
--header-bg: rgba(44, 130, 164, 0.11);
|
||||
--header-border-color: transparent;
|
||||
--topbar-link-color-hover: white;
|
||||
--topbar-link-bg-hover: rgb(255 255 255 / .1);
|
||||
--main-nav-link-color: #86a7b1;
|
||||
--main-nav-link-hover-color: #e2e9ec;
|
||||
--link-color: #34a1e4;
|
||||
--link-decoration-color: #375862;
|
||||
--link-hover-color: rgb(42, 228, 98);
|
||||
--heading-color: #dee8ee;
|
||||
--code-bg: #1f3237;
|
||||
--dropdown-bg: #152125; /* #34414b; */
|
||||
--dropdown-linkbox: #1d2c32;
|
||||
--dropdown-link-title-color: #f0f3f5;
|
||||
--dropdown-link-color: #9ebeca;
|
||||
--dropdown-link-hover-color: white;
|
||||
--dropdown-link-hover-bg: rgb(30, 48, 63);
|
||||
--dropdown-featured-bg: linear-gradient(to bottom, rgb(46, 58, 66), transparent);
|
||||
--dropdown-featured-hover-bg: rgb(64, 82, 92);
|
||||
--dropdown-shadow-color: black;
|
||||
--box-bg: var(--header-bg);
|
||||
}
|
||||
|
||||
.dark #logo-light,
|
||||
.dark-header #logo-light,
|
||||
#logo-dark {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.dark #logo-dark,
|
||||
.dark-header #logo-dark {
|
||||
display: initial;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: Inter, Figtree, Gantari, 'Albert Sans', Inter, system-ui;
|
||||
font-size: 18px;
|
||||
/* -webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale; */
|
||||
tab-size: 4;
|
||||
background-color: var(--body-bg);
|
||||
color: var(--text-color);
|
||||
}
|
||||
|
||||
section.dark,
|
||||
footer {
|
||||
background-color: #002020;
|
||||
color: white;
|
||||
}
|
||||
|
||||
main a {
|
||||
color: var(--link-color);
|
||||
text-decoration-line: underline;
|
||||
text-decoration-thickness: 2px;
|
||||
text-underline-offset: 2px;
|
||||
text-decoration-color: var(--link-decoration-color);
|
||||
transition: all .15s;
|
||||
}
|
||||
|
||||
main a:hover {
|
||||
color: var(--link-hover-color);
|
||||
text-decoration-color: var(--link-color);
|
||||
}
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
code {
|
||||
font-family: 'JetBrains Mono', 'Chivo Mono', monospace;
|
||||
font-feature-settings: "liga" 0; /* prevent the merging of chars like "fi", relevant for Chivo Mono especially */
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
max-width: 1400px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
padding-left: 50px;
|
||||
padding-right: 50px;
|
||||
}
|
||||
|
||||
header {
|
||||
background: var(--header-bg);
|
||||
position: relative;
|
||||
z-index: 99;
|
||||
}
|
||||
|
||||
header a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
header nav>ul {
|
||||
background: linear-gradient(to right, rgb(100 190 121), rgb(54 206 255));
|
||||
background-clip: text;
|
||||
-webkit-background-clip: text;
|
||||
}
|
||||
|
||||
.topbar {
|
||||
font-size: 12px;
|
||||
border-bottom: 1px solid hsl(203deg 100% 79% / 20%);
|
||||
}
|
||||
|
||||
.topbar .wrapper {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
align-items: center;
|
||||
gap: 1em;
|
||||
color: #777;
|
||||
}
|
||||
|
||||
.topbar a {
|
||||
display: inline-block;
|
||||
padding: 10px 10px 8px;
|
||||
color: #719bcc;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.topbar a:hover {
|
||||
background: var(--topbar-link-bg-hover);
|
||||
color: var(--topbar-link-color-hover);
|
||||
}
|
||||
|
||||
.navbar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 2em;
|
||||
}
|
||||
|
||||
.navbar .actions,
|
||||
.navbar nav ul {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
header nav ul {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding-left: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.navbar nav>ul>li>a {
|
||||
-webkit-text-fill-color: rgba(0 0 0 / .1);
|
||||
}
|
||||
|
||||
.navbar nav>ul>li>a:hover {
|
||||
-webkit-text-fill-color: rgba(255 255 255 / .4);
|
||||
}
|
||||
|
||||
.navbar nav {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.navbar nav>ul>li>a,
|
||||
.navbar .button {
|
||||
text-decoration: none;
|
||||
transition: all 200ms;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.navbar nav>ul>li>a {
|
||||
padding: 20px 1.5em;
|
||||
display: block;
|
||||
font-family: Figtree, system-ui;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.navbar .button {
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
.icon {
|
||||
height: 1.4em;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.logo-link {
|
||||
line-height: 0; /* avoid extra space along the bottom for some reason */
|
||||
}
|
||||
|
||||
.logo {
|
||||
height: 2.25em;
|
||||
}
|
||||
|
||||
.navbar .actions {
|
||||
margin-left: auto;
|
||||
display: flex;
|
||||
gap: 1em;
|
||||
}
|
||||
|
||||
button,
|
||||
.button {
|
||||
padding: .6em 1.5em;
|
||||
border-radius: 6px;
|
||||
text-decoration: none;
|
||||
background: none;
|
||||
cursor: pointer;
|
||||
|
||||
/* necessary for hoversplash: */
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.button {
|
||||
color: rgb(54 206 255);
|
||||
border: 1px solid rgb(54 206 255);
|
||||
}
|
||||
|
||||
.button:hover {
|
||||
color: white;
|
||||
border-color: white;
|
||||
}
|
||||
|
||||
button.primary,
|
||||
.button.primary {
|
||||
background: linear-gradient(135deg, white 25%, rgba(167, 183, 193) 80%);
|
||||
color: #222;
|
||||
font-weight: bold;
|
||||
border: none;
|
||||
box-shadow: 0 3px 5px rgba(0, 0, 0, 0.08);
|
||||
}
|
||||
|
||||
button.primary:hover,
|
||||
.button.primary:hover {
|
||||
color: #1a71cb;
|
||||
}
|
||||
|
||||
button:active,
|
||||
.button:active {
|
||||
transition: all 75ms;
|
||||
transform: scale(.95);
|
||||
box-shadow: 1px 1px 3px inset rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
button.purple,
|
||||
.button.purple {
|
||||
border: none;
|
||||
background: linear-gradient(165deg, rgba(170,81,212,1) 20%, rgba(37,159,235,1) 100%);
|
||||
color: white !important; /* sigh... to prevent being stepped on by very specific link color rule on the sponsors page */
|
||||
font-weight: bold;
|
||||
box-shadow: 0 2px 2px rgba(0, 0, 0, 0.25)
|
||||
}
|
||||
|
||||
button svg,
|
||||
.button svg {
|
||||
margin-right: .5em;
|
||||
}
|
||||
|
||||
|
||||
@keyframes hoverSplash {
|
||||
0% {
|
||||
opacity: 1;
|
||||
transform: translate3d(-50%, -50%, 0) scale3d(0, 0, 1);
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 0;
|
||||
transform: translate3d(-50%, -50%, 0) scale3d(1, 1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
.hover-splash {
|
||||
pointer-events: none;
|
||||
position: absolute;
|
||||
/* z-index: 1; */
|
||||
width: 200%;
|
||||
height: 0;
|
||||
padding-bottom: 200%;
|
||||
border-radius: 50%;
|
||||
/* transform: translate3d(-50%,-50%,0) scale3d(0,0,1); */
|
||||
animation: 1s cubic-bezier(.16, 1, .3, 1) hoverSplash;
|
||||
}
|
||||
|
||||
button .hover-splash,
|
||||
.button .hover-splash {
|
||||
background-color: rgba(24, 156, 233, 0.6);
|
||||
}
|
||||
|
||||
button.primary .hover-splash,
|
||||
.button.primary .hover-splash {
|
||||
background-color: rgba(255, 255, 255, 0.6);
|
||||
}
|
||||
|
||||
|
||||
.dropdown {
|
||||
font-size: 16px;
|
||||
position: absolute;
|
||||
display: inline-block;
|
||||
background: var(--dropdown-bg);
|
||||
border-radius: 15px;
|
||||
line-height: 1.5;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 50px 75px var(--dropdown-shadow-color);
|
||||
visibility: hidden;
|
||||
top: calc(100% - 5px);
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.dropdown-trigger:hover .dropdown {
|
||||
visibility: visible;
|
||||
transform-origin: top left;
|
||||
animation: rotateMenu 300ms ease;
|
||||
}
|
||||
|
||||
@keyframes rotateMenu {
|
||||
0% {
|
||||
transform: rotateX(-90deg) scale(0.75);
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: rotateX(0deg) scale(1);
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.dropdown .row {
|
||||
display: flex;
|
||||
gap: 1px;
|
||||
margin-bottom: 1px;
|
||||
}
|
||||
|
||||
.dropdown .plainbox,
|
||||
.dropdown .linkbox {
|
||||
display: flex;
|
||||
gap: 4em;
|
||||
padding: 1.5em;
|
||||
}
|
||||
|
||||
.dropdown .plainbox {
|
||||
padding-top: .5em;
|
||||
width: 100%;
|
||||
justify-content: space-around;
|
||||
}
|
||||
|
||||
.dropdown .plainbox a {
|
||||
color: var(--dropdown-link-color);
|
||||
}
|
||||
|
||||
.dropdown .plainbox a:hover {
|
||||
color: var(--dropdown-link-hover-color);
|
||||
}
|
||||
|
||||
.dropdown .linkbox {
|
||||
background: var(--dropdown-linkbox);
|
||||
gap: 3em;
|
||||
--link-padding-x: 10px;
|
||||
}
|
||||
|
||||
.dropdown .links-header {
|
||||
font-family: Poppins, ui-rounded;
|
||||
font-weight: 600;
|
||||
color: var(--dropdown-link-title-color);
|
||||
font-size: 20px;
|
||||
margin-bottom: 14px;
|
||||
padding-left: var(--link-padding-x);
|
||||
}
|
||||
|
||||
.dropdown .col {
|
||||
min-width: 150px;
|
||||
}
|
||||
|
||||
.dropdown .col a {
|
||||
display: block;
|
||||
color: var(--dropdown-link-color);
|
||||
text-decoration: none;
|
||||
padding: 5px var(--link-padding-x);
|
||||
border-radius: 1.5em;
|
||||
}
|
||||
|
||||
|
||||
.dropdown .col a:hover {
|
||||
color: var(--dropdown-link-hover-color);
|
||||
background-color: var(--dropdown-link-hover-bg);
|
||||
}
|
||||
|
||||
.dropdown .flatlinks a,
|
||||
.dropdown .featured a {
|
||||
transition: background-color 150ms;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.dropdown .flatlinks a {
|
||||
background: var(--dropdown-linkbox);
|
||||
padding: 1em 2em;
|
||||
color: var(--dropdown-link-color);
|
||||
}
|
||||
|
||||
.dropdown .flatlinks a b,
|
||||
.dropdown .featured a b {
|
||||
display: block;
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.dropdown .flatlinks a b {
|
||||
color: var(--dropdown-link-title-color);
|
||||
margin-bottom: .25em;
|
||||
}
|
||||
|
||||
.dropdown .flatlinks a:hover {
|
||||
/* background: rgb(239, 244, 248); */
|
||||
background: var(--dropdown-link-hover-bg);
|
||||
}
|
||||
|
||||
.dropdown .featured a b {
|
||||
color: var(--dropdown-link-title-color);
|
||||
margin-bottom: .5em;
|
||||
}
|
||||
|
||||
.dropdown .featured a:hover b {
|
||||
color: var(--dropdown-link-hover-color);
|
||||
}
|
||||
|
||||
|
||||
.dropdown .featured {
|
||||
gap: 1em;
|
||||
padding: 1em;
|
||||
/* background: white; */
|
||||
}
|
||||
|
||||
.dropdown .featured a {
|
||||
display: block;
|
||||
padding: 1em;
|
||||
line-height: 1.4;
|
||||
border-radius: 10px;
|
||||
color: var(--dropdown-link-color);
|
||||
background-color: var(--dropdown-linkbox);
|
||||
background-image: var(--dropdown-featured-bg);
|
||||
/* background-image: linear-gradient(to bottom, rgb(239 244 247), rgba(252,252,252,0)); */
|
||||
/* background: linear-gradient(137deg, rgb(241 251 247) 0%, rgb(242 248 255) 100%); */
|
||||
flex: 1;
|
||||
box-shadow: 0 1px 2px rgb(0 0 0 / .2);
|
||||
}
|
||||
|
||||
.dropdown .featured a:hover {
|
||||
background-color: var(--dropdown-featured-hover-bg);
|
||||
}
|
||||
|
||||
.dropdown .featured a b {
|
||||
display: block;
|
||||
color: var(--dropdown-link-title-color);
|
||||
font-size: 16px;
|
||||
margin-bottom: .5em;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
|
||||
#current-theme {
|
||||
text-transform: capitalize;
|
||||
}
|
||||
|
||||
.construction-images {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.construction img {
|
||||
margin-left: 20px;
|
||||
margin-right: 20px;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.construction p {
|
||||
width: 100%;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
color: #e71414;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
footer {
|
||||
padding: 75px 0;
|
||||
font-size: 14px;
|
||||
color: #7c9393;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
footer p {
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
footer a {
|
||||
color: inherit;
|
||||
font-weight: bold;
|
||||
transition: .25s;
|
||||
}
|
||||
|
||||
footer a:hover {
|
||||
color: #76b8b8;
|
||||
}
|
||||
|
||||
footer .logo-area {
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
footer .wrapper {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 75px;
|
||||
}
|
||||
|
||||
footer .nostalgia {
|
||||
display: block;
|
||||
text-align: center;
|
||||
margin-top: 40px;
|
||||
}
|
||||
|
||||
footer .nostalgia-badges {
|
||||
gap: 25px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
margin-top: 40px;
|
||||
}
|
||||
|
||||
footer .nostalgia p {
|
||||
margin: 0 auto 15px;
|
||||
color: #d2f7e7;
|
||||
}
|
||||
|
||||
footer .w3c {
|
||||
width: 80px;
|
||||
line-height: 0;
|
||||
}
|
||||
|
||||
footer .logo {
|
||||
display: block;
|
||||
margin-bottom: 15px;
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
footer .link-col {
|
||||
font-size: initial;
|
||||
line-height: 2;
|
||||
}
|
||||
|
||||
footer .col-header {
|
||||
font-size: 110%;
|
||||
color: white;
|
||||
font-weight: 700;
|
||||
margin-bottom: .5em;
|
||||
}
|
||||
|
||||
footer .link-col a {
|
||||
display: block;
|
||||
color: #b7c8c8;
|
||||
font-weight: 500;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
footer .link-col a:hover {
|
||||
color: #35655e;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@media (max-width: 1150px) {
|
||||
.dropdown {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
padding-left: 20px;
|
||||
padding-right: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 950px) {
|
||||
header nav ul {
|
||||
justify-content: space-evenly;
|
||||
}
|
||||
|
||||
.topbar .wrapper {
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 0;
|
||||
}
|
||||
|
||||
.logo {
|
||||
height: 3em;
|
||||
}
|
||||
|
||||
.navbar {
|
||||
flex-direction: column;
|
||||
gap: 0;
|
||||
padding: 1em 0;
|
||||
}
|
||||
|
||||
.navbar nav {
|
||||
margin: .5em 0;
|
||||
}
|
||||
|
||||
.navbar .actions {
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.navbar nav > ul > li > a {
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
}
|
|
@ -1,820 +0,0 @@
|
|||
:root, .light {
|
||||
--header-bg: transparent;
|
||||
--button-color: rgb(64, 131, 153);
|
||||
--button-border-color: rgb(198, 217, 223);
|
||||
--button-color-hover: rgb(7, 86, 134);
|
||||
--button-border-color-hover: rgb(155, 191, 213);
|
||||
--nav-current-bg: linear-gradient(to right, #ecf1f3, transparent);
|
||||
--nav-link-hover-shadow-color: rgba(0, 0, 0, 0.15);
|
||||
--nav-link-hover-before-bg: #d2e5e7;
|
||||
--autonav-bg: #fff;
|
||||
--pagenav-hover-bg: #f4f7f9;
|
||||
--cmd-bg: #333;
|
||||
--tip-color: #5c50bb;
|
||||
--menu-toggle-bg: #e4f1f2;
|
||||
}
|
||||
|
||||
.dark {
|
||||
--header-bg: rgba(44, 130, 164, 0.11);
|
||||
--button-color: rgb(36, 166, 208);
|
||||
--button-border-color: rgb(38, 116, 140);
|
||||
--button-color-hover: rgb(0, 194, 255);
|
||||
--button-border-color-hover: rgb(0, 194, 255);
|
||||
--nav-current-bg: linear-gradient(to right, #1a3c4d, transparent);
|
||||
--nav-link-hover-shadow-color: rgba(255, 255, 255, 0.15);
|
||||
--nav-link-hover-before-bg: #32494f;
|
||||
--autonav-bg: #34404d;
|
||||
--pagenav-hover-bg: #18262f;
|
||||
--cmd-bg: black;
|
||||
--tip-color: #a6b2f7;
|
||||
--menu-toggle-bg: #274d5c;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
html,
|
||||
body {
|
||||
min-height: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
background-image:
|
||||
radial-gradient(at calc(50% - min(25vw, 800px)) -10%, hsl(137.64deg, 100%, 92.42%) 0px, transparent min(15%, 500px)),
|
||||
radial-gradient(at calc(50% + min(25vw, 800px)) -10%, hsl(201.2deg, 68%, 90.2%) 0px, transparent min(15%, 500px));
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
|
||||
.dark body {
|
||||
background-image:
|
||||
radial-gradient(at calc(50% - min(35vw, 700px)) -10%, hsl(129.5deg, 100%, 12.4%) 0px, transparent min(25%, 600px)),
|
||||
radial-gradient(at calc(50% + min(35vw, 700px)) -10%, hsl(201deg, 100%, 19.33%) 0px, transparent min(25%, 600px))
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
max-width: 1800px;
|
||||
}
|
||||
|
||||
header {
|
||||
border-bottom: 1px solid var(--header-border-color);
|
||||
}
|
||||
|
||||
.topbar {
|
||||
border-bottom: 0;
|
||||
}
|
||||
|
||||
button,
|
||||
.button {
|
||||
color: var(--button-color);
|
||||
border: 1px solid var(--button-border-color);
|
||||
}
|
||||
button:hover,
|
||||
.button:hover {
|
||||
color: var(--button-color-hover);
|
||||
border: 1px solid var(--button-border-color-hover);
|
||||
}
|
||||
button.primary,
|
||||
.button.primary {
|
||||
background: linear-gradient(135deg, #7ece98 25%, rgb(49, 155, 208) 80%);
|
||||
color: white;
|
||||
border: none;
|
||||
}
|
||||
button.primary:hover,
|
||||
.button.primary:hover {
|
||||
color: white;
|
||||
}
|
||||
.button.purple:hover {
|
||||
border: none;
|
||||
}
|
||||
|
||||
|
||||
main {
|
||||
margin-top: 50px;
|
||||
font-family: Inter, system-ui;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.docs {
|
||||
display: flex;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.docs nav,
|
||||
#pagenav {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.docs nav {
|
||||
min-width: 250px;
|
||||
}
|
||||
|
||||
#docs-menu {
|
||||
background: var(--menu-toggle-bg);
|
||||
padding: 1em;
|
||||
cursor: pointer;
|
||||
display: none;
|
||||
}
|
||||
|
||||
#pagenav .heading {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
main nav ul {
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
main nav li {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
main nav li li::before {
|
||||
content: '';
|
||||
display: block;
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 100%;
|
||||
background-color: var(--nav-link-hover-before-bg);
|
||||
transition: .15s;
|
||||
}
|
||||
|
||||
main nav li li:hover::before {
|
||||
background-color: #62868d;
|
||||
width: 4px;
|
||||
}
|
||||
|
||||
main nav ul li a,
|
||||
main nav .heading,
|
||||
#autonav a {
|
||||
padding: 8px 18px 8px 28px;
|
||||
}
|
||||
/*
|
||||
main nav li a,
|
||||
#pagenav a {
|
||||
color: #546c75;
|
||||
} */
|
||||
|
||||
main nav a {
|
||||
display: block;
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
border-radius: 1.5em;
|
||||
color: var(--main-nav-link-color);
|
||||
transition: .15s;
|
||||
}
|
||||
|
||||
|
||||
main nav li:hover > a,
|
||||
#autonav a:hover,
|
||||
#pagenav a:hover {
|
||||
color: var(--main-nav-link-hover-color);
|
||||
}
|
||||
|
||||
|
||||
main nav li:hover > a {
|
||||
/* background: #f6fafc; */
|
||||
box-shadow: -10px 0 10px -3px var(--nav-link-hover-shadow-color);
|
||||
}
|
||||
|
||||
main nav > ul > li > a::before {
|
||||
content: '\203A';
|
||||
font-weight: bold;
|
||||
font-size: 150%;
|
||||
line-height: .75;
|
||||
position: absolute;
|
||||
opacity: 0;
|
||||
left: 0;
|
||||
transition: left .15s, opacity .15s;
|
||||
}
|
||||
|
||||
main nav li a:hover::before {
|
||||
opacity: 1;
|
||||
left: .75rem;
|
||||
}
|
||||
|
||||
main nav li a.current {
|
||||
background: var(--nav-current-bg);
|
||||
}
|
||||
|
||||
main nav .heading {
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
font-size: 80%;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
main nav ul:not(:first-child) > .heading {
|
||||
margin-top: 2.5em;
|
||||
}
|
||||
|
||||
main nav li li a {
|
||||
border-top-left-radius: 0;
|
||||
border-bottom-left-radius: 0;
|
||||
padding-left: 1em;
|
||||
transition: padding .15s;
|
||||
}
|
||||
|
||||
main nav li li a:not(#autonav a) {
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
main nav li ul {
|
||||
margin-left: 2.5em;
|
||||
margin-bottom: .5em;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
article {
|
||||
font-family: 'Albert Sans', Figree, Assistant, 'Red Hat Text', 'Be Vietnam Pro', system-ui;
|
||||
font-size: 20px;
|
||||
word-wrap: break-word;
|
||||
|
||||
max-width: 1100px;
|
||||
min-width: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/*
|
||||
while we want most elements that are rendered
|
||||
server-side from markdown to have a constrained
|
||||
width, a few elements should be allowed to
|
||||
extend to the borders of the page
|
||||
*/
|
||||
article > :not(.fullwidth, .fullspan),
|
||||
article > .fullwidth > *,
|
||||
.pad {
|
||||
padding-left: 8%;
|
||||
padding-right: 8%;
|
||||
}
|
||||
article > :not(h1, hr),
|
||||
dd,
|
||||
article p,
|
||||
article ol,
|
||||
article ul,
|
||||
article pre,
|
||||
article table {
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
article > .fullwidth { margin-bottom: 1.5rem; }
|
||||
article > .fullwidth > * { margin-bottom: 0; }
|
||||
|
||||
article > pre.chroma > code {
|
||||
background: none;
|
||||
padding: 0;
|
||||
}
|
||||
article > pre.chroma {
|
||||
padding-top: 2em;
|
||||
padding-bottom: 2em;
|
||||
}
|
||||
|
||||
article ul,
|
||||
article ol,
|
||||
#hovercard ul,
|
||||
#hovercard ol {
|
||||
margin-left: 2.5em;
|
||||
}
|
||||
|
||||
article ul ul,
|
||||
article ol ol,
|
||||
article ol ul,
|
||||
article ul ol {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
article p,
|
||||
article li {
|
||||
line-height: 1.75;
|
||||
}
|
||||
|
||||
article li p,
|
||||
article li ul,
|
||||
article li ol {
|
||||
margin-bottom: .5em;
|
||||
}
|
||||
|
||||
article h1,
|
||||
article h2,
|
||||
article h3,
|
||||
article h4,
|
||||
article h5,
|
||||
article h6 {
|
||||
/* to ensure that the anchor-link icons stay inside the heading */
|
||||
position: relative;
|
||||
|
||||
font-family: Gantari;
|
||||
font-weight: 800;
|
||||
color: var(--heading-color);
|
||||
}
|
||||
|
||||
article h1,
|
||||
article h2,
|
||||
article h3 {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
article h1 {
|
||||
font-size: 72px;
|
||||
color: #0e3e5b;
|
||||
letter-spacing: -2px;
|
||||
margin-top: 5%;
|
||||
margin-bottom: 50px;
|
||||
|
||||
background: linear-gradient(to right, #23a1ec, #3fd53a);
|
||||
background-clip: text;
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
|
||||
article h2 {
|
||||
font-size: 56px;
|
||||
padding-bottom: 15px;
|
||||
margin: 100px 0 40px;
|
||||
|
||||
border-image-slice: 1;
|
||||
border-bottom-width: 10px;
|
||||
border-bottom-style: solid;
|
||||
border-image-source: linear-gradient(to left, #23a1ec, #3fd53a);
|
||||
}
|
||||
|
||||
article h3 {
|
||||
font-size: 36px;
|
||||
margin: 50px 0 20px;
|
||||
font-weight: 600;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
article h4 {
|
||||
font-size: 24px;
|
||||
margin: 25px 0 15px;
|
||||
}
|
||||
|
||||
article h5 {
|
||||
font-size: 22px;
|
||||
margin: 2em 0 1em;
|
||||
}
|
||||
|
||||
.anchor-link {
|
||||
opacity: 0;
|
||||
font-size: .6em;
|
||||
border-radius: 10px;
|
||||
padding: .3em .5em;
|
||||
position: absolute;
|
||||
top: 5px;
|
||||
left: 0;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
*:hover > .anchor-link,
|
||||
.anchor-link:focus {
|
||||
opacity: 1;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.anchor-link:hover {
|
||||
background-color: rgba(0, 0, 0, .075);
|
||||
}
|
||||
|
||||
code {
|
||||
background-color: var(--code-bg);
|
||||
border-radius: 6px;
|
||||
padding: 2px 5px;
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
code.cmd {
|
||||
background-color: var(--cmd-bg);
|
||||
color: #eaeaea;
|
||||
}
|
||||
|
||||
pre > code,
|
||||
pre.chroma,
|
||||
.group {
|
||||
display: block;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
pre > code,
|
||||
article > pre {
|
||||
padding: 1em;
|
||||
line-height: 1.6;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
pre > code.cmd,
|
||||
.chroma {
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
code.cmd.bash,
|
||||
code.cmd .bash,
|
||||
code.cmd.bash-continuation,
|
||||
code.cmd .bash-continuation {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
code.cmd.bash::before,
|
||||
code.cmd .bash::before {
|
||||
content: '$';
|
||||
margin-right: .5rem;
|
||||
}
|
||||
|
||||
code.cmd.bash-continuation::before,
|
||||
code.cmd .bash-continuation::before {
|
||||
content: '>';
|
||||
margin-right: .5rem;
|
||||
}
|
||||
|
||||
dt:hover .inline-link {
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin-left: 1em;
|
||||
}
|
||||
|
||||
#field-list-header {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.field-name {
|
||||
display: block;
|
||||
font-family: 'Source Code Pro', monospace;
|
||||
margin-top: 2em;
|
||||
font-weight: bold;
|
||||
margin-bottom: .5em;
|
||||
}
|
||||
|
||||
.inline-link {
|
||||
text-decoration: none;
|
||||
position: absolute;
|
||||
margin-left: -1.5em;
|
||||
/* margin-top: -.1em; */
|
||||
padding-right: .3em;
|
||||
padding-left: .2em;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.inline-link:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
hr {
|
||||
border: none;
|
||||
border-top: 4px solid var(--link-decoration-color);
|
||||
margin: 4em auto;
|
||||
width: 35%;
|
||||
}
|
||||
|
||||
article img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
iframe {
|
||||
margin: 1em 0 2em;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
article aside {
|
||||
position: relative;
|
||||
font-size: 16px;
|
||||
margin: 2em auto 3em !important;
|
||||
max-width: 800px;
|
||||
}
|
||||
|
||||
article aside.tip,
|
||||
article aside.advice {
|
||||
padding-left: calc(8% + 50px) !important;
|
||||
}
|
||||
|
||||
article aside.tip::before,
|
||||
article aside.advice::before {
|
||||
font-size: 45px;
|
||||
position: absolute;
|
||||
top: -4px;
|
||||
left: 8%;
|
||||
}
|
||||
|
||||
article aside.tip {
|
||||
color: var(--tip-color);
|
||||
}
|
||||
|
||||
|
||||
article aside.advice {
|
||||
color: #826848;
|
||||
}
|
||||
|
||||
article aside.tip:nth-child(even)::before {
|
||||
content: '💁♀️';
|
||||
}
|
||||
article aside.tip:nth-child(odd)::before {
|
||||
content: '💁♂️';
|
||||
}
|
||||
|
||||
article aside.advice::before {
|
||||
content: '🤦';
|
||||
}
|
||||
|
||||
article aside.complete {
|
||||
color: #6b6b6b;
|
||||
border: 2px dotted #88db88;
|
||||
text-align: center;
|
||||
max-width: 500px;
|
||||
padding: 15px 25px !important;
|
||||
}
|
||||
|
||||
article aside.complete::before {
|
||||
content: '✅ complete';
|
||||
color: #39c849;
|
||||
text-transform: uppercase;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
letter-spacing: 1px;
|
||||
margin-right: 2em;
|
||||
margin-bottom: .5em;
|
||||
}
|
||||
|
||||
table {
|
||||
table-layout: fixed;
|
||||
border-collapse: collapse;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
article > table {
|
||||
margin: 25px auto;
|
||||
}
|
||||
|
||||
th, td {
|
||||
border-bottom: 1px solid #ddd;
|
||||
padding: 10px;
|
||||
line-height: 1.4em;
|
||||
vertical-align: top;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
th {
|
||||
text-align: left;
|
||||
background: #eee;
|
||||
}
|
||||
|
||||
td code {
|
||||
font-size: 14px;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
|
||||
.box {
|
||||
border-radius: 10px;
|
||||
padding: 1em;
|
||||
margin: 1em;
|
||||
font-size: 18px;
|
||||
border: 2px solid var(--box-bg);
|
||||
}
|
||||
|
||||
.box-filled {
|
||||
border: none;
|
||||
background: var(--box-bg);
|
||||
}
|
||||
|
||||
.box-capped {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.box-capped > * {
|
||||
padding: 1em;
|
||||
}
|
||||
|
||||
.box-cap {
|
||||
border-bottom: 1px solid var(--box-bg);
|
||||
}
|
||||
|
||||
.box-filled .box-cap {
|
||||
border-bottom: 1px solid var(--button-border-color); /* #d0dfe6; */
|
||||
}
|
||||
|
||||
.box > :first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
.box > :last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.box:not(.box-capped) > :first-child {
|
||||
padding-top: 0;
|
||||
}
|
||||
.box:not(.box-capped) > :last-child {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.box h3 {
|
||||
font-size: 125%;
|
||||
margin: 0 0 .5em;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
|
||||
#autonav {
|
||||
position: absolute;
|
||||
display: none;
|
||||
left: 80%;
|
||||
top: 0;
|
||||
background: var(--autonav-bg);
|
||||
box-shadow: 0 10px 40px rgb(0 0 0 / .2);
|
||||
border-radius: 10px;
|
||||
border-top-left-radius: 0;
|
||||
min-width: 250px;
|
||||
max-width: 350px;
|
||||
z-index: 999;
|
||||
padding-top: .5em;
|
||||
padding-bottom: .5em;
|
||||
max-height: 400px;
|
||||
overflow: hidden;
|
||||
overflow-y: auto;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
main nav ul > li:hover #autonav {
|
||||
display: block;
|
||||
}
|
||||
|
||||
#autonav .heading {
|
||||
color: #888;
|
||||
}
|
||||
|
||||
#autonav a {
|
||||
transition: none;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
#autonav a:hover {
|
||||
color: #01324b;
|
||||
background: #f1f7fb;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#pagenav .heading {
|
||||
padding-left: .75em;
|
||||
}
|
||||
|
||||
#pagenav a {
|
||||
display: block;
|
||||
animation: fadeIn 500ms;
|
||||
padding: .75em;
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
#pagenav a:hover {
|
||||
background: var(--pagenav-hover-bg);
|
||||
}
|
||||
|
||||
@keyframes fadeIn {
|
||||
0% { opacity: 0; transform: translateY(2em); }
|
||||
100% { opacity: 1; transform: translateY(0); }
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
.quick-assist-history {
|
||||
font-size: 90%;
|
||||
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: .5em;
|
||||
}
|
||||
|
||||
.quick-assist-history > a {
|
||||
display: inline-block;
|
||||
color: var(--text-color-muted);
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.quick-assist-history > a:hover {
|
||||
color: #216688;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.quick-assist-history > a:not(:first-child):before {
|
||||
content: '>';
|
||||
margin-right: .5em;
|
||||
display: inline-block;
|
||||
color: #809783;
|
||||
}
|
||||
|
||||
h3.quick-assist-question {
|
||||
font-size: 150%;
|
||||
}
|
||||
|
||||
.quick-assist-options {
|
||||
margin-top: 1.5em;
|
||||
display: grid;
|
||||
gap: 1em;
|
||||
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
|
||||
}
|
||||
|
||||
.quick-assist-options > div {
|
||||
display: contents;
|
||||
}
|
||||
|
||||
.quick-assist button,
|
||||
.quick-assist .button {
|
||||
font-size: 100%;
|
||||
min-height: 3.5em;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@media (max-width: 1400px) {
|
||||
#pagenav {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 950px) {
|
||||
#autonav {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.docs {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
#docs-menu {
|
||||
display: block;
|
||||
}
|
||||
|
||||
#docs-menu-container {
|
||||
height: 0;
|
||||
overflow: hidden;
|
||||
transition: height 250ms ease-out;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.docs nav ul {
|
||||
min-width: 250px;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
main nav ul .heading {
|
||||
margin-top: 2.5em !important;
|
||||
}
|
||||
}
|
|
@ -1,423 +0,0 @@
|
|||
.bgtext,
|
||||
.demobox {
|
||||
font-family: Poppins, ui-rounded;
|
||||
}
|
||||
|
||||
|
||||
.hero {
|
||||
padding-bottom: 20vw;
|
||||
}
|
||||
|
||||
.hero-content {
|
||||
padding-bottom: 100px;
|
||||
}
|
||||
|
||||
.demobox .or {
|
||||
margin: -1em 0 1em;
|
||||
}
|
||||
|
||||
|
||||
|
||||
h1 {
|
||||
text-align: left;
|
||||
text-transform: uppercase;
|
||||
margin-bottom: 0;
|
||||
line-height: .9;
|
||||
|
||||
background-image: unset;
|
||||
-webkit-background-clip: unset;
|
||||
background-clip: unset;
|
||||
-webkit-text-fill-color: unset;
|
||||
}
|
||||
|
||||
h1 .color-dodge {
|
||||
mix-blend-mode: color-dodge;
|
||||
}
|
||||
|
||||
h1 .the {
|
||||
font-size: 60%;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
h1 .subheading {
|
||||
margin-top: .75em;
|
||||
}
|
||||
|
||||
h3 a {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
|
||||
.sponsors-leaders {
|
||||
position: relative;
|
||||
text-align: center;
|
||||
margin: 75px auto;
|
||||
padding: 35px;
|
||||
z-index: 0;
|
||||
}
|
||||
|
||||
.sponsors-leaders::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
padding: 40px;
|
||||
background-color: rgb(207 27 189 / .2);
|
||||
filter: blur(10px);
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
z-index: -1;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.sponsors-leaders h3 {
|
||||
color: #EB5EDD;
|
||||
font-weight: normal;
|
||||
font-size: 18px;
|
||||
margin-bottom: 2em;
|
||||
border-left: 0;
|
||||
margin-left: 0;
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
.sponsor-logos {
|
||||
display: flex;
|
||||
column-gap: 50px;
|
||||
row-gap: 25px;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
max-width: 900px;
|
||||
margin: 1.5em auto;
|
||||
}
|
||||
|
||||
.sponsors-divider {
|
||||
border-top: 1px solid #634772;
|
||||
max-width: 200px;
|
||||
width: 100%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.wavy-top {
|
||||
background-color: #C4D5E0;
|
||||
margin-top: -10vw;
|
||||
position: relative;
|
||||
z-index: 0;
|
||||
padding-top: 14vw;
|
||||
padding-bottom: 300px;
|
||||
}
|
||||
|
||||
.wavy-top::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: -16vw;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background-image: url('/resources/images/home-curvey-bg.svg');
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% auto;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
.bgtext {
|
||||
color: #86A6A3;
|
||||
opacity: .5;
|
||||
width: 90%;
|
||||
min-width: 65vw;
|
||||
max-width: 1200px;
|
||||
font-size: min(15vw, 300px);
|
||||
text-align: center;
|
||||
line-height: .85;
|
||||
font-weight: 800;
|
||||
text-transform: uppercase;
|
||||
mix-blend-mode: color-burn;
|
||||
pointer-events: none;
|
||||
|
||||
position: absolute;
|
||||
top: 5vw;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
}
|
||||
|
||||
.bgtext .site-on {
|
||||
font-size: 85%;
|
||||
}
|
||||
|
||||
.wavy-top h2 {
|
||||
color: #003E4B;
|
||||
font-size: min(3vw, 52px);
|
||||
text-align: center;
|
||||
width: 60vw;
|
||||
max-width: 950px;
|
||||
font-weight: normal;
|
||||
margin: 0 auto 200px;
|
||||
line-height: 2.5em;
|
||||
}
|
||||
|
||||
.wavy-top h2 b,
|
||||
.section-upset b {
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.section-upset {
|
||||
background: white;
|
||||
max-width: 1600px;
|
||||
margin: -350px auto 0;
|
||||
padding: 100px 50px 0;
|
||||
border-radius: 20px;
|
||||
z-index: 0;
|
||||
position: relative;
|
||||
box-shadow: 0 -15px 20px -2px rgb(0 0 0 / .1);
|
||||
}
|
||||
|
||||
.section-upset h2 {
|
||||
background: linear-gradient(195deg, rgb(6, 79, 107) 25%, rgba(139, 189, 224, 1) 49%, rgb(72, 129, 164)50%, rgb(8, 44, 58) 100%);
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
|
||||
font-size: 80px;
|
||||
font-weight: 600;
|
||||
text-align: center;
|
||||
margin-bottom: 100px;
|
||||
max-width: none;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.testimonials-container {
|
||||
height: 80vh;
|
||||
position: relative;
|
||||
}
|
||||
.testimonials {
|
||||
--testimonial-spacing: 25px;
|
||||
gap: var(--testimonial-spacing);
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
padding-top: 75px;
|
||||
padding-bottom: 75px;
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
margin-top: 50px;
|
||||
}
|
||||
.testimonial-col {
|
||||
flex: 1;
|
||||
min-width: 250px;
|
||||
}
|
||||
.testimonials-container::before {
|
||||
content: "";
|
||||
background: linear-gradient(0deg, #f5f8f9 0%, rgba(255,255,255,0) 25%, rgba(255,255,255,0) 75%, #f5f8f9 100%);
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
pointer-events: none;
|
||||
z-index: 1;
|
||||
}
|
||||
.testimonial-picture {
|
||||
width: 60px;
|
||||
border-radius: 50%;
|
||||
}
|
||||
.testimonial {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 1em;
|
||||
border: 1px solid rgb(222, 233, 240);
|
||||
border-radius: 5px;
|
||||
padding: 1em;
|
||||
margin: var(--testimonial-spacing) 0;
|
||||
background: white;
|
||||
}
|
||||
.testimonial-quote {
|
||||
margin-bottom: 1em;
|
||||
font-size: 16px;
|
||||
line-height: 1.4;
|
||||
}
|
||||
.testimonial-name,
|
||||
.testimonial-role {
|
||||
font-size: 90%;
|
||||
}
|
||||
.testimonial-name {
|
||||
font-weight: bold;
|
||||
margin-bottom: .5em;
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
.testimonial-name:hover {
|
||||
color: inherit;
|
||||
}
|
||||
.testimonial-name[href]:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.testimonial-name::before {
|
||||
content: '—';
|
||||
}
|
||||
.testimonial-role {
|
||||
color: var(--text-color-muted);
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
.smallstep {
|
||||
max-width: 150px;
|
||||
margin-top: 1em;
|
||||
}
|
||||
|
||||
.gold {
|
||||
color: gold;
|
||||
background: linear-gradient(63deg, rgba(212,167,36,1) 8%, rgba(251,228,63,1) 50%, rgba(241,218,57,1) 75%);
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
|
||||
.col .cite {
|
||||
font-size: 75%;
|
||||
}
|
||||
|
||||
img.cite {
|
||||
width: 100%;
|
||||
max-width: 600px;
|
||||
display: block;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
|
||||
.demobox {
|
||||
position: relative;
|
||||
color: #003e4b;
|
||||
background: radial-gradient(circle at 200px 100px, rgba(184,255,239,1) 0%, rgba(234,249,255,1) 280px);
|
||||
font-size: 20px;
|
||||
padding: 50px;
|
||||
border-radius: 15px;
|
||||
margin-top: 200px;
|
||||
}
|
||||
|
||||
.demobox h2 {
|
||||
font-size: 90px;
|
||||
font-weight: 700;
|
||||
max-width: 100%;
|
||||
white-space: nowrap;
|
||||
overflow-x: auto;
|
||||
white-space: nowrap;
|
||||
margin-top: -1.65em;
|
||||
|
||||
background: linear-gradient(0deg, rgba(27,180,186,1) 10%, rgba(0,61,75,1) 50%);
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
|
||||
.demobox p {
|
||||
margin-bottom: 2em;
|
||||
}
|
||||
|
||||
.demo-ips {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 2em;
|
||||
}
|
||||
|
||||
.demo-ips code {
|
||||
background: #ecffff;
|
||||
display: flex;
|
||||
border-radius: 5px;
|
||||
box-shadow: 0 4px 16px rgb(0 0 0 / .1);
|
||||
}
|
||||
|
||||
.record-type,
|
||||
.demo-ip {
|
||||
display: block;
|
||||
padding: 10px 20px;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
|
||||
.record-type {
|
||||
color: #6ea9b7;
|
||||
border-right: 1px solid #cef4f1;
|
||||
}
|
||||
|
||||
.demo-help {
|
||||
border-top: 1px solid #b5d3d9;
|
||||
font-size: 75%;
|
||||
color: #628991;
|
||||
font-family: Inter;
|
||||
max-width: 800px;
|
||||
}
|
||||
|
||||
.demo-help p {
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.franken {
|
||||
background-color: #b3d133;
|
||||
color: #390075;
|
||||
}
|
||||
|
||||
|
||||
@media (max-width: 1350px) {
|
||||
h1 {
|
||||
font-size: 95px;
|
||||
}
|
||||
|
||||
h1 .subheading {
|
||||
font-size: 30px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@media (max-width: 1000px) {
|
||||
h1 {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.action-buttons {
|
||||
margin-bottom: 55px;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.bgtext {
|
||||
font-size: 25vw;
|
||||
opacity: .25;
|
||||
}
|
||||
|
||||
.wavy-top h2 {
|
||||
font-size: 5vw;
|
||||
width: 80%;
|
||||
max-width: 700px;
|
||||
line-height: 2em;
|
||||
}
|
||||
|
||||
.section-upset {
|
||||
padding: 50px 15px 0;
|
||||
}
|
||||
|
||||
.section-upset h2 {
|
||||
font-size: 50px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 700px) {
|
||||
h1 {
|
||||
font-size: 55px;
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 12 KiB |
|
@ -1,201 +0,0 @@
|
|||
// AJQuery: https://github.com/coolaj86/ajquery.js (modified slightly by me)
|
||||
function $_(sel, el) { return ((typeof el === 'string' ? $_(el) : el) || document).querySelector(sel); }
|
||||
function $$_(sel, el) { return (el || document).querySelectorAll(sel); }
|
||||
|
||||
function ready(fn) {
|
||||
if (document.readyState !== 'loading') {
|
||||
fn();
|
||||
} else {
|
||||
document.addEventListener('DOMContentLoaded', fn);
|
||||
}
|
||||
}
|
||||
|
||||
function on(eventName, elemSelector, handler, capture) {
|
||||
let events = [eventName];
|
||||
if (eventName.indexOf(',') >= 0) {
|
||||
events = eventName.split(',');
|
||||
}
|
||||
|
||||
events.forEach(eventName => {
|
||||
// from youmightnotneedjquery.com
|
||||
document.addEventListener(eventName.trim(), function (e) {
|
||||
// loop parent nodes from the target to the delegation node
|
||||
for (let target = e.target; target && target != this; target = target.parentNode) {
|
||||
if (NodeList.prototype.isPrototypeOf(elemSelector)) {
|
||||
for (el of elemSelector) {
|
||||
if (el == target) {
|
||||
handler.call(target, e);
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else if (!elemSelector || target.matches(elemSelector)) {
|
||||
handler.call(target, e);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}, capture); // I find capture=true helpful when using :not() selectors to exclude one elem of the node tree
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// cloneTemplate does a deep clone of the <template> tag selected by tplSelector.
|
||||
function cloneTemplate(tplSelector) {
|
||||
// Ohhhhhh wow, we need to use firstElementChild when cloning the content of a template tag (!!!!):
|
||||
// https://developer.mozilla.org/en-US/docs/Web/HTML/Element/template#avoiding_documentfragment_pitfall
|
||||
// I spent way too long on this.
|
||||
const elem = $_(tplSelector);
|
||||
if (!elem) return;
|
||||
return elem.content.firstElementChild.cloneNode(true);
|
||||
// return document.importNode(elem.content, true);
|
||||
}
|
||||
|
||||
// Find the first element matching a selector which contains the specified text
|
||||
function findWithContent(selector, text) {
|
||||
const selected = document.querySelectorAll(selector);
|
||||
let found = null;
|
||||
selected.forEach(element => {
|
||||
if (element.textContent.includes(text)) {
|
||||
found = element;
|
||||
}
|
||||
});
|
||||
return found;
|
||||
}
|
||||
|
||||
// Find the next element containing the specified text
|
||||
function findNextText(startElement, nextText) {
|
||||
let currentElement = startElement.nextSibling;
|
||||
while (currentElement) {
|
||||
if (currentElement.textContent.includes(nextText)) {
|
||||
return currentElement;
|
||||
}
|
||||
currentElement = currentElement.nextSibling;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// Function to wrap the range between startElement and endElement in a new span
|
||||
function wrapRangeWithSpan(startElement, endElement, className) {
|
||||
// Check if startElement and endElement are the same
|
||||
if (startElement === endElement) {
|
||||
const span = document.createElement('span');
|
||||
span.className = className;
|
||||
span.appendChild(startElement.cloneNode(true));
|
||||
startElement.parentNode.replaceChild(span, startElement);
|
||||
return span;
|
||||
}
|
||||
|
||||
// Create a new span element
|
||||
const span = document.createElement('span');
|
||||
span.className = className;
|
||||
|
||||
// Reference the parent node of the common ancestor
|
||||
const parent = startElement.parentNode;
|
||||
|
||||
// Iterate through siblings and wrap them in the span
|
||||
const toRemove = [];
|
||||
for (var node = startElement; node; node = node.nextSibling) {
|
||||
var clonedNode = node.cloneNode(true);
|
||||
span.appendChild(clonedNode);
|
||||
if (node === endElement) {
|
||||
parent.replaceChild(span, endElement);
|
||||
toRemove.forEach(node => parent.removeChild(node));
|
||||
break;
|
||||
}
|
||||
toRemove.push(node);
|
||||
}
|
||||
|
||||
return span;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// when the system theme changes, apply that to our site if system theme is configured
|
||||
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', ({ matches }) => {
|
||||
if (getTheme() == "system") {
|
||||
applyTheme(matches ? "dark" : "light");
|
||||
}
|
||||
});
|
||||
|
||||
// getTheme returns the configured theme.
|
||||
function getTheme() {
|
||||
return localStorage.getItem("theme") || "system";
|
||||
}
|
||||
|
||||
// setTheme changes the configured theme to light, dark, or system and applies it.
|
||||
function setTheme(theme) {
|
||||
if (theme !== "light" && theme !== "dark" && theme !== "system") {
|
||||
theme = "system";
|
||||
}
|
||||
localStorage.setItem("theme", theme);
|
||||
ready(function() { $_('#current-theme').innerText = theme; });
|
||||
let lightOrDarkTheme = theme;
|
||||
if (lightOrDarkTheme == "system") {
|
||||
lightOrDarkTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? "dark" : "light";
|
||||
}
|
||||
applyTheme(lightOrDarkTheme);
|
||||
}
|
||||
|
||||
// applyTheme simply adds or removes the 'dark' class to the HTML.
|
||||
function applyTheme(lightOrDark) {
|
||||
if (lightOrDark == "dark") {
|
||||
$_('html').classList.add('dark');
|
||||
} else {
|
||||
$_('html').classList.remove('dark');
|
||||
}
|
||||
}
|
||||
|
||||
// nextTheme switches to the next theme in the rotation.
|
||||
function nextTheme() {
|
||||
let theme = getTheme();
|
||||
if (theme == "system") {
|
||||
theme = "light";
|
||||
} else if (theme == "light") {
|
||||
theme = "dark";
|
||||
} else if (theme == "dark") {
|
||||
theme = "system";
|
||||
}
|
||||
setTheme(theme);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// hoversplash effect!
|
||||
on('mouseover', '.button:not(.cool), button:not(.cool)', (e) => {
|
||||
const elem = document.createElement('span');
|
||||
elem.classList.add('hover-splash');
|
||||
|
||||
// get coordinates relative to container
|
||||
const rect = e.target.getBoundingClientRect();
|
||||
const x = e.clientX - rect.left;
|
||||
const y = e.clientY - rect.top;
|
||||
|
||||
elem.style.left = `${x}px`;
|
||||
elem.style.top = `${y}px`;
|
||||
|
||||
e.target.append(elem);
|
||||
|
||||
setTimeout(function() {
|
||||
elem.remove();
|
||||
}, 1000);
|
||||
});
|
||||
|
||||
|
||||
// mouseover highlights for feature sections that explain config
|
||||
on('mouseover', '.rollover', e => {
|
||||
const target = e.target.closest('.rollover') || e.target;
|
||||
$$_(`.${target.dataset.rollover}`).forEach(elem => elem.classList.add('show'));
|
||||
});
|
||||
on('mouseout', '.rollover', e => {
|
||||
const target = e.target.closest('.rollover') || e.target;
|
||||
$$_(`.${target.dataset.rollover}`).forEach(elem => elem.classList.remove('show'));
|
||||
});
|
||||
|
||||
|
||||
|
||||
// immediately set the configured theme to avoid flash
|
||||
setTheme(getTheme());
|
|
@ -1,105 +0,0 @@
|
|||
ready(function() {
|
||||
// highlight current page in left nav
|
||||
let currentPageLink = $_('main nav a[href="'+window.location.pathname+'"]');
|
||||
if (window.location.pathname.startsWith("/docs/json/")) {
|
||||
// as a special case, highlight the JSON structure link anywhere within it
|
||||
currentPageLink = $_('main nav a[href="/docs/json/"]');
|
||||
}
|
||||
if (window.location.pathname.startsWith("/docs/modules/")) {
|
||||
// as another special case, highlight the modules link anywhere within it
|
||||
currentPageLink = $_('main nav a[href="/docs/modules/"]');
|
||||
}
|
||||
currentPageLink?.classList?.add('current');
|
||||
|
||||
// generate in-page nav before adding anchor links to headings;
|
||||
// only show sidebar if there are any navigable headers
|
||||
// TODO: support h3 too
|
||||
const spacingMS = 50;
|
||||
let delay = spacingMS;
|
||||
const h2elems = $$_('main article h2');
|
||||
if (h2elems.length) {
|
||||
$_('#pagenav .heading').style.display = 'block';
|
||||
h2elems.forEach(elem => {
|
||||
const a = document.createElement('a');
|
||||
a.innerText = elem.innerText;
|
||||
a.href = `#${elem.id}`;
|
||||
setTimeout(function() {
|
||||
$_('#pagenav').append(a);
|
||||
}, delay);
|
||||
delay += spacingMS;
|
||||
});
|
||||
}
|
||||
|
||||
// add anchor links, inspired by https://github.com/bryanbraun/anchorjs
|
||||
$$_('article > h2[id], article > h3[id], article > h4[id], article > h5[id], article > h6[id]').forEach(function(elem) {
|
||||
const anchor = document.createElement('a');
|
||||
anchor.href = `#${elem.id}`;
|
||||
anchor.classList.add('anchor-link');
|
||||
anchor.title = "Link to this section";
|
||||
anchor.innerText = '🔗';
|
||||
elem.append(anchor);
|
||||
});
|
||||
|
||||
const autonav = $_('#autonav');
|
||||
|
||||
// when a left-side-nav-link is hovered, show the in-page nav in a popout to the side
|
||||
on('mouseover', 'main nav li a:not(#autonav a)', async e => {
|
||||
// only show the pop-out nav if not on mobile/narrow screen
|
||||
if ($_('#docs-menu').offsetParent != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
const response = await fetch("/temporary-markdown-proxy"+e.target.getAttribute('href'));
|
||||
const markdown = await response.text();
|
||||
const tokens = marked.lexer(markdown);
|
||||
|
||||
// empty the container
|
||||
autonav.replaceChildren();
|
||||
|
||||
let seenH1 = false;
|
||||
for (const tkn of tokens) {
|
||||
if (tkn.type != "heading") continue;
|
||||
if (tkn.depth == 1) {
|
||||
seenH1 = true;
|
||||
}
|
||||
if (!seenH1 || tkn.depth != 2) continue;
|
||||
|
||||
// this includes HTML entities like < (i.e. not user-facing text), but
|
||||
// that's how the server-side markdown renderer does it too ¯\_(ツ)_/¯
|
||||
const anchor = anchorID(tkn.text);
|
||||
|
||||
const a = document.createElement('a');
|
||||
a.classList.add('autonav-link');
|
||||
a.innerHTML = marked.parseInline(tkn.text);
|
||||
a.href = `${e.target.href}#${anchor}`;
|
||||
autonav.append(a);
|
||||
}
|
||||
|
||||
if ($_('#autonav *')) {
|
||||
const sections = document.createElement('div')
|
||||
sections.classList.add('heading');
|
||||
sections.innerText = 'Sections';
|
||||
autonav.prepend(sections);
|
||||
e.target.closest('li').append(autonav);
|
||||
autonav.style.display = ''; // unhide the container
|
||||
} else {
|
||||
// no links; hide the container so we don't see an empty box
|
||||
autonav.style.display = 'none';
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
// toggle left-nav when menu link is clicked
|
||||
on('click', '#docs-menu', e => {
|
||||
const nav = $_('#docs-menu-container');
|
||||
if (!nav.offsetHeight) {
|
||||
nav.style.height = `${nav.scrollHeight}px`;
|
||||
} else {
|
||||
nav.style.height = 0;
|
||||
}
|
||||
});
|
||||
|
||||
function anchorID(text) {
|
||||
return text.trim().toLowerCase().replace(/\s/g, '-').replace(/[^\w-]/g, '');
|
||||
}
|
|
@ -2,14 +2,14 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Create Account - Caddy</title>
|
||||
{{import "/includes/account/head.html"}}
|
||||
{{import "/old/includes/account/head.html"}}
|
||||
{{template "account-head"}}
|
||||
<script src="/resources/js/account/create.js{{template "cacheBust"}}"></script>
|
||||
<script src="/old/resources/js/account/create.js{{template "cacheBust"}}"></script>
|
||||
</head>
|
||||
<body>
|
||||
<form action="/api/create-account" class="card">
|
||||
<section class="head">
|
||||
<a href="/"><img src="/resources/images/caddy-lock.png" alt="Caddy Portal" class="logo"></a>
|
||||
<a href="/"><img src="/old/resources/images/caddy-lock.png" alt="Caddy Portal" class="logo"></a>
|
||||
</section>
|
||||
<section>
|
||||
<h1>Create Account</h1>
|
||||
|
|
|
@ -2,14 +2,14 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Dashboard - Caddy</title>
|
||||
{{import "/includes/account/head.html"}}
|
||||
{{import "/old/includes/account/head.html"}}
|
||||
{{template "account-head"}}
|
||||
<link rel="stylesheet" href="/resources/css/account/dashboard.css{{template "cacheBust"}}">
|
||||
<script src="/resources/js/account/dashboard.js{{template "cacheBust"}}"></script>
|
||||
<script src="/old/resources/js/account/dashboard.js{{template "cacheBust"}}"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
{{include "/includes/account/nav.html"}}
|
||||
{{include "/old/includes/account/nav.html"}}
|
||||
<main class="dashboard">
|
||||
<section>
|
||||
<h1 class="pad">Your packages<a href="/account/register-package" class="gray button float-right">Register package</a></h1>
|
||||
|
|
|
@ -2,14 +2,14 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Log In - Caddy</title>
|
||||
{{import "/includes/account/head.html"}}
|
||||
{{import "/old/includes/account/head.html"}}
|
||||
{{template "account-head"}}
|
||||
<script src="/resources/js/account/login.js{{template "cacheBust"}}"></script>
|
||||
<script src="/old/resources/js/account/login.js{{template "cacheBust"}}"></script>
|
||||
</head>
|
||||
<body>
|
||||
<form action="/api/login" class="card">
|
||||
<section class="head">
|
||||
<a href="/"><img src="/resources/images/caddy-lock.png" alt="Caddy Portal" class="logo"></a>
|
||||
<a href="/"><img src="/old/resources/images/caddy-lock.png" alt="Caddy Portal" class="logo"></a>
|
||||
</section>
|
||||
<section>
|
||||
<h1>Log In</h1>
|
||||
|
|
|
@ -2,9 +2,9 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Logout - Caddy</title>
|
||||
{{import "/includes/account/head.html"}}
|
||||
{{import "/old/includes/account/head.html"}}
|
||||
{{template "account-head"}}
|
||||
<script src="/resources/js/account/logout.js{{template "cacheBust"}}"></script>
|
||||
<script src="/old/resources/js/account/logout.js{{template "cacheBust"}}"></script>
|
||||
</head>
|
||||
<body>
|
||||
Logging out...
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Register Package - Caddy</title>
|
||||
{{import "/includes/account/head.html"}}
|
||||
{{import "/old/includes/account/head.html"}}
|
||||
{{template "account-head"}}
|
||||
<script src="/resources/js/account/register-package.js{{template "cacheBust"}}"></script>
|
||||
<script src="/old/resources/js/account/register-package.js{{template "cacheBust"}}"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
{{include "/includes/account/nav.html"}}
|
||||
{{include "/old/includes/account/nav.html"}}
|
||||
<main>
|
||||
<section>
|
||||
<form action="/api/claim-package">
|
||||
|
|
|
@ -2,14 +2,14 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Reset Password - Caddy</title>
|
||||
{{import "/includes/account/head.html"}}
|
||||
{{import "/old/includes/account/head.html"}}
|
||||
{{template "account-head"}}
|
||||
<script src="/resources/js/account/reset-password.js{{template "cacheBust"}}"></script>
|
||||
<script src="/old/resources/js/account/reset-password.js{{template "cacheBust"}}"></script>
|
||||
</head>
|
||||
<body>
|
||||
<form action="/api/reset-password" class="card" id="reset-password-step1">
|
||||
<section class="head">
|
||||
<a href="/"><img src="/resources/images/caddy-lock.png" alt="Caddy Portal" class="logo"></a>
|
||||
<a href="/"><img src="/old/resources/images/caddy-lock.png" alt="Caddy Portal" class="logo"></a>
|
||||
</section>
|
||||
<section>
|
||||
<h1>Reset Password</h1>
|
||||
|
@ -22,7 +22,7 @@
|
|||
</form>
|
||||
<form action="/api/reset-password" class="card" id="reset-password-step2">
|
||||
<section class="head">
|
||||
<a href="/"><img src="/resources/images/caddy-lock.png" alt="Caddy Portal" class="logo"></a>
|
||||
<a href="/"><img src="/old/resources/images/caddy-lock.png" alt="Caddy Portal" class="logo"></a>
|
||||
</section>
|
||||
<section>
|
||||
<h1>Reset Password</h1>
|
||||
|
|
|
@ -2,14 +2,14 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Confirm Account - Caddy</title>
|
||||
{{import "/includes/account/head.html"}}
|
||||
{{import "/old/includes/account/head.html"}}
|
||||
{{template "account-head"}}
|
||||
<script src="/resources/js/account/verify.js{{template "cacheBust"}}"></script>
|
||||
<script src="/old/resources/js/account/verify.js{{template "cacheBust"}}"></script>
|
||||
</head>
|
||||
<body>
|
||||
<form action="/api/verify-account" class="card">
|
||||
<section class="head">
|
||||
<a href="/"><img src="/resources/images/caddy-lock.png" alt="Caddy Portal" class="logo"></a>
|
||||
<a href="/"><img src="/old/resources/images/caddy-lock.png" alt="Caddy Portal" class="logo"></a>
|
||||
</section>
|
||||
<section>
|
||||
<h1>Confirm Account</h1>
|
||||
|
|
|
@ -1,48 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Caddy for Business</title>
|
||||
{{import "/includes/head.html"}}
|
||||
{{template "head"}}
|
||||
<link rel="stylesheet" href="/resources/css/business.css{{template "cacheBust"}}">
|
||||
<meta property="og:title" content="Caddy 2 for Business">
|
||||
<meta name="twitter:title" value="Caddy 2 for Business">
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<header>
|
||||
<div id="logo-container">
|
||||
<a href="/"><img src="/resources/images/caddy-logo.svg" id="logo" alt="Caddy"></a>
|
||||
<div id="zerossl-project">a <a href="https://zerossl.com"><img src="/resources/images/zerossl-logo.svg" id="zerossl-logo"></a> project</div>
|
||||
</div>
|
||||
{{include "/includes/header-nav.html"}}
|
||||
</header>
|
||||
|
||||
<h1>Ready for business</h1>
|
||||
|
||||
<section>
|
||||
<div class="panels">
|
||||
<div>
|
||||
<h2>Need help with something?</h2>
|
||||
<p>
|
||||
Most users should participate in our <a href="https://caddy.community">community forum</a> to help others and ask questions.
|
||||
</p>
|
||||
<p>
|
||||
The only price for this help is to put some effort into your question and say thank you. 😃
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<h2>Support and development for businesses</h2>
|
||||
<p>
|
||||
We highly recommend that companies using Caddy get a support plan and contract any related development work with our exclusive partner <a href="https://www.ardanlabs.com/">Ardan Labs</a>. Contact us to get started:
|
||||
</p>
|
||||
<a href="mailto:b%75s%69%6Eess@ca%64dyse%72ver.c%6Fm" class="button red">Email <b>business@caddyserver.com</b></a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
{{include "/includes/footer.html"}}
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -8,15 +8,15 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>{{$title}} — Caddy Documentation</title>
|
||||
{{import "/includes/docs/head.html"}}
|
||||
{{import "/old/includes/docs/head.html"}}
|
||||
{{template "docs-head"}}
|
||||
<meta property="og:title" content="{{$title}} - Caddy Documentation">
|
||||
<meta name="twitter:title" value="{{$title}} - Caddy Documentation">
|
||||
</head>
|
||||
<body>
|
||||
{{include "/includes/docs/header.html"}}
|
||||
{{include "/old/includes/docs/header.html"}}
|
||||
<main>
|
||||
{{include "/includes/docs/nav.html"}}
|
||||
{{include "/old/includes/docs/nav.html"}}
|
||||
<div class="article-container">
|
||||
<div class="paper" id="paper1"></div>
|
||||
<div class="paper" id="paper2"></div>
|
||||
|
@ -26,6 +26,6 @@
|
|||
</div>
|
||||
<div class="sidebar"></div>
|
||||
</main>
|
||||
{{include "/includes/footer.html"}}
|
||||
{{include "/old/includes/footer.html"}}
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -2,17 +2,17 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>JSON Config Structure - Caddy Documentation</title>
|
||||
{{import "/includes/docs/head.html"}}
|
||||
{{import "/old/includes/docs/head.html"}}
|
||||
{{template "docs-head"}}
|
||||
<link rel="stylesheet" href="/resources/css/docs-json.css{{template "cacheBust"}}">
|
||||
<script src="/resources/js/marked-0.8.0.min.js"></script>
|
||||
<script src="/resources/js/docs-api.js{{template "cacheBust"}}"></script>
|
||||
<script src="/resources/js/json-docs.js{{template "cacheBust"}}"></script>
|
||||
<link rel="stylesheet" href="/old/resources/css/docs-json.css{{template "cacheBust"}}">
|
||||
<script src="/old/resources/js/marked-0.8.0.min.js"></script>
|
||||
<script src="/old/resources/js/docs-api.js{{template "cacheBust"}}"></script>
|
||||
<script src="/old/resources/js/json-docs.js{{template "cacheBust"}}"></script>
|
||||
</head>
|
||||
<body>
|
||||
{{include "/includes/docs/header.html"}}
|
||||
{{include "/old/includes/docs/header.html"}}
|
||||
<main>
|
||||
{{include "/includes/docs/nav.html"}}
|
||||
{{include "/old/includes/docs/nav.html"}}
|
||||
<div class="article-container">
|
||||
<div class="paper" id="paper1"></div>
|
||||
<div class="paper" id="paper2"></div>
|
||||
|
@ -21,16 +21,16 @@
|
|||
<div class="breadcrumbs">
|
||||
<!--Populated by JS-->
|
||||
</div>
|
||||
{{include "/includes/docs/renderbox.html"}}
|
||||
{{include "/includes/docs/details.html"}}
|
||||
{{include "/old/includes/docs/renderbox.html"}}
|
||||
{{include "/old/includes/docs/details.html"}}
|
||||
</article>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sidebar"></div>
|
||||
</main>
|
||||
|
||||
{{include "/includes/docs/hovercard.html"}}
|
||||
{{include "/old/includes/docs/hovercard.html"}}
|
||||
|
||||
{{include "/includes/footer.html"}}
|
||||
{{include "/old/includes/footer.html"}}
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -153,7 +153,7 @@ You should see:
|
|||
|
||||
<aside class="tip">
|
||||
|
||||
You can use the [`jq` command <img src="/resources/images/external-link.svg" class="external-link">](https://stedolan.github.io/jq/) to prettify JSON output: **`curl ... | jq`**
|
||||
You can use the [`jq` command <img src="/old/resources/images/external-link.svg" class="external-link">](https://stedolan.github.io/jq/) to prettify JSON output: **`curl ... | jq`**
|
||||
|
||||
</aside>
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ title: "API"
|
|||
|
||||
# API
|
||||
|
||||
Caddy is configured through an administration endpoint which can be accessed via HTTP using a [REST <img src="/resources/images/external-link.svg" class="external-link">](https://en.wikipedia.org/wiki/Representational_state_transfer) API. You can [configure this endpoint](/docs/json/admin/) in your Caddy config.
|
||||
Caddy is configured through an administration endpoint which can be accessed via HTTP using a [REST <img src="/old/resources/images/external-link.svg" class="external-link">](https://en.wikipedia.org/wiki/Representational_state_transfer) API. You can [configure this endpoint](/docs/json/admin/) in your Caddy config.
|
||||
|
||||
**Default address: `localhost:2019`**
|
||||
|
||||
|
@ -254,7 +254,7 @@ This section is for all `/config/` endpoints. It is experimental and subject to
|
|||
</aside>
|
||||
|
||||
|
||||
Caddy's config API provides [ACID guarantees <img src="/resources/images/external-link.svg" class="external-link">](https://en.wikipedia.org/wiki/ACID) for individual requests, but changes that involve more than a single request are subject to collisions or data loss if not properly synchronized.
|
||||
Caddy's config API provides [ACID guarantees <img src="/old/resources/images/external-link.svg" class="external-link">](https://en.wikipedia.org/wiki/ACID) for individual requests, but changes that involve more than a single request are subject to collisions or data loss if not properly synchronized.
|
||||
|
||||
For example, two clients may `GET /config/foo` at the same time, make an edit within that scope (config path), then call `POST|PUT|PATCH|DELETE /config/foo/...` at the same time to apply their changes, resulting in a collision: either one will overwrite the other, or the second might leave the config in an unintended state since it was applied to a different version of the config than it was prepared against. This is because the changes are not aware of each other.
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@ Here's a 28-second video showing how it works:
|
|||
|
||||
- Caddy serves IP addresses and local/internal hostnames over HTTPS using self-signed certificates that are automatically trusted locally (if permitted).
|
||||
- Examples: `localhost`, `127.0.0.1`
|
||||
- Caddy serves public DNS names over HTTPS using certificates from a public ACME CA such as [Let's Encrypt <img src="/resources/images/external-link.svg" class="external-link">](https://letsencrypt.org) or [ZeroSSL <img src="/resources/images/external-link.svg" class="external-link">](https://zerossl.com).
|
||||
- Caddy serves public DNS names over HTTPS using certificates from a public ACME CA such as [Let's Encrypt <img src="/old/resources/images/external-link.svg" class="external-link">](https://letsencrypt.org) or [ZeroSSL <img src="/old/resources/images/external-link.svg" class="external-link">](https://zerossl.com).
|
||||
- Examples: `example.com`, `sub.example.com`, `*.example.com`
|
||||
|
||||
Caddy keeps all managed certificates renewed and redirects HTTP (default port `80`) to HTTPS (default port `443`) automatically.
|
||||
|
@ -89,7 +89,7 @@ Any of the following will prevent automatic HTTPS from being activated, either i
|
|||
|
||||
**Special cases:**
|
||||
|
||||
- Domains ending in `.ts.net` will not be managed by Caddy. Instead, Caddy will automatically attempt to get these certificates at handshake-time from the locally-running [Tailscale <img src="/resources/images/external-link.svg" class="external-link">](https://tailscale.com) instance. This requires that [HTTPS is enabled in your Tailscale account <img src="/resources/images/external-link.svg" class="external-link">](https://tailscale.com/kb/1153/enabling-https/) and the Caddy process must either be running as root, or you must configure `tailscaled` to give your Caddy user [permission to fetch certificates](https://github.com/caddyserver/caddy/pull/4541#issuecomment-1021568348).
|
||||
- Domains ending in `.ts.net` will not be managed by Caddy. Instead, Caddy will automatically attempt to get these certificates at handshake-time from the locally-running [Tailscale <img src="/old/resources/images/external-link.svg" class="external-link">](https://tailscale.com) instance. This requires that [HTTPS is enabled in your Tailscale account <img src="/old/resources/images/external-link.svg" class="external-link">](https://tailscale.com/kb/1153/enabling-https/) and the Caddy process must either be running as root, or you must configure `tailscaled` to give your Caddy user [permission to fetch certificates](https://github.com/caddyserver/caddy/pull/4541#issuecomment-1021568348).
|
||||
|
||||
|
||||
## Effects
|
||||
|
@ -126,7 +126,7 @@ Caddy uses HTTPS automatically for all sites with a host (domain, IP, or hostnam
|
|||
|
||||
To serve non-public sites over HTTPS, Caddy generates its own certificate authority (CA) and uses it to sign certificates. The trust chain consists of a root and intermediate certificate. Leaf certificates are signed by the intermediate. They are stored in [Caddy's data directory](/docs/conventions#data-directory) at `pki/authorities/local`.
|
||||
|
||||
Caddy's local CA is powered by [Smallstep libraries <img src="/resources/images/external-link.svg" class="external-link">](https://smallstep.com/certificates/).
|
||||
Caddy's local CA is powered by [Smallstep libraries <img src="/old/resources/images/external-link.svg" class="external-link">](https://smallstep.com/certificates/).
|
||||
|
||||
Local HTTPS does not use ACME nor does it perform any DNS validation. It works only on the local machine and is trusted only where the CA's root certificate is installed.
|
||||
|
||||
|
@ -158,7 +158,7 @@ Unlike the root certificate, intermediate certificates have a much shorter lifet
|
|||
|
||||
To test or experiment with your Caddy configuration, make sure you [change the ACME endpoint](/docs/modules/tls.issuance.acme#ca) to a staging or development URL, otherwise you are likely to hit rate limits which can block your access to HTTPS for up to a week, depending on which rate limit you hit.
|
||||
|
||||
One of Caddy's default CAs is [Let's Encrypt <img src="/resources/images/external-link.svg" class="external-link">](https://letsencrypt.org/), which has a [staging endpoint <img src="/resources/images/external-link.svg" class="external-link">](https://letsencrypt.org/docs/staging-environment/) that is not subject to the same [rate limits <img src="/resources/images/external-link.svg" class="external-link">](https://letsencrypt.org/docs/rate-limits/):
|
||||
One of Caddy's default CAs is [Let's Encrypt <img src="/old/resources/images/external-link.svg" class="external-link">](https://letsencrypt.org/), which has a [staging endpoint <img src="/old/resources/images/external-link.svg" class="external-link">](https://letsencrypt.org/docs/staging-environment/) that is not subject to the same [rate limits <img src="/old/resources/images/external-link.svg" class="external-link">](https://letsencrypt.org/docs/rate-limits/):
|
||||
|
||||
```
|
||||
https://acme-staging-v02.api.letsencrypt.org/directory
|
||||
|
@ -166,7 +166,7 @@ https://acme-staging-v02.api.letsencrypt.org/directory
|
|||
|
||||
## ACME challenges
|
||||
|
||||
Obtaining a publicly-trusted TLS certificate requires validation from a publicly-trusted, third-party authority. These days, this validation process is automated with the [ACME protocol <img src="/resources/images/external-link.svg" class="external-link">](https://tools.ietf.org/html/rfc8555), and can be performed one of three ways ("challenge types"), described below.
|
||||
Obtaining a publicly-trusted TLS certificate requires validation from a publicly-trusted, third-party authority. These days, this validation process is automated with the [ACME protocol <img src="/old/resources/images/external-link.svg" class="external-link">](https://tools.ietf.org/html/rfc8555), and can be performed one of three ways ("challenge types"), described below.
|
||||
|
||||
The first two challenge types are enabled by default. If multiple challenges are enabled, Caddy chooses one at random to avoid accidental dependence on a particular challenge. Over time, it learns which challenge type is most successful and will begin to prefer it first, but will fall back to other available challenge types if necessary.
|
||||
|
||||
|
@ -245,7 +245,7 @@ Here's what happens if there's an error obtaining or renewing a certificate:
|
|||
- Maximum of 1 day between attempts
|
||||
- For up to 30 days
|
||||
|
||||
During retries with Let's Encrypt, Caddy switches to their [staging environment <img src="/resources/images/external-link.svg" class="external-link">](https://letsencrypt.org/docs/staging-environment/) to avoid rate limit concerns. This isn't a perfect strategy, but in general it's helpful.
|
||||
During retries with Let's Encrypt, Caddy switches to their [staging environment <img src="/old/resources/images/external-link.svg" class="external-link">](https://letsencrypt.org/docs/staging-environment/) to avoid rate limit concerns. This isn't a perfect strategy, but in general it's helpful.
|
||||
|
||||
ACME challenges take at least a few seconds, and internal rate limiting helps mitigate accidental abuse. Caddy uses internal rate limiting in addition to what you or the CA configure so that you can hand Caddy a platter with a million domain names and it will gradually -- but as fast as it can -- obtain certificates for all of them. Caddy's internal rate limit is currently 10 attempts per ACME account per 10 seconds.
|
||||
|
||||
|
@ -255,7 +255,7 @@ To avoid leaking resources, Caddy aborts in-flight tasks (including ACME transac
|
|||
|
||||
Caddy is the first (and so far only) server to support fully-redundant, automatic failover to other CAs in the event it cannot successfully get a certificate.
|
||||
|
||||
By default, Caddy enables two ACME-compatible CAs: [**Let's Encrypt** <img src="/resources/images/external-link.svg" class="external-link">](https://letsencrypt.org) and [**ZeroSSL** <img src="/resources/images/external-link.svg" class="external-link">](https://zerossl.com). If Caddy cannot get a certificate from Let's Encrypt, it will try with ZeroSSL; if both fail, it will backoff and retry again later. In your config, you can customize which issuers Caddy uses to obtain certificates, either universally or for specific names.
|
||||
By default, Caddy enables two ACME-compatible CAs: [**Let's Encrypt** <img src="/old/resources/images/external-link.svg" class="external-link">](https://letsencrypt.org) and [**ZeroSSL** <img src="/old/resources/images/external-link.svg" class="external-link">](https://zerossl.com). If Caddy cannot get a certificate from Let's Encrypt, it will try with ZeroSSL; if both fail, it will backoff and retry again later. In your config, you can customize which issuers Caddy uses to obtain certificates, either universally or for specific names.
|
||||
|
||||
|
||||
## Storage
|
||||
|
@ -277,4 +277,4 @@ If using the Caddyfile, Caddy takes site names literally with regards to the cer
|
|||
|
||||
Wildcard certificates represent a wide degree of authority and should only be used when you have so many subdomains that managing individual certificates for them would strain the PKI or cause you to hit CA-enforced rate limits.
|
||||
|
||||
**Note:** [Let's Encrypt requires <img src="/resources/images/external-link.svg" class="external-link">](https://letsencrypt.org/docs/challenge-types/) the [DNS challenge](#dns-challenge) to obtain wildcard certificates.
|
||||
**Note:** [Let's Encrypt requires <img src="/old/resources/images/external-link.svg" class="external-link">](https://letsencrypt.org/docs/challenge-types/) the [DNS challenge](#dns-challenge) to obtain wildcard certificates.
|
||||
|
|
|
@ -147,7 +147,7 @@ The **format** subdirective lets you customize how logs get encoded (formatted).
|
|||
|
||||
<aside class="tip">
|
||||
|
||||
**A note about Common Log Format (CLF):** CLF clashes with modern structured logs. To transform your access logs into the deprecated Common Log Format, please use the [`transform-encoder` plugin <img src="/resources/images/external-link.svg" class="external-link">](https://github.com/caddyserver/transform-encoder).
|
||||
**A note about Common Log Format (CLF):** CLF clashes with modern structured logs. To transform your access logs into the deprecated Common Log Format, please use the [`transform-encoder` plugin <img src="/old/resources/images/external-link.svg" class="external-link">](https://github.com/caddyserver/transform-encoder).
|
||||
|
||||
</aside>
|
||||
|
||||
|
@ -440,7 +440,7 @@ log {
|
|||
}
|
||||
```
|
||||
|
||||
<span id="multiple-outputs" /> To write the access logs for a particular subdomain to two different files, with different formats (one with [`transform-encoder` plugin <img src="/resources/images/external-link.svg" class="external-link">](https://github.com/caddyserver/transform-encoder) and the other with [`json`](#json)).
|
||||
<span id="multiple-outputs" /> To write the access logs for a particular subdomain to two different files, with different formats (one with [`transform-encoder` plugin <img src="/old/resources/images/external-link.svg" class="external-link">](https://github.com/caddyserver/transform-encoder) and the other with [`json`](#json)).
|
||||
|
||||
This works by overriding the logger name as `foo` in the site block, then including the access logs produced by that logger in the two loggers in global options with `include http.log.access.foo`:
|
||||
|
||||
|
|
|
@ -748,7 +748,7 @@ reverse_proxy 10.0.0.1:443 {
|
|||
|
||||
|
||||
|
||||
[Strip a path prefix](/docs/caddyfile/directives/handle_path) before proxying; but be aware of the [subfolder problem <img src="/resources/images/external-link.svg" class="external-link">](https://caddy.community/t/the-subfolder-problem-or-why-cant-i-reverse-proxy-my-app-into-a-subfolder/8575):
|
||||
[Strip a path prefix](/docs/caddyfile/directives/handle_path) before proxying; but be aware of the [subfolder problem <img src="/old/resources/images/external-link.svg" class="external-link">](https://caddy.community/t/the-subfolder-problem-or-why-cant-i-reverse-proxy-my-app-into-a-subfolder/8575):
|
||||
|
||||
```caddy-d
|
||||
handle_path /prefix/* {
|
||||
|
|
|
@ -94,17 +94,17 @@ Keep in mind that Let's Encrypt may send you emails about your certificate neari
|
|||
- `secp384r1`
|
||||
- `secp521r1`
|
||||
|
||||
- **alpn** <span id="alpn"/> is the list of values to advertise in the [ALPN extension <img src="/resources/images/external-link.svg" class="external-link">](https://developer.mozilla.org/en-US/docs/Glossary/ALPN) of the TLS handshake.
|
||||
- **alpn** <span id="alpn"/> is the list of values to advertise in the [ALPN extension <img src="/old/resources/images/external-link.svg" class="external-link">](https://developer.mozilla.org/en-US/docs/Glossary/ALPN) of the TLS handshake.
|
||||
|
||||
- **load** <span id="load"/> specifies a list of folders from which to load PEM files that are certificate+key bundles.
|
||||
|
||||
- **ca** <span id="ca"/> changes the ACME CA endpoint. This is most often used to set [Let's Encrypt's staging endpoint <img src="/resources/images/external-link.svg" class="external-link">](https://letsencrypt.org/docs/staging-environment/) when testing, or an internal ACME server. (To change this value for the whole Caddyfile, use the `acme_ca` [global option](/docs/caddyfile/options) instead.)
|
||||
- **ca** <span id="ca"/> changes the ACME CA endpoint. This is most often used to set [Let's Encrypt's staging endpoint <img src="/old/resources/images/external-link.svg" class="external-link">](https://letsencrypt.org/docs/staging-environment/) when testing, or an internal ACME server. (To change this value for the whole Caddyfile, use the `acme_ca` [global option](/docs/caddyfile/options) instead.)
|
||||
|
||||
- **ca_root** <span id="ca_root"/> specifies a PEM file that contains a trusted root certificate for the ACME CA endpoint, if not in the system trust store.
|
||||
|
||||
- **key_type** <span id="key_type"/> is the type of key to use when generating CSRs. Only set this if you have a specific requirement.
|
||||
|
||||
- **dns** <span id="dns"/> enables the [DNS challenge](/docs/automatic-https#dns-challenge) using the specified provider plugin, which must be plugged in from one of the [`caddy-dns` <img src="/resources/images/external-link.svg" class="external-link">](https://github.com/caddy-dns) repositories. Each provider plugin may have their own syntax following their name; refer to their docs for details. Maintaining support for each DNS provider is a community effort. [Learn how to enable the DNS challenge for your provider at our wiki.](https://caddy.community/t/how-to-use-dns-provider-modules-in-caddy-2/8148)
|
||||
- **dns** <span id="dns"/> enables the [DNS challenge](/docs/automatic-https#dns-challenge) using the specified provider plugin, which must be plugged in from one of the [`caddy-dns` <img src="/old/resources/images/external-link.svg" class="external-link">](https://github.com/caddy-dns) repositories. Each provider plugin may have their own syntax following their name; refer to their docs for details. Maintaining support for each DNS provider is a community effort. [Learn how to enable the DNS challenge for your provider at our wiki.](https://caddy.community/t/how-to-use-dns-provider-modules-in-caddy-2/8148)
|
||||
|
||||
- **propagation_timeout** <span id="propagation_timeout"/> is a [duration value](/docs/conventions#durations) that sets the maximum time to wait for the DNS TXT records to appear when using the DNS challenge. Set to `-1` to disable propagation checks. Default 2 minutes.
|
||||
|
||||
|
@ -114,13 +114,13 @@ Keep in mind that Let's Encrypt may send you emails about your certificate neari
|
|||
|
||||
- **dns_challenge_override_domain** <span id="dns_challenge_override_domain"/> overrides the domain to use for the DNS challenge. This is to delegate the challenge to a different domain.
|
||||
|
||||
You may want to use this if your primary domain's DNS provider does not have a [DNS plugin <img src="/resources/images/external-link.svg" class="external-link">](https://github.com/caddy-dns) available. You can instead add a `CNAME` record with subdomain `_acme-challenge` to your primary domain, pointing to a secondary domain for which you _do_ have a plugin.
|
||||
You may want to use this if your primary domain's DNS provider does not have a [DNS plugin <img src="/old/resources/images/external-link.svg" class="external-link">](https://github.com/caddy-dns) available. You can instead add a `CNAME` record with subdomain `_acme-challenge` to your primary domain, pointing to a secondary domain for which you _do_ have a plugin.
|
||||
|
||||
When ACME issuers try to solve the DNS challenge for your primary domain, they will then follow the `CNAME` to your secondary domain to find the `TXT` record.
|
||||
|
||||
- **resolvers** <span id="resolvers"/> customizes the DNS resolvers used when performing the DNS challenge; these take precedence over system resolvers or any default ones. If set here, the resolvers will propagate to all configured certificate issuers.
|
||||
|
||||
This is typically a list of IP addresses. For example, to use [Google Public DNS <img src="/resources/images/external-link.svg" class="external-link">](https://developers.google.com/speed/public-dns):
|
||||
This is typically a list of IP addresses. For example, to use [Google Public DNS <img src="/old/resources/images/external-link.svg" class="external-link">](https://developers.google.com/speed/public-dns):
|
||||
|
||||
```caddy-d
|
||||
resolvers 8.8.8.8 8.8.4.4
|
||||
|
@ -230,13 +230,13 @@ Obtains certificates using the ACME protocol. Note that `acme` is a default issu
|
|||
|
||||
- **dns_challenge_override_domain** <span id="dns_challenge_override_domain"/> overrides the domain to use for the DNS challenge. This is to delegate the challenge to a different domain.
|
||||
|
||||
You may want to use this if your primary domain's DNS provider does not have a [DNS plugin <img src="/resources/images/external-link.svg" class="external-link">](https://github.com/caddy-dns) available. You can instead add a `CNAME` record with subdomain `_acme-challenge` to your primary domain, pointing to a secondary domain for which you _do_ have a plugin.
|
||||
You may want to use this if your primary domain's DNS provider does not have a [DNS plugin <img src="/old/resources/images/external-link.svg" class="external-link">](https://github.com/caddy-dns) available. You can instead add a `CNAME` record with subdomain `_acme-challenge` to your primary domain, pointing to a secondary domain for which you _do_ have a plugin.
|
||||
|
||||
When ACME issuers try to solve the DNS challenge for your primary domain, they will then follow the `CNAME` to your secondary domain to find the `TXT` record.
|
||||
|
||||
- **resolvers** <span id="resolvers"/> customizes the DNS resolvers used when performing the DNS challenge; these take precedence over system resolvers or any default ones. If set here, the resolvers will propagate to all configured certificate issuers.
|
||||
|
||||
This is typically a list of IP addresses. For example, to use [Google Public DNS <img src="/resources/images/external-link.svg" class="external-link">](https://developers.google.com/speed/public-dns):
|
||||
This is typically a list of IP addresses. For example, to use [Google Public DNS <img src="/old/resources/images/external-link.svg" class="external-link">](https://developers.google.com/speed/public-dns):
|
||||
|
||||
```caddy-d
|
||||
resolvers 8.8.8.8 8.8.4.4
|
||||
|
@ -298,7 +298,7 @@ These manager modules come standard with the `tls` directive:
|
|||
|
||||
#### tailscale
|
||||
|
||||
Get certificates from a locally-running [Tailscale <img src="/resources/images/external-link.svg" class="external-link">](https://tailscale.com) instance. [HTTPS must be enabled in your Tailscale account](https://tailscale.com/kb/1153/enabling-https/) (or your open source [Headscale server <img src="/resources/images/external-link.svg" class="external-link">](https://github.com/juanfont/headscale)); and the Caddy process must either be running as root, or you must configure `tailscaled` to give your Caddy user [permission to fetch certificates](https://github.com/caddyserver/caddy/pull/4541#issuecomment-1021568348).
|
||||
Get certificates from a locally-running [Tailscale <img src="/old/resources/images/external-link.svg" class="external-link">](https://tailscale.com) instance. [HTTPS must be enabled in your Tailscale account](https://tailscale.com/kb/1153/enabling-https/) (or your open source [Headscale server <img src="/old/resources/images/external-link.svg" class="external-link">](https://github.com/juanfont/headscale)); and the Caddy process must either be running as root, or you must configure `tailscaled` to give your Caddy user [permission to fetch certificates](https://github.com/caddyserver/caddy/pull/4541#issuecomment-1021568348).
|
||||
|
||||
_**NOTE: This is usually unnecessary!** Caddy automatically uses Tailscale for all `*.ts.net` domains without any extra configuration._
|
||||
|
||||
|
|
|
@ -323,7 +323,7 @@ Skips the attempts to install the local CA's root into the system trust store, a
|
|||
|
||||
|
||||
##### `acme_ca`
|
||||
Specifies the URL to the ACME CA's directory. It is strongly recommended to set this to Let's Encrypt's [staging endpoint <img src="/resources/images/external-link.svg" class="external-link">](https://letsencrypt.org/docs/staging-environment/) for testing or development. Default: ZeroSSL and Let's Encrypt's production endpoints.
|
||||
Specifies the URL to the ACME CA's directory. It is strongly recommended to set this to Let's Encrypt's [staging endpoint <img src="/old/resources/images/external-link.svg" class="external-link">](https://letsencrypt.org/docs/staging-environment/) for testing or development. Default: ZeroSSL and Let's Encrypt's production endpoints.
|
||||
|
||||
Note that a globally-configured ACME CA may not apply to all sites; see the [hostname requirements](/docs/automatic-https#hostname-requirements) for using the default ACME issuer(s).
|
||||
|
||||
|
@ -642,7 +642,7 @@ Events typically include a metadata payload. The best way to learn about events
|
|||
|
||||
Binds an event handler to the named event. Specify the name of the event handler module, followed by its configuration.
|
||||
|
||||
For example, to run a command after a certificate is obtained ([third-party plugin <img src="/resources/images/external-link.svg" class="external-link">](https://github.com/mholt/caddy-events-exec) required), with a part of the event payload being passed to the script using a placeholder:
|
||||
For example, to run a command after a certificate is obtained ([third-party plugin <img src="/old/resources/images/external-link.svg" class="external-link">](https://github.com/mholt/caddy-events-exec) required), with a part of the event payload being passed to the script using a placeholder:
|
||||
|
||||
```caddy
|
||||
{
|
||||
|
@ -656,7 +656,7 @@ For example, to run a command after a certificate is obtained ([third-party plug
|
|||
|
||||
These standard events are emitted by Caddy:
|
||||
|
||||
- [`tls` events <img src="/resources/images/external-link.svg" class="external-link">](https://github.com/caddyserver/certmagic#events)
|
||||
- [`tls` events <img src="/old/resources/images/external-link.svg" class="external-link">](https://github.com/caddyserver/certmagic#events)
|
||||
- [`reverse_proxy` events](/docs/caddyfile/directives/reverse_proxy#events)
|
||||
|
||||
Plugins may also emit events, so check their documentation for details.
|
||||
|
|
|
@ -65,7 +65,7 @@ unix//path/to/socket|0200
|
|||
|
||||
<aside class="tip">
|
||||
|
||||
Caddy network addresses are not URLs. URLs couple the lower and higher layers of the [OSI model <img src="/resources/images/external-link.svg" class="external-link">](https://en.wikipedia.org/wiki/OSI_model#Layer_architecture), but Caddy often uses network addresses independently of a specific application, so combining them would be problematic. In Caddy, network addresses refer precisely to resources that can be dialed or bound at L3-L5, but URLs combine L3-L7, which is too many. A network address requires a host+port and path to be mutually exclusive, but URLs do not. Network addresses sometimes support port ranges, but URLs do not.
|
||||
Caddy network addresses are not URLs. URLs couple the lower and higher layers of the [OSI model <img src="/old/resources/images/external-link.svg" class="external-link">](https://en.wikipedia.org/wiki/OSI_model#Layer_architecture), but Caddy often uses network addresses independently of a specific application, so combining them would be problematic. In Caddy, network addresses refer precisely to resources that can be dialed or bound at L3-L5, but URLs combine L3-L7, which is too many. A network address requires a host+port and path to be mutually exclusive, but URLs do not. Network addresses sometimes support port ranges, but URLs do not.
|
||||
|
||||
</aside>
|
||||
|
||||
|
@ -78,7 +78,7 @@ Caddy's configuration supports the use of _placeholders_ (variables). Using plac
|
|||
|
||||
<aside class="tip">
|
||||
|
||||
Placeholders are a similar idea to variables in other software. For example, [nginx has variables <img src="/resources/images/external-link.svg" class="external-link">](https://nginx.org/en/docs/varindex.html) like `$uri` and `$document_root`.
|
||||
Placeholders are a similar idea to variables in other software. For example, [nginx has variables <img src="/old/resources/images/external-link.svg" class="external-link">](https://nginx.org/en/docs/varindex.html) like `$uri` and `$document_root`.
|
||||
|
||||
</aside>
|
||||
|
||||
|
@ -98,7 +98,7 @@ Placeholder | Description
|
|||
`{system.arch}` | The system's architecture
|
||||
`{system.wd}` | The current working directory
|
||||
`{time.now}` | The current time as a Go Time struct
|
||||
`{time.now.http}` | The current time in the format used in [HTTP headers <img src="/resources/images/external-link.svg" class="external-link">](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified)
|
||||
`{time.now.http}` | The current time in the format used in [HTTP headers <img src="/old/resources/images/external-link.svg" class="external-link">](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified)
|
||||
`{time.now.unix}` | The current time as a unix timestamp in seconds
|
||||
`{time.now.unix_ms}` | The current time as a unix timestamp in milliseconds
|
||||
`{time.now.common_log}` | The current time in Common Log Format
|
||||
|
|
|
@ -9,8 +9,8 @@ Caddy is easy to extend because of its modular architecture. Most kinds of Caddy
|
|||
**Prerequisites:**
|
||||
- Basic understanding of [Caddy's architecture](/docs/architecture)
|
||||
- Go language proficiency
|
||||
- [`go` <img src="/resources/images/external-link.svg" class="external-link">](https://golang.org/doc/install)
|
||||
- [`xcaddy` <img src="/resources/images/external-link.svg" class="external-link">](https://github.com/caddyserver/xcaddy)
|
||||
- [`go` <img src="/old/resources/images/external-link.svg" class="external-link">](https://golang.org/doc/install)
|
||||
- [`xcaddy` <img src="/old/resources/images/external-link.svg" class="external-link">](https://github.com/caddyserver/xcaddy)
|
||||
|
||||
|
||||
## Quick Start
|
||||
|
|
|
@ -92,7 +92,7 @@ You can see how the structured log is much more useful and contains much more in
|
|||
|
||||
Because the logs are structured and strongly-typed, they can be encoded into any format. So if you don't want to work with JSON, logs can be encoded into any other representation. Caddy supports others through [log encoder modules](/docs/json/logging/logs/encoder/), and even more can be added.
|
||||
|
||||
**Most importantly** in the distinction between structured logs and legacy formats, with a performance penalty a structured log [can be transformed into the legacy Common Log Format <img src="/resources/images/external-link.svg" class="external-link">](https://github.com/caddyserver/transform-encoder), but not the other way around. It is non-trivial (or at least inefficient) to go from CLF to structured formats, and impossible considering the lack of information.
|
||||
**Most importantly** in the distinction between structured logs and legacy formats, with a performance penalty a structured log [can be transformed into the legacy Common Log Format <img src="/old/resources/images/external-link.svg" class="external-link">](https://github.com/caddyserver/transform-encoder), but not the other way around. It is non-trivial (or at least inefficient) to go from CLF to structured formats, and impossible considering the lack of information.
|
||||
|
||||
In essence, efficient, structured logging generally promotes these philosophies:
|
||||
|
||||
|
|
|
@ -2,17 +2,17 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Modules - Caddy Documentation</title>
|
||||
{{import "/includes/docs/head.html"}}
|
||||
{{import "/old/includes/docs/head.html"}}
|
||||
{{template "docs-head"}}
|
||||
<link rel="stylesheet" href="/resources/css/docs-json.css{{template "cacheBust"}}">
|
||||
<script src="/resources/js/marked-0.8.0.min.js"></script>
|
||||
<script src="/resources/js/docs-api.js{{template "cacheBust"}}"></script>
|
||||
<script src="/resources/js/module-docs.js{{template "cacheBust"}}"></script>
|
||||
<link rel="stylesheet" href="/old/resources/css/docs-json.css{{template "cacheBust"}}">
|
||||
<script src="/old/resources/js/marked-0.8.0.min.js"></script>
|
||||
<script src="/old/resources/js/docs-api.js{{template "cacheBust"}}"></script>
|
||||
<script src="/old/resources/js/module-docs.js{{template "cacheBust"}}"></script>
|
||||
</head>
|
||||
<body>
|
||||
{{include "/includes/docs/header.html"}}
|
||||
{{include "/old/includes/docs/header.html"}}
|
||||
<main>
|
||||
{{include "/includes/docs/nav.html"}}
|
||||
{{include "/old/includes/docs/nav.html"}}
|
||||
<div class="article-container">
|
||||
<div class="paper" id="paper1"></div>
|
||||
<div class="paper" id="paper2"></div>
|
||||
|
@ -42,8 +42,8 @@
|
|||
<div id="module-template" class="module-repo-container">
|
||||
<div class="module-repo-selector"></div>
|
||||
<article>
|
||||
{{include "/includes/docs/renderbox.html"}}
|
||||
{{include "/includes/docs/details.html"}}
|
||||
{{include "/old/includes/docs/renderbox.html"}}
|
||||
{{include "/old/includes/docs/details.html"}}
|
||||
</article>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -51,7 +51,7 @@
|
|||
</div>
|
||||
<div class="sidebar"></div>
|
||||
</main>
|
||||
{{include "/includes/docs/hovercard.html"}}
|
||||
{{include "/includes/footer.html"}}
|
||||
{{include "/old/includes/docs/hovercard.html"}}
|
||||
{{include "/old/includes/footer.html"}}
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -2,21 +2,21 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Download Caddy</title>
|
||||
{{import "/includes/head.html"}}
|
||||
{{import "/old/includes/head.html"}}
|
||||
{{template "head"}}
|
||||
<link rel="stylesheet" href="/resources/css/download.css{{template "cacheBust"}}">
|
||||
<script src="/resources/js/jquery-3.4.1.min.js"></script>
|
||||
<script src="/resources/js/sweetalert.min.js"></script>
|
||||
<script src="/resources/js/download.js{{template "cacheBust"}}"></script>
|
||||
<link rel="stylesheet" href="/old/resources/css/download.css{{template "cacheBust"}}">
|
||||
<script src="/old/resources/js/jquery-3.4.1.min.js"></script>
|
||||
<script src="/old/resources/js/sweetalert.min.js"></script>
|
||||
<script src="/old/resources/js/download.js{{template "cacheBust"}}"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<header>
|
||||
<div id="logo-container">
|
||||
<a href="/"><img src="/resources/images/caddy-logo.svg" id="logo" alt="Caddy"></a>
|
||||
<div id="zerossl-project">a <a href="https://zerossl.com"><img src="/resources/images/zerossl-logo.svg" id="zerossl-logo"></a> project</div>
|
||||
<a href="/"><img src="/old/resources/images/caddy-logo.svg" id="logo" alt="Caddy"></a>
|
||||
<div id="zerossl-project">a <a href="https://zerossl.com"><img src="/old/resources/images/zerossl-logo.svg" id="zerossl-logo"></a> project</div>
|
||||
</div>
|
||||
{{include "/includes/header-nav.html"}}
|
||||
{{include "/old/includes/header-nav.html"}}
|
||||
</header>
|
||||
|
||||
<div class="notice">
|
||||
|
@ -89,6 +89,6 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
{{include "/includes/footer.html"}}
|
||||
{{include "/old/includes/footer.html"}}
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
{{define "account-head"}}
|
||||
{{import "/includes/head.html"}}
|
||||
{{template "head"}}
|
||||
<link rel="stylesheet" href="/resources/css/account/common.css{{template "cacheBust"}}">
|
||||
<script src="/resources/js/jquery-3.4.1.min.js"></script>
|
||||
<script src="/resources/js/sweetalert.min.js"></script>
|
||||
<script src="/resources/js/account/common.js{{template "cacheBust"}}"></script>
|
||||
{{end}}
|
|
@ -1,13 +0,0 @@
|
|||
{{define "docs-head"}}
|
||||
{{import "/includes/head.html"}}
|
||||
{{template "head"}}
|
||||
<link rel="stylesheet" href="/resources/css/docs.css{{template "cacheBust"}}">
|
||||
<link rel="stylesheet" href="/resources/css/chroma.css{{template "cacheBust"}}">
|
||||
{{$directives := list }}
|
||||
{{range $i, $file := (listFiles "/docs/markdown/caddyfile/directives")}}
|
||||
{{$directives = append $directives ($file | trimSuffix ".md")}}
|
||||
{{end}}
|
||||
<script type="text/javascript">window.CaddyfileDirectives = {{$directives | toJson}};</script>
|
||||
<script src="/resources/js/jquery-3.4.1.min.js"></script>
|
||||
<script src="/resources/js/docs.js{{template "cacheBust"}}"></script>
|
||||
{{end}}
|
|
@ -1,12 +0,0 @@
|
|||
<header>
|
||||
<div id="logo-container">
|
||||
<div id="logo-docs-container">
|
||||
<a href="/"><img src="/resources/images/caddy-logo.svg" id="logo" alt="Caddy"></a>
|
||||
<div id="logo-docs">Documentation</div>
|
||||
</div>
|
||||
<div id="zerossl-project">
|
||||
a <a href="https://zerossl.com"><img src="/resources/images/zerossl-logo.svg" id="zerossl-logo"></a> project
|
||||
</div>
|
||||
</div>
|
||||
{{include "/includes/header-nav.html"}}
|
||||
</header>
|
|
@ -1,24 +1,49 @@
|
|||
<div class="wrapper">
|
||||
<footer>
|
||||
<div>
|
||||
<img src="/resources/images/caddy-logo.svg" alt="Caddy" id="footer-logo">
|
||||
An <a href="https://github.com/caddyserver/caddy">open source</a> Go community project
|
||||
<footer>
|
||||
<div class="wrapper">
|
||||
<div class="logo-area">
|
||||
<img src="/resources/images/logo-dark.svg" class="logo" alt="Caddy web server">
|
||||
<p>
|
||||
A free <a href="https://github.com/caddyserver/caddy">open source</a> project
|
||||
that relies on <a href="/sponsor">sponsors</a>.
|
||||
</p>
|
||||
<p>
|
||||
<a href="https://usefathom.com/ref/AUKNWU">Privacy-respecting analytics</a> by Fathom
|
||||
</p>
|
||||
<br>
|
||||
in partnership with <a href="https://www.ardanlabs.com/">Ardan Labs</a>
|
||||
<br>
|
||||
<small><a href="https://usefathom.com/ref/AUKNWU">Privacy-respecting analytics by Fathom</a></small>
|
||||
<p>
|
||||
© {{now | date "2006"}} ZeroSSL. All rights reserved.
|
||||
</p>
|
||||
</div>
|
||||
<div class="copyright">
|
||||
© {{now | date "2006"}} ZeroSSL. All rights reserved.
|
||||
<br>
|
||||
Caddy® is a registered trademark of ZeroSSL GmbH.
|
||||
<div class="link-col">
|
||||
<div class="col-header">Project</div>
|
||||
<a href="/features">Features</a>
|
||||
<a href="/download">Download</a>
|
||||
<a href="/docs">Documentation</a>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<!-- Fathom - beautiful, simple website analytics -->
|
||||
<script src="https://cdn.usefathom.com/script.js" site="GVMGKAKP" honor-dnt="true" defer></script>
|
||||
<!-- / Fathom -->
|
||||
|
||||
<!-- Algolia DocSearch -->
|
||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@docsearch/js@3"></script>
|
||||
<div class="link-col">
|
||||
<div class="col-header">Business services</div>
|
||||
<a href="/support">Support</a>
|
||||
<a href="/sponsor">Sponsorships</a>
|
||||
</div>
|
||||
<div class="link-col">
|
||||
<div class="col-header">Community</div>
|
||||
<a href="https://caddy.community">Forum</a>
|
||||
<a href="https://github.com/caddyserver">GitHub</a>
|
||||
<a href="https://twitter.com/caddyserver">Twitter / X</a>
|
||||
<a href="https://scholar.google.com/scholar?q=caddy+web+server">Research</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wrapper nostalgia">
|
||||
<p>Caddy supports an open Web that promotes privacy, preserves data ownership, fosters innovation, freely allows varieties of client software, and safeguards human sanctity.</p>
|
||||
<div class="nostalgia-badges">
|
||||
<img src="/resources/images/nostalgia/get.gif" title="Honoring early Web clients">
|
||||
<img src="/resources/images/nostalgia/microsoft-ie.gif" title="Honoring early Web clients">
|
||||
<img src="/resources/images/nostalgia/now_anim.gif" title="Honoring early Web clients">
|
||||
<div class="w3c">
|
||||
<img src="/resources/images/nostalgia/valid_html5_yellow.png" title="This site uses HTML 5">
|
||||
<img src="/resources/images/nostalgia/valid_css3_blue.png" title="This site uses CSS 3">
|
||||
</div>
|
||||
<div title="Don't forget to sign our guestbook!">{{ maybe "hitCounter" .OriginalReq.URL.Path }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
|
@ -9,50 +9,52 @@
|
|||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
<link rel="preconnect" href="https://BH4D9OD16A-dsn.algolia.net" crossorigin />
|
||||
<!-- <link rel="preconnect" href="https://BH4D9OD16A-dsn.algolia.net" crossorigin /> -->
|
||||
|
||||
<link rel="icon" href="/resources/images/favicon.png{{template "cacheBust"}}">
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:400,700|Maven+Pro:400,700,900|Montserrat:400,700|PT+Mono&display=swap">
|
||||
<link rel="stylesheet" href="/resources/css/common.css{{template "cacheBust"}}">
|
||||
<script src="/resources/js/common.js{{template "cacheBust"}}"></script>
|
||||
<link rel="icon" href="/resources/images/favicon.png">
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Gantari:wght@400;600;800&family=Figtree:wght@300..900&&family=JetBrains+Mono:wght@400;600&family=Inter:wght@400;500;600&family=Maven+Pro:wght@400;700&family=Poppins:wght@400;600;700;800&family=Albert+Sans:wght@400;600&family=Red+Hat+Text&display=swap" rel="stylesheet">
|
||||
|
||||
<link rel="stylesheet" href="/resources/css/common.css">
|
||||
<link rel="stylesheet" href="/resources/css/chroma.css">
|
||||
|
||||
<script src="/resources/js/lib.js"></script>
|
||||
<script src="/resources/js/common.js"></script>
|
||||
|
||||
<!-- General metatags -->
|
||||
<meta name="author" content="Caddy Web Server">
|
||||
<!-- <meta name="author" content="Caddy Web Server">
|
||||
<meta name="description" content="Caddy is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go">
|
||||
<meta name="theme-color" content="#5ea9a2">
|
||||
<meta name="theme-color" content="#5ea9a2"> -->
|
||||
|
||||
<!-- Open Graph tags -->
|
||||
<meta property="og:type" content="website">
|
||||
<!-- <meta property="og:type" content="website">
|
||||
<meta property="og:url" content="https://caddyserver.com/">
|
||||
<meta property="og:description" content="Caddy is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go">
|
||||
<meta property="og:image" content="https://caddyserver.com/resources/images/caddy-open-graph.jpg">
|
||||
<meta property="og:image" content="https://caddyserver.com/resources/images/caddy-open-graph.jpg"> -->
|
||||
|
||||
<!-- Twitter card tags additive with the og: tags -->
|
||||
<meta name="twitter:card" content="summary">
|
||||
<!-- <meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:domain" value="caddyserver.com">
|
||||
<meta name="twitter:description" value="Caddy is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go">
|
||||
<meta name="twitter:image" content="https://caddyserver.com/resources/images/caddy-open-graph.jpg">
|
||||
<meta name="twitter:url" value="https://caddyserver.com/">
|
||||
<meta name="twitter:url" value="https://caddyserver.com/"> -->
|
||||
|
||||
<!-- Algolia DocSearch -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@docsearch/css@3">
|
||||
<!-- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@docsearch/css@3"> -->
|
||||
|
||||
<!-- Global site tag (gtag.js) - Google Analytics (ZeroSSL) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-2DLB04LK4P"></script>
|
||||
<!-- <script async src="https://www.googletagmanager.com/gtag/js?id=G-2DLB04LK4P"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
gtag('config', 'G-2DLB04LK4P');
|
||||
</script>
|
||||
</script> -->
|
||||
|
||||
<!-- Alpine.js to augment markdown docs -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@alpinejs/persist@3.x.x/dist/cdn.min.js" defer></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js" defer></script>
|
||||
|
||||
<!-- TODO: These don't work -- color values need to be tweaked if they do work -- I think because background-color is set on the body. -->
|
||||
<meta name="theme-color" content="#123245" media="(prefers-color-scheme: light)">
|
||||
<meta name="theme-color" content="#123245" media="(prefers-color-scheme: dark)">
|
||||
|
||||
{{end}}
|
||||
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
<ul>
|
||||
<li class="dropdown-trigger">
|
||||
<a href="/docs/">Documentation</a>
|
||||
<!--
|
||||
<div class="dropdown">
|
||||
<div class="row flatlinks">
|
||||
<a href="/docs/install">
|
||||
|
@ -111,7 +112,7 @@
|
|||
<a href="javascript:">Directives</a>
|
||||
<a href="javascript:">Request matchers</a>
|
||||
<a href="javascript:">Global options</a>
|
||||
</div> -->
|
||||
</div> -- >
|
||||
<div class="col">
|
||||
<div class="links-header">Develop</div>
|
||||
<a href="javascript:">Architecture</a>
|
||||
|
@ -127,7 +128,7 @@
|
|||
<a href="javascript:">All articles...</a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Make a new linkbox div for a separate section. -->
|
||||
<!-- Make a new linkbox div for a separate section. -- >
|
||||
</div>
|
||||
<div class="row featured">
|
||||
<a href="/docs/install">
|
||||
|
@ -159,7 +160,7 @@
|
|||
<path d="M19.875 6.27c.7 .398 1.13 1.143 1.125 1.948v7.284c0 .809 -.443 1.555 -1.158 1.948l-6.75 4.27a2.269 2.269 0 0 1 -2.184 0l-6.75 -4.27a2.225 2.225 0 0 1 -1.158 -1.948v-7.285c0 -.809 .443 -1.554 1.158 -1.947l6.75 -3.98a2.33 2.33 0 0 1 2.25 0l6.75 3.98h-.033z"></path>
|
||||
<path d="M12 16v.01"></path>
|
||||
<path d="M12 13a2 2 0 0 0 .914 -3.782a1.98 1.98 0 0 0 -2.414 .483"></path>
|
||||
</svg> -->
|
||||
</svg> -- >
|
||||
FAQ
|
||||
</b>
|
||||
Get fast answers to common questions
|
||||
|
@ -185,6 +186,7 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
-->
|
||||
</li>
|
||||
<li>
|
||||
<a href="/features">Features</a>
|
1677
src/index.html
8
src/old/includes/account/head.html
Normal file
|
@ -0,0 +1,8 @@
|
|||
{{define "account-head"}}
|
||||
{{import "/old/includes/head.html"}}
|
||||
{{template "head"}}
|
||||
<link rel="stylesheet" href="/old/resources/css/account/common.css{{template "cacheBust"}}">
|
||||
<script src="/old/resources/js/jquery-3.4.1.min.js"></script>
|
||||
<script src="/old/resources/js/sweetalert.min.js"></script>
|
||||
<script src="/old/resources/js/account/common.js{{template "cacheBust"}}"></script>
|
||||
{{end}}
|
|
@ -1,6 +1,6 @@
|
|||
<nav>
|
||||
<div class="logo-container">
|
||||
<img src="/resources/images/caddy-lock.png" alt="Caddy Portal" title="Caddy Portal" class="logo">
|
||||
<img src="/old/resources/images/caddy-lock.png" alt="Caddy Portal" title="Caddy Portal" class="logo">
|
||||
<br>
|
||||
<b>Portal</b>
|
||||
<br>
|
13
src/old/includes/docs/head.html
Normal file
|
@ -0,0 +1,13 @@
|
|||
{{define "docs-head"}}
|
||||
{{import "/old/includes/head.html"}}
|
||||
{{template "head"}}
|
||||
<link rel="stylesheet" href="/old/resources/css/docs.css{{template "cacheBust"}}">
|
||||
<link rel="stylesheet" href="/old/resources/css/chroma.css{{template "cacheBust"}}">
|
||||
{{$directives := list }}
|
||||
{{range $i, $file := (listFiles "/docs/markdown/caddyfile/directives")}}
|
||||
{{$directives = append $directives ($file | trimSuffix ".md")}}
|
||||
{{end}}
|
||||
<script type="text/javascript">window.CaddyfileDirectives = {{$directives | toJson}};</script>
|
||||
<script src="/old/resources/js/jquery-3.4.1.min.js"></script>
|
||||
<script src="/old/resources/js/docs.js{{template "cacheBust"}}"></script>
|
||||
{{end}}
|
12
src/old/includes/docs/header.html
Normal file
|
@ -0,0 +1,12 @@
|
|||
<header>
|
||||
<div id="logo-container">
|
||||
<div id="logo-docs-container">
|
||||
<a href="/"><img src="/old/resources/images/caddy-logo.svg" id="logo" alt="Caddy"></a>
|
||||
<div id="logo-docs">Documentation</div>
|
||||
</div>
|
||||
<div id="zerossl-project">
|
||||
a <a href="https://zerossl.com"><img src="/old/resources/images/zerossl-logo.svg" id="zerossl-logo"></a> project
|
||||
</div>
|
||||
</div>
|
||||
{{include "/old/includes/header-nav.html"}}
|
||||
</header>
|
|
@ -1,7 +1,7 @@
|
|||
<nav class="sidebar">
|
||||
<ul>
|
||||
<li><a href="/docs/">Welcome</a></li>
|
||||
<li><a href="https://caddy.community/c/wiki/13">Wiki <img src="/resources/images/external-link.svg"></a></li>
|
||||
<li><a href="https://caddy.community/c/wiki/13">Wiki <img src="/old/resources/images/external-link.svg"></a></li>
|
||||
|
||||
<li class="heading">Get Caddy</li>
|
||||
<li><a href="/docs/install">Install</a></li>
|
||||
|
@ -59,6 +59,6 @@
|
|||
</li>
|
||||
<li><a href="/docs/extending-caddy/namespaces">Module Namespaces</a></li>
|
||||
<br>
|
||||
<li><a href="/caddy-v1-docs-archive.tar.gz">v1 Docs <img src="/resources/images/external-link.svg"></a></li>
|
||||
<li><a href="/caddy-v1-docs-archive.tar.gz">v1 Docs <img src="/old/resources/images/external-link.svg"></a></li>
|
||||
</ul>
|
||||
</nav>
|
24
src/old/includes/footer.html
Normal file
|
@ -0,0 +1,24 @@
|
|||
<div class="wrapper">
|
||||
<footer>
|
||||
<div>
|
||||
<img src="/old/resources/images/caddy-logo.svg" alt="Caddy" id="footer-logo">
|
||||
An <a href="https://github.com/caddyserver/caddy">open source</a> Go community project
|
||||
<br>
|
||||
in partnership with <a href="https://www.ardanlabs.com/">Ardan Labs</a>
|
||||
<br>
|
||||
<small><a href="https://usefathom.com/ref/AUKNWU">Privacy-respecting analytics by Fathom</a></small>
|
||||
</div>
|
||||
<div class="copyright">
|
||||
© {{now | date "2006"}} Stack Holdings. All rights reserved.
|
||||
<br>
|
||||
Caddy® is a registered trademark of Stack Holdings GmbH.
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<!-- Fathom - beautiful, simple website analytics -->
|
||||
<script src="https://cdn.usefathom.com/script.js" site="GVMGKAKP" honor-dnt="true" defer></script>
|
||||
<!-- / Fathom -->
|
||||
|
||||
<!-- Algolia DocSearch -->
|
||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@docsearch/js@3"></script>
|
|
@ -9,52 +9,50 @@
|
|||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
<!-- <link rel="preconnect" href="https://BH4D9OD16A-dsn.algolia.net" crossorigin /> -->
|
||||
<link rel="preconnect" href="https://BH4D9OD16A-dsn.algolia.net" crossorigin />
|
||||
|
||||
<link rel="icon" href="/resources/images/favicon.png">
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Gantari:wght@400;600;800&family=Figtree:wght@300..900&&family=JetBrains+Mono:wght@400;600&family=Inter:wght@400;500;600&family=Maven+Pro:wght@400;700&family=Poppins:wght@400;600;700;800&family=Albert+Sans:wght@400;600&family=Red+Hat+Text&display=swap" rel="stylesheet">
|
||||
|
||||
<link rel="stylesheet" href="/resources/css/common.css">
|
||||
<link rel="stylesheet" href="/resources/css/chroma.css">
|
||||
|
||||
<script src="/resources/js/lib.js"></script>
|
||||
<script src="/resources/js/common.js"></script>
|
||||
<link rel="icon" href="/old/resources/images/favicon.png{{template "cacheBust"}}">
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:400,700|Maven+Pro:400,700,900|Montserrat:400,700|PT+Mono&display=swap">
|
||||
<link rel="stylesheet" href="/old/resources/css/common.css{{template "cacheBust"}}">
|
||||
<script src="/old/resources/js/common.js{{template "cacheBust"}}"></script>
|
||||
|
||||
<!-- General metatags -->
|
||||
<!-- <meta name="author" content="Caddy Web Server">
|
||||
<meta name="author" content="Caddy Web Server">
|
||||
<meta name="description" content="Caddy is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go">
|
||||
<meta name="theme-color" content="#5ea9a2"> -->
|
||||
<meta name="theme-color" content="#5ea9a2">
|
||||
|
||||
<!-- Open Graph tags -->
|
||||
<!-- <meta property="og:type" content="website">
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:url" content="https://caddyserver.com/">
|
||||
<meta property="og:description" content="Caddy is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go">
|
||||
<meta property="og:image" content="https://caddyserver.com/resources/images/caddy-open-graph.jpg"> -->
|
||||
<meta property="og:image" content="https://caddyserver.com/resources/images/caddy-open-graph.jpg">
|
||||
|
||||
<!-- Twitter card tags additive with the og: tags -->
|
||||
<!-- <meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:domain" value="caddyserver.com">
|
||||
<meta name="twitter:description" value="Caddy is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go">
|
||||
<meta name="twitter:image" content="https://caddyserver.com/resources/images/caddy-open-graph.jpg">
|
||||
<meta name="twitter:url" value="https://caddyserver.com/"> -->
|
||||
<meta name="twitter:url" value="https://caddyserver.com/">
|
||||
|
||||
<!-- Algolia DocSearch -->
|
||||
<!-- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@docsearch/css@3"> -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@docsearch/css@3">
|
||||
|
||||
<!-- Global site tag (gtag.js) - Google Analytics (ZeroSSL) -->
|
||||
<!-- <script async src="https://www.googletagmanager.com/gtag/js?id=G-2DLB04LK4P"></script>
|
||||
<!-- Global site tag (gtag.js) - Google Analytics (Stack Holdings) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-2DLB04LK4P"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
gtag('config', 'G-2DLB04LK4P');
|
||||
</script> -->
|
||||
</script>
|
||||
|
||||
<!-- Alpine.js to augment markdown docs -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@alpinejs/persist@3.x.x/dist/cdn.min.js" defer></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js" defer></script>
|
||||
|
||||
<!-- TODO: These don't work -- color values need to be tweaked if they do work -- I think because background-color is set on the body. -->
|
||||
<meta name="theme-color" content="#123245" media="(prefers-color-scheme: light)">
|
||||
<meta name="theme-color" content="#123245" media="(prefers-color-scheme: dark)">
|
||||
|
||||
{{end}}
|
||||
|
|
@ -1,11 +1,11 @@
|
|||
<!--TODO: add class="current" to the current link-->
|
||||
<nav>
|
||||
<div id="search"></div>
|
||||
<a href="/v2">v2 <span class="new">new</span></a>
|
||||
<a href="/download">Download</a>
|
||||
<a href="/docs/">Documentation</a>
|
||||
<a href="https://caddy.community">Forum</a>
|
||||
<a href="https://github.com/caddyserver/caddy">GitHub</a>
|
||||
<a href="/account/">Account</a>
|
||||
<a href="/business" class="red button">For business</a>
|
||||
<a href="/support"><b>Support</b></a>
|
||||
<a href="/sponsor" class="red button">Sponsor</a>
|
||||
</nav>
|
161
src/old/resources/css/chroma.css
Normal file
|
@ -0,0 +1,161 @@
|
|||
/*
|
||||
Derived from https://gist.github.com/nicolashery/5765395
|
||||
Adjusted to be high-contrast
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
Solarized Light (High Contrast)
|
||||
Derived from http://ethanschoonover.com/solarized
|
||||
*/
|
||||
.chroma {
|
||||
background: linear-gradient(0deg, #f8fbfd 0%, #edf5fd 100%);
|
||||
color: #254048;
|
||||
}
|
||||
.chroma .c { color: #93a1a1 } /* Comment */
|
||||
.chroma .err { color: #586e75 } /* Error */
|
||||
.chroma .g { color: #586e75 } /* Generic */
|
||||
.chroma .k { color: #577b00 } /* Keyword */
|
||||
.chroma .l { color: #586e75 } /* Literal */
|
||||
.chroma .n { color: #586e75 } /* Name */
|
||||
.chroma .o { color: #577b00 } /* Operator */
|
||||
.chroma .x { color: #d03d00 } /* Other */
|
||||
.chroma .p { color: #586e75 } /* Punctuation */
|
||||
.chroma .cm { color: #93a1a1 } /* Comment.Multiline */
|
||||
.chroma .cp { color: #577b00 } /* Comment.Preproc */
|
||||
.chroma .c1 { color: #93a1a1 } /* Comment.Single */
|
||||
.chroma .cs { color: #577b00 } /* Comment.Special */
|
||||
.chroma .gd { color: #dc322f; background-color: #efdede } /* Generic.Deleted */
|
||||
.chroma .ge { color: #586e75; font-style: italic } /* Generic.Emph */
|
||||
.chroma .gr { color: #dc322f } /* Generic.Error */
|
||||
.chroma .gh { color: #d03d00 } /* Generic.Heading */
|
||||
.chroma .gi { color: #577b00; background-color: #ddecdc } /* Generic.Inserted */
|
||||
.chroma .go { color: #586e75 } /* Generic.Output */
|
||||
.chroma .gp { color: #586e75 } /* Generic.Prompt */
|
||||
.chroma .gs { color: #586e75; font-weight: bold } /* Generic.Strong */
|
||||
.chroma .gu { color: #d03d00 } /* Generic.Subheading */
|
||||
.chroma .gt { color: #586e75 } /* Generic.Traceback */
|
||||
.chroma .kc { color: #d03d00 } /* Keyword.Constant */
|
||||
.chroma .kd { color: #0673bf } /* Keyword.Declaration */
|
||||
.chroma .kn { color: #577b00 } /* Keyword.Namespace */
|
||||
.chroma .kp { color: #577b00 } /* Keyword.Pseudo */
|
||||
.chroma .kr { color: #0673bf } /* Keyword.Reserved */
|
||||
.chroma .kt { color: #dc322f } /* Keyword.Type */
|
||||
.chroma .ld { color: #586e75 } /* Literal.Date */
|
||||
.chroma .m { color: #008076 } /* Literal.Number */
|
||||
.chroma .s { color: #008076 } /* Literal.String */
|
||||
.chroma .na { color: #586e75 } /* Name.Attribute */
|
||||
.chroma .nb { color: #B58900 } /* Name.Builtin */
|
||||
.chroma .nc { color: #0673bf } /* Name.Class */
|
||||
.chroma .no { color: #d03d00 } /* Name.Constant */
|
||||
.chroma .nd { color: #0673bf } /* Name.Decorator */
|
||||
.chroma .ni { color: #d03d00 } /* Name.Entity */
|
||||
.chroma .ne { color: #d03d00 } /* Name.Exception */
|
||||
.chroma .nf { color: #0673bf } /* Name.Function */
|
||||
.chroma .nl { color: #586e75 } /* Name.Label */
|
||||
.chroma .nn { color: #586e75 } /* Name.Namespace */
|
||||
.chroma .nx { color: #586e75 } /* Name.Other */
|
||||
.chroma .py { color: #586e75 } /* Name.Property */
|
||||
.chroma .nt { color: #0673bf } /* Name.Tag */
|
||||
.chroma .nv { color: #0673bf } /* Name.Variable */
|
||||
.chroma .ow { color: #577b00 } /* Operator.Word */
|
||||
.chroma .w { color: #586e75 } /* Text.Whitespace */
|
||||
.chroma .mf { color: #008076 } /* Literal.Number.Float */
|
||||
.chroma .mh { color: #008076 } /* Literal.Number.Hex */
|
||||
.chroma .mi { color: #008076 } /* Literal.Number.Integer */
|
||||
.chroma .mo { color: #008076 } /* Literal.Number.Oct */
|
||||
.chroma .sb { color: #93a1a1 } /* Literal.String.Backtick */
|
||||
.chroma .sc { color: #008076 } /* Literal.String.Char */
|
||||
.chroma .sd { color: #586e75 } /* Literal.String.Doc */
|
||||
.chroma .s2 { color: #008076 } /* Literal.String.Double */
|
||||
.chroma .se { color: #d03d00 } /* Literal.String.Escape */
|
||||
.chroma .sh { color: #586e75 } /* Literal.String.Heredoc */
|
||||
.chroma .si { color: #008076 } /* Literal.String.Interpol */
|
||||
.chroma .sx { color: #008076 } /* Literal.String.Other */
|
||||
.chroma .sr { color: #dc322f } /* Literal.String.Regex */
|
||||
.chroma .s1 { color: #008076 } /* Literal.String.Single */
|
||||
.chroma .ss { color: #008076 } /* Literal.String.Symbol */
|
||||
.chroma .bp { color: #0673bf } /* Name.Builtin.Pseudo */
|
||||
.chroma .vc { color: #0673bf } /* Name.Variable.Class */
|
||||
.chroma .vg { color: #0673bf } /* Name.Variable.Global */
|
||||
.chroma .vi { color: #0673bf } /* Name.Variable.Instance */
|
||||
.chroma .il { color: #008076 } /* Literal.Number.Integer.Long */
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
/*
|
||||
Solarized Dark (High Contrast)
|
||||
Derived from http://ethanschoonover.com/solarized
|
||||
*/
|
||||
.chroma {
|
||||
background: linear-gradient(0deg, #18384d 0%, #122537 100%);
|
||||
color: #93a1a1;
|
||||
}
|
||||
.chroma .c { color: #586e75 } /* Comment */
|
||||
.chroma .err { color: #93a1a1 } /* Error */
|
||||
.chroma .g { color: #93a1a1 } /* Generic */
|
||||
.chroma .k { color: #76a507 } /* Keyword */
|
||||
.chroma .l { color: #93a1a1 } /* Literal */
|
||||
.chroma .n { color: #93a1a1 } /* Name */
|
||||
.chroma .o { color: #76a507 } /* Operator */
|
||||
.chroma .x { color: #ec662e } /* Other */
|
||||
.chroma .p { color: #93a1a1 } /* Punctuation */
|
||||
.chroma .cm { color: #586e75 } /* Comment.Multiline */
|
||||
.chroma .cp { color: #76a507 } /* Comment.Preproc */
|
||||
.chroma .c1 { color: #586e75 } /* Comment.Single */
|
||||
.chroma .cs { color: #76a507 } /* Comment.Special */
|
||||
.chroma .gd { color: #dc322f; background-color: #efdede } /* Generic.Deleted */
|
||||
.chroma .ge { color: #93a1a1; font-style: italic } /* Generic.Emph */
|
||||
.chroma .gr { color: #dc322f } /* Generic.Error */
|
||||
.chroma .gh { color: #ec662e } /* Generic.Heading */
|
||||
.chroma .gi { color: #76a507 } /* Generic.Inserted */
|
||||
.chroma .go { color: #93a1a1 } /* Generic.Output */
|
||||
.chroma .gp { color: #93a1a1 } /* Generic.Prompt */
|
||||
.chroma .gs { color: #93a1a1; font-weight: bold } /* Generic.Strong */
|
||||
.chroma .gu { color: #ec662e } /* Generic.Subheading */
|
||||
.chroma .gt { color: #93a1a1 } /* Generic.Traceback */
|
||||
.chroma .kc { color: #ec662e } /* Keyword.Constant */
|
||||
.chroma .kd { color: #0090f5 } /* Keyword.Declaration */
|
||||
.chroma .kn { color: #76a507 } /* Keyword.Namespace */
|
||||
.chroma .kp { color: #76a507 } /* Keyword.Pseudo */
|
||||
.chroma .kr { color: #0090f5 } /* Keyword.Reserved */
|
||||
.chroma .kt { color: #dc322f } /* Keyword.Type */
|
||||
.chroma .ld { color: #93a1a1 } /* Literal.Date */
|
||||
.chroma .m { color: #09a598 } /* Literal.Number */
|
||||
.chroma .s { color: #09a598 } /* Literal.String */
|
||||
.chroma .na { color: #93a1a1 } /* Name.Attribute */
|
||||
.chroma .nb { color: #B58900 } /* Name.Builtin */
|
||||
.chroma .nc { color: #0090f5 } /* Name.Class */
|
||||
.chroma .no { color: #ec662e } /* Name.Constant */
|
||||
.chroma .nd { color: #0090f5 } /* Name.Decorator */
|
||||
.chroma .ni { color: #ec662e } /* Name.Entity */
|
||||
.chroma .ne { color: #ec662e } /* Name.Exception */
|
||||
.chroma .nf { color: #0090f5 } /* Name.Function */
|
||||
.chroma .nl { color: #93a1a1 } /* Name.Label */
|
||||
.chroma .nn { color: #93a1a1 } /* Name.Namespace */
|
||||
.chroma .nx { color: #93a1a1 } /* Name.Other */
|
||||
.chroma .py { color: #93a1a1 } /* Name.Property */
|
||||
.chroma .nt { color: #0090f5 } /* Name.Tag */
|
||||
.chroma .nv { color: #0090f5 } /* Name.Variable */
|
||||
.chroma .ow { color: #76a507 } /* Operator.Word */
|
||||
.chroma .w { color: #93a1a1 } /* Text.Whitespace */
|
||||
.chroma .mf { color: #09a598 } /* Literal.Number.Float */
|
||||
.chroma .mh { color: #09a598 } /* Literal.Number.Hex */
|
||||
.chroma .mi { color: #09a598 } /* Literal.Number.Integer */
|
||||
.chroma .mo { color: #09a598 } /* Literal.Number.Oct */
|
||||
.chroma .sb { color: #586e75 } /* Literal.String.Backtick */
|
||||
.chroma .sc { color: #09a598 } /* Literal.String.Char */
|
||||
.chroma .sd { color: #93a1a1 } /* Literal.String.Doc */
|
||||
.chroma .s2 { color: #09a598 } /* Literal.String.Double */
|
||||
.chroma .se { color: #ec662e } /* Literal.String.Escape */
|
||||
.chroma .sh { color: #93a1a1 } /* Literal.String.Heredoc */
|
||||
.chroma .si { color: #09a598 } /* Literal.String.Interpol */
|
||||
.chroma .sx { color: #09a598 } /* Literal.String.Other */
|
||||
.chroma .sr { color: #dc322f } /* Literal.String.Regex */
|
||||
.chroma .s1 { color: #09a598 } /* Literal.String.Single */
|
||||
.chroma .ss { color: #09a598 } /* Literal.String.Symbol */
|
||||
.chroma .bp { color: #0090f5 } /* Name.Builtin.Pseudo */
|
||||
.chroma .vc { color: #0090f5 } /* Name.Variable.Class */
|
||||
.chroma .vg { color: #0090f5 } /* Name.Variable.Global */
|
||||
.chroma .vi { color: #0090f5 } /* Name.Variable.Instance */
|
||||
.chroma .il { color: #09a598 } /* Literal.Number.Integer.Long */
|
||||
}
|
283
src/old/resources/css/common.css
Normal file
|
@ -0,0 +1,283 @@
|
|||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: Inter, sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
tab-size: 4;
|
||||
-moz-tab-size: 4;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
max-width: 1400px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
padding-left: 40px;
|
||||
padding-right: 40px;
|
||||
}
|
||||
|
||||
.text-center {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.text-right {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.float-right {
|
||||
float: right;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #0694f1;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #ff3f2c;
|
||||
}
|
||||
|
||||
header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: 25px 0;
|
||||
}
|
||||
|
||||
#logo-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-end;
|
||||
}
|
||||
|
||||
#logo {
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
#zerossl-project {
|
||||
font-size: 12px;
|
||||
margin-top: -5px;
|
||||
}
|
||||
|
||||
#zerossl-logo {
|
||||
height: 1.5em;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
header nav {
|
||||
text-align: right;
|
||||
line-height: 40px;
|
||||
}
|
||||
|
||||
header nav > a {
|
||||
display: inline-block;
|
||||
padding-left: 12px;
|
||||
padding-right: 12px;
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
header nav > a:hover {
|
||||
color: #ff3f2c;
|
||||
}
|
||||
|
||||
header nav > a.current {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* Algolia DocSearch */
|
||||
#search {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.DocSearch-Container {
|
||||
color: initial;
|
||||
}
|
||||
.DocSearch-Footer {
|
||||
margin-top: 0;
|
||||
}
|
||||
/* End Algolia DocSearch */
|
||||
|
||||
header nav .new {
|
||||
background-color: #ffe300;
|
||||
font-size: 75%;
|
||||
vertical-align: top;
|
||||
padding: 4px 8px;
|
||||
border-radius: 1em;
|
||||
}
|
||||
|
||||
header nav .button {
|
||||
margin: 0 0 0 10px;
|
||||
padding-top: 2px;
|
||||
padding-bottom: 2px;
|
||||
}
|
||||
|
||||
button,
|
||||
.button {
|
||||
border-radius: 2em;
|
||||
padding: 10px 20px;
|
||||
margin: 15px 0;
|
||||
height: auto;
|
||||
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;
|
||||
font-weight: bold;
|
||||
padding: 20px 50px;
|
||||
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;
|
||||
}
|
||||
|
||||
pre,
|
||||
code,
|
||||
kbd {
|
||||
font-family: 'PT Mono', 'Source Code Pro', monospace;
|
||||
padding: 3px 6px;
|
||||
font-size: 95%;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
kbd {
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
font-size: 80%;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
|
||||
footer {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-top: 100px;
|
||||
padding-bottom: 100px;
|
||||
line-height: 125%;
|
||||
}
|
||||
|
||||
footer > div {
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
#footer-logo {
|
||||
float: left;
|
||||
max-width: 150px;
|
||||
margin-right: 35px;
|
||||
vertical-align: middle;
|
||||
margin-top: -4px;
|
||||
}
|
||||
|
||||
.copyright {
|
||||
text-align: right;
|
||||
font-size: 14px;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
@media (max-width: 900px) {
|
||||
header {
|
||||
flex-direction: column;
|
||||
gap: 1em;
|
||||
}
|
||||
|
||||
#logo-container {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
header nav {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
footer {
|
||||
flex-direction: column;
|
||||
margin-top: 0;
|
||||
padding: 20px 0;
|
||||
}
|
||||
|
||||
footer > div {
|
||||
width: initial;
|
||||
text-align: center;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
#footer-logo {
|
||||
float: none;
|
||||
display: block;
|
||||
margin: 0 auto 25px;
|
||||
}
|
||||
|
||||
.copyright {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
1106
src/old/resources/css/docs.css
Normal file
334
src/old/resources/css/home.css
Normal file
|
@ -0,0 +1,334 @@
|
|||
body {
|
||||
font-family: 'Inter', sans-serif;
|
||||
}
|
||||
|
||||
.hero {
|
||||
background-image: url('/resources/images/bg-teal.jpg');
|
||||
background-repeat: no-repeat;
|
||||
background-size: cover;
|
||||
padding-bottom: 100px;
|
||||
background-position: center;
|
||||
}
|
||||
|
||||
h1 {
|
||||
text-transform: uppercase;
|
||||
font-size: 70px;
|
||||
font-family: Montserrat, sans-serif;
|
||||
text-align: center;
|
||||
margin: 70px 0 20px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 28px;
|
||||
font-weight: normal;
|
||||
text-align: center;
|
||||
max-width: 60rem;
|
||||
margin: 0 auto 50px;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-family: Montserrat, sans-serif;
|
||||
font-weight: 400;
|
||||
font-size: 55px;
|
||||
}
|
||||
|
||||
p {
|
||||
font-size: 20px;
|
||||
max-width: 600px;
|
||||
margin-top: 20px;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
.download-container {
|
||||
text-align: center;
|
||||
margin-top: 50px;
|
||||
}
|
||||
|
||||
.download-container .button.big {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
section {
|
||||
padding: 100px 0;
|
||||
}
|
||||
|
||||
section.alternate:nth-child(even) {
|
||||
background-color: #f5f8f9;
|
||||
}
|
||||
|
||||
section.alternate:nth-child(odd) .side-by-side {
|
||||
flex-direction: row-reverse;
|
||||
}
|
||||
|
||||
.side-by-side {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.side-by-side > * {
|
||||
width: 48%;
|
||||
}
|
||||
|
||||
.side-by-side img {
|
||||
max-height: 400px;
|
||||
}
|
||||
|
||||
.code-caption {
|
||||
font-size: 24px;
|
||||
font-weight: bold;
|
||||
margin: 75px auto 20px;
|
||||
}
|
||||
|
||||
code {
|
||||
font-family: 'PT Mono', monospace;
|
||||
}
|
||||
|
||||
code.block {
|
||||
display: block;
|
||||
background: #2f2f2f;
|
||||
color: #eee;
|
||||
font-size: 20px;
|
||||
padding-top: 30px;
|
||||
padding-bottom: 30px;
|
||||
line-height: 1.25em;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
.actions {
|
||||
padding-top: 100px;
|
||||
}
|
||||
|
||||
code.caddyfile {
|
||||
background-color: #dbebf3;
|
||||
color: black;
|
||||
}
|
||||
|
||||
.cf-key {
|
||||
color: #d22500;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.cf-comment {
|
||||
color: #7291a0;
|
||||
}
|
||||
|
||||
.cf-dir {
|
||||
color: #006c96;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.cf-arg {
|
||||
color: #008000;
|
||||
}
|
||||
|
||||
.cf-subdir {
|
||||
color: #835234;
|
||||
}
|
||||
|
||||
code.rest {
|
||||
background-color: #f0f5f4; /*#073d59;*/
|
||||
color: #253a28;
|
||||
}
|
||||
|
||||
.footnote {
|
||||
font-size: 18px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
|
||||
@media (max-width: 1100px) {
|
||||
.side-by-side,
|
||||
section.alternate:nth-child(odd) .side-by-side {
|
||||
flex-direction: column;
|
||||
}
|
||||
section.alternate:nth-child(odd) .side-by-side > img {
|
||||
flex-direction: column-reverse;
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
|
||||
.side-by-side-content {
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
|
||||
.side-by-side > * {
|
||||
width: initial;
|
||||
}
|
||||
|
||||
p {
|
||||
max-width: 900px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 900px) {
|
||||
h1 {
|
||||
font-size: 50px;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 24px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* TODO: */
|
||||
/* TAKEN FROM features.css */
|
||||
|
||||
.features-start {
|
||||
background: linear-gradient(0deg, #13a8f5 0%, #18b125 100%);
|
||||
color: white;
|
||||
padding: 35px 0;
|
||||
}
|
||||
|
||||
|
||||
.main-features {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
flex-wrap: wrap;
|
||||
padding-top: 2rem;
|
||||
}
|
||||
|
||||
.main-feature {
|
||||
text-align: center;
|
||||
padding: 0 2rem;
|
||||
margin: 3rem 0;
|
||||
width: 25%;
|
||||
}
|
||||
|
||||
.main-feature img {
|
||||
height: 130px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.main-feature .title {
|
||||
font-size: 24px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.main-feature p {
|
||||
text-align: left;
|
||||
font-size: 16px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.feature-points {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
flex-wrap: wrap;
|
||||
font-size: 28px;
|
||||
}
|
||||
|
||||
.feature-point {
|
||||
width: 33.333%;
|
||||
min-width: 300px;
|
||||
padding: 1rem 3rem;
|
||||
}
|
||||
|
||||
#features-title {
|
||||
width: 80%;
|
||||
max-width: 700px;
|
||||
display: block;
|
||||
margin: 50px auto 0;
|
||||
position: relative;
|
||||
top: 40px;
|
||||
}
|
||||
|
||||
.features-area h3 {
|
||||
border-bottom: 3px solid #2BABED;
|
||||
}
|
||||
|
||||
.features-area h4 {
|
||||
text-align: center;
|
||||
padding-top: 80px;
|
||||
padding-bottom: 40px;
|
||||
font-family: Montserrat, sans-serif;
|
||||
font-size: 40px;
|
||||
}
|
||||
|
||||
.features-area h5 {
|
||||
font-size: 18px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
.section-heading {
|
||||
font-style: italic;
|
||||
font-size: 20px;
|
||||
line-height: 2rem;
|
||||
color: #000;
|
||||
max-width: 550px;
|
||||
text-align: center;
|
||||
margin: 2rem auto 0;
|
||||
}
|
||||
|
||||
.features {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.feature {
|
||||
width: 33.333%;
|
||||
padding: 25px;
|
||||
}
|
||||
|
||||
.feature p {
|
||||
margin-top: 5px;
|
||||
color: #333;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
@media (max-width: 900px) {
|
||||
.main-feature {
|
||||
width: 50%;
|
||||
margin: 3rem 0;
|
||||
padding: 0 1rem;
|
||||
}
|
||||
|
||||
.feature {
|
||||
width: 50%;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 700px) {
|
||||
.pitch {
|
||||
width: 100%;
|
||||
border-right: none;
|
||||
}
|
||||
|
||||
.feature-highlight {
|
||||
padding: 1rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 500px) {
|
||||
.main-feature {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.feature {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 162 KiB After Width: | Height: | Size: 162 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 7.1 KiB |
Before Width: | Height: | Size: 109 KiB After Width: | Height: | Size: 109 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
BIN
src/old/resources/images/favicon.png
Normal file
After Width: | Height: | Size: 8.8 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 110 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 171 KiB |
Before Width: | Height: | Size: 164 KiB After Width: | Height: | Size: 164 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 939 B After Width: | Height: | Size: 939 B |
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 81 KiB |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |