From fdc99e5bf619daf46b9f3508827a79e329b0da9b Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Tue, 19 Nov 2019 11:39:49 +0100
Subject: Update `README` and `ROADMAP` and add `ECOSYSTEM`

---
 ECOSYSTEM.md              |  88 +++++++++++++++++++++
 README.md                 | 100 +++++++++++++++---------
 ROADMAP.md                | 193 ++++------------------------------------------
 docs/crates_graph.dot     |  12 ---
 docs/crates_graph.png     | Bin 40251 -> 0 bytes
 docs/graphs/core.dot      |  13 ++++
 docs/graphs/core.png      | Bin 0 -> 16123 bytes
 docs/graphs/ecosystem.dot |  59 ++++++++++++++
 docs/graphs/ecosystem.png | Bin 0 -> 51911 bytes
 docs/graphs/iced.dot      |  47 +++++++++++
 docs/graphs/iced.png      | Bin 0 -> 32794 bytes
 docs/graphs/native.dot    |  42 ++++++++++
 docs/graphs/native.png    | Bin 0 -> 27637 bytes
 docs/graphs/web.dot       |  12 +++
 docs/graphs/web.png       | Bin 0 -> 13023 bytes
 docs/graphs/wgpu.dot      |  33 ++++++++
 docs/graphs/wgpu.png      | Bin 0 -> 20091 bytes
 docs/graphs/winit.dot     |  33 ++++++++
 docs/graphs/winit.png     | Bin 0 -> 17051 bytes
 19 files changed, 406 insertions(+), 226 deletions(-)
 create mode 100644 ECOSYSTEM.md
 delete mode 100644 docs/crates_graph.dot
 delete mode 100644 docs/crates_graph.png
 create mode 100644 docs/graphs/core.dot
 create mode 100644 docs/graphs/core.png
 create mode 100644 docs/graphs/ecosystem.dot
 create mode 100644 docs/graphs/ecosystem.png
 create mode 100644 docs/graphs/iced.dot
 create mode 100644 docs/graphs/iced.png
 create mode 100644 docs/graphs/native.dot
 create mode 100644 docs/graphs/native.png
 create mode 100644 docs/graphs/web.dot
 create mode 100644 docs/graphs/web.png
 create mode 100644 docs/graphs/wgpu.dot
 create mode 100644 docs/graphs/wgpu.png
 create mode 100644 docs/graphs/winit.dot
 create mode 100644 docs/graphs/winit.png

