@@ -8,6 +8,8 @@ Elm.Native.Graphics.Input.make = function(elm) {
8 var Render = ElmRuntime.use(ElmRuntime.Render.Element);
8 var Render = ElmRuntime.use(ElmRuntime.Render.Element);
9 var newNode = ElmRuntime.use(ElmRuntime.Render.Utils).newElement;
9 var newNode = ElmRuntime.use(ElmRuntime.Render.Utils).newElement;
11+ var toCss = Elm.Native.Color.make(elm).toCss;
12+ var Text = Elm.Native.Text.make(elm);
11 var Signal = Elm.Signal.make(elm);
13 var Signal = Elm.Signal.make(elm);
12 var newElement = Elm.Graphics.Element.make(elm).newElement;
14 var newElement = Elm.Graphics.Element.make(elm).newElement;
13 var JS = Elm.Native.JavaScript.make(elm);
15 var JS = Elm.Native.JavaScript.make(elm);
@@ -78,7 +80,7 @@ Elm.Native.Graphics.Input.make = function(elm) {
79 function updateButton(node, oldModel, newModel) {
81 function updateButton(node, oldModel, newModel) {
80 node.elm_signal = newModel.signal;
82 node.elm_signal = newModel.signal;
81− node.elm_value = nemModel.value;
83+ node.elm_value = newModel.value;
82 var txt = newModel.text;
84 var txt = newModel.text;
83 if (oldModel.text !== txt) node.innerHTML = txt;
85 if (oldModel.text !== txt) node.innerHTML = txt;
@@ -215,19 +217,57 @@ Elm.Native.Graphics.Input.make = function(elm) {
220+ function updateIfNeeded(css, attribute, latestAttribute) {
221+ if (css[attribute] !== latestAttribute) {
222+ css[attribute] = latestAttribute;
225+ function cssDimensions(dimensions) {
226+ return dimensions.top + 'px ' +
227+ dimensions.right + 'px ' +
228+ dimensions.bottom + 'px ' +
229+ dimensions.left + 'px';
231+ function updateFieldStyle(css, style) {
232+ updateIfNeeded(css, 'padding', cssDimensions(style.padding));
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');
239+ var highlight = style.highlight;
240+ if (highlight.width === 0) {
241+ css.outline = 'none';
243+ updateIfNeeded(css, 'outline-width', highlight.width + 'px');
244+ updateIfNeeded(css, 'outline-color', toCss(highlight.color));
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));
252+ if (textStyle.height.ctor !== "Nothing") {
253+ updateIfNeeded(css, 'font-size', textStyle.height._0 + 'px');
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));
218 function renderField(model) {
262 function renderField(model) {
219 var field = newNode('input');
263 var field = newNode('input');
220− field.style.border = 'none';
264+ updateFieldStyle(field.style, model.style);
221− field.style.outline = 'none';
265+ field.style.borderStyle = 'solid';
222− field.style.backgroundColor = 'transparent';
223 field.style.pointerEvents = 'auto';
266 field.style.pointerEvents = 'auto';
225 field.type = model.type;
268 field.type = model.type;
226 field.placeholder = JS.fromString(model.placeHolder);
269 field.placeholder = JS.fromString(model.placeHolder);
227 field.value = JS.fromString(model.content.string);
270 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);
232 field.elm_signal = model.signal;
272 field.elm_signal = model.signal;
233 field.elm_handler = model.handler;
273 field.elm_handler = model.handler;
@@ -297,11 +337,20 @@ Elm.Native.Graphics.Input.make = function(elm) {
297 field.addEventListener('keypress', keyUpdate);
337 field.addEventListener('keypress', keyUpdate);
298 field.addEventListener('input', inputUpdate);
338 field.addEventListener('input', inputUpdate);
299 field.addEventListener('mousedown', mousedown);
339 field.addEventListener('mousedown', mousedown);
340+ field.addEventListener('focus', function() {
341+ field.elm_hasFocus = true;
343+ field.addEventListener('blur', function() {
344+ field.elm_hasFocus = false;
301 return field;
347 return field;
304 function updateField(field, oldModel, newModel) {
350 function updateField(field, oldModel, newModel) {
351+ if (oldModel.style !== newModel.style) {
352+ updateFieldStyle(field.style, newModel.style);
305 field.elm_signal = newModel.signal;
354 field.elm_signal = newModel.signal;
306 field.elm_handler = newModel.handler;
355 field.elm_handler = newModel.handler;
@@ -310,16 +359,24 @@ Elm.Native.Graphics.Input.make = function(elm) {
310 var value = JS.fromString(newModel.content.string);
359 var value = JS.fromString(newModel.content.string);
311 field.value = value;
360 field.value = value;
312 field.elm_old_value = value;
361 field.elm_old_value = value;
362+ if (field.elm_hasFocus) {
313− var selection = newModel.content.selection;
363+ var selection = newModel.content.selection;
314− var direction = selection.direction.ctor === 'Forward' ? 'forward' : 'backward';
364+ var direction = selection.direction.ctor === 'Forward' ? 'forward' : 'backward';
315− setRange(field, selection.start, selection.end, direction);
365+ setRange(field, selection.start, selection.end, direction);
318 function mkField(type) {
369 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;
320 return A3(newElement, 200, 30, {
375 return A3(newElement, 200, 30, {
321 ctor: 'Custom',
376 ctor: 'Custom',
322− type: type + 'Input',
377+ type: type + 'Field',
378+ adjustWidth: adjustWidth,
379+ adjustHeight: adjustHeight,
323 render: renderField,
380 render: renderField,
324 update: updateField,
381 update: updateField,
@@ -327,14 +384,14 @@ Elm.Native.Graphics.Input.make = function(elm) {
327 handler:handler,
384 handler:handler,
328 placeHolder:placeHolder,
385 placeHolder:placeHolder,
329 content:content,
386 content:content,
330 type:type
388 type:type
334− return F4(field);
392+ return F5(field);
338 function hoverable(signal, handler, elem) {
395 function hoverable(signal, handler, elem) {
339 function onHover(bool) {
396 function onHover(bool) {
340 elm.notify(signal.id, handler(bool));
397 elm.notify(signal.id, handler(bool));