dioxus/docs/index.html
2021-02-09 12:44:37 -05:00

915 lines
35 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<!-- saved from url=(0018)https://rocket.rs/ -->
<html>
<link type="text/css" rel="stylesheet" id="dark-mode-general-link" /><link
type="text/css"
rel="stylesheet"
id="dark-mode-custom-link"
/><style lang="en" type="text/css" id="dark-mode-custom-style"></style
><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width" />
<title>Dioxus - Simple, Fast, Type-Safe Web Framework for Rust</title>
<meta
name="description"
content="Dioxus is a web framework for the Rust
programming language that makes it simple to write fast web applications
without sacrificing flexibility or type safety."
/>
<meta name="author" content="Sergio Benitez" />
<link href="./rocketsrchrome_files/css" rel="stylesheet" />
<link
rel="stylesheet"
href="./rocketsrchrome_files/style.css"
media="all"
/>
<link
rel="icon"
type="image/png"
href="https://rocket.rs/v0.4/images/favicon-32x32.png"
sizes="32x32"
/>
<link
rel="icon"
type="image/png"
href="https://rocket.rs/v0.4/images/favicon-16x16.png"
sizes="16x16"
/>
<style media="screen">
#logo {
background-image: url(/v0.4/images/logo.svg);
}
@media (max-width: 870px) {
#logo {
background-image: url(/v0.4/images/logo-small.svg);
}
}
input#search-input {
background-image: url(/v0.4/images/search-icon.svg);
}
.cancel-search {
background: url(/v0.4/images/cancel-icon.svg) no-repeat center;
}
.admonition.note .title {
background-image: url(/v0.4/images/pencil-icon.svg);
}
.admonition.tip .title {
background-image: url(/v0.4/images/star-icon.svg);
}
.admonition.warning .title {
background-image: url(/v0.4/images/warning-icon.svg);
}
</style>
</head>
<body>
<header>
<div id="clouds">
<img
src="./rocketsrchrome_files/cloud-0.png"
class="cloud back"
style="
width: 254px;
height: 159px;
transform: scaleX(-1);
left: 327.999px;
top: 620.94px;
"
/><img
src="./rocketsrchrome_files/cloud-1.png"
class="cloud front"
style="width: 231px; height: 117px; left: -122.168px; top: 339.537px"
/><img
src="./rocketsrchrome_files/cloud-2.png"
class="cloud front"
style="width: 66px; height: 37px; left: 505.832px; top: 166.641px"
/><img
src="./rocketsrchrome_files/cloud-0.png"
class="cloud front"
style="width: 114px; height: 71px; left: 740.832px; top: 379.316px"
/><img
src="./rocketsrchrome_files/cloud-0.png"
class="cloud back"
style="
width: 96px;
height: 60px;
transform: scaleX(-1);
left: 452.999px;
top: 606.645px;
"
/><img
src="./rocketsrchrome_files/cloud-0.png"
class="cloud front"
style="
width: 72px;
height: 45px;
transform: scaleX(-1);
left: 149.832px;
top: 26.552px;
"
/><img
src="./rocketsrchrome_files/cloud-0.png"
class="cloud back"
style="width: 84px; height: 53px; left: 939.999px; top: 156.89px"
/><img
src="./rocketsrchrome_files/cloud-1.png"
class="cloud front"
style="
width: 157px;
height: 79px;
transform: scaleX(-1);
left: 607.832px;
top: 45.7999px;
"
/><img
src="./rocketsrchrome_files/cloud-1.png"
class="cloud front"
style="width: 129px; height: 66px; left: 259.832px; top: 328.975px"
/><img
src="./rocketsrchrome_files/cloud-2.png"
class="cloud front"
style="
width: 191px;
height: 107px;
transform: scaleX(-1);
left: 232.832px;
top: 158.592px;
"
/><img
src="./rocketsrchrome_files/cloud-1.png"
class="cloud front"
style="
width: 257px;
height: 130px;
transform: scaleX(-1);
left: 464.832px;
top: 722.23px;
"
/><img
src="./rocketsrchrome_files/cloud-0.png"
class="cloud front"
style="
width: 160px;
height: 100px;
transform: scaleX(-1);
left: 653.832px;
top: 697.267px;
"
/><img
src="./rocketsrchrome_files/cloud-0.png"
class="cloud front"
style="width: 189px; height: 118px; left: -103.168px; top: 158.261px"
/><img
src="./rocketsrchrome_files/cloud-2.png"
class="cloud back"
style="
width: 167px;
height: 93px;
transform: scaleX(-1);
left: 506.999px;
top: 296.27px;
"
/><img
src="./rocketsrchrome_files/cloud-2.png"
class="cloud back"
style="
width: 211px;
height: 118px;
transform: scaleX(-1);
left: 580.999px;
top: 625.646px;
"
/><img
src="./rocketsrchrome_files/cloud-2.png"
class="cloud back"
style="
width: 228px;
height: 128px;
transform: scaleX(-1);
left: 1034px;
top: 248.156px;
"
/>
</div>
<div class="container">
<a id="logo" href="https://rocket.rs/"><span>Dioxus Homepage</span></a>
<nav class="version-select">
<span onclick="toggleOptions()">v0.4 <i></i></span
><options
><a href="https://rocket.rs/v0.3/">v0.3</a>
<a href="https://rocket.rs/master/">master</a></options
>
</nav>
<input type="checkbox" id="toggle" />
<label for="toggle" class="hamburger"
><span></span> <span></span> <span></span
></label>
<nav class="main">
<a href="https://rocket.rs/v0.4/overview">overview</a>
<a href="https://rocket.rs/v0.4/guide">guide</a>
<a href="https://api.rocket.rs/v0.4/rocket">api</a>
<a href="https://rocket.rs/v0.4/news">news</a>
<a href="https://github.com/SergioBenitez/Dioxus/tree/v0.4">code</a>
</nav>
<div class="centered banner">
<h1>Meet Dioxus.</h1>
<h2>
Dioxus is a web framework for Rust that makes it simple to write
<i>fast</i>, <b>secure</b> web applications without sacrificing
flexibility, usability, or type safety.
</h2>
<a href="https://rocket.rs/v0.4/guide" class="button">Get Started</a>
<a href="https://rocket.rs/v0.4/overview" class="button inverted"
>Learn More</a
>
</div>
<div class="grid">
<div class="col"><hr /></div>
<h4 class="col" style="text-align: center; margin: 0; padding: 0">
Latest Release:
<a href="https://crates.io/crates/rocket/0.4.6"
>0.4.6 (Nov 09, 2020)</a
>
</h4>
<div class="col"><hr /></div>
</div>
<br />
<div class="grid features">
<div class="col centered">
<img
src="./rocketsrchrome_files/helmet.svg"
alt="Type Safe Icon (helmet)"
/>
<h3>Type Safe</h3>
<figcaption>
From request to response Dioxus ensures that your types mean
something.
</figcaption>
<a
class="button inverted small"
href="https://rocket.rs/v0.4/overview/#how-rocket-works"
>Learn More</a
>
</div>
<div class="col centered">
<img
src="./rocketsrchrome_files/robot-free.svg"
alt="Boilerplate Free Icon (robot-free)"
/>
<h3>Boilerplate Free</h3>
<figcaption>
Spend your time writing code that really matters, and let Dioxus
generate the rest.
</figcaption>
<a
class="button inverted small"
href="https://rocket.rs/v0.4/overview/#anatomy-of-a-rocket-application"
>See Examples</a
>
</div>
<div class="col centered">
<img
src="./rocketsrchrome_files/sun.svg"
alt="Easy To Use Icon (sun)"
style="margin-top: 2px"
/>
<h3>Easy To Use</h3>
<figcaption>
Simple, intuitive APIs make Dioxus approachable, no matter your
background.
</figcaption>
<a class="button inverted small" href="https://rocket.rs/v0.4/guide"
>Get Started</a
>
</div>
<div class="col centered">
<img
src="./rocketsrchrome_files/telescope.svg"
alt="Extensible Icon (telescope)"
style="margin-top: 9px"
/>
<h3>Extensible</h3>
<figcaption>
Create your own first-class primitives that any Dioxus application
can use.
</figcaption>
<a
class="button inverted small"
href="https://rocket.rs/v0.4/overview/#anatomy-of-a-rocket-application"
>See How</a
>
</div>
</div>
</div>
</header>
<a
href="https://github.com/SergioBenitez/Dioxus/tree/v0.4"
class="github-corner"
aria-label="View source on Github"
><svg
width="75"
height="75"
viewBox="0 0 250 250"
style="
fill: #fff;
z-index: 10;
color: #151513;
mix-blend-mode: screen;
position: absolute;
top: 0;
border: 0;
right: 0;
"
aria-hidden="true"
>
<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
<path
d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7
120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9
125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2"
fill="currentColor"
style="transform-origin: 130px 106px"
class="octo-arm"
></path>
<path
d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6
C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0
C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1
C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4
C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9
C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5
C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9
L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z"
fill="currentColor"
class="octo-body"
></path>
</svg> </a
><span></span>
<section class="grid mobile-reverse">
<div class="container">
<div class="col left-main">
<h3>Hello, Dioxus!</h3>
<hr />
<p>
This is a <strong>complete Dioxus application</strong>. It does
exactly what you would expect. If you were to visit
<strong>http://localhost:8000/hello/John/58</strong>, youd see:
</p>
<p><span class="callout">Hello, 58 year old named John!</span></p>
<p>
If someone visits a path with an <code>&lt;age&gt;</code> that isnt
a <code>u8</code>, Dioxus doesnt blindly call <code>hello</code>.
Instead, it tries other matching routes or returns a
<strong>404</strong>.
</p>
</div>
<div class="col right-main hl-dark">
<table class="code hltable">
<tbody>
<tr>
<td class="linenos">
<div class="linenodiv">
<pre>
1
2
3
4
5
6
7
8
9
10
11
12</pre
>
</div>
</td>
<td class="code">
<div class="code hl">
<pre><span></span><span class="cp">#![feature(proc_macro_hygiene, decl_macro)]</span><span class="w"></span>
<span class="cp">#[macro_use]</span><span class="w"> </span><span class="k">extern</span><span class="w"> </span><span class="k">crate</span><span class="w"> </span><span class="n">rocket</span><span class="p">;</span><span class="w"></span>
<span class="cp">#[get(</span><span class="s">"/hello/&lt;name&gt;/&lt;age&gt;"</span><span class="cp">)]</span><span class="w"></span>
<span class="k">fn</span> <span class="nf">hello</span><span class="p">(</span><span class="n">name</span>: <span class="nb">String</span><span class="p">,</span><span class="w"> </span><span class="n">age</span>: <span class="kt">u8</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nb">String</span> <span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="n">format</span><span class="o">!</span><span class="p">(</span><span class="s">"Hello, {} year old named {}!"</span><span class="p">,</span><span class="w"> </span><span class="n">age</span><span class="p">,</span><span class="w"> </span><span class="n">name</span><span class="p">)</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>
<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="n">rocket</span>::<span class="n">ignite</span><span class="p">().</span><span class="n">mount</span><span class="p">(</span><span class="s">"/"</span><span class="p">,</span><span class="w"> </span><span class="n">routes</span><span class="o">!</span><span class="p">[</span><span class="n">hello</span><span class="p">]).</span><span class="n">launch</span><span class="p">();</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>
</pre>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<section class="grid mobile-reverse">
<div class="container">
<div class="col left-main">
<h3>Forms? Check!</h3>
<hr />
<p>
Handling forms <strong>is simple and easy</strong>. Simply derive
<code>FromForm</code> for your structure and let Dioxus know which
parameter to use. Dioxus <strong>parses and validates</strong> the
form request, creates the structure, and calls your function.
</p>
<p>
Bad form request? Dioxus doesnt call your function! What if you
want to know if the form was bad? Simple! Change the type of
<code>task</code> to <code>Option</code> or <code>Result</code>!
</p>
</div>
<div class="col right-main hl-light">
<table class="code hltable">
<tbody>
<tr>
<td class="linenos">
<div class="linenodiv">
<pre>
1
2
3
4
5
6
7
8
9
10
11
12
13
14</pre
>
</div>
</td>
<td class="code">
<div class="code hl">
<pre><span></span><span class="cp">#[derive(FromForm)]</span><span class="w"></span>
<span class="k">struct</span> <span class="nc">Task</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="n">description</span>: <span class="nb">String</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="n">completed</span>: <span class="kt">bool</span>
<span class="p">}</span><span class="w"></span>
<span class="cp">#[post(</span><span class="s">"/"</span><span class="cp">, data = </span><span class="s">"&lt;task&gt;"</span><span class="cp">)]</span><span class="w"></span>
<span class="k">fn</span> <span class="nf">new</span><span class="p">(</span><span class="n">task</span>: <span class="nc">Form</span><span class="o">&lt;</span><span class="n">Task</span><span class="o">&gt;</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nc">Flash</span><span class="o">&lt;</span><span class="n">Redirect</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">task</span><span class="p">.</span><span class="n">description</span><span class="p">.</span><span class="n">is_empty</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="n">Flash</span>::<span class="n">error</span><span class="p">(</span><span class="n">Redirect</span>::<span class="n">to</span><span class="p">(</span><span class="s">"/"</span><span class="p">),</span><span class="w"> </span><span class="s">"Cannot be empty."</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="n">Flash</span>::<span class="n">success</span><span class="p">(</span><span class="n">Redirect</span>::<span class="n">to</span><span class="p">(</span><span class="s">"/"</span><span class="p">),</span><span class="w"> </span><span class="s">"Task added."</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="p">}</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>
</pre>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<section class="grid mobile-reverse">
<div class="container">
<div class="col left-main">
<h3>JSON, out of the box.</h3>
<hr />
<p>
Dioxus has first-class support for JSON, right out of the box.
Simply derive <code>Deserialize</code> or <code>Serialize</code> to
receive or return JSON, respectively.
</p>
<p>
Like other important features, JSON works through Dioxuss
<code>FromData</code> trait, Dioxuss approach to deriving types
from body data. It works like this: specify a
<code>data</code> route parameter of any type that implements
<code>FromData</code>. A value of that type will then be created
automatically from the incoming request body. Best of all, you can
implement <code>FromData</code> for your types!
</p>
</div>
<div class="col right-main hl-dark">
<table class="code hltable">
<tbody>
<tr>
<td class="linenos">
<div class="linenodiv">
<pre>
1
2
3
4
5
6
7
8
9
10
11
12
13
14</pre
>
</div>
</td>
<td class="code">
<div class="code hl">
<pre><span></span><span class="cp">#[derive(Serialize, Deserialize)]</span><span class="w"></span>
<span class="k">struct</span> <span class="nc">Message</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="n">contents</span>: <span class="nb">String</span><span class="p">,</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>
<span class="cp">#[put(</span><span class="s">"/&lt;id&gt;"</span><span class="cp">, data = </span><span class="s">"&lt;msg&gt;"</span><span class="cp">)]</span><span class="w"></span>
<span class="k">fn</span> <span class="nf">update</span><span class="p">(</span><span class="n">db</span>: <span class="kp">&amp;</span><span class="nc">Db</span><span class="p">,</span><span class="w"> </span><span class="n">id</span>: <span class="nc">Id</span><span class="p">,</span><span class="w"> </span><span class="n">msg</span>: <span class="nc">Json</span><span class="o">&lt;</span><span class="n">Message</span><span class="o">&gt;</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nc">JsonValue</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">db</span><span class="p">.</span><span class="n">contains_key</span><span class="p">(</span><span class="o">&amp;</span><span class="n">id</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="n">db</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">msg</span><span class="p">.</span><span class="n">contents</span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="n">json</span><span class="o">!</span><span class="p">({</span><span class="w"> </span><span class="s">"status"</span>: <span class="s">"ok"</span><span class="w"> </span><span class="p">})</span><span class="w"></span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="n">json</span><span class="o">!</span><span class="p">({</span><span class="w"> </span><span class="s">"status"</span>: <span class="s">"error"</span><span class="w"> </span><span class="p">})</span><span class="w"></span>
<span class="w"> </span><span class="p">}</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>
</pre>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<section class="centered">
<h1>Dioxus is ready to launch.</h1>
<a href="https://rocket.rs/v0.4/guide" class="button">Get Started</a>
<a href="https://rocket.rs/v0.4/overview" class="button inverted"
>Learn More</a
>
</section>
<section class="features">
<div class="container">
<div class="centered">
<h2>And so much more.</h2>
<h4>Essential features, built in.</h4>
</div>
<div class="grid">
<div class="col centered tight">
<img
src="./rocketsrchrome_files/templating-icon.svg"
alt="Templating Icon (templating-icon)"
/>
<h3 class="blue">Templating</h3>
<figcaption class="wide">
Dioxus makes templating a breeze with built-in templating support.
</figcaption>
<a
class="button inverted small blue"
href="https://rocket.rs/v0.4/guide/responses/#templates"
>Learn More</a
>
</div>
<div class="col centered tight">
<img
src="./rocketsrchrome_files/cookies-icon.svg"
alt="Cookies Icon (cookies-icon)"
style="margin-top: -6px"
/>
<h3 class="purple">Cookies</h3>
<figcaption class="wide">
View, add, or remove cookies, with or without encryption, without
hassle.
</figcaption>
<a
class="button inverted small purple"
href="https://rocket.rs/v0.4/guide/requests/#cookies"
>Learn More</a
>
</div>
<div class="col centered tight">
<img
src="./rocketsrchrome_files/streams-icon.svg"
alt="Streams Icon (streams-icon)"
style="margin-top: -29px"
/>
<h3 class="red">Streams</h3>
<figcaption class="wide">
Dioxus streams all incoming and outgoing data, so size isn't a
concern.
</figcaption>
<a
class="button inverted small red"
href="https://rocket.rs/v0.4/guide/requests/#streaming"
>Learn More</a
>
</div>
</div>
<hr />
<div class="grid">
<div class="col centered tight">
<img
src="./rocketsrchrome_files/config-icon.svg"
alt="Config Environments Icon (config-icon)"
style="margin-top: -3px"
/>
<h3 class="yellow">Config Environments</h3>
<figcaption class="wide">
Configure your application your way for development, staging, and
production.
</figcaption>
<a
class="button inverted small yellow"
href="https://rocket.rs/v0.4/guide/configuration/#environment"
>Learn More</a
>
</div>
<div class="col centered tight">
<img
src="./rocketsrchrome_files/testing-icon.svg"
alt="Testing Library Icon (testing-icon)"
/>
<h3 class="orange">Testing Library</h3>
<figcaption class="wide">
Unit test your applications with ease using the built-in testing
library.
</figcaption>
<a
class="button inverted small orange"
href="https://rocket.rs/v0.4/guide/testing#testing"
>Learn More</a
>
</div>
<div class="col centered tight">
<img
src="./rocketsrchrome_files/ship-icon.svg"
alt="Typed URIs Icon (ship-icon)"
style="margin-top: -20px"
/>
<h3 class="green">Typed URIs</h3>
<figcaption class="wide">
Dioxus typechecks route URIs for you so you never mistype a URI
again.
</figcaption>
<a
class="button inverted small green"
href="https://rocket.rs/v0.4/guide/responses/#typed-uris"
>Learn More</a
>
</div>
</div>
</div>
</section>
<footer class="grid">
<div class="container">
<div class="col mobile-hide">
<a href="https://sergio.bz/">© 2016-2020 Sergio Benitez</a>
</div>
<div class="col centered">
<img
src="./rocketsrchrome_files/logo-small.svg"
alt="Small Dioxus Logo"
/>
</div>
<div class="col text-right mobile-hide">
<a href="https://rocket.rs/#">BACK TO TOP Δ</a>
</div>
</div>
</footer>
<script>
function toggleOptions() {
if (!(870 <= screen.width)) {
var e = document.querySelector("nav.version-select options");
e.style.display = "none" === e.style.display ? "block" : "none";
}
}
</script>
<script>
function make_clouds() {
for (
var t = [
{
src: "/v0.4/images/cloud-0.png",
className: "cloud back",
style: {
width: "254px",
height: "159px",
left: 0.4150208376753395,
top: 0.8482790827243787,
transform: "scaleX(-1)",
},
},
{
src: "/v0.4/images/cloud-1.png",
className: "cloud front",
style: {
width: "231px",
height: "117px",
left: 0.08151647217334701,
top: 0.46384778619445943,
transform: "",
},
},
{
src: "/v0.4/images/cloud-2.png",
className: "cloud front",
style: {
width: "66px",
height: "37px",
left: 0.748033557779848,
top: 0.22765147586875178,
transform: "",
},
},
{
src: "/v0.4/images/cloud-0.png",
className: "cloud front",
style: {
width: "114px",
height: "71px",
left: 0.9580076354609097,
top: 0.5181917598421091,
transform: "",
},
},
{
src: "/v0.4/images/cloud-0.png",
className: "cloud back",
style: {
width: "96px",
height: "60px",
left: 0.526598813402908,
top: 0.828749451839631,
transform: "scaleX(-1)",
},
},
{
src: "/v0.4/images/cloud-0.png",
className: "cloud front",
style: {
width: "72px",
height: "45px",
left: 0.43174032452284195,
top: 0.03627323642266411,
transform: "scaleX(-1)",
},
},
{
src: "/v0.4/images/cloud-0.png",
className: "cloud back",
style: {
width: "84px",
height: "53px",
left: 0.9296373513977365,
top: 0.2143312531352375,
transform: "",
},
},
{
src: "/v0.4/images/cloud-1.png",
className: "cloud front",
style: {
width: "157px",
height: "79px",
left: 0.8394192676334562,
top: 0.06256812600484052,
transform: "scaleX(-1)",
},
},
{
src: "/v0.4/images/cloud-1.png",
className: "cloud front",
style: {
width: "129px",
height: "66px",
left: 0.5289903611035771,
top: 0.44941927870774023,
transform: "",
},
},
{
src: "/v0.4/images/cloud-2.png",
className: "cloud front",
style: {
width: "191px",
height: "107px",
left: 0.5054580108916613,
top: 0.21665631039514555,
transform: "scaleX(-1)",
},
},
{
src: "/v0.4/images/cloud-1.png",
className: "cloud front",
style: {
width: "257px",
height: "130px",
left: 0.711964549651326,
top: 0.9866528842991085,
transform: "scaleX(-1)",
},
},
{
src: "/v0.4/images/cloud-0.png",
className: "cloud front",
style: {
width: "160px",
height: "100px",
left: 0.8804341424789892,
top: 0.9525512115988461,
transform: "scaleX(-1)",
},
},
{
src: "/v0.4/images/cloud-0.png",
className: "cloud front",
style: {
width: "189px",
height: "118px",
left: 0.11523417887783305,
top: 0.21620306890331475,
transform: "",
},
},
{
src: "/v0.4/images/cloud-2.png",
className: "cloud back",
style: {
width: "167px",
height: "93px",
left: 0.5745663098156899,
top: 0.40474044003106946,
transform: "scaleX(-1)",
},
},
{
src: "/v0.4/images/cloud-2.png",
className: "cloud back",
style: {
width: "211px",
height: "118px",
left: 0.640291368531211,
top: 0.854708255363859,
transform: "scaleX(-1)",
},
},
{
src: "/v0.4/images/cloud-2.png",
className: "cloud back",
style: {
width: "228px",
height: "128px",
left: 0.9868028690238078,
top: 0.3390108865793462,
transform: "scaleX(-1)",
},
},
],
p = document.getElementsByTagName("header")[0],
e = document.getElementById("clouds"),
s = Math.min((p.offsetHeight / 750) * t.length, t.length),
l = 0;
l < s;
l++
) {
var a = t[l],
c = document.createElement("img");
Object.assign(c, a), Object.assign(c.style, a.style);
var o = p.offsetWidth;
c.style.left = o * a.style.left + "px";
var r = p.offsetHeight;
(c.style.top = r * a.style.top + "px"), e.appendChild(c);
}
var n = 0,
i = 0,
d = 14,
m = 5,
f = e.children;
function h(t, e, s, l) {
var a = ((e - s) / 1e3) * l;
if (a < 1) return !1;
for (var c = 0; c < f.length; c++) {
var o = f[c];
if (o.className.includes(t)) {
var r = parseInt(o.style.left) - a,
n = parseInt(o.style.width);
if (r < -n) {
var i = p.offsetWidth;
r = i - (-(r + n) % i);
}
o.style.left = r + "px";
}
}
return !0;
}
window.requestAnimationFrame(function t(e) {
e - Math.min(i, n) < 50 ||
(h("front", e, n, d) && (n = e), h("back", e, i, m) && (i = e)),
window.requestAnimationFrame(t);
});
}
make_clouds();
</script>
</body>
</html>