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 0b3bc80  jewel-tabbar: add animation to tabbar buttons indicators 
using Google Material guidelines. Animation uses FLIP technique (First, Last, 
Invert, Play). This adds Web Animations API polifyll from a CDN as usual. 
Apache License 2.0 : 
https://github.com/web-animations/web-animations-js/blob/dev/COPYING
0b3bc80 is described below

commit 0b3bc8067c09c16ca534ba09ed5863f445ea8637
Author: Carlos Rovira <[email protected]>
AuthorDate: Fri Apr 19 23:21:53 2019 +0200

    jewel-tabbar: add animation to tabbar buttons indicators using Google 
Material guidelines. Animation uses FLIP technique (First, Last, Invert, Play).
    This adds Web Animations API polifyll from a CDN as usual. Apache License 
2.0 : https://github.com/web-animations/web-animations-js/blob/dev/COPYING
---
 .../projects/Jewel/src/main/resources/defaults.css |  8 +-
 .../projects/Jewel/src/main/royale/JewelClasses.as |  1 +
 .../main/royale/org/apache/royale/jewel/Alert.as   |  1 +
 .../apache/royale/jewel/beads/views/TabBarView.as  | 85 ++++++++++++++++++++++
 .../itemRenderers/TabBarButtonItemRenderer.as      | 40 +++++++---
 .../Jewel/src/main/sass/components/_tabbar.sass    | 10 +--
 6 files changed, 126 insertions(+), 19 deletions(-)

