@@ -8,6 +8,8 @@ Elm.Native.Graphics.Input.make = function(elm) {
88 var Render = ElmRuntime.use(ElmRuntime.Render.Element);
99 var newNode = ElmRuntime.use(ElmRuntime.Render.Utils).newElement;
1010
11+ var toCss = Elm.Native.Color.make(elm).toCss;
12+ var Text = Elm.Native.Text.make(elm);
1113 var Signal = Elm.Signal.make(elm);
1214 var newElement = Elm.Graphics.Element.make(elm).newElement;
1315 var JS = Elm.Native.JavaScript.make(elm);
@@ -78,7 +80,7 @@ Elm.Native.Graphics.Input.make = function(elm) {
7880
7981 function updateButton(node, oldModel, newModel) {
8082 node.elm_signal = newModel.signal;
81− node.elm_value = nemModel.value;
83+ node.elm_value = newModel.value;
8284 var txt = newModel.text;
8385 if (oldModel.text !== txt) node.innerHTML = txt;
8486 }
@@ -215,19 +217,57 @@ Elm.Native.Graphics.Input.make = function(elm) {
215217 }
216218 }
217219
220+ function updateIfNeeded(css, attribute, latestAttribute) {
221+ if (css[attribute] !== latestAttribute) {
222+ css[attribute] = latestAttribute;
223+ }
224+ }
225+ function cssDimensions(dimensions) {
226+ return dimensions.top + 'px ' +
227+ dimensions.right + 'px ' +
228+ dimensions.bottom + 'px ' +
229+ dimensions.left + 'px';
230+ }
231+ function updateFieldStyle(css, style) {
232+ updateIfNeeded(css, 'padding', cssDimensions(style.padding));
233+
234+ var outline = style.outline;
235+ updateIfNeeded(css, 'border-width', cssDimensions(outline.width));
236+ updateIfNeeded(css, 'border-color', toCss(outline.color));
237+ updateIfNeeded(css, 'border-radius', outline.radius + 'px');
238+
239+ var highlight = style.highlight;
240+ if (highlight.width === 0) {
241+ css.outline = 'none';
242+ } else {
243+ updateIfNeeded(css, 'outline-width', highlight.width + 'px');
244+ updateIfNeeded(css, 'outline-color', toCss(highlight.color));
245+ }
246+
247+ var textStyle = style.style;
248+ updateIfNeeded(css, 'color', toCss(textStyle.color));
249+ if (textStyle.typeface.ctor !== '[]') {
250+ updateIfNeeded(css, 'font-family', Text.toTypefaces(textStyle.typeface));
251+ }
252+ if (textStyle.height.ctor !== "Nothing") {
253+ updateIfNeeded(css, 'font-size', textStyle.height._0 + 'px');
254+ }
255+ updateIfNeeded(css, 'font-weight', textStyle.bold ? 'bold' : 'normal');
256+ updateIfNeeded(css, 'font-style', textStyle.italic ? 'italic' : 'normal');
257+ if (textStyle.line.ctor !== 'Nothing') {
258+ updateIfNeeded(css, 'text-decoration', Text.toLine(textStyle.line._0));
259+ }
260+ }
261+
218262 function renderField(model) {
219263 var field = newNode('input');
220− field.style.border = 'none';
221− field.style.outline = 'none';
222− field.style.backgroundColor = 'transparent';
264+ updateFieldStyle(field.style, model.style);
265+ field.style.borderStyle = 'solid';
223266 field.style.pointerEvents = 'auto';
224267
225268 field.type = model.type;
226269 field.placeholder = JS.fromString(model.placeHolder);
227270 field.value = JS.fromString(model.content.string);
228− var selection = model.content.selection;
229− var direction = selection.direction.ctor === 'Forward' ? 'forward' : 'backward';
230− setRange(field, selection.start, selection.end, direction);
231271
232272 field.elm_signal = model.signal;
233273 field.elm_handler = model.handler;
@@ -297,11 +337,20 @@ Elm.Native.Graphics.Input.make = function(elm) {
297337 field.addEventListener('keypress', keyUpdate);
298338 field.addEventListener('input', inputUpdate);
299339 field.addEventListener('mousedown', mousedown);
340+ field.addEventListener('focus', function() {
341+ field.elm_hasFocus = true;
342+ });
343+ field.addEventListener('blur', function() {
344+ field.elm_hasFocus = false;
345+ });
300346
301347 return field;
302348 }
303349
304350 function updateField(field, oldModel, newModel) {
351+ if (oldModel.style !== newModel.style) {
352+ updateFieldStyle(field.style, newModel.style);
353+ }
305354 field.elm_signal = newModel.signal;
306355 field.elm_handler = newModel.handler;
307356
@@ -310,16 +359,24 @@ Elm.Native.Graphics.Input.make = function(elm) {
310359 var value = JS.fromString(newModel.content.string);
311360 field.value = value;
312361 field.elm_old_value = value;
313− var selection = newModel.content.selection;
314− var direction = selection.direction.ctor === 'Forward' ? 'forward' : 'backward';
315− setRange(field, selection.start, selection.end, direction);
362+ if (field.elm_hasFocus) {
363+ var selection = newModel.content.selection;
364+ var direction = selection.direction.ctor === 'Forward' ? 'forward' : 'backward';
365+ setRange(field, selection.start, selection.end, direction);
366+ }
316367 }
317368
318369 function mkField(type) {
319− function field(signal, handler, placeHolder, content) {
370+ function field(signal, handler, style, placeHolder, content) {
371+ var padding = style.padding;
372+ var outline = style.outline.width;
373+ var adjustWidth = padding.left + padding.right + outline.left + outline.right;
374+ var adjustHeight = padding.top + padding.bottom + outline.top + outline.bottom;
320375 return A3(newElement, 200, 30, {
321376 ctor: 'Custom',
322− type: type + 'Input',
377+ type: type + 'Field',
378+ adjustWidth: adjustWidth,
379+ adjustHeight: adjustHeight,
323380 render: renderField,
324381 update: updateField,
325382 model: {
@@ -327,14 +384,14 @@ Elm.Native.Graphics.Input.make = function(elm) {
327384 handler:handler,
328385 placeHolder:placeHolder,
329386 content:content,
387+ style:style,
330388 type:type
331389 }
332390 });
333391 }
334− return F4(field);
392+ return F5(field);
335393 }
336394
337−
338395 function hoverable(signal, handler, elem) {
339396 function onHover(bool) {
340397 elm.notify(signal.id, handler(bool));