define(['dart_sdk'], function(dart_sdk) {
  'use strict';
  const core = dart_sdk.core;
  const html = dart_sdk.html;
  const math = dart_sdk.math;
  const dart = dart_sdk.dart;
  const dartx = dart_sdk.dartx;
  const _root = Object.create(null);
  const sunflower = Object.create(_root);
  const circle = Object.create(_root);
  const painter = Object.create(_root);
  const $getContext = dartx.getContext;
  const $addEventListener = dartx.addEventListener;
  const $text = dartx.text;
  const $arc = dartx.arc;
  const $fill = dartx.fill;
  let StringToElement = () => (StringToElement = dart.constFn(dart.fnType(html.Element, [core.String])))();
  let EventTovoid = () => (EventTovoid = dart.constFn(dart.fnType(dart.void, [html.Event])))();
  let VoidTovoid = () => (VoidTovoid = dart.constFn(dart.fnType(dart.void, [])))();
  dart.defineLazy(sunflower, {
    get SEED_RADIUS() {
      return 2;
    },
    get SCALE_FACTOR() {
      return 4;
    },
    get MAX_D() {
      return 300;
    },
    get centerX() {
      return 300 / 2;
    },
    get centerY() {
      return sunflower.centerX;
    }
  });
  sunflower.querySelector = function(selector) {
    return html.document.querySelector(selector);
  };
  dart.fn(sunflower.querySelector, StringToElement());
  dart.defineLazy(sunflower, {
    get canvas() {
      return html.CanvasElement.as(sunflower.querySelector("#canvas"));
    },
    get context() {
      return html.CanvasRenderingContext2D.as(sunflower.canvas[$getContext]('2d'));
    },
    get slider() {
      return html.InputElement.as(sunflower.querySelector("#slider"));
    },
    get notes() {
      return sunflower.querySelector("#notes");
    },
    get PHI() {
      return (math.sqrt(5) + 1) / 2;
    },
    get seeds() {
      return 0;
    },
    set seeds(_) {}
  });
  sunflower.main = function() {
    sunflower.slider[$addEventListener]('change', dart.fn(e => sunflower.draw(), EventTovoid()));
    sunflower.draw();
  };
  dart.fn(sunflower.main, VoidTovoid());
  sunflower.draw = function() {
    sunflower.seeds = core.int.parse(sunflower.slider.value);
    sunflower.context.clearRect(0, 0, 300, 300);
    for (let i = 0; i < dart.notNull(sunflower.seeds); i++) {
      let theta = i * painter.TAU / dart.notNull(sunflower.PHI);
      let r = math.sqrt(i) * 4;
      let x = sunflower.centerX + r * math.cos(theta);
      let y = sunflower.centerY - r * math.sin(theta);
      new sunflower.SunflowerSeed.new(x, y, 2).draw(sunflower.context);
    }
    sunflower.notes[$text] = dart.str`${sunflower.seeds} seeds`;
  };
  dart.fn(sunflower.draw, VoidTovoid());
  circle.Circle = class Circle extends core.Object {
    get x() {
      return this[x$];
    }
    set x(value) {
      super.x = value;
    }
    get y() {
      return this[y$];
    }
    set y(value) {
      super.y = value;
    }
    get radius() {
      return this[radius$];
    }
    set radius(value) {
      super.radius = value;
    }
  };
  (circle.Circle.new = function(x, y, radius) {
    this[x$] = x;
    this[y$] = y;
    this[radius$] = radius;
  }).prototype = circle.Circle.prototype;
  dart.addTypeTests(circle.Circle);
  const x$ = Symbol("Circle.x");
  const y$ = Symbol("Circle.y");
  const radius$ = Symbol("Circle.radius");
  dart.setFieldSignature(circle.Circle, () => ({
    __proto__: dart.getFields(circle.Circle.__proto__),
    x: dart.finalFieldType(core.num),
    y: dart.finalFieldType(core.num),
    radius: dart.finalFieldType(core.num)
  }));
  painter.CirclePainter = class CirclePainter extends core.Object {
    get color() {
      return this[color];
    }
    set color(value) {
      this[color] = value;
    }
    draw(context) {
      context.beginPath();
      context.lineWidth = 2;
      context.fillStyle = this.color;
      context.strokeStyle = this.color;
      context[$arc](this.x, this.y, this.radius, 0, painter.TAU, false);
      context[$fill]();
      context.closePath();
      context.stroke();
    }
  };
  (painter.CirclePainter.new = function() {
    this[color] = "orange";
  }).prototype = painter.CirclePainter.prototype;
  dart.addTypeTests(painter.CirclePainter);
  const color = Symbol("CirclePainter.color");
  painter.CirclePainter[dart.implements] = () => [circle.Circle];
  dart.setMethodSignature(painter.CirclePainter, () => ({
    __proto__: dart.getMethods(painter.CirclePainter.__proto__),
    draw: dart.fnType(dart.void, [html.CanvasRenderingContext2D])
  }));
  dart.setFieldSignature(painter.CirclePainter, () => ({
    __proto__: dart.getFields(painter.CirclePainter.__proto__),
    color: dart.fieldType(core.String)
  }));
  sunflower.SunflowerSeed = class SunflowerSeed extends dart.mixin(circle.Circle, painter.CirclePainter) {};
  (sunflower.SunflowerSeed.new = function(x, y, radius, color) {
    if (color === void 0) color = null;
    sunflower.SunflowerSeed.__proto__.new.call(this, x, y, radius);
    if (color != null) this.color = color;
  }).prototype = sunflower.SunflowerSeed.prototype;
  dart.addTypeTests(sunflower.SunflowerSeed);
  dart.defineLazy(painter, {
    get ORANGE() {
      return "orange";
    },
    get RED() {
      return "red";
    },
    get BLUE() {
      return "blue";
    },
    get TAU() {
      return math.PI * 2;
    }
  });
  painter.querySelector = function(selector) {
    return html.document.querySelector(selector);
  };
  dart.fn(painter.querySelector, StringToElement());
  dart.defineLazy(painter, {
    get canvas() {
      return html.CanvasElement.as(painter.querySelector("#canvas"));
    },
    get context() {
      return html.CanvasRenderingContext2D.as(painter.canvas[$getContext]('2d'));
    }
  });
  dart.trackLibraries("sunflower", {
    "sunflower.dart": sunflower,
    "circle.dart": circle,
    "painter.dart": painter
  }, null);
  // Exports:
  return {
    sunflower: sunflower,
    circle: circle,
    painter: painter
  };
});

//# sourceMappingURL=sunflower.js.map
