diff --git a/doc/animations.md b/doc/animations.md
new file mode 100644
index 00000000..7dabb28d
--- /dev/null
+++ b/doc/animations.md
@@ -0,0 +1,39 @@
+# 🦉 Animations 🦉
+
+
+Animation is a complex topic. There are many different use cases, and many
+solutions and technologies.
+
+## Simple CSS effects
+
+Sometimes, using pure CSS is enough. For these use cases, Owl is not really
+necessary: it just needs to render a DOM element with a specific class. For
+example:
+
+
+```xml
+
+```
+
+with the following CSS:
+
+```css
+.flash {
+ transition: background 0.5s;
+}
+
+.flash:active {
+ background-color: #41454a;
+ transition: background 0s;
+}
+```
+
+will produce a nice flash effect whenever the user click (or activate with the
+keyboard) the button.
+
+## CSS Transitions (single element)
+
+A more complex situation occurs when we want to transition an element in or out
+of the page. For example, we may want a fade-in and fade-out effect.
+
+The `t-transition` directive is here to help us (see [QWeb documentation](doc/qweb.md#t-transition-directive)).
\ No newline at end of file
diff --git a/doc/qweb.md b/doc/qweb.md
index 6201f610..3adf36eb 100644
--- a/doc/qweb.md
+++ b/doc/qweb.md
@@ -16,6 +16,7 @@
- [Component: `t-widget`, `t-props`](#component-t-widget-t-props)
- [`t-ref` directive](#t-ref-directive)
- [`t-key` directive](#t-key-directive)
+ - [`t-transition` directive](#t-transition)
- [Debugging (`t-debug` and `t-log`)](#debugging-t-debug-and-t-log)
- [White spaces](#white-spaces)
- [Root nodes](#root-nodes)
@@ -253,6 +254,54 @@ There are three main use cases:
- *animations*: give a different identity to a component. Ex: thread id with
animations on add/remove message.
+### `t-transition` directive
+
+To perform useful transition effects, whenever an element appears or disappears,
+it is necessary to add/remove some css style or class at some precise moment in
+the lifetime of a node. Since this is not easy to do by hand, Owl `t-transition`
+directive is there to help.
+
+Whenever a node has a `t-transition` directive, with a `name` value, the following
+will happen:
+
+At node creation:
+
+- the css classes `name-enter` and `name-enter-active` will be added before the
+ node is added to the DOM,
+- on the next animation frame: the css class `name-enter` will be removed and the
+ class `name-enter-to` will be added (so they can be used to trigger css
+ transition effects),
+- the css class `name-enter-active` will be removed whenever a css transition
+ ends.
+
+At node destruction:
+- the css classes `name-leave` and `name-leave-active` will be added before the
+ node is removed to the DOM,
+- the css class `name-leave` will be removed on the next animation frame (so it
+ can be used to trigger css transition effects),
+- the css class `name-leave-active` will be removed whenever a css transition
+ ends. Only then will the element be removed from the DOM.
+
+For example, a simple fade in/out effect can be done with this:
+
+```xml
+
`
);
- qweb.render('test');
+ qweb.render("test");
expect(qweb.templates.test.fn.toString()).toMatchSnapshot();
expect(console.log).toHaveBeenCalledTimes(1);
@@ -1112,7 +1112,7 @@ describe("debugging", () => {
test("t-log", () => {
const consoleLog = console.log;
- console.log = jest.fn()
+ console.log = jest.fn();
qweb.addTemplate(
"test",
@@ -1121,10 +1121,23 @@ describe("debugging", () => {
`
);
- qweb.render('test');
+ qweb.render("test");
expect(qweb.templates.test.fn.toString()).toMatchSnapshot();
expect(console.log).toHaveBeenCalledWith(45);
console.log = consoleLog;
});
});
+
+describe("animations", () => {
+ test("t-transition, on a simple node", async () => {
+ // this test does not test much, because it is not easy to test timing
+ // transitions... we should do a little more effort for these tests.
+ qweb.addTemplate(
+ "test",
+ `