diff --git a/ECOSYSTEM.md b/ECOSYSTEM.md
new file mode 100644
index 00000000..177b8709
--- /dev/null
+++ b/ECOSYSTEM.md
@@ -0,0 +1,88 @@
+# Ecosystem
+This document describes the Iced ecosystem.
+
+It quickly lists the different audiences of the library and explains how the different crates relate to each other.
+
+## Users
+
+Iced is meant to be used by 2 different types of users:
+
+- __End-users__. They should be able to:
+  - get started quickly,
+  - have many widgets available,
+  - keep things simple,
+  - and build applications that are __maintainable__ and __performant__.
+- __GUI toolkit developers / Ecosystem contributors__. They should be able to:
+  - build new kinds of widgets,
+  - implement custom runtimes,
+  - integrate existing runtimes in their own system (like game engines),
+  - and create their own custom renderers.
+
+## Crates
+Iced consists of different crates which offer different layers of abstractions for our users. This modular architecture helps us keep implementation details hidden and decoupled, which should allow us to rewrite or change strategies in the future.
+
+![Ecosystem graph](docs/graphs/ecosystem.png)
+
+### [`iced_core`]
+
+[`iced_core`] holds basic reusable types of the public API. For instance, basic data types like `Point`, `Rectangle`, `Length`, etc.
+
+This crate is meant to be a starting point for an Iced runtime.
+
+### [`iced_native`]
+[`iced_native`] takes [`iced_core`] and builds a native runtime on top of it, featuring:
+- A custom layout engine, greatly inspired by [`druid`]
+- Event handling for all the built-in widgets
+- A renderer-agnostic API
+
+To achieve this, it introduces a bunch of reusable interfaces:
+- A `Widget` trait, which is used to implement new widgets: from layout requirements to event and drawing logic.
+- A bunch of `Renderer` traits, meant to keep the crate renderer-agnostic.
+- A `Windowed` trait, leveraging [`raw-window-handle`], which can be implemented by graphical renderers that target _windows_. Window-based shells (like [`iced_winit`]) can use this trait to stay renderer-agnostic.
+
+[`druid`]: https://github.com/xi-editor/druid
+[`raw-window-handle`]: https://github.com/rust-windowing/raw-window-handle
+
+### [`iced_web`]
+[`iced_web`] takes [`iced_core`] and builds a WebAssembly runtime on top. It achieves this by introducing a `Widget` trait that can be used to produce VDOM nodes.
+
+The crate is currently a simple abstraction layer over [`dodrio`].
+
+[`dodrio`]: https://github.com/fitzgen/dodrio
+
+### [`iced_wgpu`]
+[`iced_wgpu`] is a [`wgpu`] renderer for [`iced_native`]. For now, it is the default renderer of Iced in native platforms.
+
+[`wgpu`] supports most modern graphics backends: Vulkan, Metal, DX11, and DX12 (OpenGL and WebGL are still WIP). Additionally, it will support the incoming [WebGPU API].
+
+Currently, [`iced_wgpu`] supports the following primitives:
+- Text, which is rendered using [`wgpu_glyph`]. No shaping at all.
+- Quads or rectangles, with rounded borders and a solid background color.
+- Images, lazily loaded from the filesystem.
+- Clip areas, useful to implement scrollables or hide overflowing content.
+
+[`wgpu`]: https://github.com/gfx-rs/wgpu-rs
+[WebGPU API]: https://gpuweb.github.io/gpuweb/
+[`wgpu_glyph`]: https://github.com/hecrj/wgpu_glyph
+
+### [`iced_winit`]
+[`iced_winit`] offers some convenient abstractions on top of [`iced_native`] to quickstart development when using [`winit`].
+
+It exposes a renderer-agnostic `Application` trait that can be implemented and then run with a simple call. The use of this trait is optional. A `conversion` module is provided for users that decide to implement a custom event loop.
+
+[`winit`]: https://github.com/rust-windowing/winit
+
+### [`iced`]
+Finally, [`iced`] unifies everything into a simple abstraction to create cross-platform applications:
+
+- On native, it uses [`iced_winit`] and [`iced_wgpu`].
+- On the web, it uses [`iced_web`].
+
+This is the crate meant to be used by __end-users__.
+
+[`iced_core`]: core
+[`iced_native`]: native
+[`iced_web`]: web
+[`iced_wgpu`]: wgpu
+[`iced_winit`]: winit
+[`iced`]: ..
diff --git a/README.md b/README.md
index 0aac9bc8..7e243871 100644
--- a/README.md
+++ b/README.md
@@ -3,8 +3,9 @@
 [![Documentation](https://docs.rs/iced/badge.svg)][documentation]
 [![Crates.io](https://img.shields.io/crates/v/iced.svg)](https://crates.io/crates/iced)
 [![License](https://img.shields.io/crates/l/iced.svg)](https://github.com/hecrj/iced/blob/master/LICENSE)
+[![project chat](https://img.shields.io/badge/chat-on_zulip-brightgreen.svg)](https://iced.zulipchat.com)
 
-A renderer-agnostic GUI library for Rust focused on simplicity and type-safety.
+A cross-platform GUI library for Rust focused on simplicity and type-safety.
 Inspired by [Elm].
 
 [![Tour - Iced][gui_gif]][gui_gfycat]
@@ -17,15 +18,31 @@ Inspired by [Elm].
 [coffee_gui_gfycat]: https://gfycat.com/gloomyweakhammerheadshark
 
 ## Features
-  * Simple, easy-to-use, renderer-agnostic API
-  * Responsive, flexbox-based layouting
+  * Simple, easy-to-use, batteries-included API
   * Type-safe, reactive programming model
-  * Built-in widgets
-  * Custom widget support
-
-__Iced is in a experimental stage.__ [Take a look at the roadmap],
-[check out the issues], and [feel free to contribute!].
-
+  * Cross-platform support (Windows, macOS, Linux, and the Web)
+  * Responsive layout
+  * Built-in widgets (including [text inputs], [scrollables], and more!)
+  * Custom widget support (create your own!)
+  * [Debug overlay with performance metrics]
+  * First-class support for async actions (use futures!)
+  * [Modular ecosystem] split into reusable parts:
+    * A [default renderer] supporting Vulkan, Metal, DX11, and DX12
+    * A [renderer-agnostic native runtime] enabling integration with existing systems
+    * A [web runtime] leveraging the DOM
+
+__Iced is currently experimental software.__ [Take a look at the roadmap],
+[check out the issues], and [feel free to contribute!]
+
+[text inputs]: https://gfycat.com/alertcalmcrow-rust-gui
+[scrollables]: https://gfycat.com/perkybaggybaboon-rust-gui
+[Debug overlay with performance metrics]: https://gfycat.com/artisticdiligenthorseshoebat-rust-gui
+[Modular ecosystem]: https://github.com/hecrj/iced/blob/master/ECOSYSTEM.md
+[renderer-agnostic native runtime]: https://github.com/hecrj/iced/tree/master/native
+[`wgpu`]: https://github.com/gfx-rs/wgpu-rs
+[Default renderer]: https://github.com/hecrj/iced/tree/master/wgpu
+[`dodrio`]: https://github.com/fitzgen/dodrio
+[web runtime]: https://github.com/hecrj/iced/tree/master/web
 [Take a look at the roadmap]: https://github.com/hecrj/iced/blob/master/ROADMAP.md
 [check out the issues]: https://github.com/hecrj/iced/issues
 [feel free to contribute!]: #contributing--feedback
@@ -139,7 +156,7 @@ to:
   1. Take the result of our __view logic__ and layout its widgets.
   1. Process events from our system and produce __messages__ for our
      __update logic__.
-  1. Draw the resulting user interface using our chosen __renderer__.
+  1. Draw the resulting user interface.
 
 Browse the [documentation] and the [examples] to learn more!
 
@@ -147,40 +164,51 @@ Browse the [documentation] and the [examples] to learn more!
 Iced was originally born as an attempt at bringing the simplicity of [Elm] and
 [The Elm Architecture] into [Coffee], a 2D game engine I am working on.
 
-The core of the library was implemented during May in [this pull request], using
-[`stretch`] for flexbox-based layouting. It was later released as the main
-feature of [Coffee 0.3.0].
+The core of the library was implemented during May in [this pull request].
+[The first alpha version] was eventually released as
+[a renderer-agnostic GUI library]. The library did not provide a renderer and
+implemented the current [tour example] on top of [`ggez`], a game library.
 
-After release, different folks suggested me to split the new [`ui` module] into
-its own standalone crate, as it could potentially benefit other engines and
-applications. I thought it was a great idea, and after a bit of work... Iced is
-here!
+Since then, the focus has shifted towards providing a batteries-included,
+end-user-oriented GUI library, while keeping [the ecosystem] modular.
 
-Iced consists of different crates which offer different layers of abstractions
-for our users. This modular architecture helps us keep implementation details
-hidden and decoupled, which should allow us to rewrite or change strategies in
-the future.
+Currently, Iced is a cross-platform GUI library built on top of smaller crates:
 
-![Iced ecosystem](https://github.com/hecrj/iced/raw/master/docs/crates_graph.png)
+  - [`iced_core`], a bunch of basic types that can be reused in different runtimes.
+  - [`iced_native`], a renderer-agnostic native runtime implementing widget
+    logic and a layout engine inspired by [`druid`].
+  - [`iced_web`], an experimental web runtime that targets the DOM thanks to
+    [`dodrio`].
+  - [`iced_wgpu`], a renderer leveraging [`wgpu`], [`wgpu_glyph`], and
+    [`font-kit`].
+  - [`iced_winit`], a windowing shell on top of [`winit`].
 
-Read [the roadmap] if you want to learn more!
+[![Iced ecosystem](docs/graphs/ecosystem.png)](https://github.com/hecrj/iced/blob/master/ECOSYSTEM.md)
 
 [this pull request]: https://github.com/hecrj/coffee/pull/35
-[`stretch`]: https://github.com/vislyhq/stretch
-[Coffee 0.3.0]: https://github.com/hecrj/coffee/releases/tag/0.3.0
-[`ui` module]: https://docs.rs/coffee/0.3.2/coffee/ui/index.html
-[the roadmap]: https://github.com/hecrj/iced/blob/master/ROADMAP.md
+[The first alpha version]: https://github.com/hecrj/iced/tree/0.1.0-alpha
+[a renderer-agnostic GUI library]: https://www.reddit.com/r/rust/comments/czzjnv/iced_a_rendereragnostic_gui_library_focused_on/
+[tour example]: https://github.com/hecrj/iced/blob/master/examples/tour.rs
+[`ggez`]: https://github.com/ggez/ggez
+[the ecosystem]: https://github.com/hecrj/iced/blob/master/ECOSYSTEM.md
+[`iced_core`]: https://github.com/hecrj/iced/tree/master/core
+[`iced_native`]: https://github.com/hecrj/iced/tree/master/native
+[`iced_web`]: https://github.com/hecrj/iced/tree/master/web
+[`iced_wgpu`]: https://github.com/hecrj/iced/tree/master/wgpu
+[`iced_winit`]: https://github.com/hecrj/iced/tree/master/winit
+[`druid`]: https://github.com/xi-editor/druid
+[`wgpu_glyph`]: https://github.com/hecrj/wgpu_glyph
+[`font-kit`]: https://github.com/servo/font-kit
+[`winit`]: https://github.com/rust-windowing/winit
 
 ## Contributing / Feedback
-If you want to contribute, you are more than welcome to be a part of the
-project! Check out [the roadmap] and [the current issues] if you want to find
-something to work on. Try to share you thoughts first! Feel free to open a new
-issue if you want to discuss new ideas.
+Contributions are greatly appreciated! If you want to contribute, please
+read our [contributing guidelines] for more details.
 
-Any kind of feedback is welcome! You can open an issue or, if you want to talk,
-you can find me (and a bunch of awesome folks) over the `#games-and-graphics`
-and `#gui-and-ui` channels in the [Rust Community Discord]. I go by
-`@lone_scientist` there.
+Feedback is also welcome! You can open an issue or, if you want to talk,
+come chat to our [Zulip server]. Moreover, you can find me (and a bunch of
+awesome folks) over the `#games-and-graphics` and `#gui-and-ui` channels in
+the [Rust Community Discord]. I go by `lone_scientist#9554` there.
 
 [documentation]: https://docs.rs/iced
 [examples]: https://github.com/hecrj/iced/tree/master/examples
@@ -188,4 +216,6 @@ and `#gui-and-ui` channels in the [Rust Community Discord]. I go by
 [Elm]: https://elm-lang.org/
 [The Elm Architecture]: https://guide.elm-lang.org/architecture/
 [the current issues]: https://github.com/hecrj/iced/issues
+[contributing guidelines]: https://github.com/hecrj/iced/blob/master/CONTRIBUTING.md
+[Zulip server]: https://iced.zulipchat.com/
 [Rust Community Discord]: https://bit.ly/rust-community
diff --git a/ROADMAP.md b/ROADMAP.md
index 8a6c7869..75b7c707 100644
--- a/ROADMAP.md
+++ b/ROADMAP.md
@@ -1,149 +1,21 @@
 # Roadmap
-This document describes the current state of Iced and some of the most important next steps we should take before it can become a production-ready GUI library.
-
-## Context
-Before we get into the actual roadmap, let's quickly review what is the current state of the library.
-
-### Users
-
-Iced is meant to be used by 2 different types of users:
-
-- __End-users__. They should be able to:
-  - get started quickly,
-  - have many widgets available,
-  - keep things simple,
-  - and build applications that are __maintainable__ and __performant__.
-- __GUI toolkit developers / Ecosystem contributors__. They should be able to:
-  - build new kinds of widgets,
-  - implement custom runtimes,
-  - integrate existing runtimes in their own system (like game engines),
-  - and create their own custom renderers.
-
-### Current state
-Iced consists of different crates which offer different layers of abstractions for our users. This modular architecture helps us keep implementation details hidden and decoupled, which should allow us to rewrite or change strategies in the future.
-
-![Crates graph](docs/crates_graph.png)
-
-#### `iced_core`
-
-`iced_core` holds most of the reusable types of the public API. For instance, common widgets (like `Column`, `Row`, `Button`...) and basic data types (`Point`, `Rectangle`, `Length`...).
-
-This crate is meant to be a starting point for an Iced runtime.
-
-#### `iced_native`
-`iced_native` takes `iced_core` and builds a native runtime on top of it, featuring:
-- A flexbox-based layout engine, powered by [`stretch`]
-- Event handling for all the built-in widgets
-- A renderer-agnostic API
-
-To achieve this, it introduces a bunch of reusable interfaces:
-- A `Widget` trait, which is used to implement new widgets: from layout requirements to event and drawing logic.
-- A bunch of `Renderer` traits, meant to keep the crate renderer-agnostic.
-- A `Windowed` trait, which can be implemented by graphical renderers that target _windows_. Window-based runtimes can use this trait to stay renderer-agnostic.
-
-[`stretch`]: https://github.com/vislyhq/stretch
-
-#### `iced_web`
-`iced_web` takes `iced_core` and builds a WebAssembly runtime on top. It achieves this by introducing a `Widget` trait that can be used to produce VDOM nodes.
-
-The crate is a quite simple abstraction layer over [`dodrio`].
-
-[`dodrio`]: https://github.com/fitzgen/dodrio
-
-#### `iced_wgpu`
-`iced_wgpu` is a [`wgpu`] renderer for `iced_native`. It is meant to become the default renderer of Iced in native platforms.
-
-[`wgpu`] supports most modern graphics backends: Vulkan, Metal, DX11, and DX12 (OpenGL and WebGL are still WIP). Additionally, it will support the incoming [WebGPU API].
-
-Currently, `iced_wgpu` only supports a couple of primitives:
-- Text, which is rendered using [`wgpu_glyph`].
-- Quads or rectangles, with rounded borders and a solid background color.
-
-[`wgpu`]: https://github.com/gfx-rs/wgpu-rs
-[WebGPU API]: https://gpuweb.github.io/gpuweb/
-[`wgpu_glyph`]: https://github.com/hecrj/wgpu_glyph
-
-#### `iced_winit`
-`iced_winit` offers some convenient abstractions on top of `iced_native` to quickstart development when using [`winit`].
-
-It exposes a renderer-agnostic `Application` trait that can be implemented and then run with a simple call. The use of this trait is optional. A `conversion` module is provided for users that decide to implement a custom event loop.
-
-[`winit`]: https://github.com/rust-windowing/winit
-
-#### `iced`
-Finally, `iced` unifies everything into a simple abstraction to create cross-platform applications:
-
-- On native, it uses `iced_winit` and `iced_wgpu`.
-- On the web, it uses `iced_web`.
-
-This is the crate meant to be used by __end-users__.
-
+This document describes the current state of Iced and some of the most important next steps we should take before it can become a production-ready GUI library. This list keeps the short term new features in sight in order to coordinate work. Therefore, it is not meant to be exhaustive.
 
 ## Next steps
-This section describes some important features that should be implemented before Iced can be considered production-ready (before a 1.0 release).
-
 Most of the work related to these features needs to happen in the `iced_native` path of the ecosystem, as the web already supports many of them.
 
-### Scrollables / Clippables ([#24])
-Content that can take a (practically) infinite amount of space and can be viewed using a scrollbar. This is a very basic feature.
-
-The end-user API could look like this:
+Once a step is completed, it is collapsed and added to this list:
 
-```rust
-Column::new()
-    .push(content)
-    .scroll(&mut self.scroll_state);
-```
-
-The challenge here is __composability__. Nested scrollables should work as expected.
-
-When it comes to `iced_native`, we may need to add the concept of _event propagation_, so mouse wheel events can be captured by the inner-most scrollable and stop propagation.
-
-When it comes to `iced_wgpu`, we should be able to use scissoring and transformations. [`wgpu`] has a [`RenderPass::set_scissor_rect`] that should work nicely.
-
-The main issue here will be [`wgpu_glyph`], which is used currently to render text primitives. [`wgpu_glyph`] is powered by [`glyph-brush`], which caches glyphs to render text very fast. However, the current cache model does not seem to be composable (i.e. once you issue a draw call the cache is purged). We will need to change it (and potentially contribute) to accommodate for this use case.
+  * [x] Scrollables / Clippables ([#24])
+  * [x] Text input widget ([#25])
+  * [x] TodoMVC example ([#26])
+  * [x] Async actions ([#27])
+  * [x] Custom layout engine
 
 [#24]: https://github.com/hecrj/iced/issues/24
-[`RenderPass::set_scissor_rect`]: https://docs.rs/wgpu/0.3.0/src/wgpu/lib.rs.html#1246-1248
-[`glyph-brush`]: https://github.com/alexheretic/glyph-brush
-
-### Text input widget ([#25])
-A widget where the user can type raw text and passwords.
-
-This widget will have a quite complex event logic, potentially coupled with text rendering. Some examples are:
-- Text cursor positioning based on a mouse click
-- Text selection
-- Clipboard interaction (copy & paste)
-- Text editing shortcuts (go to start, go to end, etc.)
-
-It also needs scrollable / clippable text support, as the introduced text may not fit the input and scrolling based on the text cursor will need to be implemented.
-
-Additionally, the text cursor should blink at a regular interval, which can be considered an _animation_.
-
-I think we should start simple here, and build a text widget with the most basic functionality: click to focus and type to fill. We can improve the implementation with time as the library matures.
-
-The end-user API could look like this:
-
-```rust
-pub enum Message {
-    TextChanged(String),
-}
-
-let text_input = text_input::State::new();
-let text = "Hello";
-
-TextInput::new(&mut text_input, &text, Message::TextChanged);
-```
-
 [#25]: https://github.com/hecrj/iced/issues/25
-
-### TodoMVC example ([#26])
-Once we have scrollables support and a text widget, we could build a [TodoMVC] example. It seems to be a very simple example and could showcase the API quite well.
-
-We could also consider releasing a `0.1.0` version at this point and share it as a milestone on different social platforms.
-
 [#26]: https://github.com/hecrj/iced/issues/26
-[TodoMVC]: http://todomvc.com/
+[#28]: https://github.com/hecrj/iced/issues/28
 
 ### Multi-window support ([#27])
 Open and control multiple windows at runtime.
@@ -154,46 +26,6 @@ This approach should also allow us to perform custom optimizations for this part
 
 [#27]: https://github.com/hecrj/iced/issues/27
 
-### Async actions ([#28])
-Most applications need to perform work in the background, without freezing the UI while they work. The current architecture can be easily extended to achieve this.
-
-We can let users return an asynchronous action (i.e. a future) producing a `Message` in `Application::update`. The runtime will spawn each returned action in a thread pool and, once it finishes, feed the produced message back to `update`. This is also how [Elm] does it.
-
-When it comes to implementing this, [`winit`] already supports user-specific events that can be sent from another thread. Accommodating `iced_winit` for this functionality should not be too complicated.
-
-[Elm]: https://elm-lang.org/
-
-Here is an example of how the end-user API could look:
-
-```rust
-impl Application for WeatherReport {
-    fn update(&mut self, message: Message) -> Command<Message> {
-        match message {
-            Message::Refresh => {
-                self.state = State::Loading;
-
-                Command::from_future(
-                    Weather::request(self.location),
-                    Message::ReportReceived,
-                )
-            }
-            Message::ReportReceived(Ok(report)) => {
-                self.state = State::Show(report);
-
-                Command::none()
-            },
-            Message::ReportReceived(Err(error)) => {
-                self.state = State::Error(error);
-
-                Command::none()
-            }
-        }
-    }
-}
-```
-
-[#28]: https://github.com/hecrj/iced/issues/28
-
 ### Event subscriptions ([#29])
 Besides performing async actions on demand, most applications also need to listen to events passively. An example of this could be a WebSocket connection, where messages can come in at any time.
 
@@ -233,7 +65,7 @@ In the long run, we could expose a renderer-agnostic abstraction to perform the
 [#32]: https://github.com/hecrj/iced/issues/32
 
 ### Text shaping and font fallback ([#33])
-[`wgpu_glyph`] uses [`glyph-brush`], which in turn uses [`rusttype`]. While the current implementation is able to layout text quite nicely, it does not perform any [text shaping].
+[`wgpu_glyph`] uses [`glyph_brush`], which in turn uses [`rusttype`]. While the current implementation is able to layout text quite nicely, it does not perform any [text shaping].
 
 [Text shaping] with font fallback is a necessary feature for any serious GUI toolkit. It unlocks support to truly localize your application, supporting many different scripts.
 
@@ -303,5 +135,8 @@ This could be very useful to build very performant user interfaces with a lot of
 
 [Elm does it very well!](https://guide.elm-lang.org/optimization/lazy.html)
 
-### Build a custom layout engine
-It may be possible to build an optimized layout engine only for `iced_native` if it turns out that there are some flexbox features we end up not using.
+[Elm]: https://elm-lang.org/
+[`winit`]: https://github.com/rust-windowing/winit
+[`wgpu`]: https://github.com/gfx-rs/wgpu-rs
+[`wgpu_glyph`]: https://github.com/hecrj/wgpu_glyph
+[`glyph_brush`]: https://github.com/alexheretic/glyph-brush
diff --git a/docs/crates_graph.dot b/docs/crates_graph.dot
deleted file mode 100644
index 85e375d0..00000000
--- a/docs/crates_graph.dot
+++ /dev/null
@@ -1,12 +0,0 @@
-digraph G {
-  "iced_core" -> "iced_native"
-  "iced_core" -> "iced_web"
-  "iced_native" -> "iced_wgpu"
-  "iced_native" -> "iced_winit"
-  "iced_web" -> "iced"
-  "iced_wgpu" -> "iced"
-  "iced_winit" -> "iced"
-
-  node[shape=box];
-  "iced" -> "cross-platform application"
-}
diff --git a/docs/crates_graph.png b/docs/crates_graph.png
deleted file mode 100644
index d598c1dd..00000000
Binary files a/docs/crates_graph.png and /dev/null differ
diff --git a/docs/graphs/core.dot b/docs/graphs/core.dot
new file mode 100644
index 00000000..a52dfbb9
--- /dev/null
+++ b/docs/graphs/core.dot
@@ -0,0 +1,13 @@
+digraph G {
+  fontname = "Roboto";
+  newrank=true;
+  node[fontname = "Roboto", style=filled, fontcolor=white, color="#474973"];
+
+  { rank = same; iced_native iced_web }
+
+  iced_core -> iced_native [style=dashed];
+  iced_core -> iced_web [style=dashed];
+
+  iced_core [style=dashed, fontcolor=black];
+
+}
diff --git a/docs/graphs/core.png b/docs/graphs/core.png
new file mode 100644
index 00000000..a5002c9b
Binary files /dev/null and b/docs/graphs/core.png differ
diff --git a/docs/graphs/ecosystem.dot b/docs/graphs/ecosystem.dot
new file mode 100644
index 00000000..e6c1af94
--- /dev/null
+++ b/docs/graphs/ecosystem.dot
@@ -0,0 +1,59 @@
+digraph G {
+  fontname = "Roboto";
+  newrank=true;
+  node[fontname = "Roboto", style=filled, fontcolor=white, color="#474973"];
+
+  subgraph cluster_1 {
+    label = "renderers  ";
+    labelloc = "b";
+    labeljust = "r";
+    fontcolor = "#ffffff";
+    color="#8797AF";
+    bgcolor="#8797AF";
+    style=rounded;
+    node [fillcolor=white, color=white, fontcolor=black];
+
+    etc_1 [label="...", style=empty, shape=none, fontcolor=white];
+    iced_wgpu;
+  }
+
+  subgraph cluster_2 {
+    label = "shells  ";
+    labelloc = "b";
+    labeljust = "r";
+    fontcolor = "#ffffff";
+    color="#8797AF";
+    bgcolor="#8797AF";
+    style=rounded;
+    node [fillcolor=white, color=white, fontcolor=black];
+
+    etc_2 [label="...", style=empty, shape=none, fontcolor=white];
+    iced_winit;
+  }
+
+  subgraph cluster_3 {
+    style=invis;
+    margin=20;
+    iced;
+  }
+
+  { rank = same; iced_native iced_web }
+  { rank = same; iced_wgpu iced_winit etc_1 etc_2 }
+
+  iced_core -> iced_native [style=dashed];
+  iced_core -> iced_web [style=dashed];
+  iced_native -> iced_wgpu;
+  iced_native -> iced_winit;
+
+  iced_winit -> iced;
+  iced_wgpu -> iced;
+  iced_web -> iced;
+
+  iced -> "cross-platform application";
+
+  iced_core [style=dashed, fontcolor=black];
+  iced [width=1, height=0.6, style="filled", fontcolor=white, color="#474973"];
+
+
+  "cross-platform application" [shape=box3d, style="solid", width=2.8, height=0.6, fontcolor="#474973"];
+}
diff --git a/docs/graphs/ecosystem.png b/docs/graphs/ecosystem.png
new file mode 100644
index 00000000..647c22ab
Binary files /dev/null and b/docs/graphs/ecosystem.png differ
diff --git a/docs/graphs/iced.dot b/docs/graphs/iced.dot
new file mode 100644
index 00000000..c049bf95
--- /dev/null
+++ b/docs/graphs/iced.dot
@@ -0,0 +1,47 @@
+digraph G {
+  fontname = "Roboto";
+  newrank=true;
+  node[fontname = "Roboto", style=filled, fontcolor=white, color="#474973"];
+
+  subgraph cluster_1 {
+    label = "renderers  ";
+    labelloc = "b";
+    labeljust = "r";
+    fontcolor = "#ffffff";
+    color="#8797AF";
+    bgcolor="#8797AF";
+    style=rounded;
+    node [fillcolor=white, color=white, fontcolor=black];
+
+    etc_1 [label="...", style=empty, shape=none, fontcolor=white];
+    iced_wgpu;
+  }
+
+  subgraph cluster_2 {
+    label = "shells  ";
+    labelloc = "b";
+    labeljust = "r";
+    fontcolor = "#ffffff";
+    color="#8797AF";
+    bgcolor="#8797AF";
+    style=rounded;
+    node [fillcolor=white, color=white, fontcolor=black];
+
+    etc_2 [label="...", style=empty, shape=none, fontcolor=white];
+    iced_winit;
+  }
+
+  subgraph cluster_3 {
+    style=invis;
+    margin=20;
+    iced;
+  }
+
+  { rank = same; iced_wgpu iced_winit etc_1 etc_2 }
+
+  iced_winit -> iced;
+  iced_wgpu -> iced;
+  iced_web -> iced;
+
+  iced [width=1, height=0.6, style="filled", fontcolor=white, color="#474973"];
+}
diff --git a/docs/graphs/iced.png b/docs/graphs/iced.png
new file mode 100644
index 00000000..dcdd9cd3
Binary files /dev/null and b/docs/graphs/iced.png differ
diff --git a/docs/graphs/native.dot b/docs/graphs/native.dot
new file mode 100644
index 00000000..3bc654a5
--- /dev/null
+++ b/docs/graphs/native.dot
@@ -0,0 +1,42 @@
+digraph G {
+  fontname = "Roboto";
+  newrank=true;
+  node[fontname = "Roboto", style=filled, fontcolor=white, color="#474973"];
+
+  subgraph cluster_1 {
+    label = "renderers  ";
+    labelloc = "b";
+    labeljust = "r";
+    fontcolor = "#ffffff";
+    color="#8797AF";
+    bgcolor="#8797AF";
+    style=rounded;
+    node [fillcolor=white, color=white, fontcolor=black];
+
+    etc_1 [label="...", style=empty, shape=none, fontcolor=white];
+    iced_wgpu;
+  }
+
+  subgraph cluster_2 {
+    label = "shells  ";
+    labelloc = "b";
+    labeljust = "r";
+    fontcolor = "#ffffff";
+    color="#8797AF";
+    bgcolor="#8797AF";
+    style=rounded;
+    node [fillcolor=white, color=white, fontcolor=black];
+
+    etc_2 [label="...", style=empty, shape=none, fontcolor=white];
+    iced_winit;
+  }
+
+
+  { rank = same; iced_wgpu iced_winit etc_1 etc_2 }
+
+  iced_core -> iced_native [style=dashed];
+  iced_native -> iced_wgpu;
+  iced_native -> iced_winit;
+
+  iced_core [style=dashed, fontcolor=black];
+}
diff --git a/docs/graphs/native.png b/docs/graphs/native.png
new file mode 100644
index 00000000..fbcad808
Binary files /dev/null and b/docs/graphs/native.png differ
diff --git a/docs/graphs/web.dot b/docs/graphs/web.dot
new file mode 100644
index 00000000..06c05176
--- /dev/null
+++ b/docs/graphs/web.dot
@@ -0,0 +1,12 @@
+digraph G {
+  fontname = "Roboto";
+  newrank=true;
+  node[fontname = "Roboto", style=filled, fontcolor=white, color="#474973"];
+
+  iced_core -> iced_web [style=dashed];
+
+  iced_web -> iced;
+
+  iced_core [style=dashed, fontcolor=black];
+  iced [width=1, height=0.6, style="filled", fontcolor=white, color="#474973"];
+}
diff --git a/docs/graphs/web.png b/docs/graphs/web.png
new file mode 100644
index 00000000..6db04087
Binary files /dev/null and b/docs/graphs/web.png differ
diff --git a/docs/graphs/wgpu.dot b/docs/graphs/wgpu.dot
new file mode 100644
index 00000000..dc2d7cc8
--- /dev/null
+++ b/docs/graphs/wgpu.dot
@@ -0,0 +1,33 @@
+digraph G {
+  fontname = "Roboto";
+  newrank=true;
+  node[fontname = "Roboto", style=filled, fontcolor=white, color="#474973"];
+
+  subgraph cluster_1 {
+    label = "renderers  ";
+    labelloc = "b";
+    labeljust = "r";
+    fontcolor = "#ffffff";
+    color="#8797AF";
+    bgcolor="#8797AF";
+    style=rounded;
+    node [fillcolor=white, color=white, fontcolor=black];
+
+    etc_1 [label="...", style=empty, shape=none, fontcolor=white];
+    iced_wgpu;
+  }
+
+  subgraph cluster_3 {
+    style=invis;
+    margin=20;
+    iced;
+  }
+
+  { rank = same; iced_wgpu etc_1  }
+
+  iced_native -> iced_wgpu;
+
+  iced_wgpu -> iced;
+
+  iced [width=1, height=0.6, style="filled", fontcolor=white, color="#474973"];
+}
diff --git a/docs/graphs/wgpu.png b/docs/graphs/wgpu.png
new file mode 100644
index 00000000..00ae76ce
Binary files /dev/null and b/docs/graphs/wgpu.png differ
diff --git a/docs/graphs/winit.dot b/docs/graphs/winit.dot
new file mode 100644
index 00000000..c31f869b
--- /dev/null
+++ b/docs/graphs/winit.dot
@@ -0,0 +1,33 @@
+digraph G {
+  fontname = "Roboto";
+  newrank=true;
+  node[fontname = "Roboto", style=filled, fontcolor=white, color="#474973"];
+
+  subgraph cluster_2 {
+    label = "shells  ";
+    labelloc = "b";
+    labeljust = "r";
+    fontcolor = "#ffffff";
+    color="#8797AF";
+    bgcolor="#8797AF";
+    style=rounded;
+    node [fillcolor=white, color=white, fontcolor=black];
+
+    etc_2 [label="...", style=empty, shape=none, fontcolor=white];
+    iced_winit;
+  }
+
+  subgraph cluster_3 {
+    style=invis;
+    margin=20;
+    iced;
+  }
+
+  { rank = same; iced_winit  etc_2 }
+
+  iced_native -> iced_winit;
+
+  iced_winit -> iced;
+
+  iced [width=1, height=0.6, style="filled", fontcolor=white, color="#474973"];
+}
diff --git a/docs/graphs/winit.png b/docs/graphs/winit.png
new file mode 100644
index 00000000..ef8b98dc
Binary files /dev/null and b/docs/graphs/winit.png differ
-- 
cgit 


From cae26cb7bc627f4a5b3bcf1cd023a0c552e8c65e Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Wed, 20 Nov 2019 05:01:36 +0100
Subject: Remove high contrast from graphs

---
 docs/graphs/core.dot      |   6 +++---
 docs/graphs/core.png      | Bin 16123 -> 13172 bytes
 docs/graphs/ecosystem.dot |  27 ++++++++++++---------------
 docs/graphs/ecosystem.png | Bin 51911 -> 44705 bytes
 docs/graphs/generate.sh   |   6 ++++++
 docs/graphs/iced.dot      |  23 +++++++++++------------
 docs/graphs/iced.png      | Bin 32794 -> 26302 bytes
 docs/graphs/native.dot    |  23 +++++++++++------------
 docs/graphs/native.png    | Bin 27637 -> 24980 bytes
 docs/graphs/web.dot       |   6 +++---
 docs/graphs/web.png       | Bin 13023 -> 11717 bytes
 docs/graphs/wgpu.dot      |  14 ++++++--------
 docs/graphs/wgpu.png      | Bin 20091 -> 16570 bytes
 docs/graphs/winit.dot     |  14 ++++++--------
 docs/graphs/winit.png     | Bin 17051 -> 15892 bytes
 15 files changed, 58 insertions(+), 61 deletions(-)
 create mode 100755 docs/graphs/generate.sh

diff --git a/docs/graphs/core.dot b/docs/graphs/core.dot
index a52dfbb9..93724927 100644
--- a/docs/graphs/core.dot
+++ b/docs/graphs/core.dot
@@ -1,13 +1,13 @@
 digraph G {
   fontname = "Roboto";
   newrank=true;
-  node[fontname = "Roboto", style=filled, fontcolor=white, color="#474973"];
+  node[fontname = "Roboto", style="filled", fontcolor="#333333", fillcolor=white, color="#333333"];
+  edge[color="#333333"];
 
   { rank = same; iced_native iced_web }
 
   iced_core -> iced_native [style=dashed];
   iced_core -> iced_web [style=dashed];
 
-  iced_core [style=dashed, fontcolor=black];
-
+  iced_core [style=dashed];
 }
diff --git a/docs/graphs/core.png b/docs/graphs/core.png
index a5002c9b..0b14ab6c 100644
Binary files a/docs/graphs/core.png and b/docs/graphs/core.png differ
diff --git a/docs/graphs/ecosystem.dot b/docs/graphs/ecosystem.dot
index e6c1af94..609cf726 100644
--- a/docs/graphs/ecosystem.dot
+++ b/docs/graphs/ecosystem.dot
@@ -1,19 +1,19 @@
 digraph G {
   fontname = "Roboto";
   newrank=true;
-  node[fontname = "Roboto", style=filled, fontcolor=white, color="#474973"];
+  node[fontname = "Roboto", style="filled", fontcolor="#333333", fillcolor=white, color="#333333"];
+  edge[color="#333333"];
 
   subgraph cluster_1 {
     label = "renderers  ";
     labelloc = "b";
     labeljust = "r";
-    fontcolor = "#ffffff";
-    color="#8797AF";
-    bgcolor="#8797AF";
+    fontcolor = "#0366d6";
+    color="#f6f8fa";
+    bgcolor="#f6f8fa";
     style=rounded;
-    node [fillcolor=white, color=white, fontcolor=black];
 
-    etc_1 [label="...", style=empty, shape=none, fontcolor=white];
+    etc_1 [label="...", style=solid, shape=none];
     iced_wgpu;
   }
 
@@ -21,13 +21,12 @@ digraph G {
     label = "shells  ";
     labelloc = "b";
     labeljust = "r";
-    fontcolor = "#ffffff";
-    color="#8797AF";
-    bgcolor="#8797AF";
+    fontcolor = "#0366d6";
+    color="#f6f8fa";
+    bgcolor="#f6f8fa";
     style=rounded;
-    node [fillcolor=white, color=white, fontcolor=black];
 
-    etc_2 [label="...", style=empty, shape=none, fontcolor=white];
+    etc_2 [label="...", style=solid, shape=none];
     iced_winit;
   }
 
@@ -51,9 +50,7 @@ digraph G {
 
   iced -> "cross-platform application";
 
-  iced_core [style=dashed, fontcolor=black];
-  iced [width=1, height=0.6, style="filled", fontcolor=white, color="#474973"];
+  iced_core [style=dashed];
 
-
-  "cross-platform application" [shape=box3d, style="solid", width=2.8, height=0.6, fontcolor="#474973"];
+  "cross-platform application" [shape=box, width=2.8, height=0.6];
 }
diff --git a/docs/graphs/ecosystem.png b/docs/graphs/ecosystem.png
index 647c22ab..03fe1130 100644
Binary files a/docs/graphs/ecosystem.png and b/docs/graphs/ecosystem.png differ
diff --git a/docs/graphs/generate.sh b/docs/graphs/generate.sh
new file mode 100755
index 00000000..45073820
--- /dev/null
+++ b/docs/graphs/generate.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+
+for file in *.dot
+do
+  dot -Tpng ${file} -o ${file%.*}.png
+done
diff --git a/docs/graphs/iced.dot b/docs/graphs/iced.dot
index c049bf95..24dbb972 100644
--- a/docs/graphs/iced.dot
+++ b/docs/graphs/iced.dot
@@ -1,19 +1,19 @@
 digraph G {
   fontname = "Roboto";
   newrank=true;
-  node[fontname = "Roboto", style=filled, fontcolor=white, color="#474973"];
+  node[fontname = "Roboto", style="filled", fontcolor="#333333", fillcolor=white, color="#333333"];
+  edge[color="#333333"];
 
   subgraph cluster_1 {
     label = "renderers  ";
     labelloc = "b";
     labeljust = "r";
-    fontcolor = "#ffffff";
-    color="#8797AF";
-    bgcolor="#8797AF";
+    fontcolor = "#0366d6";
+    color="#f6f8fa";
+    bgcolor="#f6f8fa";
     style=rounded;
-    node [fillcolor=white, color=white, fontcolor=black];
 
-    etc_1 [label="...", style=empty, shape=none, fontcolor=white];
+    etc_1 [label="...", style=solid, shape=none];
     iced_wgpu;
   }
 
@@ -21,13 +21,12 @@ digraph G {
     label = "shells  ";
     labelloc = "b";
     labeljust = "r";
-    fontcolor = "#ffffff";
-    color="#8797AF";
-    bgcolor="#8797AF";
+    fontcolor = "#0366d6";
+    color="#f6f8fa";
+    bgcolor="#f6f8fa";
     style=rounded;
-    node [fillcolor=white, color=white, fontcolor=black];
 
-    etc_2 [label="...", style=empty, shape=none, fontcolor=white];
+    etc_2 [label="...", style=solid, shape=none];
     iced_winit;
   }
 
@@ -43,5 +42,5 @@ digraph G {
   iced_wgpu -> iced;
   iced_web -> iced;
 
-  iced [width=1, height=0.6, style="filled", fontcolor=white, color="#474973"];
+  iced;
 }
diff --git a/docs/graphs/iced.png b/docs/graphs/iced.png
index dcdd9cd3..5d4a35bc 100644
Binary files a/docs/graphs/iced.png and b/docs/graphs/iced.png differ
diff --git a/docs/graphs/native.dot b/docs/graphs/native.dot
index 3bc654a5..b57736b5 100644
--- a/docs/graphs/native.dot
+++ b/docs/graphs/native.dot
@@ -1,19 +1,19 @@
 digraph G {
   fontname = "Roboto";
   newrank=true;
-  node[fontname = "Roboto", style=filled, fontcolor=white, color="#474973"];
+  node[fontname = "Roboto", style="filled", fontcolor="#333333", fillcolor=white, color="#333333"];
+  edge[color="#333333"];
 
   subgraph cluster_1 {
     label = "renderers  ";
     labelloc = "b";
     labeljust = "r";
-    fontcolor = "#ffffff";
-    color="#8797AF";
-    bgcolor="#8797AF";
+    fontcolor = "#0366d6";
+    color="#f6f8fa";
+    bgcolor="#f6f8fa";
     style=rounded;
-    node [fillcolor=white, color=white, fontcolor=black];
 
-    etc_1 [label="...", style=empty, shape=none, fontcolor=white];
+    etc_1 [label="...", style=solid, shape=none];
     iced_wgpu;
   }
 
@@ -21,13 +21,12 @@ digraph G {
     label = "shells  ";
     labelloc = "b";
     labeljust = "r";
-    fontcolor = "#ffffff";
-    color="#8797AF";
-    bgcolor="#8797AF";
+    fontcolor = "#0366d6";
+    color="#f6f8fa";
+    bgcolor="#f6f8fa";
     style=rounded;
-    node [fillcolor=white, color=white, fontcolor=black];
 
-    etc_2 [label="...", style=empty, shape=none, fontcolor=white];
+    etc_2 [label="...", style=solid, shape=none];
     iced_winit;
   }
 
@@ -38,5 +37,5 @@ digraph G {
   iced_native -> iced_wgpu;
   iced_native -> iced_winit;
 
-  iced_core [style=dashed, fontcolor=black];
+  iced_core [style=dashed];
 }
diff --git a/docs/graphs/native.png b/docs/graphs/native.png
index fbcad808..892e4fee 100644
Binary files a/docs/graphs/native.png and b/docs/graphs/native.png differ
diff --git a/docs/graphs/web.dot b/docs/graphs/web.dot
index 06c05176..853ca398 100644
--- a/docs/graphs/web.dot
+++ b/docs/graphs/web.dot
@@ -1,12 +1,12 @@
 digraph G {
   fontname = "Roboto";
   newrank=true;
-  node[fontname = "Roboto", style=filled, fontcolor=white, color="#474973"];
+  node[fontname = "Roboto", style="filled", fontcolor="#333333", fillcolor=white, color="#333333"];
+  edge[color="#333333"];
 
   iced_core -> iced_web [style=dashed];
 
   iced_web -> iced;
 
-  iced_core [style=dashed, fontcolor=black];
-  iced [width=1, height=0.6, style="filled", fontcolor=white, color="#474973"];
+  iced_core [style=dashed];
 }
diff --git a/docs/graphs/web.png b/docs/graphs/web.png
index 6db04087..e6a1a5f6 100644
Binary files a/docs/graphs/web.png and b/docs/graphs/web.png differ
diff --git a/docs/graphs/wgpu.dot b/docs/graphs/wgpu.dot
index dc2d7cc8..410c2eeb 100644
--- a/docs/graphs/wgpu.dot
+++ b/docs/graphs/wgpu.dot
@@ -1,19 +1,19 @@
 digraph G {
   fontname = "Roboto";
   newrank=true;
-  node[fontname = "Roboto", style=filled, fontcolor=white, color="#474973"];
+  node[fontname = "Roboto", style="filled", fontcolor="#333333", fillcolor=white, color="#333333"];
+  edge[color="#333333"];
 
   subgraph cluster_1 {
     label = "renderers  ";
     labelloc = "b";
     labeljust = "r";
-    fontcolor = "#ffffff";
-    color="#8797AF";
-    bgcolor="#8797AF";
+    fontcolor = "#0366d6";
+    color="#f6f8fa";
+    bgcolor="#f6f8fa";
     style=rounded;
-    node [fillcolor=white, color=white, fontcolor=black];
 
-    etc_1 [label="...", style=empty, shape=none, fontcolor=white];
+    etc_1 [label="...", style=solid, shape=none];
     iced_wgpu;
   }
 
@@ -28,6 +28,4 @@ digraph G {
   iced_native -> iced_wgpu;
 
   iced_wgpu -> iced;
-
-  iced [width=1, height=0.6, style="filled", fontcolor=white, color="#474973"];
 }
diff --git a/docs/graphs/wgpu.png b/docs/graphs/wgpu.png
index 00ae76ce..4831caba 100644
Binary files a/docs/graphs/wgpu.png and b/docs/graphs/wgpu.png differ
diff --git a/docs/graphs/winit.dot b/docs/graphs/winit.dot
index c31f869b..4ea5149a 100644
--- a/docs/graphs/winit.dot
+++ b/docs/graphs/winit.dot
@@ -1,19 +1,19 @@
 digraph G {
   fontname = "Roboto";
   newrank=true;
-  node[fontname = "Roboto", style=filled, fontcolor=white, color="#474973"];
+  node[fontname = "Roboto", style="filled", fontcolor="#333333", fillcolor=white, color="#333333"];
+  edge[color="#333333"];
 
   subgraph cluster_2 {
     label = "shells  ";
     labelloc = "b";
     labeljust = "r";
-    fontcolor = "#ffffff";
-    color="#8797AF";
-    bgcolor="#8797AF";
+    fontcolor = "#0366d6";
+    color="#f6f8fa";
+    bgcolor="#f6f8fa";
     style=rounded;
-    node [fillcolor=white, color=white, fontcolor=black];
 
-    etc_2 [label="...", style=empty, shape=none, fontcolor=white];
+    etc_2 [label="...", style=solid, shape=none];
     iced_winit;
   }
 
@@ -28,6 +28,4 @@ digraph G {
   iced_native -> iced_winit;
 
   iced_winit -> iced;
-
-  iced [width=1, height=0.6, style="filled", fontcolor=white, color="#474973"];
 }
diff --git a/docs/graphs/winit.png b/docs/graphs/winit.png
index ef8b98dc..1c028b29 100644
Binary files a/docs/graphs/winit.png and b/docs/graphs/winit.png differ
-- 
cgit 


From d53e1bb00b9dec57b660860e8f972619675754a2 Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Wed, 20 Nov 2019 06:17:54 +0100
Subject: Display new GIFs in `README`

---
 README.md | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/README.md b/README.md
index 7e243871..0ccbeb26 100644
--- a/README.md
+++ b/README.md
@@ -8,14 +8,14 @@
 A cross-platform GUI library for Rust focused on simplicity and type-safety.
 Inspired by [Elm].
 
-[![Tour - Iced][gui_gif]][gui_gfycat]
-[![Tour - Coffee][coffee_gui_gif]][coffee_gui_gfycat]
-
-[gui_gif]: https://thumbs.gfycat.com/VeneratedSourAurochs-small.gif
-[gui_gfycat]: https://gfycat.com/veneratedsouraurochs
-
-[coffee_gui_gif]: https://thumbs.gfycat.com/GloomyWeakHammerheadshark-small.gif
-[coffee_gui_gfycat]: https://gfycat.com/gloomyweakhammerheadshark
+<div align="center">
+  <a href="https://gfycat.com/littlesanehalicore">
+    <img src="https://thumbs.gfycat.com/LittleSaneHalicore-small.gif" height="350px">
+  </a>
+  <a href="https://gfycat.com/politeadorableiberianmole">
+    <img src="https://thumbs.gfycat.com/PoliteAdorableIberianmole-small.gif">
+  </a>
+</div>
 
 ## Features
   * Simple, easy-to-use, batteries-included API
-- 
cgit 


From 93093fa0236f3b9bdb048eee32e8d6f347c44794 Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Wed, 20 Nov 2019 06:18:22 +0100
Subject: Disable debug view by default in `tour` example

---
 examples/tour.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/examples/tour.rs b/examples/tour.rs
index 6d7a080f..f5bb84d1 100644
--- a/examples/tour.rs
+++ b/examples/tour.rs
@@ -29,7 +29,7 @@ impl Application for Tour {
                 scroll: scrollable::State::new(),
                 back_button: button::State::new(),
                 next_button: button::State::new(),
-                debug: true,
+                debug: false,
             },
             Command::none(),
         )
-- 
cgit 


From 28423f54db3d18021d1da8a16ef2fe96bc9d6478 Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Wed, 20 Nov 2019 06:19:20 +0100
Subject: Remove `dbg!` in `UserInterface`

---
 native/src/user_interface.rs | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs
index f031b090..9324fe0b 100644
--- a/native/src/user_interface.rs
+++ b/native/src/user_interface.rs
@@ -109,11 +109,7 @@ where
         let layout = if hash == cache.hash {
             cache.layout
         } else {
-            let layout_start = std::time::Instant::now();
-            let layout = renderer.layout(&root);
-            dbg!(std::time::Instant::now() - layout_start);
-
-            layout
+            renderer.layout(&root)
         };
 
         UserInterface {
-- 
cgit 


From 6543baa3d1e3f78ffa6aeb0c6317e65091e6bfc7 Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Wed, 20 Nov 2019 06:35:00 +0100
Subject: Add image of `todos` in multiple platforms

---
 README.md                     |   3 ++-
 docs/images/todos_desktop.jpg | Bin 0 -> 309612 bytes
 2 files changed, 2 insertions(+), 1 deletion(-)
 create mode 100644 docs/images/todos_desktop.jpg

diff --git a/README.md b/README.md
index 0ccbeb26..096afdc8 100644
--- a/README.md
+++ b/README.md
@@ -20,7 +20,7 @@ Inspired by [Elm].
 ## Features
   * Simple, easy-to-use, batteries-included API
   * Type-safe, reactive programming model
-  * Cross-platform support (Windows, macOS, Linux, and the Web)
+  * [Cross-platform support] (Windows, macOS, Linux, and the Web)
   * Responsive layout
   * Built-in widgets (including [text inputs], [scrollables], and more!)
   * Custom widget support (create your own!)
@@ -34,6 +34,7 @@ Inspired by [Elm].
 __Iced is currently experimental software.__ [Take a look at the roadmap],
 [check out the issues], and [feel free to contribute!]
 
+[Cross-platform support]: https://github.com/hecrj/iced/blob/master/docs/images/todos_desktop.jpg?raw=true
 [text inputs]: https://gfycat.com/alertcalmcrow-rust-gui
 [scrollables]: https://gfycat.com/perkybaggybaboon-rust-gui
 [Debug overlay with performance metrics]: https://gfycat.com/artisticdiligenthorseshoebat-rust-gui
diff --git a/docs/images/todos_desktop.jpg b/docs/images/todos_desktop.jpg
new file mode 100644
index 00000000..a604fd62
Binary files /dev/null and b/docs/images/todos_desktop.jpg differ
-- 
cgit 


From c47f5095c85d5b259b298dd2446929dc9cbf1753 Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Wed, 20 Nov 2019 07:08:37 +0100
Subject: Link to custom layout engine PR in `ROADMAP`

---
 ROADMAP.md | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/ROADMAP.md b/ROADMAP.md
index 75b7c707..962a09a9 100644
--- a/ROADMAP.md
+++ b/ROADMAP.md
@@ -1,5 +1,5 @@
 # Roadmap
-This document describes the current state of Iced and some of the most important next steps we should take before it can become a production-ready GUI library. This list keeps the short term new features in sight in order to coordinate work. Therefore, it is not meant to be exhaustive.
+This document describes the current state of Iced and some of the most important next steps we should take before it can become a production-ready GUI library. This list keeps the short term new features in sight in order to coordinate work and discussion. Therefore, it is not meant to be exhaustive.
 
 ## Next steps
 Most of the work related to these features needs to happen in the `iced_native` path of the ecosystem, as the web already supports many of them.
@@ -10,12 +10,13 @@ Once a step is completed, it is collapsed and added to this list:
   * [x] Text input widget ([#25])
   * [x] TodoMVC example ([#26])
   * [x] Async actions ([#27])
-  * [x] Custom layout engine
+  * [x] Custom layout engine ([#52])
 
 [#24]: https://github.com/hecrj/iced/issues/24
 [#25]: https://github.com/hecrj/iced/issues/25
 [#26]: https://github.com/hecrj/iced/issues/26
 [#28]: https://github.com/hecrj/iced/issues/28
+[#52]: https://github.com/hecrj/iced/pull/52
 
 ### Multi-window support ([#27])
 Open and control multiple windows at runtime.
-- 
cgit 


From cb4827059fdb34fa9b0cea714fb81b28741a08e7 Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Wed, 20 Nov 2019 09:41:04 +0100
Subject: Add `README` for each subcrate

---
 core/README.md   | 13 +++++++++++++
 native/README.md | 23 +++++++++++++++++++++++
 web/README.md    | 15 +++++++++++++++
 wgpu/README.md   | 37 +++++++++++++++++++++++++++++++++++++
 winit/README.md  | 15 +++++++++++++++
 5 files changed, 103 insertions(+)
 create mode 100644 core/README.md
 create mode 100644 native/README.md
 create mode 100644 web/README.md
 create mode 100644 wgpu/README.md
 create mode 100644 winit/README.md

diff --git a/core/README.md b/core/README.md
new file mode 100644
index 00000000..8f967796
--- /dev/null
+++ b/core/README.md
@@ -0,0 +1,13 @@
+# `iced_core`
+[![Documentation](https://docs.rs/iced_core/badge.svg)][documentation]
+[![Crates.io](https://img.shields.io/crates/v/iced_core.svg)](https://crates.io/crates/iced_core)
+[![License](https://img.shields.io/crates/l/iced_core.svg)](https://github.com/hecrj/iced/blob/master/LICENSE)
+[![project chat](https://img.shields.io/badge/chat-on_zulip-brightgreen.svg)](https://iced.zulipchat.com)
+
+`iced_core` holds basic reusable types of the public API. For instance, basic data types like `Point`, `Rectangle`, `Length`, etc.
+
+This crate is meant to be a starting point for an Iced runtime.
+
+![iced_core](../docs/graphs/core.png)
+
+[documentation]: https://docs.rs/iced_core
diff --git a/native/README.md b/native/README.md
new file mode 100644
index 00000000..60f350b8
--- /dev/null
+++ b/native/README.md
@@ -0,0 +1,23 @@
+# `iced_native`
+[![Documentation](https://docs.rs/iced_native/badge.svg)][documentation]
+[![Crates.io](https://img.shields.io/crates/v/iced_native.svg)](https://crates.io/crates/iced_native)
+[![License](https://img.shields.io/crates/l/iced_native.svg)](https://github.com/hecrj/iced/blob/master/LICENSE)
+[![project chat](https://img.shields.io/badge/chat-on_zulip-brightgreen.svg)](https://iced.zulipchat.com)
+
+`iced_native` takes [`iced_core`] and builds a native runtime on top of it, featuring:
+- A custom layout engine, greatly inspired by [`druid`]
+- Event handling for all the built-in widgets
+- A renderer-agnostic API
+
+To achieve this, it introduces a bunch of reusable interfaces:
+- A `Widget` trait, which is used to implement new widgets: from layout requirements to event and drawing logic.
+- A bunch of `Renderer` traits, meant to keep the crate renderer-agnostic.
+- A `Windowed` trait, leveraging [`raw-window-handle`], which can be implemented by graphical renderers that target _windows_. Window-based shells (like [`iced_winit`]) can use this trait to stay renderer-agnostic.
+
+![iced_native](../docs/graphs/native.png)
+
+[documentation]: https://docs.rs/iced_native
+[`iced_core`]: ../core
+[`iced_winit`]: ../winit
+[`druid`]: https://github.com/xi-editor/druid
+[`raw-window-handle`]: https://github.com/rust-windowing/raw-window-handle
diff --git a/web/README.md b/web/README.md
new file mode 100644
index 00000000..f86b2cb7
--- /dev/null
+++ b/web/README.md
@@ -0,0 +1,15 @@
+# `iced_web`
+[![Documentation](https://docs.rs/iced_web/badge.svg)][documentation]
+[![Crates.io](https://img.shields.io/crates/v/iced_web.svg)](https://crates.io/crates/iced_web)
+[![License](https://img.shields.io/crates/l/iced_web.svg)](https://github.com/hecrj/iced/blob/master/LICENSE)
+[![project chat](https://img.shields.io/badge/chat-on_zulip-brightgreen.svg)](https://iced.zulipchat.com)
+
+`iced_web` takes [`iced_core`] and builds a WebAssembly runtime on top. It achieves this by introducing a `Widget` trait that can be used to produce VDOM nodes.
+
+The crate is currently a __very experimental__, simple abstraction layer over [`dodrio`].
+
+![iced_core](../docs/graphs/web.png)
+
+[documentation]: https://docs.rs/iced_web
+[`iced_core`]: ../core
+[`dodrio`]: https://github.com/fitzgen/dodrio
diff --git a/wgpu/README.md b/wgpu/README.md
new file mode 100644
index 00000000..47038c10
--- /dev/null
+++ b/wgpu/README.md
@@ -0,0 +1,37 @@
+# `iced_wgpu`
+[![Documentation](https://docs.rs/iced_wgpu/badge.svg)][documentation]
+[![Crates.io](https://img.shields.io/crates/v/iced_wgpu.svg)](https://crates.io/crates/iced_wgpu)
+[![License](https://img.shields.io/crates/l/iced_wgpu.svg)](https://github.com/hecrj/iced/blob/master/LICENSE)
+[![project chat](https://img.shields.io/badge/chat-on_zulip-brightgreen.svg)](https://iced.zulipchat.com)
+
+`iced_wgpu` is a [`wgpu`] renderer for [`iced_native`]. For now, it is the default renderer of Iced in native platforms.
+
+[`wgpu`] supports most modern graphics backends: Vulkan, Metal, DX11, and DX12 (OpenGL and WebGL are still WIP). Additionally, it will support the incoming [WebGPU API].
+
+Currently, `iced_wgpu` supports the following primitives:
+- Text, which is rendered using [`wgpu_glyph`]. No shaping at all.
+- Quads or rectangles, with rounded borders and a solid background color.
+- Images, lazily loaded from the filesystem.
+- Clip areas, useful to implement scrollables or hide overflowing content.
+
+![iced_wgpu](../docs/graphs/wgpu.png)
+
+[documentation]: https://docs.rs/iced_wgpu
+[`iced_native`]: ../native
+[`wgpu`]: https://github.com/gfx-rs/wgpu-rs
+[WebGPU API]: https://gpuweb.github.io/gpuweb/
+[`wgpu_glyph`]: https://github.com/hecrj/wgpu_glyph
+
+## Current limitations
+
+The current implementation is quite naive, it uses:
+
+- A different pipeline/shader for each primitive
+- A very simplistic layer model: every `Clip` primitive will generate new layers
+- _Many_ render passes instead of preparing everything upfront
+- A glyph cache that is trimmed incorrectly when there are multiple layers (a [`glyph_brush`] limitation)
+
+Some of these issues are already being worked on! If you want to help, [get in touch!]
+
+[get in touch!]: ../CONTRIBUTING.md
+[`glyph_brush`]: https://github.com/alexheretic/glyph-brush
diff --git a/winit/README.md b/winit/README.md
new file mode 100644
index 00000000..b11184cb
--- /dev/null
+++ b/winit/README.md
@@ -0,0 +1,15 @@
+# `iced_winit`
+[![Documentation](https://docs.rs/iced_winit/badge.svg)][documentation]
+[![Crates.io](https://img.shields.io/crates/v/iced_winit.svg)](https://crates.io/crates/iced_winit)
+[![License](https://img.shields.io/crates/l/iced_winit.svg)](https://github.com/hecrj/iced/blob/master/LICENSE)
+[![project chat](https://img.shields.io/badge/chat-on_zulip-brightgreen.svg)](https://iced.zulipchat.com)
+
+`iced_winit` offers some convenient abstractions on top of [`iced_native`] to quickstart development when using [`winit`].
+
+It exposes a renderer-agnostic `Application` trait that can be implemented and then run with a simple call. The use of this trait is optional. A `conversion` module is provided for users that decide to implement a custom event loop.
+
+![iced_winit](../docs/graphs/winit.png)
+
+[documentation]: https://docs.rs/iced_winit
+[`iced_native`]: ../native
+[`winit`]: https://github.com/rust-windowing/winit
-- 
cgit 


From 4b94cf00351f09fa916ebb1d89e4cdf4622fd800 Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Wed, 20 Nov 2019 09:56:16 +0100
Subject: Add installation section to subcrate `README`s

---
 Cargo.toml        |  4 ++--
 README.md         |  8 +++++---
 core/Cargo.toml   |  2 +-
 core/README.md    | 12 ++++++++++++
 native/Cargo.toml |  4 ++--
 native/README.md  | 12 ++++++++++++
 web/README.md     | 12 ++++++++++++
 wgpu/Cargo.toml   |  4 ++--
 wgpu/README.md    | 12 ++++++++++++
 winit/README.md   | 12 ++++++++++++
 10 files changed, 72 insertions(+), 10 deletions(-)

diff --git a/Cargo.toml b/Cargo.toml
index 8766d814..0368408b 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "iced"
-version = "0.1.0-alpha.1"
+version = "0.1.0-beta"
 authors = ["Héctor Ramón Jiménez <hector0193@gmail.com>"]
 edition = "2018"
 description = "A cross-platform GUI library inspired by Elm"
@@ -29,7 +29,7 @@ members = [
 
 [target.'cfg(not(target_arch = "wasm32"))'.dependencies]
 iced_winit = { version = "0.1.0-alpha", path = "winit" }
-iced_wgpu = { version = "0.1.0-alpha", path = "wgpu" }
+iced_wgpu = { version = "0.1.0", path = "wgpu" }
 
 [target.'cfg(target_arch = "wasm32")'.dependencies]
 iced_web = { version = "0.1.0-alpha", path = "web" }
diff --git a/README.md b/README.md
index 096afdc8..d91629aa 100644
--- a/README.md
+++ b/README.md
@@ -27,8 +27,9 @@ Inspired by [Elm].
   * [Debug overlay with performance metrics]
   * First-class support for async actions (use futures!)
   * [Modular ecosystem] split into reusable parts:
-    * A [default renderer] supporting Vulkan, Metal, DX11, and DX12
     * A [renderer-agnostic native runtime] enabling integration with existing systems
+    * A [built-in renderer] supporting Vulkan, Metal, DX11, and DX12
+    * A [windowing shell]
     * A [web runtime] leveraging the DOM
 
 __Iced is currently experimental software.__ [Take a look at the roadmap],
@@ -41,7 +42,8 @@ __Iced is currently experimental software.__ [Take a look at the roadmap],
 [Modular ecosystem]: https://github.com/hecrj/iced/blob/master/ECOSYSTEM.md
 [renderer-agnostic native runtime]: https://github.com/hecrj/iced/tree/master/native
 [`wgpu`]: https://github.com/gfx-rs/wgpu-rs
-[Default renderer]: https://github.com/hecrj/iced/tree/master/wgpu
+[built-in renderer]: https://github.com/hecrj/iced/tree/master/wgpu
+[windowing shell]: https://github.com/hecrj/iced/tree/master/winit
 [`dodrio`]: https://github.com/fitzgen/dodrio
 [web runtime]: https://github.com/hecrj/iced/tree/master/web
 [Take a look at the roadmap]: https://github.com/hecrj/iced/blob/master/ROADMAP.md
@@ -52,7 +54,7 @@ __Iced is currently experimental software.__ [Take a look at the roadmap],
 Add `iced` as a dependency in your `Cargo.toml`:
 
 ```toml
-iced = "0.1"
+iced = "0.1.0-beta"
 ```
 
 __Iced moves fast and the `master` branch can contain breaking changes!__ If
diff --git a/core/Cargo.toml b/core/Cargo.toml
index f2492345..c623ba78 100644
--- a/core/Cargo.toml
+++ b/core/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "iced_core"
-version = "0.1.0-alpha"
+version = "0.1.0"
 authors = ["Héctor Ramón Jiménez <hector0193@gmail.com>"]
 edition = "2018"
 description = "The essential concepts of Iced"
diff --git a/core/README.md b/core/README.md
index 8f967796..31630ea8 100644
--- a/core/README.md
+++ b/core/README.md
@@ -11,3 +11,15 @@ This crate is meant to be a starting point for an Iced runtime.
 ![iced_core](../docs/graphs/core.png)
 
 [documentation]: https://docs.rs/iced_core
+
+## Installation
+Add `iced_core` as a dependency in your `Cargo.toml`:
+
+```toml
+iced_core = "0.1.0"
+```
+
+__Iced moves fast and the `master` branch can contain breaking changes!__ If
+you want to learn about a specific release, check out [the release list].
+
+[the release list]: https://github.com/hecrj/iced/releases
diff --git a/native/Cargo.toml b/native/Cargo.toml
index 5dc3ae1a..7993676e 100644
--- a/native/Cargo.toml
+++ b/native/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "iced_native"
-version = "0.1.0-alpha"
+version = "0.1.0"
 authors = ["Héctor Ramón Jiménez <hector0193@gmail.com>"]
 edition = "2018"
 description = "A renderer-agnostic library for native GUIs"
@@ -8,6 +8,6 @@ license = "MIT"
 repository = "https://github.com/hecrj/iced"
 
 [dependencies]
-iced_core = { version = "0.1.0-alpha", path = "../core", features = ["command"] }
+iced_core = { version = "0.1.0", path = "../core", features = ["command"] }
 twox-hash = "1.5"
 raw-window-handle = "0.3"
diff --git a/native/README.md b/native/README.md
index 60f350b8..59ec5424 100644
--- a/native/README.md
+++ b/native/README.md
@@ -21,3 +21,15 @@ To achieve this, it introduces a bunch of reusable interfaces:
 [`iced_winit`]: ../winit
 [`druid`]: https://github.com/xi-editor/druid
 [`raw-window-handle`]: https://github.com/rust-windowing/raw-window-handle
+
+## Installation
+Add `iced_native` as a dependency in your `Cargo.toml`:
+
+```toml
+iced_native = "0.1.0"
+```
+
+__Iced moves fast and the `master` branch can contain breaking changes!__ If
+you want to learn about a specific release, check out [the release list].
+
+[the release list]: https://github.com/hecrj/iced/releases
diff --git a/web/README.md b/web/README.md
index f86b2cb7..8f97f79e 100644
--- a/web/README.md
+++ b/web/README.md
@@ -13,3 +13,15 @@ The crate is currently a __very experimental__, simple abstraction layer over [`
 [documentation]: https://docs.rs/iced_web
 [`iced_core`]: ../core
 [`dodrio`]: https://github.com/fitzgen/dodrio
+
+## Installation
+Add `iced_web` as a dependency in your `Cargo.toml`:
+
+```toml
+iced_web = "0.1.0-alpha"
+```
+
+__Iced moves fast and the `master` branch can contain breaking changes!__ If
+you want to learn about a specific release, check out [the release list].
+
+[the release list]: https://github.com/hecrj/iced/releases
diff --git a/wgpu/Cargo.toml b/wgpu/Cargo.toml
index 3ebfa7ea..0d80357c 100644
--- a/wgpu/Cargo.toml
+++ b/wgpu/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "iced_wgpu"
-version = "0.1.0-alpha"
+version = "0.1.0"
 authors = ["Héctor Ramón Jiménez <hector0193@gmail.com>"]
 edition = "2018"
 description = "A wgpu renderer for Iced"
@@ -8,7 +8,7 @@ license = "MIT"
 repository = "https://github.com/hecrj/iced"
 
 [dependencies]
-iced_native = { version = "0.1.0-alpha", path = "../native" }
+iced_native = { version = "0.1.0", path = "../native" }
 wgpu = "0.4"
 glyph_brush = "0.6"
 wgpu_glyph = { version = "0.5", git = "https://github.com/hecrj/wgpu_glyph", branch = "feature/scissoring" }
diff --git a/wgpu/README.md b/wgpu/README.md
index 47038c10..38c6ddb6 100644
--- a/wgpu/README.md
+++ b/wgpu/README.md
@@ -22,6 +22,18 @@ Currently, `iced_wgpu` supports the following primitives:
 [WebGPU API]: https://gpuweb.github.io/gpuweb/
 [`wgpu_glyph`]: https://github.com/hecrj/wgpu_glyph
 
+## Installation
+Add `iced_wgpu` as a dependency in your `Cargo.toml`:
+
+```toml
+iced_wgpu = "0.1.0"
+```
+
+__Iced moves fast and the `master` branch can contain breaking changes!__ If
+you want to learn about a specific release, check out [the release list].
+
+[the release list]: https://github.com/hecrj/iced/releases
+
 ## Current limitations
 
 The current implementation is quite naive, it uses:
diff --git a/winit/README.md b/winit/README.md
index b11184cb..01785150 100644
--- a/winit/README.md
+++ b/winit/README.md
@@ -13,3 +13,15 @@ It exposes a renderer-agnostic `Application` trait that can be implemented and t
 [documentation]: https://docs.rs/iced_winit
 [`iced_native`]: ../native
 [`winit`]: https://github.com/rust-windowing/winit
+
+## Installation
+Add `iced_winit` as a dependency in your `Cargo.toml`:
+
+```toml
+iced_winit = "0.1.0-alpha"
+```
+
+__Iced moves fast and the `master` branch can contain breaking changes!__ If
+you want to learn about a specific release, check out [the release list].
+
+[the release list]: https://github.com/hecrj/iced/releases
-- 
cgit 


From 409b2db994980879355dc8ce0d065500a545ca61 Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Wed, 20 Nov 2019 10:54:32 +0100
Subject: Add usage section to `iced_web`

---
 web/README.md | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/web/README.md b/web/README.md
index 8f97f79e..762f6c83 100644
--- a/web/README.md
+++ b/web/README.md
@@ -25,3 +25,41 @@ __Iced moves fast and the `master` branch can contain breaking changes!__ If
 you want to learn about a specific release, check out [the release list].
 
 [the release list]: https://github.com/hecrj/iced/releases
+
+## Usage
+The current build process is a bit involved, as [`wasm-pack`] does not currently [support building binary crates](https://github.com/rustwasm/wasm-pack/issues/734).
+
+Therefore, we instead build using the `wasm32-unknown-unknown` target and use the [`wasm-bindgen`] CLI to generate appropriate bindings.
+
+For instance, let's say we want to build the [`tour` example]:
+
+```
+cd examples
+cargo build --example tour --target wasm32-unknown-unknown
+wasm-bindgen ../target/wasm32-unknown-unknown/debug/examples/tour.wasm --out-dir tour --web
+```
+
+Then, we need to create an `.html` file to load our application:
+
+```html
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
+    <title>Tour - Iced</title>
+  </head>
+  <body>
+    <script type="module">
+      import init from "./tour/tour.js";
+
+      init('./tour/tour_bg.wasm');
+    </script>
+  </body>
+</html>
+```
+
+Finally, we serve it using an HTTP server and access it with our browser.
+
+[`wasm-pack`]: https://github.com/rustwasm/wasm-pack
+[`wasm-bindgen`]: https://github.com/rustwasm/wasm-bindgen
+[`tour` example]: ../examples/README.md#tour
-- 
cgit 


From 08aa862a42b8bd710b3add7408b090d1fc918cab Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Wed, 20 Nov 2019 10:54:40 +0100
Subject: Update examples `README`

---
 examples/README.md | 73 +++++++++++++++++++++++++-----------------------------
 1 file changed, 34 insertions(+), 39 deletions(-)

diff --git a/examples/README.md b/examples/README.md
index 0a06a012..95ec6c5c 100644
--- a/examples/README.md
+++ b/examples/README.md
@@ -4,29 +4,17 @@ you want to learn about a specific release, check out [the release list].
 
 [the release list]: https://github.com/hecrj/iced/releases
 
-
 ## [Tour](tour.rs)
-A simple UI tour showcasing different widgets that can be built using Iced.
-
-The example can run both on native and web platforms, using the same GUI code!
-
-[![Tour - Iced][gui_gif]][gui_gfycat]
-
-[gui_gif]: https://thumbs.gfycat.com/VeneratedSourAurochs-small.gif
-[gui_gfycat]: https://gfycat.com/veneratedsouraurochs
 
-On native, the example uses:
-  - [`iced_winit`], as a bridge between [`iced_native`] and [`winit`].
-  - [`iced_wgpu`], a WIP Iced renderer built on top of [`wgpu`] and supporting
-    Vulkan, Metal, D3D11, and D3D12 (OpenGL and WebGL soon!).
+A simple UI tour that can run both on native platforms and the web! It showcases different widgets that can be built using Iced.
 
-The web version uses [`iced_web`], which is still a work in progress. In
-particular, the styling of elements is not finished yet (text color, alignment,
-sizing, etc).
+The __[`tour`]__ file contains all the code of the example! All the cross-platform GUI is defined in terms of __state__, __messages__, __update logic__ and __view logic__.
 
-The __[`tour`]__ file contains all the code of the example! All the
-cross-platform GUI is defined in terms of __state__, __messages__,
-__update logic__ and __view logic__.
+<div align="center">
+  <a href="https://gfycat.com/politeadorableiberianmole">
+    <img src="https://thumbs.gfycat.com/PoliteAdorableIberianmole-small.gif">
+  </a>
+</div>
 
 [`tour`]: tour.rs
 [`iced_winit`]: ../winit
@@ -36,42 +24,49 @@ __update logic__ and __view logic__.
 [`winit`]: https://github.com/rust-windowing/winit
 [`wgpu`]: https://github.com/gfx-rs/wgpu-rs
 
-#### Running the native version
-Use [Cargo](https://doc.rust-lang.org/cargo/reference/manifest.html#examples)
-to run the example:
-
+You can run the native version with `cargo run`:
 ```
 cargo run --example tour
 ```
 
-#### Running the web version
-Build using the `wasm32-unknown-unknown` target and use the [`wasm-bindgen`] CLI
-to generate appropriate bindings in a `tour` directory.
+The web version can be run by following [the usage instructions of `iced_web`] or by accessing [iced.rs](https://iced.rs/)!
 
-```
-cd examples
-cargo build --example tour --target wasm32-unknown-unknown
-wasm-bindgen ../target/wasm32-unknown-unknown/debug/examples/tour.wasm --out-dir tour --web
-```
+[the usage instructions of `iced_web`]: ../web#usage
 
-Finally, serve the `examples` directory using an HTTP server and access the
-`tour.html` file.
 
-[`wasm-bindgen`]: https://github.com/rustwasm/wasm-bindgen
+## [Todos](todos.rs)
+
+A simple todos tracker inspired by [TodoMVC]. It showcases dynamic layout, text input, checkboxes, scrollables, icons, and async actions! It automatically saves your tasks in the background, even if you did not finish typing them.
+
+All the example code is located in the __[`todos`]__ file.
+
+<div align="center">
+  <a href="https://gfycat.com/littlesanehalicore">
+    <img src="https://thumbs.gfycat.com/LittleSaneHalicore-small.gif" height="400px">
+  </a>
+</div>
+
+You can run the native version with `cargo run`:
+```
+cargo run --example todos
+```
+We have not yet implemented a `LocalStorage` version of the auto-save feature. Therefore, it does not work on web _yet_!
 
+[`todos`]: todos.rs
+[TodoMVC]: http://todomvc.com/
 
 ## [Coffee]
 
 Since [Iced was born in May], it has been powering the user interfaces in
 [Coffee], an experimental 2D game engine.
 
-If you want to give Iced a try without having to write your own renderer,
-the __[`ui` module]__ in [Coffee] is probably your best choice as of now.
 
-[![Tour - Coffee][coffee_gui_gif]][coffee_gui_gfycat]
+<div align="center">
+  <a href="https://gfycat.com/gloomyweakhammerheadshark">
+    <img src="https://thumbs.gfycat.com/GloomyWeakHammerheadshark-small.gif">
+  </a>
+</div>
 
 [Iced was born in May]: https://github.com/hecrj/coffee/pull/35
 [`ui` module]: https://docs.rs/coffee/0.3.2/coffee/ui/index.html
 [Coffee]: https://github.com/hecrj/coffee
-[coffee_gui_gif]: https://thumbs.gfycat.com/GloomyWeakHammerheadshark-small.gif
-[coffee_gui_gfycat]: https://gfycat.com/gloomyweakhammerheadshark
-- 
cgit 


From 7f1c6fc14cddbf7055a4d00a4c188311592e679e Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Wed, 20 Nov 2019 11:02:40 +0100
Subject: Remove `scroll` example and `tour.html`

---
 examples/scroll.rs | 84 ------------------------------------------------------
 examples/tour.html | 14 ---------
 2 files changed, 98 deletions(-)
 delete mode 100644 examples/scroll.rs
 delete mode 100644 examples/tour.html

diff --git a/examples/scroll.rs b/examples/scroll.rs
deleted file mode 100644
index 61ad2a53..00000000
--- a/examples/scroll.rs
+++ /dev/null
@@ -1,84 +0,0 @@
-use iced::{
-    button, scrollable, Align, Application, Button, Command, Container,
-    Element, Image, Length, Scrollable, Text,
-};
-
-pub fn main() {
-    env_logger::init();
-
-    Example::run()
-}
-
-#[derive(Default)]
-struct Example {
-    item_count: u16,
-
-    scroll: scrollable::State,
-    add_button: button::State,
-}
-
-#[derive(Debug, Clone, Copy)]
-pub enum Message {
-    AddItem,
-}
-
-impl Application for Example {
-    type Message = Message;
-
-    fn new() -> (Example, Command<Message>) {
-        (Example::default(), Command::none())
-    }
-
-    fn title(&self) -> String {
-        String::from("Scroll - Iced")
-    }
-
-    fn update(&mut self, message: Message) -> Command<Message> {
-        match message {
-            Message::AddItem => {
-                self.item_count += 1;
-            }
-        }
-
-        Command::none()
-    }
-
-    fn view(&mut self) -> Element<Message> {
-        let content = (0..self.item_count)
-            .fold(
-                Scrollable::new(&mut self.scroll)
-                    .spacing(20)
-                    .padding(20)
-                    .align_items(Align::Center),
-                |scrollable, i| {
-                    if i % 2 == 0 {
-                        scrollable.push(lorem_ipsum().width(Length::Units(600)))
-                    } else {
-                        scrollable.push(
-                            Image::new(format!(
-                                "{}/examples/resources/ferris.png",
-                                env!("CARGO_MANIFEST_DIR")
-                            ))
-                            .width(Length::Units(400)),
-                        )
-                    }
-                },
-            )
-            .push(
-                Button::new(&mut self.add_button, Text::new("Add item"))
-                    .on_press(Message::AddItem)
-                    .padding(20)
-                    .border_radius(5),
-            );
-
-        Container::new(content)
-            .width(Length::Fill)
-            .height(Length::Fill)
-            .center_y()
-            .into()
-    }
-}
-
-fn lorem_ipsum() -> Text {
-    Text::new("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi in dui vel massa blandit interdum. Quisque placerat, odio ut vulputate sagittis, augue est facilisis ex, eget euismod felis magna in sapien. Nullam luctus consequat massa, ac interdum mauris blandit pellentesque. Nullam in est urna. Aliquam tristique lectus ac luctus feugiat. Aenean libero diam, euismod facilisis consequat quis, pellentesque luctus erat. Praesent vel tincidunt elit.")
-}
diff --git a/examples/tour.html b/examples/tour.html
deleted file mode 100644
index 35360e59..00000000
--- a/examples/tour.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
-    <title>Tour - Iced</title>
-  </head>
-  <body>
-    <script type="module">
-      import init from "./tour/tour.js";
-
-      init('./tour/tour_bg.wasm');
-    </script>
-  </body>
-</html>
-- 
cgit 


From 1094968e43ddb7a217fbdd0426236325b499c8fb Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Wed, 20 Nov 2019 12:36:49 +0100
Subject: Add `CONTRIBUTING.md`

---
 CONTRIBUTING.md | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)
 create mode 100644 CONTRIBUTING.md

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 00000000..1a8d6164
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,20 @@
+# Contributing
+
+Thank you for considering contributing to Iced! Feel free to read [the ecosystem overview] and [the roadmap] to get an idea of the current state of the library.
+
+The main advice for new contributors is to share your ideas with the community. Introduce yourself over our [Zulip server] or [start a discussion in an issue](https://github.com/hecrj/iced/issues) explaining what you have in mind (do not be afraid of duplicated issues!). If you want to talk directly to me (@hecrj), you can also find me on Discord (`lone_scientist#9554`).
+
+This is a very important step. It helps to coordinate work, get on the same page, and start building trust. Please, do not skip it! Remember that [Code is the Easy Part] and also [The Hard Parts of Open Source]!
+
+Iced is in its infancy and, besides directly writing code, there are many other different ways you can contribute. To name a few:
+
+- Writing tutorials or blog posts
+- Improving the documentation
+- Submitting bug reports and use cases
+- Sharing, discussing, researching and exploring new ideas
+
+[the ecosystem overview]: ECOSYSTEM.md
+[the roadmap]: ROADMAP.md
+[Zulip server]: https://iced.zulipchat.com/
+[Code is the Easy Part]: https://youtu.be/DSjbTC-hvqQ?t=845
+[The Hard Parts of Open Source]: https://www.youtube.com/watch?v=o_4EX4dPppA
-- 
cgit 


From 49349b75d92612e158f78fee84c70b172b4acd0e Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Thu, 21 Nov 2019 07:43:21 +0100
Subject: Add sponsors section to `README`

---
 README.md | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/README.md b/README.md
index d91629aa..0dbade92 100644
--- a/README.md
+++ b/README.md
@@ -213,6 +213,9 @@ come chat to our [Zulip server]. Moreover, you can find me (and a bunch of
 awesome folks) over the `#games-and-graphics` and `#gui-and-ui` channels in
 the [Rust Community Discord]. I go by `lone_scientist#9554` there.
 
+## Sponsors
+The development of Iced is sponsored by the [Cryptowatch] team at [Kraken.com]
+
 [documentation]: https://docs.rs/iced
 [examples]: https://github.com/hecrj/iced/tree/master/examples
 [Coffee]: https://github.com/hecrj/coffee
@@ -222,3 +225,5 @@ the [Rust Community Discord]. I go by `lone_scientist#9554` there.
 [contributing guidelines]: https://github.com/hecrj/iced/blob/master/CONTRIBUTING.md
 [Zulip server]: https://iced.zulipchat.com/
 [Rust Community Discord]: https://bit.ly/rust-community
+[Cryptowatch]: https://cryptowat.ch/charts
+[Kraken.com]: https://kraken.com/
-- 
cgit