Make the stock app demo list view prettier

This CL makes the list view in the stocks app more consistent with the material
spec by using a colored circle instead of color-coding the percentage change.

R=eseidel@chromium.org

Review URL: https://codereview.chromium.org/932103004
This commit is contained in:
Adam Barth 2015-02-24 15:41:35 -08:00
parent 8462f94f22
commit b4385bcebe
2 changed files with 112 additions and 46 deletions

View File

@ -0,0 +1,98 @@
<!--
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-->
<import src="/sky/framework/sky-element.sky" />
<sky-element attributes="change:number">
<template>
<style>
:host {
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 40px;
border: 1px solid transparent;
}
#arrow {
width: 0;
height: 0;
border-left: 9px solid transparent;
border-right: 9px solid transparent;
}
.up {
margin-bottom: 3px;
border-bottom: 9px solid white;
}
.down {
margin-top: 3px;
border-top: 9px solid white;
}
</style>
<div id="arrow" />
</template>
<script>
import "dart:sky";
import "dart:math";
final List<String> _kRedColors = [
'#E57373',
'#EF5350',
'#F44336',
'#E53935',
'#D32F2F',
'#C62828',
'#B71C1C',
];
final List<String> _kGreenColors = [
'#81C784',
'#66BB6A',
'#4CAF50',
'#43A047',
'#388E3C',
'#2E7D32',
'#1B5E20',
];
int _colorIndexForPercentChange(double percentChange) {
// Currently the max is 10%.
double maxPercent = 10.0;
return max(0, ((percentChange.abs() / maxPercent) * _kGreenColors.length).floor());
}
String _colorForPercentChange(double percentChange) {
if (percentChange > 0)
return _kGreenColors[_colorIndexForPercentChange(percentChange)];
return _kRedColors[_colorIndexForPercentChange(percentChange)];
}
@Tagname('stock-arrow')
class StockArrow extends SkyElement {
Element _arrow;
void _updateArrow(double percentChange) {
String border = _colorForPercentChange(percentChange).toString();
String type = percentChange > 0 ? 'bottom' : 'top';
_arrow.style['border-$type-color'] = border;
style['border-color'] = border;
_arrow.setAttribute('class', percentChange > 0 ? 'up' : 'down');
}
void shadowRootReady() {
_arrow = shadowRoot.getElementById('arrow');
_updateArrow(change);
}
void changeChanged(double oldValue, double newValue) {
if (_arrow != null)
_updateArrow(newValue);
}
}
_init(script) => register(script, StockArrow);
</script>
</sky-element>

View File

@ -4,6 +4,7 @@
// found in the LICENSE file. // found in the LICENSE file.
--> -->
<import src="/sky/framework/sky-element.sky" /> <import src="/sky/framework/sky-element.sky" />
<import src="stock-arrow.sky" />
<sky-element> <sky-element>
<template> <template>
@ -13,71 +14,36 @@
// height: 48px; // height: 48px;
max-height: 48px; max-height: 48px;
display: flex; display: flex;
align-items: center;
border-bottom: 1px solid #F4F4F4; border-bottom: 1px solid #F4F4F4;
padding-top: 16px; padding-top: 16px;
padding-left: 16px; padding-left: 16px;
padding-right: 16px; padding-right: 16px;
padding-bottom: 20px; padding-bottom: 20px;
} }
stock-arrow {
margin-right: 16px;
}
#ticker { #ticker {
flex-grow: 1; flex: 1;
font-family: 'Roboto Medium', 'Helvetica';
} }
#last-sale { #last-sale {
padding-right: 20px; text-align: right;
padding-right: 16px;
} }
#change { #change {
border-radius: 5px; color: #8A8A8A;
min-width: 72px;
padding: 2px;
padding-right: 10px;
text-align: right; text-align: right;
} }
</style> </style>
<stock-arrow id="arrow" />
<div id="ticker" /> <div id="ticker" />
<div id="last-sale" /> <div id="last-sale" />
<div id="change" /> <div id="change" />
</template> </template>
<script> <script>
import "dart:sky"; import "dart:sky";
import "dart:math";
List<String> redColors = [
'#FFEBEE',
'#FFCDD2',
'#EF9A9A',
'#E57373',
'#EF5350',
'#F44336',
'#E53935',
'#D32F2F',
'#C62828',
'#B71C1C',
];
List<String> greenColors = [
'#E8F5E9',
'#C8E6C9',
'#A5D6A7',
'#81C784',
'#66BB6A',
'#4CAF50',
'#43A047',
'#388E3C',
'#2E7D32',
'#1B5E20',
];
int colorIndexForPercentChange(double percentChange) {
// Currently the max is 10%.
double maxPercent = 10.0;
return max(0, ((percentChange.abs() / maxPercent) * greenColors.length).floor());
}
String colorForPercentChange(double percentChange) {
if (percentChange > 0)
return greenColors[colorIndexForPercentChange(percentChange)];
return redColors[colorIndexForPercentChange(percentChange)];
}
@Tagname('stock') @Tagname('stock')
class Stock extends SkyElement { class Stock extends SkyElement {
@ -94,7 +60,9 @@ class Stock extends SkyElement {
if (model.percentChange > 0) if (model.percentChange > 0)
changeString = "+" + changeString; changeString = "+" + changeString;
change.textContent = changeString; change.textContent = changeString;
change.style['background-color'] = colorForPercentChange(model.percentChange);
StockArrow arrow = shadowRoot.getElementById('arrow');
arrow.change = model.percentChange;
} }
} }