diff --git a/frameworks/projects/Jewel/src/main/resources/defaults.css 
b/frameworks/projects/Jewel/src/main/resources/defaults.css
index 876bc16..a36304e 100644
--- a/frameworks/projects/Jewel/src/main/resources/defaults.css
+++ b/frameworks/projects/Jewel/src/main/resources/defaults.css
@@ -3486,7 +3486,7 @@ j|Snackbar {
 }
 
 j|TabBar {
-  IBeadView: ClassReference("org.apache.royale.jewel.beads.views.ListView");
+  IBeadView: ClassReference("org.apache.royale.jewel.beads.views.TabBarView");
   IBeadController: 
ClassReference("org.apache.royale.jewel.beads.controllers.ListSingleSelectionMouseController");
   IBeadLayout: 
ClassReference("org.apache.royale.jewel.beads.layouts.NullLayout");
   IItemRendererClassFactory: 
ClassReference("org.apache.royale.core.ItemRendererClassFactory");
@@ -3508,6 +3508,7 @@ j|TabBar {
   text-transform: uppercase;
   text-decoration: none;
   z-index: 1;
+  overflow: initial;
 }
 .jewel.tabbarbutton .content {
   display: flex;
@@ -3526,14 +3527,13 @@ j|TabBar {
   pointer-events: none;
   z-index: 1;
 }
-.jewel.tabbarbutton .indicator .indicatorContent {
+.jewel.tabbarbutton .indicator > .indicatorContent {
   align-self: flex-end;
   width: 100%;
   transform-origin: left;
   opacity: 0;
-  transition: transform 0.25s ease;
 }
-.jewel.tabbarbutton.selected .indicator .indicatorContent {
+.jewel.tabbarbutton.selected .indicator > .indicatorContent {
   opacity: 1;
 }
 
diff --git a/frameworks/projects/Jewel/src/main/royale/JewelClasses.as 
b/frameworks/projects/Jewel/src/main/royale/JewelClasses.as
index 4899278..63a8393 100644
--- a/frameworks/projects/Jewel/src/main/royale/JewelClasses.as
+++ b/frameworks/projects/Jewel/src/main/royale/JewelClasses.as
@@ -66,6 +66,7 @@ package
         import org.apache.royale.jewel.beads.views.TitleBarView; TitleBarView;
         import org.apache.royale.jewel.beads.views.AlertTitleBarView; 
AlertTitleBarView;
         import org.apache.royale.jewel.beads.views.ListView; ListView;
+        import org.apache.royale.jewel.beads.views.TabBarView; TabBarView;
         import org.apache.royale.jewel.beads.views.DropDownListView; 
DropDownListView;
         import org.apache.royale.jewel.beads.views.DropDownListView; 
DropDownListView;
         import org.apache.royale.jewel.beads.views.DateChooserView; 
DateChooserView;
diff --git 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/Alert.as 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/Alert.as
index 940cdc8..fe363db 100644
--- a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/Alert.as
+++ b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/Alert.as
@@ -46,6 +46,7 @@ package org.apache.royale.jewel
         *  To ensure support across all modern browsers, we use use 
dialogPolyfill extern or creating your own.
         *  The required Dialog Polyfill lines are injected in the constructor
         * 
+        *  @viewbead
         *  @langversion 3.0
         *  @playerversion Flash 10.2
         *  @playerversion AIR 2.6
diff --git 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/TabBarView.as
 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/TabBarView.as
new file mode 100644
index 0000000..1d9f1ba
--- /dev/null
+++ 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/TabBarView.as
@@ -0,0 +1,85 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 org.apache.royale.jewel.beads.views
+{
+       COMPILE::JS
+       {
+       import org.apache.royale.events.Event;
+       import org.apache.royale.jewel.itemRenderers.TabBarButtonItemRenderer;
+       }
+
+       /**
+        *  The TabBarView class creates the visual elements of the 
org.apache.royale.jewel.TabBar
+        *  component.
+        *
+        *  @viewbead
+        *  @langversion 3.0
+        *  @playerversion Flash 10.2
+        *  @playerversion AIR 2.6
+        *  @productversion Royale 0.9.6
+        */
+       public class TabBarView extends ListView
+       {
+               /**
+                *  constructor.
+                *
+                *  <inject_html>
+         *  <script 
src="https://cdnjs.cloudflare.com/ajax/libs/web-animations/2.3.1/web-animations.min.js";></script>
+         *  </inject_html>
+                * 
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9.6
+                */
+               public function TabBarView()
+               {
+                       super();
+               }
+
+               /**
+                * @private
+                * @royaleignorecoercion 
org.apache.royale.core.StyledMXMLItemRenderer
+                */
+               COMPILE::JS
+               override protected function 
selectionChangeHandler(event:Event):void
+               {
+                       var prev_ir:TabBarButtonItemRenderer = 
dataGroup.getItemRendererAt(lastSelectedIndex) as TabBarButtonItemRenderer;
+                       var ir:TabBarButtonItemRenderer = 
dataGroup.getItemRendererAt(listModel.selectedIndex) as 
TabBarButtonItemRenderer;
+
+                       if(prev_ir) {
+                               prev_ir.selected = false;
+                               var lastRect:ClientRect = 
prev_ir.getBoundingBox;
+                               var currentRect:ClientRect = ir.getBoundingBox;
+                               var widthDiff:Number = lastRect.width / 
currentRect.width;
+                               if(isNaN(widthDiff))
+                                       widthDiff = 1;
+                               var positionDiff:Number = lastRect.left - 
currentRect.left;
+                               
+                               ir.selected = true;
+                               ir.animateIndicator(positionDiff, widthDiff, 
300, 'ease-in-out');                               
+                       } else
+                       {
+                               ir.selected = true;
+                       }
+                       
+                       lastSelectedIndex = listModel.selectedIndex;
+               }
+       }
+}
diff --git 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/itemRenderers/TabBarButtonItemRenderer.as
 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/itemRenderers/TabBarButtonItemRenderer.as
index cc778d9..0944b98 100644
--- 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/itemRenderers/TabBarButtonItemRenderer.as
+++ 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/itemRenderers/TabBarButtonItemRenderer.as
@@ -26,7 +26,6 @@ package org.apache.royale.jewel.itemRenderers
        import org.apache.royale.core.StyledMXMLItemRenderer;
        import org.apache.royale.events.Event;
        import org.apache.royale.jewel.supportClasses.INavigationRenderer;
-       import org.apache.royale.jewel.beads.controls.TextAlign;
        import org.apache.royale.jewel.supportClasses.util.getLabelFromData;
     
        /**
@@ -138,6 +137,12 @@ package org.apache.royale.jewel.itemRenderers
                        // }
                }
 
+               COMPILE::JS
+               private var indicator:HTMLSpanElement;
+               
+               COMPILE::JS
+               private var indicator_content:HTMLSpanElement;
+
         /**
          * @royaleignorecoercion org.apache.royale.core.WrappedHTMLElement
                 * @royaleignorecoercion HTMLSpanElement
@@ -153,7 +158,7 @@ package org.apache.royale.jewel.itemRenderers
                        indicator.className = "indicator";
                        positioner.appendChild(indicator);
                        
-                       var indicator_content:HTMLSpanElement = 
document.createElement('span') as HTMLSpanElement;
+                       indicator_content = document.createElement('span') as 
HTMLSpanElement;
                        indicator_content.className = "indicatorContent";
                        indicator.appendChild(indicator_content);
             
@@ -169,9 +174,31 @@ package org.apache.royale.jewel.itemRenderers
         }
 
                COMPILE::JS
-               private var indicator:HTMLSpanElement;
+               public function get getBoundingBox():ClientRect
+               {
+                       return indicator.getBoundingClientRect();
+               }
 
                COMPILE::JS
+               public function animateIndicator(positionDiff:Number, 
widthDiff:Number, duration:int, easingFunction:String):void
+               {
+                       indicator_content["animate"]([
+                                       { 
+                                               transform : "translateX(" + 
positionDiff + "px) scaleX(" + widthDiff + ")"
+                                       }, 
+                                       {
+                                               transform: "none"
+                                       }
+                               ], 
+                               {
+                                       duration: duration,
+                                       easing: easingFunction,
+                                       fill: 'both'
+                               }
+                       );
+               }
+               
+               COMPILE::JS
                private var _positioner:WrappedHTMLElement;
 
                COMPILE::JS
@@ -224,14 +251,7 @@ package org.apache.royale.jewel.itemRenderers
                toggleClass("hovered", hovered);
                        if(selectable) {
                toggleClass("selected", selected);
-                               
-                               // COMPILE::JS
-                               // {
-                               //      indicator.classList.toggle("selected", 
selected);
-                               // }
                        }
-
-                       
                }
        }
 }
diff --git a/frameworks/projects/Jewel/src/main/sass/components/_tabbar.sass 
b/frameworks/projects/Jewel/src/main/sass/components/_tabbar.sass
index c8fcb02..641c1fc 100644
--- a/frameworks/projects/Jewel/src/main/sass/components/_tabbar.sass
+++ b/frameworks/projects/Jewel/src/main/sass/components/_tabbar.sass
@@ -32,7 +32,7 @@ $tabbarbutton-margin-height: 48px
 
 
 j|TabBar
-    IBeadView: ClassReference("org.apache.royale.jewel.beads.views.ListView")
+    IBeadView: ClassReference("org.apache.royale.jewel.beads.views.TabBarView")
     IBeadController: 
ClassReference("org.apache.royale.jewel.beads.controllers.ListSingleSelectionMouseController")
     IBeadLayout: 
ClassReference("org.apache.royale.jewel.beads.layouts.NullLayout")
     IItemRendererClassFactory: 
ClassReference("org.apache.royale.core.ItemRendererClassFactory")
@@ -64,6 +64,7 @@ $tabbarbutton-padding: 0 24px !default
         text-decoration: none
 
         z-index: 1
+        overflow: initial
 
         .content
             display: flex
@@ -71,7 +72,6 @@ $tabbarbutton-padding: 0 24px !default
             align-items: center
             justify-content: center
 
-            // width: 100%
             height: inherit
 
         .indicator
@@ -84,16 +84,16 @@ $tabbarbutton-padding: 0 24px !default
             pointer-events: none
             z-index: 1
 
-            .indicatorContent
+            > .indicatorContent
                 align-self: flex-end
                 width: 100%
                 transform-origin: left
                 opacity: 0
-                transition: transform .25s ease //cubic-bezier(.4,0,.2,1)
+                // transition: transform .25s ease //cubic-bezier(.4,0,.2,1)
 
         &.selected
             .indicator
-                .indicatorContent
+                > .indicatorContent
                     opacity: 1
 
 j|TabBarButtonItemRenderer

Reply via email to