| Index: sky/examples/stocks-fn/lib/stock_app.dart | 
| diff --git a/sky/examples/stocks-fn/lib/stock_app.dart b/sky/examples/stocks-fn/lib/stock_app.dart | 
| index 6c6888c98502c18ccca9ea6dabdd6a2aa478a8fb..1e59d3fdcf45cd82d442dc977b2fc83d89bd5f40 100644 | 
| --- a/sky/examples/stocks-fn/lib/stock_app.dart | 
| +++ b/sky/examples/stocks-fn/lib/stock_app.dart | 
| @@ -7,6 +7,7 @@ import 'package:sky/framework/components/drawer.dart'; | 
| import 'package:sky/framework/components/drawer_header.dart'; | 
| import 'package:sky/framework/components/floating_action_button.dart'; | 
| import 'package:sky/framework/components/icon.dart'; | 
| +import 'package:sky/framework/components/icon_button.dart'; | 
| import 'package:sky/framework/components/input.dart'; | 
| import 'package:sky/framework/components/menu_divider.dart'; | 
| import 'package:sky/framework/components/menu_item.dart'; | 
| @@ -15,24 +16,23 @@ import 'package:sky/framework/components/scaffold.dart'; | 
| import 'package:sky/framework/debug/tracing.dart'; | 
| import 'package:sky/framework/fn.dart'; | 
| import 'package:sky/framework/theme/typography.dart' as typography; | 
| +import 'package:sky/framework/theme/colors.dart'; | 
| import 'stock_data.dart'; | 
| import 'stock_list.dart'; | 
| import 'stock_menu.dart'; | 
|  | 
| class StocksApp extends App { | 
| - | 
| DrawerController _drawerController = new DrawerController(); | 
| PopupMenuController _menuController; | 
|  | 
| -  static Style _iconStyle = new Style(''' | 
| -    padding: 8px;''' | 
| -  ); | 
| +  static final Style _actionBarStyle = new Style(''' | 
| +    background-color: ${Purple[500]};'''); | 
| + | 
| +  static final Style _searchBarStyle = new Style(''' | 
| +    background-color: ${Grey[50]};'''); | 
|  | 
| -  static Style _titleStyle = new Style(''' | 
| -    padding-left: 24px; | 
| -    flex: 1; | 
| -    ${typography.white.title};''' | 
| -  ); | 
| +  static final Style _titleStyle = new Style(''' | 
| +    ${typography.white.title};'''); | 
|  | 
| StockDataFetcher _stockDataFetcher; | 
| List<Stock> _stocks = []; | 
| @@ -48,16 +48,16 @@ class StocksApp extends App { | 
| }); | 
| } | 
|  | 
| -  void _handleSearchClick(_) { | 
| +  void _handleSearchBegin(_) { | 
| setState(() { | 
| -      _isSearching = !_isSearching; | 
| +      _isSearching = true; | 
| }); | 
| } | 
|  | 
| -  void _handleMenuClick(_) { | 
| +  void _handleSearchEnd(_) { | 
| setState(() { | 
| -      _menuController = new PopupMenuController(); | 
| -      _menuController.open(); | 
| +      _isSearching = false; | 
| +      _searchQuery = null; | 
| }); | 
| } | 
|  | 
| @@ -67,74 +67,75 @@ class StocksApp extends App { | 
| }); | 
| } | 
|  | 
| -  Node build() { | 
| -    var drawer = new Drawer( | 
| +  void _handleMenuClick(_) { | 
| +    setState(() { | 
| +      _menuController = new PopupMenuController(); | 
| +      _menuController.open(); | 
| +    }); | 
| +  } | 
| + | 
| +  Drawer buildDrawer() { | 
| +    return new Drawer( | 
| controller: _drawerController, | 
| level: 3, | 
| children: [ | 
| -        new DrawerHeader( | 
| -          children: [new Text('Stocks')] | 
| -        ), | 
| +        new DrawerHeader(children: [new Text('Stocks')]), | 
| new MenuItem( | 
| key: 'Inbox', | 
| icon: 'content/inbox', | 
| -          children: [new Text('Inbox')] | 
| -        ), | 
| -        new MenuDivider( | 
| -        ), | 
| +          children: [new Text('Inbox')]), | 
| +        new MenuDivider(), | 
| new MenuItem( | 
| key: 'Drafts', | 
| icon: 'content/drafts', | 
| -          children: [new Text('Drafts')] | 
| -        ), | 
| +          children: [new Text('Drafts')]), | 
| new MenuItem( | 
| key: 'Settings', | 
| icon: 'action/settings', | 
| -          children: [new Text('Settings')] | 
| -        ), | 
| +          children: [new Text('Settings')]), | 
| new MenuItem( | 
| key: 'Help & Feedback', | 
| icon: 'action/help', | 
| -          children: [new Text('Help & Feedback')] | 
| -        ) | 
| +          children: [new Text('Help & Feedback')]) | 
| ] | 
| ); | 
| +  } | 
|  | 
| -    Node title; | 
| -    if (_isSearching) { | 
| -      title = new Input(focused: true, placeholder: 'Search stocks', | 
| -          onChanged: _handleSearchQueryChanged); | 
| -    } else { | 
| -      title = new Text('Stocks'); | 
| -    } | 
| - | 
| -    var actionBar = new ActionBar( | 
| -      children: [ | 
| -        new EventTarget( | 
| -          new Icon(key: 'menu', style: _iconStyle, | 
| -              size: 24, | 
| -              type: 'navigation/menu_white'), | 
| -          onGestureTap: _drawerController.toggle | 
| -        ), | 
| -        new Container( | 
| +  Node buildActionBar() { | 
| +    return new StyleNode( | 
| +      new ActionBar( | 
| +        left: new IconButton( | 
| +          icon: 'navigation/menu_white', | 
| +          onGestureTap: _drawerController.toggle), | 
| +        center: new Container( | 
| style: _titleStyle, | 
| -          children: [title] | 
| -        ), | 
| -        new EventTarget( | 
| -          new Icon(key: 'search', style: _iconStyle, | 
| -              size: 24, | 
| -              type: 'action/search_white'), | 
| -          onGestureTap: _handleSearchClick | 
| -        ), | 
| -        new EventTarget( | 
| -          new Icon(key: 'more_white', style: _iconStyle, | 
| -              size: 24, | 
| -              type: 'navigation/more_vert_white'), | 
| -          onGestureTap: _handleMenuClick | 
| -        ) | 
| -      ] | 
| -    ); | 
| +          children: [new Text('Stocks')]), | 
| +        right: [ | 
| +          new IconButton( | 
| +            icon: 'action/search_white', | 
| +            onGestureTap: _handleSearchBegin), | 
| +          new IconButton( | 
| +            icon: 'navigation/more_vert_white', | 
| +            onGestureTap: _handleMenuClick) | 
| +        ]), | 
| +      _actionBarStyle); | 
| +  } | 
|  | 
| +  // TODO(abarth): Should we factor this into a SearchBar in the framework? | 
| +  Node buildSearchBar() { | 
| +    return new StyleNode( | 
| +      new ActionBar( | 
| +        left: new IconButton( | 
| +          icon: 'navigation/arrow_back_grey600', | 
| +          onGestureTap: _handleSearchEnd), | 
| +        center: new Input( | 
| +          focused: true, | 
| +          placeholder: 'Search stocks', | 
| +          onChanged: _handleSearchQueryChanged)), | 
| +      _searchBarStyle); | 
| +  } | 
| + | 
| +  Node build() { | 
| List<Node> overlays = []; | 
|  | 
| if (_menuController != null) { | 
| @@ -152,11 +153,11 @@ class StocksApp extends App { | 
| } | 
|  | 
| return new Scaffold( | 
| -      actionBar: actionBar, | 
| +      header: _isSearching ? buildSearchBar() : buildActionBar(), | 
| content: new Stocklist(stocks: _stocks, query: _searchQuery), | 
| fab: new FloatingActionButton( | 
| content: new Icon(type: 'content/add_white', size: 24), level: 3), | 
| -      drawer: drawer, | 
| +      drawer: buildDrawer(), | 
| overlays: overlays | 
| ); | 
| } | 
|  |