It turns out that what I tried to achieve is possible. To get it working you need to include the following in the HTML
<script src="packages/polymer/boot.js"></script>
then the following works
<polymer-element name="x-app">
<template>
<button on-click="increment">{{counter}}</button>
</template>
<script type="application/dart">
import 'package:polymer/polymer.dart';
@CustomTag('x-app')
class XApp extends PolymerElement with ObservableMixin {
@observable int counter = 0;
increment(event, detail, target) {
print("increment");
counter++;
Observable.dirtyCheck();
}
}
</script>
</polymer-element>
<x-app></x-app>
And best of all it works without the need for a build step (i.e. no more build.dart).