This is an automated email from the ASF dual-hosted git repository.

carlosrovira pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git


The following commit(s) were added to refs/heads/develop by this push:
     new aa6a86d  todomvc-crux: New Crux version of the TodoMVC
aa6a86d is described below

commit aa6a86d3e995a06a109212e37c2dd6a8db46bad0
Author: Carlos Rovira <carlosrov...@apache.org>
AuthorDate: Wed Feb 12 20:18:07 2020 +0100

    todomvc-crux: New Crux version of the TodoMVC
---
 examples/crux/pom.xml                              |   1 +
 examples/crux/todomvc/asconfig.json                |  31 ++
 examples/crux/todomvc/build.xml                    |  56 ++++
 examples/crux/todomvc/pom.xml                      | 125 ++++++++
 examples/crux/todomvc/readme.md                    |  68 +++++
 .../todomvc/src/main/config/compile-app-config.xml |  46 +++
 .../src/main/resources/todomvc-index-template.html |  30 ++
 .../todomvc/src/main/resources/todomvc-styles.css  | 323 +++++++++++++++++++++
 examples/crux/todomvc/src/main/royale/App.mxml     |  83 ++++++
 .../main/royale/jewel/todomvc/config/Beans.mxml    |  28 ++
 .../jewel/todomvc/controllers/TodoController.as    | 203 +++++++++++++
 .../main/royale/jewel/todomvc/events/TodoEvent.as  |  72 +++++
 .../main/royale/jewel/todomvc/models/TodoModel.as  | 154 ++++++++++
 .../jewel/todomvc/renderers/TodoItemRenderer.mxml  | 165 +++++++++++
 .../royale/jewel/todomvc/views/TodoFooter.mxml     |  85 ++++++
 .../royale/jewel/todomvc/views/TodoHeader.mxml     |  75 +++++
 .../jewel/todomvc/views/TodoListSection.mxml       |  97 +++++++
 .../src/main/royale/jewel/todomvc/vos/TodoVO.as    |  65 +++++
 examples/crux/todomvc/todomvc.as3proj              | 115 ++++++++
 19 files changed, 1822 insertions(+)

diff --git a/examples/crux/pom.xml b/examples/crux/pom.xml
index a592967..45091d8 100644
--- a/examples/crux/pom.xml
+++ b/examples/crux/pom.xml
@@ -36,6 +36,7 @@
     <module>CruxQuickStart</module>
     <module>CruxQuickStartBasic</module>
     <module>CruxGitHubCommitLogViewer</module>
+    <module>todomvc-jewel-crux</module>
   </modules>
 
   <build>
diff --git a/examples/crux/todomvc/asconfig.json 
b/examples/crux/todomvc/asconfig.json
new file mode 100644
index 0000000..14ab179
--- /dev/null
+++ b/examples/crux/todomvc/asconfig.json
@@ -0,0 +1,31 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+{
+    "config": "royale",
+    "compilerOptions": {
+        "debug": false,
+        "targets": ["JSRoyale"],
+        "source-map": true
+    },
+    "additionalOptions": "-remove-circulars 
-js-output-optimization=skipAsCoercions",
+    "files":
+    [
+        "src/main/royale/App.mxml"
+    ]
+}
diff --git a/examples/crux/todomvc/build.xml b/examples/crux/todomvc/build.xml
new file mode 100644
index 0000000..36b2dd6
--- /dev/null
+++ b/examples/crux/todomvc/build.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+
+
+<project name="todomvc" default="main" basedir=".">
+    <property name="ROYALE_HOME" location="../../.."/>
+    <property name="example" value="todomvc" />
+    
+    <property file="${ROYALE_HOME}/env.properties"/>
+    <property environment="env"/>
+    <property file="${ROYALE_HOME}/build.properties"/>
+    <property name="ROYALE_HOME" value="${ROYALE_HOME}"/>
+
+    <include file="${basedir}/../../build_example.xml" />
+
+
+    
+    <target name="main" depends="clean,build_example.compile-js-only" 
description="Clean build of ${example}">
+    </target>
+    
+    <target name="clean">
+        <delete dir="${basedir}/bin" failonerror="false" />
+        <delete dir="${basedir}/bin-debug" failonerror="false" />
+        <delete dir="${basedir}/bin-release" failonerror="false" />
+        <delete dir="${basedir}/target" failonerror="false" />
+    </target>
+
+    <target name="examine" depends="build_example.get.browser">
+        <property name="which" value="debug" />
+        <echo message="Make sure label appears."/>
+        <exec executable="${browser}" dir="${basedir}/bin-${which}" 
failonerror="true">
+            <arg value="${basedir}/bin-${which}/${example}.html"/>
+        </exec>
+        <exec executable="${browser}" dir="${basedir}/bin/js-${which}" 
failonerror="true">
+            <arg value="${basedir}/bin/js-${which}/index.html"/>
+        </exec>
+    </target>
+
+</project>
diff --git a/examples/crux/todomvc/pom.xml b/examples/crux/todomvc/pom.xml
new file mode 100644
index 0000000..0d547f7
--- /dev/null
+++ b/examples/crux/todomvc/pom.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.royale.examples</groupId>
+    <artifactId>examples-crux</artifactId>
+    <version>0.9.7-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>todomvc-jewel-crux</artifactId>
+  <version>0.9.7-SNAPSHOT</version>
+  <packaging>swf</packaging>
+
+  <name>Apache Royale: Examples: TodoMVC-Jewel-Crux</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.royale.compiler</groupId>
+        <artifactId>royale-maven-plugin</artifactId>
+        <extensions>true</extensions>
+        <configuration>
+          <mainClass>App.mxml</mainClass>
+          <targets>${royale.targets}</targets>
+          <debug>false</debug>
+          
<htmlTemplate>${basedir}/target/javascript/bin/js-debug/todomvc-index-template.html</htmlTemplate>
+          <additionalCompilerOptions>
+            -js-default-initializers=true;
+            
-keep-as3-metadata+=Inject,Dispatcher,EventHandler,PostConstruct,PreDestroy,ViewAdded,ViewRemoved,Bindable,Transient;
+            -keep-code-with-metadata=Inject;
+            -source-map=true;
+            
-compiler.exclude-defaults-css-files=MXRoyale-${royale.framework.version}-js.swc:defaults.css;
+          </additionalCompilerOptions>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Icons</artifactId>
+      <version>0.9.7-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Storage</artifactId>
+      <version>0.9.7-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Crux</artifactId>
+      <version>0.9.7-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>JewelTheme</artifactId>
+      <version>0.9.7-SNAPSHOT</version>
+      <type>swc</type>
+      <scope>theme</scope>
+      <classifier>js</classifier>
+    </dependency>
+  </dependencies>
+
+  <profiles>
+    <profile>
+      <id>option-with-swf</id>
+
+      <properties>
+        <!-- no point building the swf target  -->
+        <royale.targets>JSRoyale</royale.targets>
+      </properties>
+
+      <dependencies>
+        <dependency>
+          <groupId>org.apache.royale.framework</groupId>
+          <artifactId>Icons</artifactId>
+          <version>0.9.7-SNAPSHOT</version>
+          <type>swc</type>
+          <classifier>swf</classifier>
+        </dependency>
+        <dependency>
+          <groupId>org.apache.royale.framework</groupId>
+          <artifactId>Storage</artifactId>
+          <version>0.9.7-SNAPSHOT</version>
+          <type>swc</type>
+          <classifier>swf</classifier>
+        </dependency>
+        <dependency>
+          <groupId>org.apache.royale.framework</groupId>
+          <artifactId>Crux</artifactId>
+          <version>0.9.7-SNAPSHOT</version>
+          <type>swc</type>
+          <classifier>swf</classifier>
+        </dependency>
+      </dependencies>
+    </profile>
+  </profiles>
+
+</project>
diff --git a/examples/crux/todomvc/readme.md b/examples/crux/todomvc/readme.md
new file mode 100644
index 0000000..f11545e
--- /dev/null
+++ b/examples/crux/todomvc/readme.md
@@ -0,0 +1,68 @@
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+
+# Apache Royale TodoMVC Example (Crux version)
+
+> Apache Royale™ is a productive, open-source frontend application technology 
that lets you code in MXML & AS3 and output to different formats, included 
Javascript and SWF.
+
+> _[Apache Royale™ Website](https://royale.apache.org)_
+
+
+## Learning Apache Royale
+
+The [Apache Royale getting started 
documentation](https://apache.github.io/royale-docs/get-started) is a great way 
to get started.
+
+Here are some links you may find helpful:
+
+* [Documentation](https://apache.github.io/royale-docs)
+* [API Reference](https://royale.apache.org/asdoc)
+* [Blog](https://royale.apache.org/blog)
+* [Apache Royale on 
GitHub](https://github.com/apache/royale-asjs/wiki/Apache-Royale-Source-Code-Repositories)
+* [Support (Dev Mailing List)](https://royale.apache.org/mailing-lists)
+* [FAQ](https://royale.apache.org/faq/)
+* [Get Involved](https://royale.apache.org/get-involved)
+
+Crux is a microframework for Inversion of Control (IoC), Dependency Injection 
(DI) and event handling with metadata.
+
+* [Crux in Apache Royale 
Docs](https://apache.github.io/royale-docs/libraries/crux)
+
+Articles and guides from the community:
+
+* [Royale Examples](https://royale.apache.org/category/royale-examples)
+
+Apache Royale social media:
+
+* [Twitter](https://twitter.com/apacheroyale)
+* [Facebook](https://facebook.com/ApacheRoyaleSDK/)
+* [LinkedIn](https://www.linkedin.com/groups/12118437)
+
+Get help from other Apache Royale users:
+
+* [Apache Royale on 
StackOverflow](https://stackoverflow.com/questions/tagged/apache-royale)
+* [Discussion Forum (User Mailing 
List)](https://royale.apache.org/mailing-lists)
+
+_If you have other helpful links to share, or find any of the links above no 
longer work, please [let us 
know](https://github.com/apache/royale-asjs/issues)._
+
+
+## Running
+
+The app is built upon [AS3](https://apache.github.io/royale-docs/features/as3) 
and [MXML](https://apache.github.io/royale-docs/features/mxml) languages and 
compiled with the Apache Royale Compiler.
+We use [Maven](https://maven.apache.org) and [ANT](https://ant.apache.org) to 
build the project.
+
+To run the app, go to the generated code and run `index.html` or visit 
[https://royale.apache.org/todomvc-jewel].
diff --git a/examples/crux/todomvc/src/main/config/compile-app-config.xml 
b/examples/crux/todomvc/src/main/config/compile-app-config.xml
new file mode 100644
index 0000000..a507639
--- /dev/null
+++ b/examples/crux/todomvc/src/main/config/compile-app-config.xml
@@ -0,0 +1,46 @@
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<royale-config>
+    <js-output-optimization>
+        <optimization>skipAsCoercions</optimization>
+    </js-output-optimization>
+    <js-dynamic-access-unknown-members>true</js-dynamic-access-unknown-members>
+
+    <compiler>
+        <targets>
+            <target>JSRoyale</target>
+        </targets>
+        <keep-as3-metadata>
+            <name>Bindable</name>
+            <name>Transient</name>
+        </keep-as3-metadata>
+
+        <js-library-path append="true">
+            
<path-element>../../../../../../frameworks/js/libs/BasicJS.swc</path-element>
+            
<path-element>../../../../../../frameworks/js/libs/IconsJS.swc</path-element>
+        </js-library-path>
+        <!--<library-path append="true">
+            
<path-element>../../../../../../frameworks/libs/Basic.swc</path-element>
+            
<path-element>../../../../../../frameworks/libs/Icons.swc</path-element>
+        </library-path>-->
+        <theme>
+            
<filename>../../../../../../frameworks/libs/JewelTheme.swc</filename>
+        </theme>
+    </compiler>
+</royale-config>
diff --git 
a/examples/crux/todomvc/src/main/resources/todomvc-index-template.html 
b/examples/crux/todomvc/src/main/resources/todomvc-index-template.html
new file mode 100644
index 0000000..764fe53
--- /dev/null
+++ b/examples/crux/todomvc/src/main/resources/todomvc-index-template.html
@@ -0,0 +1,30 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!DOCTYPE html>
+<html>
+<head>
+       <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <meta name="Custom Template for injecting custom style CSS">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, 
maximum-scale=1.0, user-scalable=no" />
+    <link rel="stylesheet" type="text/css" href="${application}.css">
+    <link href="https://fonts.googleapis.com/css?family=Lato:400,700"; 
rel="stylesheet">
+${head}
+</head>
+<body>
+${body}
+</body>
+</html>
diff --git a/examples/crux/todomvc/src/main/resources/todomvc-styles.css 
b/examples/crux/todomvc/src/main/resources/todomvc-styles.css
new file mode 100644
index 0000000..24e1c4f
--- /dev/null
+++ b/examples/crux/todomvc/src/main/resources/todomvc-styles.css
@@ -0,0 +1,323 @@
+/*
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+*/
+@namespace "http://www.w3.org/1999/xhtml";;
+
+/* Application */
+.jewel.application {
+    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
+    font-size: 14px;
+       line-height: 1.4em;
+       background: #f5f5f5;
+       color: #4d4d4d;
+       min-width: 230px;
+       max-width: 550px;
+       margin: 0 auto;
+       -webkit-font-smoothing: antialiased;
+       -moz-osx-font-smoothing: grayscale;
+       font-weight: 300;
+}
+
+/* Main Section */
+.todoapp {
+       background: #fff;
+       margin: 130px 0 40px 0;
+       position: relative;
+       box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2),
+                   0 25px 50px 0 rgba(0, 0, 0, 0.1);
+}
+
+/* Main Title */
+.todoapp h1 {
+       position: absolute;
+       top: -155px;
+       width: 100%;
+       font-size: 100px;
+       font-weight: 100;
+       text-align: center;
+       color: rgba(175, 47, 47, 0.15);
+       -webkit-text-rendering: optimizeLegibility;
+       -moz-text-rendering: optimizeLegibility;
+       text-rendering: optimizeLegibility;
+}
+
+/* Button */
+.jewel.button {
+       margin: 3px;
+    padding: 3px 7px;
+       background: none;
+       border: 1px solid transparent;
+       box-shadow: none;
+       border-radius: 0.25rem;
+       color: #808080;
+       text-shadow: none;
+       font-weight: normal;
+       text-transform: initial;
+}
+.jewel.button:hover, .jewel.button:hover:focus {
+       background: none;
+       border: 1px solid transparent;  
+}
+.jewel.button:active, .jewel.button:active:focus {
+       background: none;
+       border: 1px solid transparent;
+       box-shadow: none;
+}
+.jewel.button:focus {
+       border: 1px solid transparent;
+       box-shadow: none;
+}
+
+/* ToggleButton */
+.jewel.togglebutton {
+       margin: 3px;
+    padding: 3px 7px;
+       background: none;
+       border: 1px solid transparent;
+       box-shadow: none;
+       border-radius: 0.25rem;
+       color: #808080;
+       text-shadow: none;
+       font-weight: normal;
+       text-transform: initial;
+}
+.jewel.togglebutton:hover, .jewel.togglebutton:hover:focus {
+       background: none;
+       border: 1px solid rgba(175, 47, 47, .1);
+}
+.jewel.togglebutton:active, .jewel.togglebutton:active:focus {
+       background: none;
+       border: 1px solid rgba(175,47,47,.2);
+       box-shadow: none;
+}
+.jewel.togglebutton:focus {
+       border: 1px solid #b3b3b3;
+       box-shadow: none;
+}
+.jewel.togglebutton.selected {
+       background: none;
+       border: 1px solid rgba(175,47,47,.2);;
+       box-shadow: none;
+}
+
+/* Toggle All */
+.jewel.togglebutton.toggleAll .fonticon {
+       font-size: 1.8em;
+}
+.jewel.togglebutton.toggleAll:hover, .jewel.togglebutton.toggleAll:hover:focus 
{
+       border: 1px solid transparent;
+}
+.jewel.togglebutton.toggleAll:active, 
.jewel.togglebutton.toggleAll:active:focus {
+       border: 1px solid transparent;
+}
+.jewel.togglebutton.toggleAll:focus {
+       border: 1px solid transparent;
+}
+.jewel.togglebutton.toggleAll.selected {
+       border: 1px solid transparent;
+}
+.jewel.togglebutton.toggleAll .fonticon {
+       color: #e6e6e6;
+}
+.jewel.togglebutton.toggleAll.selected .fonticon {
+       color: #737373;
+}
+
+/* TextInput */
+.jewel.textinput.new-todo input {
+       padding: 16px 16px 16px 60px !important;
+       border-radius: 0px;
+       border: none;
+       
+       background: rgba(0, 0, 0, 0.003);
+       box-shadow: inset 0 -2px 1px rgba(0,0,0,0.03);
+
+       font-size: 24px;
+       font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+       font-weight: 300;
+       font-stretch: normal;
+       font-style: normal;
+       font-variant-caps: normal;
+       font-weight: 300;
+       line-height: 1.4em;
+       border: 0;
+       color: rgb(77, 77, 77);
+       -webkit-font-smoothing: antialiased;
+       -moz-osx-font-smoothing: grayscale;
+}
+
+.jewel.textinput.new-todo input:focus {
+       border: none;
+}
+.jewel.textinput.new-todo input::placeholder, .jewel.textinput.new-todo 
input:-ms-input-placeholder {
+       color:rgb(230, 230, 230);
+       font-style: italic;
+}
+
+.jewel.item .jewel.textinput {
+       margin-left: 46px;
+}
+.jewel.textinput input {
+       background: none;
+       border-radius: 0px;
+       font-weight: 300;
+       padding: 12px;
+       font-size: 24px;
+       font-family: inherit;
+       font-weight: 300;
+       line-height: 1.4em;
+       height: auto;
+       outline: 0;
+       color: inherit;
+       border: 1px solid #999;
+       box-shadow: inset 0 -1px 5px 0 rgba(0,0,0,.2);
+       -webkit-font-smoothing: antialiased;
+       -moz-font-smoothing: antialiased;
+}
+.jewel.textinput input:focus {
+       border: 1px solid darkgrey;
+}
+
+/* List */
+.todo-list {
+       IItemRenderer: 
ClassReference("jewel.todomvc.renderers.TodoItemRenderer");
+}
+
+.jewel.list {
+       border-radius: 0px;
+       border: none;
+       background: none;
+}
+
+/* ItemRenderer */
+.jewel.item {
+       padding: 0px;
+       min-height: 60px;
+}
+
+.todo-list li {
+       position: relative;
+       font-size: 24px;
+       border-bottom: 1px solid #ededed;
+}
+
+.todo-list li:last-child {
+       border-bottom: none;
+}
+
+.todo-list li.editing {
+       border-bottom: none;
+       padding: 0;
+}
+
+/* CheckBox */
+.jewel.checkbox {
+       margin: 8px;
+}
+
+.jewel.checkbox input + span::before {
+       background: url("data:image/svg+xml,%3Csvg viewBox='0 -18 100 135' 
xmlns='http://www.w3.org/2000/svg' width='40' height='40'%3E%3Ccircle cx='50' 
cy='50' r='50' fill='none' stroke='%23ededed' stroke-width='3'/%3E%3C/svg%3E") 
no-repeat center center;
+       border: none;
+       border-radius: 50%;
+}
+.jewel.checkbox input + span::after {
+       background: url("data:image/svg+xml,%3Csvg viewBox='0 -18 100 135' 
xmlns='http://www.w3.org/2000/svg' width='40' height='40'%3E%3Ccircle cx='50' 
cy='50' r='50' fill='none' stroke='%23bddad5' stroke-width='3'/%3E%3Cpath 
fill='%235dc2af' d='M72 25L42 71 27 56l-4 4 20 20 34-52z'/%3E%3C/svg%3E") 
no-repeat center center;
+       border: none;
+       transition: none;
+       transform: none;
+}
+.jewel.checkbox input:checked + span::after, .jewel.checkbox 
input:checked:active + span::after {
+       transform: none;
+}
+.jewel.checkbox input:focus + span::before, .jewel.checkbox 
input:checked:focus + span::before, .jewel.checkbox input:checked:active:focus 
+ span::before {
+       background: none;
+       border: none;
+       border-radius: 50%;
+}
+.jewel.checkbox span {
+       padding-left: 3px;
+       font-size: 16px;
+}
+
+.completed {
+       color: #d9d9d9;
+       text-decoration: line-through;
+}
+
+/* ItemRenderer destroy button */
+.destroy {
+       color: #af5b5e !important;
+}
+
+/* Footer */
+.footer {
+       color: #777;
+       padding: 10px 15px;
+       text-align: center;
+       border-top: 1px solid #e6e6e6;
+}
+
+.footer:before {
+       content: '';
+       position: absolute;
+       right: 0;
+       bottom: 0;
+       left: 0;
+       height: 50px;
+       overflow: hidden;
+       box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2),
+                   0 8px 0 -3px #f6f6f6,
+                   0 9px 1px -3px rgba(0, 0, 0, 0.2),
+                   0 16px 0 -6px #f6f6f6,
+                   0 17px 2px -6px rgba(0, 0, 0, 0.2);
+}
+
+/* BarRow */
+.jewel.barrow {
+       height: unset;
+}
+
+/* Clear Completed Button */
+.jewel.button.clearCompleted {
+       text-decoration: underline;
+}
+
+/* Footer Info */
+.info {
+       text-align: center;
+       margin: 65px auto 0;
+       color: #bfbfbf;
+       font-size: 10px;
+       text-shadow: 0 1px 0 rgba(255, 255, 255, .5);
+}
+
+.info p {
+       line-height: 1;
+}
+
+.info a {
+       font-weight: 400;
+       color: inherit;
+       text-decoration: none;
+}
+
+.info a:hover {
+       text-decoration: underline;
+}
\ No newline at end of file
diff --git a/examples/crux/todomvc/src/main/royale/App.mxml 
b/examples/crux/todomvc/src/main/royale/App.mxml
new file mode 100644
index 0000000..3d5aec4
--- /dev/null
+++ b/examples/crux/todomvc/src/main/royale/App.mxml
@@ -0,0 +1,83 @@
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<j:Application xmlns:fx="http://ns.adobe.com/mxml/2009";
+               xmlns:j="library://ns.apache.org/royale/jewel"
+               xmlns:js="library://ns.apache.org/royale/basic"
+               xmlns:crux="library://ns.apache.org/royale/crux"
+               xmlns:config="jewel.todomvc.config.*"
+               xmlns:views="jewel.todomvc.views.*"
+               initialize="setUp()">
+
+    <fx:Style source="../../main/resources/todomvc-styles.css"/>
+
+    <j:valuesImpl>
+        <js:SimpleCSSValuesImpl />
+    </j:valuesImpl>
+
+    <fx:Script>
+        <![CDATA[
+            import org.apache.royale.collections.ArrayList;
+            import org.apache.royale.reflection.registerClassAlias;
+
+            /**
+             *  Register ArrayCollection alias to map to ArrayList
+             */
+            public function setUp():void
+                       {
+                               
registerClassAlias("flex.messaging.io.ArrayCollection", ArrayList);
+                       }
+        ]]>
+    </fx:Script>
+
+    <j:beads>
+               <js:ClassAliasBead/>
+        <!-- support for simulated stage events in javascript (needed for Crux 
view processing)-->
+        <!-- packageExclusionFilter="_default_" avoids dispatching events for 
royale framework classes.
+             we can expect they will not have Crux metadata tags in any of 
them, so we would only avoid this
+             if we needed to use stage-like events for other reasons to 
emulate flash outside Crux...
+             -->
+        <crux:JSStageEvents packageExclusionFilter="_default_"/>
+        <!-- BeanProviders simply contain the non-display objects that Crux 
should process. -->
+        <crux:Crux>
+            <crux:beanProviders>
+                <config:Beans/>
+            </crux:beanProviders>
+
+            <crux:config>
+                <crux:CruxConfig>
+                    <crux:eventPackages>
+                        <fx:Array>
+                            <fx:String>jewel.todomvc.events.*</fx:String>
+                        </fx:Array>
+                    </crux:eventPackages>
+                    <crux:viewPackages>
+                        <fx:Array>
+                            <fx:String>jewel.todomvc.views.*</fx:String>
+                        </fx:Array>
+                    </crux:viewPackages>
+                </crux:CruxConfig>
+            </crux:config>
+        </crux:Crux>
+       </j:beads>
+
+    <j:initialView>
+        <views:TodoListSection/>
+    </j:initialView>
+     
+</j:Application>
diff --git 
a/examples/crux/todomvc/src/main/royale/jewel/todomvc/config/Beans.mxml 
b/examples/crux/todomvc/src/main/royale/jewel/todomvc/config/Beans.mxml
new file mode 100644
index 0000000..c46fd74
--- /dev/null
+++ b/examples/crux/todomvc/src/main/royale/jewel/todomvc/config/Beans.mxml
@@ -0,0 +1,28 @@
+<!--
+/*
+ * Copyright 2010 Swiz Framework Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy 
of
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations 
under
+ * the License.
+ */
+// Apache Royale Crux example based on 
https://github.com/swiz/swiz-examples/tree/master/SwizQuickStartExample-Flex4
+-->
+<crux:BeanProvider
+       xmlns:fx="http://ns.adobe.com/mxml/2009";
+       xmlns:crux="library://ns.apache.org/royale/crux"
+       xmlns:models="jewel.todomvc.models.*"
+       xmlns:controller="jewel.todomvc.controllers.*">
+       
+       <models:TodoModel id="todoModel"/>
+       <controller:TodoController id="todoController"/>
+       
+</crux:BeanProvider>
\ No newline at end of file
diff --git 
a/examples/crux/todomvc/src/main/royale/jewel/todomvc/controllers/TodoController.as
 
b/examples/crux/todomvc/src/main/royale/jewel/todomvc/controllers/TodoController.as
new file mode 100644
index 0000000..0422640
--- /dev/null
+++ 
b/examples/crux/todomvc/src/main/royale/jewel/todomvc/controllers/TodoController.as
@@ -0,0 +1,203 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package jewel.todomvc.controllers
+{
+       import jewel.todomvc.events.TodoEvent;
+       import jewel.todomvc.models.TodoModel;
+       import jewel.todomvc.vos.TodoVO;
+
+       import org.apache.royale.collections.ArrayList;
+       import org.apache.royale.core.IStrand;
+
+       /**
+     * The Todo Controller holds all the global actions. The views dispatch 
events that bubbles and
+        * this class register to these evens and updates the model, so views 
can update accordingly using
+        * binding most of the times.
+     */
+       public class TodoController
+       {
+        /**
+                *  Common todo model
+                */
+               //example of injection where name of source is different to 
local name
+               [Inject(source = "todoModel")]
+               public var model:TodoModel;
+
+               /**
+                *  [PostConstruct] methods are invoked after all dependencies 
are injected.
+                *  In this example, we set up a default user after the bean is 
created.
+                */
+               [PostConstruct]
+               public function setUp(value:IStrand):void {
+                       // retrieve local items and use it if exists
+                       model.allItems = new ArrayList(model.getItemStore());
+                       
+                       model.setUpFilteredCollections();
+                       model.listItems = model.allItems;
+
+                       updateInterface();
+        }
+               
+        /**
+         *  Add the todo item to the list, save data and refresh the list 
state 
+         */
+               [EventHandler(event="TodoEvent.ADD_TODO_ITEM", 
properties="todo")]
+        public function addTodoItem(todo:TodoVO):void {
+            model.allItems.addItem(todo);
+                       
+                       saveDataToLocal();
+                       updateInterface();
+        }
+        
+               /**
+         *  Mark all todo items as completed or uncompleted, save data and 
update the interface accordingly
+         */
+               [EventHandler(event="TodoEvent.TOGGLE_ALL_COMPLETE")]
+        public function toggleAllComplete(event:TodoEvent):void {
+                       model.toggleAllToCompletedState = 
!model.toggleAllToCompletedState;
+
+            var len:int = model.allItems.length;
+                       var item:TodoVO;
+                       for(var i:int = 0; i < len; i++) {
+                               item = TodoVO(model.allItems.getItemAt(i));
+                               item.done = model.toggleAllToCompletedState;
+                       }
+
+                       saveDataToLocal();
+                       updateInterface();
+        }
+
+               /**
+         *  Remove all completed todo items, save data and update footer and 
toggle all button visibility
+         */
+               [EventHandler(event="TodoEvent.REMOVE_COMPLETED")]
+        public function removeCompleted(event:TodoEvent):void {
+                       var l:uint = model.allItems.length;
+                       var item:TodoVO;
+                       while(l--) {
+                               item = TodoVO(model.allItems.getItemAt(l));
+                               if(item.done){
+                                       model.allItems.removeItem(item);
+                               }
+                       }
+
+                       saveDataToLocal();
+                       updateInterface();
+               }
+
+               /**
+         *  Refresh the todo list to the appropiate filter state (All, Active 
or Completed)
+         */
+               [EventHandler(event="TodoEvent.REFRESH_LIST", 
properties="label")]
+        public function refreshList(label:String):void
+               {
+                       if(model.filterState != label) {
+                               model.filterState = label;
+
+                               setListState();
+                       }
+               }
+
+               /**
+                *  When some todo item change state (done/undone), we must 
save data and update the interface accordingly
+                */
+               [EventHandler(event="TodoEvent.ITEM_STATE_CHANGED", 
properties="todo, completion")]
+        public function itemStateChangedHandler(todo:TodoVO, 
completion:String):void {
+                       todo.done = completion;
+                       model.allItems.itemUpdated(todo);
+
+                       saveDataToLocal();
+                       updateInterface();
+               }
+
+               /**
+                *  Commit the label changes to the item and save data
+                *  if label is empty, remove todo item
+                */
+               [EventHandler(event="TodoEvent.ITEM_LABEL_CHANGED", 
properties="todo, label")]
+        public function itemLabelChangedHandler(todo:TodoVO, 
label:String):void {
+                       if(label != ""){
+                               todo.label = label;
+                               model.allItems.itemUpdated(todo);
+                       }
+                       else {
+                               model.allItems.removeItem(todo);
+                       }
+
+                       saveDataToLocal();
+                       updateInterface();
+               }
+
+               /**
+                *  When the user click in the renderer destroy button we must 
remove the item, save data and update the interface
+                */
+               [EventHandler(event="TodoEvent.ITEM_REMOVED", 
properties="todo")]
+        public function itemRemovedHandler(todo:TodoVO):void {
+                       model.allItems.removeItem(todo);
+
+                       saveDataToLocal();
+            updateInterface();
+               }
+
+               /**
+         *  Saves the actual data to the local storage via Local SharedObject
+         */
+        protected function saveDataToLocal():void {
+                       try {
+                               model.setItemStore(model.allItems.source);
+                       } catch (error:Error) {
+                               trace("You need to be online to store locally");
+                       }
+               }
+
+               /**
+                *  Update the interface accordingly
+                */
+               protected function updateInterface():void {
+                       setListState();
+                       var item:String = model.activeItems.length == 1 ? " 
item " : " items ";
+                       model.itemsLeftLabel = model.activeItems.length + item 
+ "left";
+            model.clearCompletedVisibility = model.completedItems.length != 0;
+                       model.footerVisibility = model.allItems.length != 0;
+                       model.toogleAllVisibility = model.allItems.length != 0;
+                       model.toggleAllToCompletedState = 
model.activeItems.length == 0;
+        }
+
+               /**
+                *  Sets the new state filter and refresh list to match the 
filter
+                */
+        protected function setListState():void {
+                       // setting to the same collection must cause refreshed 
too
+                       model.listItems = null;
+
+                       model.activeItems.refresh();
+                       model.completedItems.refresh();
+
+                       if(model.filterState == TodoModel.ALL_FILTER) {
+                               model.listItems = model.allItems;
+                       } 
+                       else if(model.filterState == TodoModel.ACTIVE_FILTER) {
+                               model.listItems = model.activeItems;
+                       }
+                       else if(model.filterState == 
TodoModel.COMPLETED_FILTER) {
+                               model.listItems = model.completedItems;
+                       }
+               }
+       }
+}
diff --git 
a/examples/crux/todomvc/src/main/royale/jewel/todomvc/events/TodoEvent.as 
b/examples/crux/todomvc/src/main/royale/jewel/todomvc/events/TodoEvent.as
new file mode 100644
index 0000000..42f6b5e
--- /dev/null
+++ b/examples/crux/todomvc/src/main/royale/jewel/todomvc/events/TodoEvent.as
@@ -0,0 +1,72 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package jewel.todomvc.events
+{
+       import jewel.todomvc.vos.TodoVO;
+
+       import org.apache.royale.events.Event;
+
+       /**
+        * Todo Event
+        */
+       public class TodoEvent extends Event
+       {
+               /**
+                * Actions
+                */
+               public static const ADD_TODO_ITEM:String = "add_Todo_Item";
+               public static const TOGGLE_ALL_COMPLETE:String = 
"toggle_all_complete";
+               public static const REMOVE_COMPLETED:String = 
"remove_completed";
+               public static const REFRESH_LIST:String = "refresh_list";
+
+               public static const ITEM_STATE_CHANGED:String = 
"item_state_changed";
+               public static const ITEM_LABEL_CHANGED:String = 
"item_label_changed";
+               public static const ITEM_REMOVED:String = "item_removed";
+
+               /**
+                * The todo to pass between layers
+                */
+               public var todo:TodoVO;
+               
+               /**
+                * Use to send the filter state label or the changes in a todo 
item label
+                */
+               public var label:String;
+               
+               /**
+                * To send the state of the item (done/undone)
+                */
+               public var completion:Boolean;
+               
+               /**
+         * constructor
+                * 
+                * This is just a normal Royale event which will be dispatched 
from a view instance.
+                * The only thing to note is that we set 'bubbles' to true, so 
that the event will bubble
+                * up the 'display' list, allowing Crux to listen for your 
events.
+                */ 
+               public function TodoEvent(type:String, todo:TodoVO = null, 
label:String = null, completion:Boolean = false) {
+                       super(type, true);
+
+                       this.todo = todo;
+                       this.label = label;
+                       this.completion = completion
+               }
+       }
+}
\ No newline at end of file
diff --git 
a/examples/crux/todomvc/src/main/royale/jewel/todomvc/models/TodoModel.as 
b/examples/crux/todomvc/src/main/royale/jewel/todomvc/models/TodoModel.as
new file mode 100644
index 0000000..c3ba82f
--- /dev/null
+++ b/examples/crux/todomvc/src/main/royale/jewel/todomvc/models/TodoModel.as
@@ -0,0 +1,154 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package jewel.todomvc.models
+{
+       import jewel.todomvc.vos.TodoVO;
+
+       import org.apache.royale.collections.ArrayList;
+       import org.apache.royale.collections.ArrayListView;
+       import org.apache.royale.events.EventDispatcher;
+       import org.apache.royale.events.IEventDispatcher;
+       import org.apache.royale.storage.AMFStorage;
+
+       [Bindable]
+    /**
+     *  Todo Model stores global model variables that are updated by controller
+     *  and used in views to update visuals for the user
+     */
+       public class TodoModel
+       {
+        /**
+         * We have three todo list states: All, Active and Completed
+         */
+        public static const ALL_FILTER:String = "All";
+        public static const ACTIVE_FILTER:String = "Active";
+        public static const COMPLETED_FILTER:String = "Completed";
+        
+               /**
+                * The [Dispatcher] metadata tag instructs Crux to inject an 
event dispatcher.
+                * Event's dispatched via this dispatcher can trigger event 
mediators.
+                */ 
+        [Dispaqtcher]
+               public var dispatcher : IEventDispatcher;
+
+        /**
+         * Retrieves the array ot items
+         */
+        public function getItemStore():Array
+        {
+            var itemArr:Array = storage.data["items"] || [];
+            return itemArr;
+        }
+
+        /**
+         * Saves the array ot items
+         */
+        public function setItemStore(items:Array):void
+        {
+            storage.data["items"] = items;
+            storage.save();
+        }
+
+        /**
+         *  Local storage for the todo items
+         */
+        private var storage:AMFStorage = AMFStorage.getLocal("todomvc");
+
+        /**
+         * the list of items binded to the todo list component
+         */
+        public var listItems:Object;
+        
+        /**
+         * the real list with all items
+         */
+        public var allItems:ArrayList;
+
+        /**
+         * the filtered list with active items
+         */
+        public var activeItems:ArrayListView;
+        
+        /**
+         * the filtered list with completed items
+         */
+        public var completedItems:ArrayListView;
+
+        /**
+         *  Set up the filtered collections for later use
+         */
+        public function setUpFilteredCollections():void {
+            activeItems = filterItems(isActive);
+            completedItems = filterItems(isCompleted);
+        }
+        /**
+         *  Filter the items in the list creating an ArrayListView with the 
right filter function
+         */
+        public function filterItems(filterFunction:Function = 
null):ArrayListView {
+            var alv:ArrayListView = new ArrayListView(allItems);
+            alv.filterFunction = filterFunction;
+            alv.refresh();
+            return alv;
+        }
+
+        /**
+         * filterFunction for the ArrayListView to get active items
+         */
+        public function isActive(item:TodoVO):Boolean {
+            return item && item.done == false;
+        }
+
+        /**
+         * filterFunction for the ArrayListView to get completed items
+         */
+        public function isCompleted(item:TodoVO):Boolean {
+            return item && item.done == true;
+        }
+
+        /**
+         * Stores the current filter for the list
+         */
+        public var filterState:String = TodoModel.ALL_FILTER;
+
+        /**
+         * true, toggle all todo items to completed state, false to all 
uncompleted
+         */
+        public var toggleAllToCompletedState:Boolean = false;
+        
+        /**
+         * how many items left to do
+         */
+        public var itemsLeftLabel:String = "0 items left";
+        
+        /**
+         * footer bar visibility
+         */
+        public var footerVisibility:Boolean = false;
+
+        /**
+         * toggle all button visibility
+         */
+        public var toogleAllVisibility:Boolean = false;
+
+        /**
+         * clear completed button visibility
+         */
+        public var clearCompletedVisibility:Boolean = false;
+       }
+}
diff --git 
a/examples/crux/todomvc/src/main/royale/jewel/todomvc/renderers/TodoItemRenderer.mxml
 
b/examples/crux/todomvc/src/main/royale/jewel/todomvc/renderers/TodoItemRenderer.mxml
new file mode 100644
index 0000000..89e3934
--- /dev/null
+++ 
b/examples/crux/todomvc/src/main/royale/jewel/todomvc/renderers/TodoItemRenderer.mxml
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+-->
+<j:ListItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"; 
+    xmlns:j="library://ns.apache.org/royale/jewel" 
+    xmlns:js="library://ns.apache.org/royale/basic"
+    hoverable="false" selectable="false" width="100%"
+    rollOver="rollOverHandler(event)"
+    rollOut="rollOutHandler(event)">
+
+    <fx:Script>
+        <![CDATA[
+                       import jewel.todomvc.events.TodoEvent;
+                       import jewel.todomvc.vos.TodoVO;
+
+                       import org.apache.royale.events.Event;
+                       import org.apache.royale.events.MouseEvent;
+
+            /**
+             *  Used to know if mouse is over this render in order to
+             *  show destroy button when exit editing state
+             */
+            private var mouseIsOverRenderer:Boolean = false;
+
+            /**
+             * the item used in bindnigs for this renderer
+             */
+            [Bindable("dataChange")]
+            public function get item():TodoVO {
+                return data as TodoVO;
+            }
+
+            /**
+             *  Change the item state between done/undone
+             */
+            public function changeItemState(event:Event):void {
+                dispatchEvent(new TodoEvent(TodoEvent.ITEM_STATE_CHANGED, 
item, null, event.target.selected));
+            }
+
+            /**
+             *  Destroy this todo item
+             */
+            public function removeItemClickHandler(event:Event):void {
+                COMPILE::JS
+                {
+                document.removeEventListener('click', commitLabelChanges, 
true);
+                }
+                dispatchEvent(new TodoEvent(TodoEvent.ITEM_REMOVED, item));
+            }
+
+            /**
+             *  commit changes to the todo item and exit 'editing' state
+             */
+            public function updateLabelAndExit(event:Event):void {
+                commitLabelChanges();
+            }
+
+            /**
+             *  Change renderer state to edit mode by double clicking in the 
todo item label
+             */
+            public function goToEditMode(event:Event):void
+            {
+                editfield.text = description.text;
+                currentState = "editing";
+                destroy_btn.visible = false;
+                editfield.setFocus();
+
+                COMPILE::JS
+                {
+                document.addEventListener('click', commitLabelChanges, true);
+                }
+            }
+
+            /**
+             *  remove document listener to stop listening click events. If 
user made changes to label, commit 
+             *  changes to the todo item and exit 'editing' state.
+             *  Make destroy button visible if mouse is over renderer.
+             */
+            public function commitLabelChanges():void {
+                COMPILE::JS
+                {
+                document.removeEventListener('click', commitLabelChanges, 
true);
+                }
+                if(item.label != editfield.text)
+                    dispatchEvent(new TodoEvent(TodoEvent.ITEM_LABEL_CHANGED, 
item, editfield.text));
+                currentState = 'normal';
+                if(mouseIsOverRenderer)
+                    destroy_btn.visible = true;
+            }
+
+            /**
+             *  Show destroy button when user rolls over the renderer
+             */
+            public function rollOverHandler(event:Event):void
+            {
+                mouseIsOverRenderer = true;
+                if(currentState == "normal")
+                    destroy_btn.visible = true;
+            }
+            
+            /**
+             *  Hide destroy button when user rolls out the renderer
+             */
+            public function rollOutHandler(event:Event):void
+            {
+                mouseIsOverRenderer = false;
+                if(currentState == "normal")
+                    destroy_btn.visible = false;
+            }
+               ]]>
+    </fx:Script>
+
+    <j:states>
+               <js:State name="normal"/>
+               <js:State name="editing"/>
+       </j:states>
+
+    <j:beads>
+        <js:SimpleStatesImpl/>
+        <js:ItemRendererDataBinding />
+    </j:beads>
+    
+    <j:CheckBox selected="{item ? item.done : false}"
+        visible.normal="true" visible.editing="false"
+        click="changeItemState(event);">
+        <j:beads>
+            <j:InputButtonSize width="40" height="40"/>
+        </j:beads>
+    </j:CheckBox>
+    
+    <j:Label localId="description" width="84%" 
+        text="{item ? item.label : ''}" multiline="true"
+        visible.normal="true" visible.editing="false"
+        className="{item ? (item.done ? 'todolabel completed' : 'todolabel') : 
'todolabel' }"
+        doubleClick="goToEditMode(event)"/>
+
+    <j:TextInput localId="editfield" width="100%"
+        visible.normal="false" visible.editing="true"
+        enter="updateLabelAndExit(event)"/>
+
+    <j:IconButton localId="destroy_btn" visible="false" className="destroy"
+        click="removeItemClickHandler(event)">
+        <j:icon>
+            <js:FontIcon text="{MaterialIconType.CLOSE}" material="true"/>
+        </j:icon>
+    </j:IconButton>
+
+</j:ListItemRenderer>
+
diff --git 
a/examples/crux/todomvc/src/main/royale/jewel/todomvc/views/TodoFooter.mxml 
b/examples/crux/todomvc/src/main/royale/jewel/todomvc/views/TodoFooter.mxml
new file mode 100644
index 0000000..64c2f56
--- /dev/null
+++ b/examples/crux/todomvc/src/main/royale/jewel/todomvc/views/TodoFooter.mxml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+-->
+<j:BarRow xmlns:fx="http://ns.adobe.com/mxml/2009";
+       xmlns:j="library://ns.apache.org/royale/jewel"
+       xmlns:js="library://ns.apache.org/royale/basic">
+
+    <fx:Script>
+        <![CDATA[
+            import jewel.todomvc.events.TodoEvent;
+            import jewel.todomvc.models.TodoModel;
+            
+            [Bindable]
+            [Inject]
+            public var todoModel:TodoModel;
+
+            /**
+             * Refresh list when change state
+             */
+            override public function set currentState(value:String):void {
+                super.currentState = value;
+                dispatchEvent(new TodoEvent(TodoEvent.REFRESH_LIST, null, 
value));
+            }
+
+            /**
+             *  All toggle buttons use this handler to navigate todo list
+             */
+            public function toggleButtonClickHandler(event:Event):void {
+                event.target.selected = true;
+                currentState = event.target.text;
+            }
+
+            /**
+             *  Remove all completed todo items and update clear complete 
visibility
+             */
+            public function removeCompleted():void {
+                dispatchEvent(new TodoEvent(TodoEvent.REMOVE_COMPLETED));
+                clearCompleted.visible = false;
+            }
+        ]]>
+    </fx:Script>
+
+    <j:states>
+        <js:State name="All"/>
+        <js:State name="Active"/>
+        <js:State name="Completed"/>
+    </j:states>
+    
+    <j:beads>
+        <js:SimpleStatesImpl/>
+        <js:ContainerDataBinding/>
+    </j:beads>
+
+    <j:BarSection width="15%">
+        <j:Label localId="itemsLeft" text="{todoModel.itemsLeftLabel}"/>
+    </j:BarSection>
+
+    <j:BarSection gap="3" itemsHorizontalAlign="itemsCenter">
+        <j:ToggleButton localId="all_btn" selected.All="true" 
selected.Active="false" selected.Completed="false" text="All" 
click="toggleButtonClickHandler(event)"/>
+        <j:ToggleButton localId="active_btn" selected.All="false" 
selected.Active="true" selected.Completed="false" text="Active" 
click="toggleButtonClickHandler(event)"/>
+        <j:ToggleButton localId="completed_btn" selected.All="false" 
selected.Active="false" selected.Completed="true" text="Completed" 
click="toggleButtonClickHandler(event)"/>
+    </j:BarSection>
+
+    <j:BarSection width="15%" gap="3" itemsHorizontalAlign="itemsRight">
+        <j:Button localId="clearCompleted" text="Clear Completed" 
className="clearCompleted"
+            visible="{todoModel.clearCompletedVisibility}" 
click="removeCompleted()"/>
+    </j:BarSection>
+
+</j:BarRow>
\ No newline at end of file
diff --git 
a/examples/crux/todomvc/src/main/royale/jewel/todomvc/views/TodoHeader.mxml 
b/examples/crux/todomvc/src/main/royale/jewel/todomvc/views/TodoHeader.mxml
new file mode 100644
index 0000000..ffbe8a0
--- /dev/null
+++ b/examples/crux/todomvc/src/main/royale/jewel/todomvc/views/TodoHeader.mxml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+-->
+<j:Group xmlns:fx="http://ns.adobe.com/mxml/2009";
+       xmlns:j="library://ns.apache.org/royale/jewel"
+       xmlns:js="library://ns.apache.org/royale/basic"
+       height="65">
+
+       <fx:Script>
+               <![CDATA[
+                       import jewel.todomvc.events.TodoEvent;
+                       import jewel.todomvc.models.TodoModel;
+                       import jewel.todomvc.vos.TodoVO;
+
+                       import org.apache.royale.events.Event;
+
+                       [Bindable]
+                       [Inject]
+                       public var todoModel:TodoModel;
+
+                       /**
+                        *  Signal todo item addition from main text box if 
text is not empty
+                        */
+                       private function addItem(event:Event):void {
+                               if(event.target.text == "") return;
+                               var newTodo:TodoVO = new 
TodoVO(event.target.text);
+                               dispatchEvent(new 
TodoEvent(TodoEvent.ADD_TODO_ITEM, newTodo));
+                               event.target.text = "";
+                       }
+
+                       /**
+                        *  Toggle all todo items complete or uncomplete
+                        */ 
+                       public function toggleAllComplete(event:Event):void {
+                               dispatchEvent(new 
TodoEvent(TodoEvent.TOGGLE_ALL_COMPLETE));
+                       }
+               ]]>
+       </fx:Script>
+
+       <j:beads>
+        <js:ContainerDataBinding/>
+    </j:beads>
+
+       <j:TextInput localId="need" width="100%" className="new-todo" 
+               enter="addItem(event)">
+               <j:beads>
+                       <j:TextPrompt prompt="What needs to be done?"/>
+               </j:beads>
+       </j:TextInput>
+
+       <j:ToggleButton localId="toogleAll" 
visible="{todoModel.toogleAllVisibility}"
+               width="50" height="61" className="toggleAll" 
selected="{todoModel.toggleAllToCompletedState}"
+               click="toggleAllComplete(event)">
+               <j:icon>
+                       <js:FontIcon 
text="{MaterialIconType.KEYBOARD_ARROW_DOWN}" material="true"/>
+               </j:icon>
+       </j:ToggleButton>
+
+</j:Group>
\ No newline at end of file
diff --git 
a/examples/crux/todomvc/src/main/royale/jewel/todomvc/views/TodoListSection.mxml
 
b/examples/crux/todomvc/src/main/royale/jewel/todomvc/views/TodoListSection.mxml
new file mode 100644
index 0000000..5a8d9e4
--- /dev/null
+++ 
b/examples/crux/todomvc/src/main/royale/jewel/todomvc/views/TodoListSection.mxml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+-->
+<j:View xmlns:fx="http://ns.adobe.com/mxml/2009";
+    xmlns:j="library://ns.apache.org/royale/jewel"
+    xmlns:js="library://ns.apache.org/royale/basic"
+    xmlns:html="library://ns.apache.org/royale/html"
+    xmlns:views="jewel.todomvc.views.*">
+
+    <fx:Script>
+        <![CDATA[
+            import jewel.todomvc.models.TodoModel;
+            
+            [Bindable]
+            [Inject]
+                       public var todoModel:TodoModel;
+
+            /**
+             *  Provide the appropiate browser window title
+             */
+            private function getTitleLookup():Object {
+                var retVal:Object = {};
+                var states:Array = [
+                    TodoModel.ALL_FILTER,
+                    TodoModel.ACTIVE_FILTER,
+                    TodoModel.COMPLETED_FILTER
+                ]
+                for(var i:int=0; i < states.length ; i++)
+                {
+                    retVal[states[i]] = "TodoMVC - " + states[i] + " State";
+                }
+                return retVal;
+            }
+        ]]>
+    </fx:Script>
+
+    <j:beads>
+        <js:ContainerDataBinding/>
+        <js:Router>
+            <js:RouteToState component="{footer}"/>
+            <js:RouteTitleLookup lookup="{getTitleLookup()}"/>
+        </js:Router>
+    </j:beads>
+
+    <html:Section className="todoapp">
+        <html:H1 text="todos"/>
+        
+        <html:Header>
+            <views:TodoHeader localId="header"/>
+        </html:Header>
+        
+        <html:Section localId="main">
+            <j:List localId="todolist" width="100%"
+                labelField="label" className="todo-list" 
+                dataProvider="{todoModel.listItems}">
+                <j:beads>
+                    <j:AddListItemRendererForArrayListData/>
+                    <j:RemoveListItemRendererForArrayListData/>
+                    <j:UpdateListItemRendererForArrayListData/>
+                </j:beads>
+            </j:List>
+        </html:Section>
+        
+        <html:Footer className="footer" visible="{todoModel.footerVisibility}">
+            <views:TodoFooter localId="footer" currentState="All"/>
+        </html:Footer>
+    </html:Section>
+    
+    <html:Footer className="info">
+        <![CDATA[
+            <p>Double-click to edit a todo</p>
+            <p>
+                Created by
+                <a href="http://github.com/carlosrovira"; 
target="_blank">Carlos Rovira</a>
+                for
+                <a href="http://royale.apache.org"; target="_blank">Apache 
Royale</a>
+            </p>
+            <p>Inspired in <a href="http://todomvc.com"; 
target="_blank">TodoMVC</a></p>
+        ]]>
+    </html:Footer>
+</j:View>
\ No newline at end of file
diff --git a/examples/crux/todomvc/src/main/royale/jewel/todomvc/vos/TodoVO.as 
b/examples/crux/todomvc/src/main/royale/jewel/todomvc/vos/TodoVO.as
new file mode 100644
index 0000000..578be80
--- /dev/null
+++ b/examples/crux/todomvc/src/main/royale/jewel/todomvc/vos/TodoVO.as
@@ -0,0 +1,65 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package jewel.todomvc.vos
+{
+    [Bindable]
+    [RemoteClass(alias="jewel.todomvc.vos.TodoVO")]
+    /**
+     *  The todo item definition with a label for description an completion 
state
+     *  The remote class is used to save and retrieve from amf local storage 
(AMFStorage)
+     */
+    public class TodoVO
+    {
+        /**
+         * label description todo
+         */
+        public var label:String;
+
+        /**
+         *  completion state (done/undone)
+         */
+        public var done:Boolean;
+        
+        /**
+         *  constructor
+         */
+        public function TodoVO(label:String)
+        {
+            this.label = label;
+        }
+        
+        /**
+         * The following two methods could be used if we were saving and 
reading the data as JSON,
+         * but we're actually saving and reading as AMF, that knows how to 
encode/decode itself, 
+         * so they are not necessary, so we left commented for reference.
+         */
+        // public function toJSON():Object{
+        //     return {
+        //         "label":label,
+        //         "done":done
+        //     }
+        // }
+        // public static function fromJSON(data:Object):TodoVO
+        // {
+        //     var todo:TodoVO = new TodoVO(data["label"]);
+        //     todo.done = data["done"];
+        //     return todo;
+        // }
+    }
+}
diff --git a/examples/crux/todomvc/todomvc.as3proj 
b/examples/crux/todomvc/todomvc.as3proj
new file mode 100644
index 0000000..1d61005
--- /dev/null
+++ b/examples/crux/todomvc/todomvc.as3proj
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project>
+  <output>
+    <movie fps="60"/>
+    <movie height="600"/>
+    <movie disabled="False"/>
+    <movie background="#FFFFFF"/>
+    <movie path="bin-debug/todomvc.swf"/>
+    <movie width="800"/>
+    <movie platform="Flash Player"/>
+    <movie version="11"/>
+    <movie input=""/>
+  </output>
+  &lt;!-- Other classes to be compiled into your SWF --&gt;
+  <jsOutput>
+    <option path=""/>
+  </jsOutput>
+  <classpaths>
+    <class path="src/main/royale"/>
+  </classpaths>
+  <moonshineResourcePaths></moonshineResourcePaths>
+  <moonshineNativeExtensionPaths></moonshineNativeExtensionPaths>
+  <build>
+    <option es="False"/>
+    <option verboseStackTraces="False"/>
+    <option customSDK=""/>
+    <option loadConfig=""/>
+    <option 
additional="-theme=${royalelib}/themes/JewelTheme/src/main/resources/defaults.css
 -html-template=src/main/resources/crux-jewel-example-index-template.html 
+configname=flex"/>
+    <option optimize="False"/>
+    <option staticLinkRSL="False"/>
+    <option antBuildPath="build/build.xml"/>
+    <option showActionScriptWarnings="True"/>
+    <option compilerConstants=""/>
+    <option locale=""/>
+    <option linkReport=""/>
+    <option showDeprecationWarnings="True"/>
+    <option showUnusedTypeSelectorWarnings="True"/>
+    <option showBindingWarnings="True"/>
+    <option strict="True"/>
+    <option accessible="False"/>
+    <option useNetwork="True"/>
+    <option allowSourcePathOverlap="False"/>
+    <option useResourceBundleMetadata="True"/>
+    <option benchmark="False"/>
+    <option warnings="True"/>
+  </build>
+  <mavenBuild>
+    <option mavenBuildPath=""/>
+    <option settingsFilePath=""/>
+    <option commandLine=""/>
+    <actions>
+      <action action="install" actionName="Build"/>
+      <action action="clean package" actionName="Clean and package"/>
+      <action action="clean" actionName="Clean"/>
+      <action action="clean install" actionName="Clean and Build"/>
+      <action action="war:exploded" actionName="Exploded"/>
+    </actions>
+  </mavenBuild>
+  <includeLibraries></includeLibraries>
+  <libraryPaths></libraryPaths>
+  <externalLibraryPaths></externalLibraryPaths>
+  <rslPaths></rslPaths>
+  <intrinsics>
+    <element path="Library/AS3/frameworks/Flex4"/>
+    <element path="Library\AS3\frameworks\Flex4"/>
+  </intrinsics>
+  <library></library>
+  <compileTargets>
+    <compile path="src/main/royale/todomvc.mxml"/>
+  </compileTargets>
+  <hiddenPaths></hiddenPaths>
+  <preBuildCommand>null</preBuildCommand>
+  <postBuildCommand alwaysRun="False">null</postBuildCommand>
+  <trustSVNCertificate>False</trustSVNCertificate>
+  <options>
+    <option isPrimeFacesVisualEditor="False"/>
+    <option defaultBuildTargets=""/>
+    <option visualEditorExportPath=""/>
+    <option showHiddenPaths="False"/>
+    <option isRoyale="True"/>
+    <option testMovie=""/>
+    <option testMovieCommand=""/>
+    <option isExportedToExistingSource="False"/>
+  </options>
+  <moonshineRunCustomization>
+    <option customUrlToLaunch=""/>
+    <option deviceSimulator="null"/>
+    <option targetPlatform="2"/>
+    <option urlToLaunch=""/>
+    <option projectType="2"/>
+    <option launchMethod="Simulator"/>
+    <deviceSimulator>null</deviceSimulator>
+    <certAndroid>null</certAndroid>
+    <certIos>null</certIos>
+    <certIosProvisioning>null</certIosProvisioning>
+  </moonshineRunCustomization>
+</project>
\ No newline at end of file

Reply via email to