Commit e90d0ec8 authored by Collin Jackson's avatar Collin Jackson

Merge remote-tracking branch 'upstream/master' into baseline5

Conflicts:
	sky/sdk/lib/rendering/flex.dart
parents 8bf1f86a 8e68805a
Contributing Getting started with Sky
============ ========================
This SDK is generated from the Sky apps are written in Dart. To get started, we need to set up Dart SDK:
[Sky repository](https://github.com/domokit/sky_engine) using
[deploy_sdk.py](https://github.com/domokit/sky_engine/blob/master/sky/tools/deploy_sdk.py).
Static files (including this README.md) are located under
[sky/sdk](https://github.com/domokit/sky_engine/tree/master/sky/sdk).
Pull - Install the [Dart SDK](https://www.dartlang.org/downloads/).
requests and issue reports are gladly accepted at the - Ensure that `$DART_SDK` is set to the path of your Dart SDK and that the
[Sky repository](https://github.com/domokit/sky_engine)! `dart` and `pub` executables are on your `$PATH`.
Sky Once you have installed Dart SDK, create a new directory and add a
=== [pubspec.yaml](https://www.dartlang.org/tools/pub/pubspec.html):
Sky is an experimental, high-performance UI framework for mobile apps. Sky helps
you create apps with beautiful user interfaces and high-quality interactive
design that run smoothly at 120 Hz.
Sky consists of two components:
1. *The Sky engine.* The engine is the core of the system. Written in C++, the
engine provides the muscle of the Sky system. The engine provides
several primitives, including a soft real-time scheduler and a hierarchical,
retained-mode graphics system, that let you build high-quality apps.
2. *The Sky framework.* The [framework](packages/sky/lib/framework) makes it
easy to build apps using Sky by providing familiar user interface widgets,
such as buttons, infinite lists, and animations, on top of the engine using
Dart. These extensible components follow a functional programming style
inspired by [React](http://facebook.github.io/react/).
We're still iterating on Sky heavily, which means the framework and underlying
engine are both likely to change in incompatible ways several times, but if
you're interested in trying out the system, this document can help you get
started.
Examples
--------
Sky uses Dart and Sky applications are
[Dart Packages](https://www.dartlang.org/docs/tutorials/shared-pkgs/).
Application creation starts by creating a new directory and
adding a [pubspec.yaml](https://www.dartlang.org/tools/pub/pubspec.html):
pubspec.yaml for your app:
```yaml ```yaml
name: your_app_name name: your_app_name
dependencies: dependencies:
sky: any sky: any
``` ```
Once the pubspec is in place, create a `lib` directory (where your dart code Next, create a `lib` directory (which is where your Dart code will go) and use
will go), ensure that the 'dart' and 'pub' executables are on your $PATH and the `pub` tool to fetch the Sky package and its dependencies:
run the following:
`pub get && pub run sky:init`. - `mkdir lib`
- `pub get && pub run sky:init`
Currently the Sky Engine assumes the entry point for your application is a Sky assumes the entry point for your application is a `main` function in
`main` function in a Dart file inside your package: `lib/main.dart`:
```dart ```dart
import 'package:sky/widgets/basic.dart'; import 'package:sky/widgets/basic.dart';
class HelloWorldApp extends App { class HelloWorldApp extends App {
Widget build() { Widget build() {
return new Text('Hello, world!'); return new Center(child: new Text('Hello, world!'));
} }
} }
...@@ -74,67 +39,27 @@ void main() { ...@@ -74,67 +39,27 @@ void main() {
} }
``` ```
Execution starts in `main`, which instructs the framework to run a new Execution starts in `main`, which runs a new instance of the `HelloWorldApp`.
instance of the `HelloWorldApp`. The framework then calls the `build()` The `HelloWorldApp` builds a `Text` widget containing the famous `Hello, world!`
function on `HelloWorldApp` to create a tree of widgets, some of which might string and centers it on the screen using a `Center` widget. To learn more about
be other `Components`, which in turn have `build()` functions that generate the widget system, please see the [widgets tutorial](lib/widgets/README.md).
more widgets iteratively to create the widget hierarchy.
Later, if a `Component` changes state, the framework calls that component's
`build()` function again to create a new widget tree. The framework diffs the
new widget tree against the old widget tree and any differences are applyed
to the underlying render tree.
* To learn more about the widget system, please see the
[widgets tutorial](lib/widgets/README.md).
* To learn how to run Sky on your device, please see the
[Running a Sky application](#running-a-sky-application) section in this
document.
* To dive into examples, please see the [examples directory](example/).
Services
--------
Sky apps can access services from the host operating system using Mojo IPC. For
example, you can access the network using the `network_service.mojom` interface.
Although you can use these low-level interfaces directly, you might prefer to
access these services via libraries in the framework. For example, the
`fetch.dart` library wraps the underlying `network_service.mojom` in an
ergonomic interface:
```dart
import 'package:sky/mojo/net/fetch.dart';
main() async {
Response response = await fetchBody('example.txt');
print(response.bodyAsString());
}
```
Set up your computer
--------------------
1. Install the Dart SDK:
- https://www.dartlang.org/tools/download.html
2. Install the `adb` tool from the Android SDK: Setup your Android device
- https://developer.android.com/sdk/installing/index.html -------------------------
3. Ensure that `$DART_SDK` is set to the path of your Dart SDK and `adb`
(inside `platform-tools` in the android sdk) is in your `$PATH`.
Set up your device
------------------
Currently Sky requires an Android device running the Lollipop (or newer) version Currently Sky requires an Android device running the Lollipop (or newer) version
of the Android operating system. of the Android operating system.
1. Enable developer mode on your device by visiting `Settings > About phone` - Install the `adb` tool from the [Android SDK](https://developer.android.com/sdk/installing/index.html)
and ensure that `adb` (inside `platform-tools` in the Android SDK) is in your
`$PATH`.
- Enable developer mode on your device by visiting `Settings > About phone`
and tapping the `Build number` field five times. and tapping the `Build number` field five times.
2. Enable `USB debugging` in `Settings > Developer options`. - Enable `USB debugging` in `Settings > Developer options`.
3. Using a USB cable, plug your phone into your computer. If prompted on your - Using a USB cable, plug your phone into your computer. If prompted on your
device, authorize your computer to access your device. device, authorize your computer to access your device.
Running a Sky application Running a Sky application
...@@ -142,73 +67,32 @@ Running a Sky application ...@@ -142,73 +67,32 @@ Running a Sky application
The `sky` pub package includes a `sky_tool` script to assist in running The `sky` pub package includes a `sky_tool` script to assist in running
Sky applications inside the `SkyDemo.apk` harness. The `sky_tool` script Sky applications inside the `SkyDemo.apk` harness. The `sky_tool` script
expects to be run from the root directory of your application pub package. To expects to be run from the root directory of your application's package (i.e.,
run one of the examples in this SDK, try: the same directory that contains the `pubspec.yaml` file). To run your app,
follow these instructions:
1. `cd example/stocks` - `./packages/sky/sky_tool start` to start the dev server and upload your
2. `pub get` to set up a copy of the sky package in the app directory.
3. `./packages/sky/sky_tool start` to start the dev server and upload your
app to the device. app to the device.
(NOTE: add a `--install` flag to install `SkyDemo.apk` if it is not already (NOTE: add a `--install` flag to install `SkyDemo.apk` if it is not already
installed on the device.) installed on the device.)
4. Use `adb logcat` to view any errors or Dart `print()` output from the app. - Use `adb logcat` to view any errors or Dart `print()` output from the app.
`adb logcat -s sky` can be used to filter only adb messages from `adb logcat -s sky` can be used to filter only adb messages from
`SkyDemo.apk`. `SkyDemo.apk`.
Measuring Performance
---------------------
Sky has support for generating trace files compatible with
[Chrome's about:tracing](https://www.chromium.org/developers/how-tos/trace-event-profiling-tool).
`packages/sky/sky_tool start_tracing` and `packages/sky/sky_tool stop_tracing`
are the commands to use.
Due to https://github.com/domokit/mojo/issues/127 tracing currently
requires root access on the device.
Debugging Debugging
--------- ---------
Sky uses [Observatory](https://www.dartlang.org/tools/observatory/) for Sky uses [Observatory](https://www.dartlang.org/tools/observatory/) for
debugging and profiling. While running your Sky app using `sky_tool`, you can debugging and profiling. While running your Sky app using `sky_tool`, you can
access Observatory by navigating your web browser to http://localhost:8181/. access Observatory by navigating your web browser to
[http://localhost:8181/](http://localhost:8181/).
Building a standalone MyApp
--------------------------- Building a standalone APK
-------------------------
Although it is possible to bundle the Sky Engine in your own app (instead of
running your code inside SkyDemo.apk), right now doing so is difficult. Although it is possible to build a standalone APK containing your application,
doing so right now is difficult. If you're feeling brave, you can see how we
There is one example of doing so if you're feeling brave: build the `Stocks.apk` in [example/stocks](example/stocks). Eventually we plan
https://github.com/domokit/sky_engine/tree/master/sky/sdk/example/stocks to make this much easier and support platforms other than Android, but that work
still in progress.
Eventually we plan to make this much easier and support platforms other than
Android, but that work is yet in progress.
Adding Services to MyApp
------------------------
[Mojo IPC](https://github.com/domokit/mojo) is an inter-process-communication
system designed to provide cross-thread, cross-process, and language-agnostic
communication between applications. Sky uses Mojo IPC to make it possible
to write UI code in Dart and yet depend on networking code, etc. written in
another language. Services are replicable, meaning that Dart code
written to use the `network_service` remains portable to any platform
(iOS, Android, etc.) by simply providing a 'natively' written `network_service`.
Embedders of the Sky Engine and consumers of the Sky Framework can use this
same mechanism to expose not only existing services like the
[Keyboard](https://github.com/domokit/mojo/blob/master/mojo/services/keyboard/public/interfaces/keyboard.mojom)
service to allow Sky Framework Dart code to interface with the underlying
platform's Keyboard, but also to expose any additional non-Dart business logic
to Sky/Dart UI code.
As an example, [SkyApplication](https://github.com/domokit/sky_engine/blob/master/sky/shell/org/domokit/sky/shell/SkyApplication.java)
exposes a mojo `network_service` (required by Sky Engine C++ code)
[SkyDemoApplication](https://github.com/domokit/sky_engine/blob/master/sky/apk/demo/org/domokit/sky/demo/SkyDemoApplication.java)
additionally exposes `keyboard_service` and `sensor_service` for use by the Sky
Framework from Dart.
...@@ -20,7 +20,7 @@ void main() { ...@@ -20,7 +20,7 @@ void main() {
TextStyle style = const TextStyle(color: const Color(0xFF000000)); TextStyle style = const TextStyle(color: const Color(0xFF000000));
RenderParagraph paragraph = new RenderParagraph(new InlineStyle(style, [new InlineText("${alignItems}")])); RenderParagraph paragraph = new RenderParagraph(new InlineStyle(style, [new InlineText("${alignItems}")]));
table.add(new RenderPadding(child: paragraph, padding: new EdgeDims.only(top: 20.0))); table.add(new RenderPadding(child: paragraph, padding: new EdgeDims.only(top: 20.0)));
var row = new RenderFlex(alignItems: alignItems); var row = new RenderFlex(alignItems: alignItems, baseline: TextBaseline.alphabetic);
style = new TextStyle(fontSize: 15.0, color: const Color(0xFF000000)); style = new TextStyle(fontSize: 15.0, color: const Color(0xFF000000));
row.add(new RenderDecoratedBox( row.add(new RenderDecoratedBox(
...@@ -32,7 +32,7 @@ void main() { ...@@ -32,7 +32,7 @@ void main() {
decoration: new BoxDecoration(backgroundColor: const Color(0x7FCCFFCC)), decoration: new BoxDecoration(backgroundColor: const Color(0x7FCCFFCC)),
child: new RenderParagraph(new InlineStyle(style, [new InlineText('foo foo foo')])) child: new RenderParagraph(new InlineStyle(style, [new InlineText('foo foo foo')]))
)); ));
var subrow = new RenderFlex(alignItems: alignItems); var subrow = new RenderFlex(alignItems: alignItems, baseline: TextBaseline.alphabetic);
style = new TextStyle(fontSize: 25.0, color: const Color(0xFF000000)); style = new TextStyle(fontSize: 25.0, color: const Color(0xFF000000));
subrow.add(new RenderDecoratedBox( subrow.add(new RenderDecoratedBox(
decoration: new BoxDecoration(backgroundColor: const Color(0x7FCCCCFF)), decoration: new BoxDecoration(backgroundColor: const Color(0x7FCCCCFF)),
......
...@@ -6,6 +6,7 @@ import 'package:sky/painting/text_style.dart'; ...@@ -6,6 +6,7 @@ import 'package:sky/painting/text_style.dart';
import 'package:sky/rendering/box.dart'; import 'package:sky/rendering/box.dart';
import 'package:sky/widgets/ink_well.dart'; import 'package:sky/widgets/ink_well.dart';
import 'package:sky/widgets/basic.dart'; import 'package:sky/widgets/basic.dart';
import 'package:sky/widgets/default_text_style.dart';
import 'package:sky/widgets/theme.dart'; import 'package:sky/widgets/theme.dart';
import 'stock_arrow.dart'; import 'stock_arrow.dart';
...@@ -60,7 +61,11 @@ class StockRow extends Component { ...@@ -60,7 +61,11 @@ class StockRow extends Component {
margin: const EdgeDims.only(right: 5.0) margin: const EdgeDims.only(right: 5.0)
), ),
new Flexible( new Flexible(
child: new Flex(children, alignItems: FlexAlignItems.baseline) child: new Flex(
children,
alignItems: FlexAlignItems.baseline,
textBaseline: DefaultTextStyle.of(this).textBaseline
)
) )
]) ])
) )
......
...@@ -10,6 +10,8 @@ const bold = FontWeight.w700; ...@@ -10,6 +10,8 @@ const bold = FontWeight.w700;
enum TextAlign { left, right, center } enum TextAlign { left, right, center }
enum TextBaseline { alphabetic, ideographic }
enum TextDecoration { none, underline, overline, lineThrough } enum TextDecoration { none, underline, overline, lineThrough }
const underline = const <TextDecoration>[TextDecoration.underline]; const underline = const <TextDecoration>[TextDecoration.underline];
const overline = const <TextDecoration>[TextDecoration.overline]; const overline = const <TextDecoration>[TextDecoration.overline];
...@@ -24,6 +26,7 @@ class TextStyle { ...@@ -24,6 +26,7 @@ class TextStyle {
this.fontSize, this.fontSize,
this.fontWeight, this.fontWeight,
this.textAlign, this.textAlign,
this.textBaseline,
this.height, this.height,
this.decoration, this.decoration,
this.decorationColor, this.decorationColor,
...@@ -35,6 +38,7 @@ class TextStyle { ...@@ -35,6 +38,7 @@ class TextStyle {
final double fontSize; // in pixels final double fontSize; // in pixels
final FontWeight fontWeight; final FontWeight fontWeight;
final TextAlign textAlign; final TextAlign textAlign;
final TextBaseline textBaseline;
final double height; // multiple of fontSize final double height; // multiple of fontSize
final List<TextDecoration> decoration; // TODO(ianh): Switch this to a Set<> once Dart supports constant Sets final List<TextDecoration> decoration; // TODO(ianh): Switch this to a Set<> once Dart supports constant Sets
final Color decorationColor; final Color decorationColor;
...@@ -46,6 +50,7 @@ class TextStyle { ...@@ -46,6 +50,7 @@ class TextStyle {
double fontSize, double fontSize,
FontWeight fontWeight, FontWeight fontWeight,
TextAlign textAlign, TextAlign textAlign,
TextBaseline textBaseline,
double height, double height,
List<TextDecoration> decoration, List<TextDecoration> decoration,
Color decorationColor, Color decorationColor,
...@@ -57,6 +62,7 @@ class TextStyle { ...@@ -57,6 +62,7 @@ class TextStyle {
fontSize: fontSize != null ? fontSize : this.fontSize, fontSize: fontSize != null ? fontSize : this.fontSize,
fontWeight: fontWeight != null ? fontWeight : this.fontWeight, fontWeight: fontWeight != null ? fontWeight : this.fontWeight,
textAlign: textAlign != null ? textAlign : this.textAlign, textAlign: textAlign != null ? textAlign : this.textAlign,
textBaseline: textBaseline != null ? textBaseline : this.textBaseline,
height: height != null ? height : this.height, height: height != null ? height : this.height,
decoration: decoration != null ? decoration : this.decoration, decoration: decoration != null ? decoration : this.decoration,
decorationColor: decorationColor != null ? decorationColor : this.decorationColor, decorationColor: decorationColor != null ? decorationColor : this.decorationColor,
...@@ -71,6 +77,7 @@ class TextStyle { ...@@ -71,6 +77,7 @@ class TextStyle {
fontSize: other.fontSize, fontSize: other.fontSize,
fontWeight: other.fontWeight, fontWeight: other.fontWeight,
textAlign: other.textAlign, textAlign: other.textAlign,
textBaseline: other.textBaseline,
height: other.height, height: other.height,
decoration: other.decoration, decoration: other.decoration,
decorationColor: other.decorationColor, decorationColor: other.decorationColor,
...@@ -161,6 +168,7 @@ class TextStyle { ...@@ -161,6 +168,7 @@ class TextStyle {
fontSize == other.fontSize && fontSize == other.fontSize &&
fontWeight == other.fontWeight && fontWeight == other.fontWeight &&
textAlign == other.textAlign && textAlign == other.textAlign &&
textBaseline == other.textBaseline &&
decoration == other.decoration && decoration == other.decoration &&
decorationColor == other.decorationColor && decorationColor == other.decorationColor &&
decorationStyle == other.decorationStyle; decorationStyle == other.decorationStyle;
...@@ -174,6 +182,7 @@ class TextStyle { ...@@ -174,6 +182,7 @@ class TextStyle {
value = 37 * value + fontSize.hashCode; value = 37 * value + fontSize.hashCode;
value = 37 * value + fontWeight.hashCode; value = 37 * value + fontWeight.hashCode;
value = 37 * value + textAlign.hashCode; value = 37 * value + textAlign.hashCode;
value = 37 * value + textBaseline.hashCode;
value = 37 * value + decoration.hashCode; value = 37 * value + decoration.hashCode;
value = 37 * value + decorationColor.hashCode; value = 37 * value + decorationColor.hashCode;
value = 37 * value + decorationStyle.hashCode; value = 37 * value + decorationStyle.hashCode;
...@@ -193,6 +202,8 @@ class TextStyle { ...@@ -193,6 +202,8 @@ class TextStyle {
result.add('${prefix}fontWeight: $fontWeight'); result.add('${prefix}fontWeight: $fontWeight');
if (textAlign != null) if (textAlign != null)
result.add('${prefix}textAlign: $textAlign'); result.add('${prefix}textAlign: $textAlign');
if (textBaseline != null)
result.add('${prefix}textBaseline: $textBaseline');
if (decoration != null) if (decoration != null)
result.add('${prefix}decoration: $decoration'); result.add('${prefix}decoration: $decoration');
if (decorationColor != null) if (decorationColor != null)
......
...@@ -7,10 +7,12 @@ import 'dart:sky' as sky; ...@@ -7,10 +7,12 @@ import 'dart:sky' as sky;
import 'package:sky/base/debug.dart'; import 'package:sky/base/debug.dart';
import 'package:sky/painting/box_painter.dart'; import 'package:sky/painting/box_painter.dart';
import 'package:sky/painting/text_style.dart';
import 'package:sky/rendering/object.dart'; import 'package:sky/rendering/object.dart';
import 'package:vector_math/vector_math.dart'; import 'package:vector_math/vector_math.dart';
export 'package:sky/painting/box_painter.dart'; export 'package:sky/painting/box_painter.dart';
export 'package:sky/painting/text_style.dart' show TextBaseline;
// GENERIC BOX RENDERING // GENERIC BOX RENDERING
// Anything that has a concept of x, y, width, height is going to derive from this // Anything that has a concept of x, y, width, height is going to derive from this
...@@ -253,8 +255,6 @@ class BoxParentData extends ParentData { ...@@ -253,8 +255,6 @@ class BoxParentData extends ParentData {
String toString() => 'position=$position'; String toString() => 'position=$position';
} }
enum TextBaseline { alphabetic, ideographic }
abstract class RenderBox extends RenderObject { abstract class RenderBox extends RenderObject {
void setupParentData(RenderObject child) { void setupParentData(RenderObject child) {
......
...@@ -47,10 +47,12 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl ...@@ -47,10 +47,12 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
List<RenderBox> children, List<RenderBox> children,
FlexDirection direction: FlexDirection.horizontal, FlexDirection direction: FlexDirection.horizontal,
FlexJustifyContent justifyContent: FlexJustifyContent.start, FlexJustifyContent justifyContent: FlexJustifyContent.start,
FlexAlignItems alignItems: FlexAlignItems.center FlexAlignItems alignItems: FlexAlignItems.center,
TextBaseline textBaseline
}) : _direction = direction, }) : _direction = direction,
_justifyContent = justifyContent, _justifyContent = justifyContent,
_alignItems = alignItems { _alignItems = alignItems,
_textBaseline = textBaseline {
addAll(children); addAll(children);
} }
...@@ -81,6 +83,15 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl ...@@ -81,6 +83,15 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
} }
} }
TextBaseline _textBaseline;
TextBaseline get textBaseline => _textBaseline;
void set textBaseline (TextBaseline value) {
if (_textBaseline != value) {
_textBaseline = value;
markNeedsLayout();
}
}
// Set during layout if overflow occurred on the main axis // Set during layout if overflow occurred on the main axis
double _overflow; double _overflow;
...@@ -345,8 +356,8 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl ...@@ -345,8 +356,8 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
crossSize = math.max(crossSize, _getCrossSize(child)); crossSize = math.max(crossSize, _getCrossSize(child));
} }
if (alignItems == FlexAlignItems.baseline) { if (alignItems == FlexAlignItems.baseline) {
// TODO(jackson): Support for non-alphabetic baselines assert(textBaseline != null);
double distance = child.getDistanceToBaseline(TextBaseline.alphabetic, onlyReal: true); double distance = child.getDistanceToBaseline(textBaseline, onlyReal: true);
if (distance != null) if (distance != null)
maxBaselineDistance = math.max(maxBaselineDistance, distance); maxBaselineDistance = math.max(maxBaselineDistance, distance);
} }
...@@ -411,10 +422,9 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl ...@@ -411,10 +422,9 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin<RenderBox, Fl
break; break;
case FlexAlignItems.baseline: case FlexAlignItems.baseline:
childCrossPosition = 0.0; childCrossPosition = 0.0;
// TODO(jackson): Support for vertical baselines
if (_direction == FlexDirection.horizontal) { if (_direction == FlexDirection.horizontal) {
// TODO(jackson): Support for non-alphabetic baselines assert(textBaseline != null);
double distance = child.getDistanceToBaseline(TextBaseline.alphabetic, onlyReal: true); double distance = child.getDistanceToBaseline(textBaseline, onlyReal: true);
if (distance != null) if (distance != null)
childCrossPosition = maxBaselineDistance - distance; childCrossPosition = maxBaselineDistance - distance;
} }
......
...@@ -9,20 +9,21 @@ import 'dart:sky'; ...@@ -9,20 +9,21 @@ import 'dart:sky';
import 'package:sky/painting/text_style.dart'; import 'package:sky/painting/text_style.dart';
// TODO(eseidel): Font weights are supposed to be language relative! // TODO(eseidel): Font weights are supposed to be language relative!
// TODO(jackson): Baseline should be language relative!
// These values are for English-like text. // These values are for English-like text.
class TextTheme { class TextTheme {
TextTheme._(Color color54, Color color87) TextTheme._(Color color54, Color color87)
: display4 = new TextStyle(fontSize: 112.0, fontWeight: FontWeight.w100, color: color54), : display4 = new TextStyle(fontSize: 112.0, fontWeight: FontWeight.w100, color: color54, textBaseline: TextBaseline.alphabetic),
display3 = new TextStyle(fontSize: 56.0, fontWeight: FontWeight.w400, color: color54), display3 = new TextStyle(fontSize: 56.0, fontWeight: FontWeight.w400, color: color54, textBaseline: TextBaseline.alphabetic),
display2 = new TextStyle(fontSize: 45.0, fontWeight: FontWeight.w400, color: color54, height: 48.0 / 45.0), display2 = new TextStyle(fontSize: 45.0, fontWeight: FontWeight.w400, color: color54, height: 48.0 / 45.0, textBaseline: TextBaseline.alphabetic),
display1 = new TextStyle(fontSize: 34.0, fontWeight: FontWeight.w400, color: color54, height: 40.0 / 34.0), display1 = new TextStyle(fontSize: 34.0, fontWeight: FontWeight.w400, color: color54, height: 40.0 / 34.0, textBaseline: TextBaseline.alphabetic),
headline = new TextStyle(fontSize: 24.0, fontWeight: FontWeight.w400, color: color87, height: 32.0 / 24.0), headline = new TextStyle(fontSize: 24.0, fontWeight: FontWeight.w400, color: color87, height: 32.0 / 24.0, textBaseline: TextBaseline.alphabetic),
title = new TextStyle(fontSize: 20.0, fontWeight: FontWeight.w500, color: color87, height: 28.0 / 20.0), title = new TextStyle(fontSize: 20.0, fontWeight: FontWeight.w500, color: color87, height: 28.0 / 20.0, textBaseline: TextBaseline.alphabetic),
subhead = new TextStyle(fontSize: 16.0, fontWeight: FontWeight.w400, color: color87, height: 24.0 / 16.0), subhead = new TextStyle(fontSize: 16.0, fontWeight: FontWeight.w400, color: color87, height: 24.0 / 16.0, textBaseline: TextBaseline.alphabetic),
body2 = new TextStyle(fontSize: 14.0, fontWeight: FontWeight.w500, color: color87, height: 24.0 / 14.0), body2 = new TextStyle(fontSize: 14.0, fontWeight: FontWeight.w500, color: color87, height: 24.0 / 14.0, textBaseline: TextBaseline.alphabetic),
body1 = new TextStyle(fontSize: 14.0, fontWeight: FontWeight.w400, color: color87, height: 20.0 / 14.0), body1 = new TextStyle(fontSize: 14.0, fontWeight: FontWeight.w400, color: color87, height: 20.0 / 14.0, textBaseline: TextBaseline.alphabetic),
caption = new TextStyle(fontSize: 12.0, fontWeight: FontWeight.w400, color: color54), caption = new TextStyle(fontSize: 12.0, fontWeight: FontWeight.w400, color: color54, textBaseline: TextBaseline.alphabetic),
button = new TextStyle(fontSize: 14.0, fontWeight: FontWeight.w500, color: color87); button = new TextStyle(fontSize: 14.0, fontWeight: FontWeight.w500, color: color87, textBaseline: TextBaseline.alphabetic);
final TextStyle display4; final TextStyle display4;
final TextStyle display3; final TextStyle display3;
......
...@@ -12,14 +12,14 @@ in the underlying render tree to transition from one state to the next. ...@@ -12,14 +12,14 @@ in the underlying render tree to transition from one state to the next.
Hello World Hello World
----------- -----------
To build an application, create a subclass of App and instantiate it: To build an application, create a subclass of `App` and instantiate it:
```dart ```dart
import 'package:sky/widgets/basic.dart'; import 'package:sky/widgets/basic.dart';
class HelloWorldApp extends App { class HelloWorldApp extends App {
Widget build() { Widget build() {
return new Text('Hello, world!'); return new Center(child: new Text('Hello, world!'));
} }
} }
......
...@@ -401,12 +401,14 @@ class Flex extends MultiChildRenderObjectWrapper { ...@@ -401,12 +401,14 @@ class Flex extends MultiChildRenderObjectWrapper {
String key, String key,
this.direction: FlexDirection.horizontal, this.direction: FlexDirection.horizontal,
this.justifyContent: FlexJustifyContent.start, this.justifyContent: FlexJustifyContent.start,
this.alignItems: FlexAlignItems.center this.alignItems: FlexAlignItems.center,
this.textBaseline
}) : super(key: key, children: children); }) : super(key: key, children: children);
final FlexDirection direction; final FlexDirection direction;
final FlexJustifyContent justifyContent; final FlexJustifyContent justifyContent;
final FlexAlignItems alignItems; final FlexAlignItems alignItems;
final TextBaseline textBaseline;
RenderFlex createNode() => new RenderFlex(direction: this.direction); RenderFlex createNode() => new RenderFlex(direction: this.direction);
RenderFlex get root => super.root; RenderFlex get root => super.root;
...@@ -416,6 +418,7 @@ class Flex extends MultiChildRenderObjectWrapper { ...@@ -416,6 +418,7 @@ class Flex extends MultiChildRenderObjectWrapper {
root.direction = direction; root.direction = direction;
root.justifyContent = justifyContent; root.justifyContent = justifyContent;
root.alignItems = alignItems; root.alignItems = alignItems;
root.textBaseline = textBaseline;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment