From 3039b74107be1274c8261b88173ab744b6e1c289 Mon Sep 17 00:00:00 2001 From: Saman Bemel-Benrud Date: Thu, 21 Mar 2013 17:02:22 -0400 Subject: [PATCH 1/6] big commit modal cleanup. --- css/app.css | 183 ++++++++++++++-------------------------- data/core.yaml | 1 + data/locales.js | 1 + js/id/ui/commit.js | 44 +++++----- js/id/ui/confirm.js | 10 +-- js/id/ui/modal.js | 8 +- js/id/ui/preset_grid.js | 6 +- js/id/ui/restore.js | 2 +- js/id/ui/success.js | 23 +++-- js/id/ui/tag_editor.js | 2 +- 10 files changed, 105 insertions(+), 175 deletions(-) diff --git a/css/app.css b/css/app.css index 57e7f2217..046bfbe71 100644 --- a/css/app.css +++ b/css/app.css @@ -70,12 +70,12 @@ h2:last-child, h4:last-child { margin-bottom: 0;} h3 { - font-size: 18px; + font-size: 16px; line-height: 1.3333; font-weight: bold; margin-bottom: 10px; text-overflow: ellipsis; - white-space: nowrap + white-space: nowrap; } h4 { @@ -134,6 +134,7 @@ a:hover { textarea { resize: vertical; + font:normal 12px/20px 'Helvetica Neue', Arial, sans-serif; } textarea, @@ -285,9 +286,6 @@ form.hide { } .pad1 {padding: 10px;} -.pad2 {padding: 20px;} -.margin1 {margin: 10px;} -.margin2 {margin: 20px;} .loading { background: url(../img/loader_bg.gif); @@ -443,12 +441,6 @@ button.save.has-count .count::before { border-right: 6px solid rgba(255,255,255,.5); } -button.close { - position: absolute; - top: 10px; - right: 10px; -} - button[disabled] { cursor:auto; background: rgba(255,255,255,.5); @@ -580,6 +572,37 @@ a.selected:hover .toggle.icon { background-position: -40px -180px;} border-radius: 0; } + +/* Header for modals / panes +------------------------------------------------------- */ + +.header { + border-bottom: 1px solid #ccc; + z-index: 2; + position: relative; +} + +.header h3 { + margin-bottom: 0; +} + +.modal > button, +.header button { + height: 100%; + border-radius: 0; + border-left: 1px solid #CCC; + width: 40px; + text-align: center; + overflow: hidden; + position: absolute; + right: 0; +} + +.modal > button { + height: 61px; + z-index: 3; +} + /* Inspector ------------------------------------------------------- */ @@ -616,24 +639,13 @@ a.selected:hover .toggle.icon { background-position: -40px -180px;} position: relative; } -.inspector-wrap .message { - height: 60px; - border-bottom: 1px solid #ccc; - z-index: 100; - position: relative; -} - -.inspector-wrap .message button { - height: 100%; - border-radius: 0; +.inspector-wrap .header button.preset-reset { border-right: 1px solid #CCC; - width: 60px; - text-align: center; - overflow: hidden; position: relative; + width: 60px; } -.inspector-wrap .message button > div { +.inspector-wrap .header button.preset-reset > div { height: 100%; padding: 20px 0; -webkit-transition: opacity 200ms; @@ -641,38 +653,26 @@ a.selected:hover .toggle.icon { background-position: -40px -180px;} transition: opacity 200ms; } -.inspector-wrap .message button .col12:last-child { +.inspector-wrap .header button.preset-reset .col12:last-child { position: absolute; width: 100%; padding: 20px 0; opacity: 0; } -.inspector-wrap .message button:hover .col12:first-child { +.inspector-wrap .header button:hover .col12:first-child { opacity: 0; } -.inspector-wrap .message button:hover .col12:last-child { +.inspector-wrap .header button:hover .col12:last-child { opacity: 1; } -.inspector-wrap .message button.line > div { +.inspector-wrap .header button.line > div { padding: 0; } -.inspector-wrap .message button.fr { - border-left: 1px solid #CCC; - width: 40px; -} - -.inspector-wrap .message h3 { - display: block; - font-size: 16px; - line-height: 20px; - overflow: hidden; -} - -.pane:last-child .message h3 { +.pane:last-child .header h3 { position: absolute; left: 60px; right: 40px; @@ -1635,11 +1635,9 @@ div.typeahead a:first-child { .modal { display: inline-block; position:absolute; - width: 50%; left: 0; right: 0; margin: auto; - max-width: 600px; top: 80px; z-index: 3; } @@ -1648,27 +1646,10 @@ div.typeahead a:first-child { margin-bottom: 10px; } -.modal .content { - margin-bottom: 40px; -} - .modal .description { text-align: center; } -.modal button.close-modal { - float:right; - position: absolute; - right:5px; - top:5px; - opacity: .5; -} - -.modal button.close-modal:hover { - background-color: transparent; - opacity: 1; -} - .shaded { z-index: 2; position: absolute; @@ -1676,6 +1657,7 @@ div.typeahead a:first-child { width: 100%; overflow: auto; } + .shaded:before { content:''; background:rgba(0,0,0,0.5); @@ -1685,29 +1667,7 @@ div.typeahead a:first-child { .modal-section { padding: 20px; -} - -.modal-section:first-child { - border-radius: 4px 4px 0 0; -} - -.modal-section:last-child { - border-radius: 0 0 4px 4px; -} - -.modal-section:only-of-type { - border-radius: 4px; -} - -.modal-section .buttons { - padding-top: 10px; - width: 100%; -} - -.modal-section img.wiki-image { - max-width: 100%; - max-height: 300px; - display: block; + border-bottom: 1px solid #CCC; } .modal-flash .content { @@ -1748,6 +1708,7 @@ div.typeahead a:first-child { .commit-modal .commit-info { margin-top: 10px; + padding-bottom: 20px; } .commit-modal .user-info img { @@ -1771,66 +1732,46 @@ div.typeahead a:first-child { .commit-modal .changeset-list { overflow: auto; border:1px solid #ccc; + border-radius: 4px; background:#fff; max-height: 160px; } +.commit-modal .warning-section .changeset-list { + border-radius: 4px 0 0 4px; +} + .commit-modal .warning-section .changeset-list button { float: right; + position: absolute; + right: 0; + top: 0; + bottom: 0; + border-radius: 0; + height: 100%; + width: 30px; } -.commit-section.modal-section { - padding-bottom: 0; -} - -.commit-section.modal-section:last-child { padding-bottom: 20px;} - .commit-modal .changeset-list li { position: relative; border-top:1px solid #ccc; padding:5px 10px; } -.modal-section { - padding: 20px; -} - -.modal-section img.wiki-image { - max-width: 100%; - max-height: 300px; - display: block; -} - -.modal-flash .content { - box-shadow: none; - border-radius: 4px; - background: #111; - color: #eee; -} - -.modal-flash .close-modal { - display:none; -} - .changeset-list li span.count { font-size:10px; color:#555; } .changeset-list li span.count:before { content: '('; } + .changeset-list li span.count:after { content: ')'; } .changeset-list li:first-child { border-top: 0;} -.commit-modal .changeset-comment { - height: 60px; - width:100%; - /* firefox uses monospace in textareas */ - font:normal 12px/20px 'Helvetica Neue', Arial, sans-serif; -} - /* Success ------------------------------------------------------- */ + a.success-action { display:inline-block; padding:10px; @@ -2094,10 +2035,10 @@ a.success-action { ------------------------------------------------------- */ @media only screen and (max-width: 840px) { - span.label {display: none;} + #bar span.label {display: none;} + #bar .icon.icon-pre-text { margin-right: 0px;} /* override hide for save button */ - .icon.icon-pre-text { margin-right: 0px;} - .save .label, .apply .label, .cancel .label { display: block;} + #bar .save .label { display: block;} } @media only screen and (max-height: 840px) { diff --git a/data/core.yaml b/data/core.yaml index ff65d5278..efe40d55f 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -114,6 +114,7 @@ en: commit: title: Save Changes description_placeholder: Brief description of your contributions + message_label: Commit message upload_explanation: "The changes you upload as {user} will be visible on all maps that use OpenStreetMap data." save: Save cancel: Cancel diff --git a/data/locales.js b/data/locales.js index 765fd3ae9..a7d467929 100644 --- a/data/locales.js +++ b/data/locales.js @@ -146,6 +146,7 @@ locale.en = { "commit": { "title": "Save Changes", "description_placeholder": "Brief description of your contributions", + "message_label": "Commit message", "upload_explanation": "The changes you upload as {user} will be visible on all maps that use OpenStreetMap data.", "save": "Save", "cancel": "Cancel", diff --git a/js/id/ui/commit.js b/js/id/ui/commit.js index efdc1c190..770bb67f3 100644 --- a/js/id/ui/commit.js +++ b/js/id/ui/commit.js @@ -28,22 +28,30 @@ iD.ui.Commit = function(context) { var changes = selection.datum(), connection = changes.connection, user = connection.user(), - header = selection.append('div').attr('class', 'header modal-section fillL'), + header = selection.append('div').attr('class', 'header modal-section'), body = selection.append('div').attr('class', 'body'); - header.append('h2') + header.append('h3') .text(t('commit.title')); + // Comment Section var commentSection = body.append('div') - .attr('class', 'modal-section fillD'); + .attr('class', 'modal-section preset-field'); - var commentField = commentSection.append('textarea') - .attr('class', 'changeset-comment') - .attr('placeholder', t('commit.description_placeholder')) - .property('value', context.storage('comment') || ''); + commentSection.append('h4') + .attr('for','input-commit-note') + .text(t('commit.message_label')); + + var commentField = commentSection + .append('textarea') + .attr('placeholder', t('commit.description_placeholder')) + .property('value', context.storage('comment') || ''); commentField.node().select(); + // Save Section + var saveSection = body.append('div').attr('class','modal-section cf'); + var userLink = d3.select(document.createElement('div')); if (user.image_url) { @@ -58,18 +66,14 @@ iD.ui.Commit = function(context) { .attr('href', connection.url() + '/user/' + user.display_name) .attr('target', '_blank'); - commentSection.append('p') + saveSection.append('p') .attr('class', 'commit-info') .html(t('commit.upload_explanation', {user: userLink.html()})); // Confirm / Cancel Buttons - var buttonWrap = commentSection.append('div') - .attr('class', 'buttons cf') - .append('div') - .attr('class', 'button-wrap joined col4'); - var saveButton = buttonWrap.append('button') - .attr('class', 'save action col6 button') + var saveButton = saveSection.append('button') + .attr('class', 'action col3 button') .on('click.save', function() { var comment = commentField.node().value; localStorage.comment = comment; @@ -82,21 +86,11 @@ iD.ui.Commit = function(context) { .attr('class', 'label') .text(t('commit.save')); - var cancelButton = buttonWrap.append('button') - .attr('class', 'cancel col6 button') - .on('click.cancel', function() { - event.cancel(); - }); - - cancelButton.append('span') - .attr('class', 'label') - .text(t('commit.cancel')); - var warnings = body.selectAll('div.warning-section') .data(iD.validate(changes, context.graph())) .enter() .append('div') - .attr('class', 'modal-section warning-section fillL'); + .attr('class', 'modal-section warning-section fillL2'); warnings.append('h3') .text(t('commit.warnings')); diff --git a/js/id/ui/confirm.js b/js/id/ui/confirm.js index 6851e739f..5ff8f72f8 100644 --- a/js/id/ui/confirm.js +++ b/js/id/ui/confirm.js @@ -5,7 +5,7 @@ iD.ui.confirm = function(selection) { .classed('modal-alert', true); var section = modal.select('.content') - .attr('class', 'modal-section fillD'); + .attr('class', 'modal-section'); var description = section.append('div') .attr('class', 'description'); @@ -17,13 +17,7 @@ iD.ui.confirm = function(selection) { .attr('class', 'col2 action centered') .on('click.confirm', function() { modal.remove(); - }); - - okbutton.append('span') - .attr('class', 'icon apply icon-pre-text'); - - okbutton.append('span') - .attr('class', 'label') + }) .text('Okay'); return modal; diff --git a/js/id/ui/modal.js b/js/id/ui/modal.js index 539c89de8..5da396a2b 100644 --- a/js/id/ui/modal.js +++ b/js/id/ui/modal.js @@ -21,13 +21,15 @@ iD.ui.modal = function(selection, blocking) { }); var modal = shaded.append('div') - .attr('class', 'modal'); + .attr('class', 'modal fillL col6'); modal.append('button') - .attr('class', 'icon remove') + .attr('class', 'close') .on('click', function() { if (!blocking) shaded.remove(); - }); + }) + .append('div') + .attr('class','icon close'); modal.append('div') .attr('class', 'content'); diff --git a/js/id/ui/preset_grid.js b/js/id/ui/preset_grid.js index 1ed641149..004de7510 100644 --- a/js/id/ui/preset_grid.js +++ b/js/id/ui/preset_grid.js @@ -12,7 +12,7 @@ iD.ui.PresetGrid = function(context, entity) { presets = context.presets().matchGeometry(entity, context.graph()); var messagewrap = selection.append('div') - .attr('class', 'message fillL'); + .attr('class', 'header fillL cf'); var message = messagewrap.append('h3') .attr('class', 'inspector-inner fl') @@ -20,13 +20,13 @@ iD.ui.PresetGrid = function(context, entity) { if (preset) { messagewrap.append('button') - .attr('class', 'tooltip-bottom preset-choose fr') + .attr('class', 'preset-choose') .on('click', event.choose) .append('span') .attr('class', 'icon forward'); } else { messagewrap.append('button') - .attr('class', 'tooltip-bottom preset-close fr') + .attr('class', 'close') .on('click', event.close) .append('span') .attr('class', 'icon close'); diff --git a/js/id/ui/restore.js b/js/id/ui/restore.js index 0c3d0a617..e5d272004 100644 --- a/js/id/ui/restore.js +++ b/js/id/ui/restore.js @@ -16,7 +16,7 @@ iD.ui.Restore = function(context) { .text(t('restore.description')); var buttonWrap = introModal.append('div') - .attr('class', 'modal-section fillD cf col12'); + .attr('class', 'modal-section cf col12'); var buttons = buttonWrap .append('div') diff --git a/js/id/ui/success.js b/js/id/ui/success.js index 4d4799ffd..fd3f14c0b 100644 --- a/js/id/ui/success.js +++ b/js/id/ui/success.js @@ -3,12 +3,10 @@ iD.ui.Success = function(connection) { function success(selection) { var changeset = selection.datum(), - header = selection.append('div').attr('class', 'header fillL modal-section'), + header = selection.append('div').attr('class', 'header modal-section'), body = selection.append('div').attr('class', 'body'); - var section = body.append('div').attr('class','modal-section fillD'); - - header.append('h2').text(t('just_edited')); + header.append('h3').text(t('just_edited')); var m = ''; if (changeset.comment) { @@ -18,7 +16,9 @@ iD.ui.Success = function(connection) { var message = (m || 'Edited OSM!') + connection.changesetUrl(changeset.id); - header.append('a') + var links = body.append('div').attr('class','modal-section'); + + links.append('a') .attr('href', function() { return connection.changesetUrl(changeset.id); }) @@ -26,7 +26,7 @@ iD.ui.Success = function(connection) { .attr('class', 'success-action') .text(t('view_on_osm')); - header.append('a') + links.append('a') .attr('target', '_blank') .attr('href', function() { return 'https://twitter.com/intent/tweet?source=webclient&text=' + @@ -35,17 +35,14 @@ iD.ui.Success = function(connection) { .attr('class', 'success-action') .text('Tweet'); - var buttonwrap = section.append('div') - .attr('class', 'buttons cf'); + var section = body.append('div').attr('class','modal-section cf'); - var okbutton = buttonwrap.append('button') + section.append('button') .attr('class', 'action col2') .on('click.save', function() { event.cancel(); - }); - - okbutton.append('span').attr('class','icon apply icon-pre-text'); - okbutton.append('span').attr('class','label').text('Okay'); + }) + .append('span').attr('class','label').text('Okay'); } return d3.rebind(success, event, 'on'); diff --git a/js/id/ui/tag_editor.js b/js/id/ui/tag_editor.js index 79ebedf9b..a97cb3afe 100644 --- a/js/id/ui/tag_editor.js +++ b/js/id/ui/tag_editor.js @@ -27,7 +27,7 @@ iD.ui.TagEditor = function(context, entity) { selection.html(''); var messagewrap = selection.append('div') - .attr('class', 'message fillL'); + .attr('class', 'header fillL cf'); var back = messagewrap.append('button') .attr('class', 'preset-reset fl ' + geometry) From 992df47cac802debe57715e7a709cd8fac4f5684 Mon Sep 17 00:00:00 2001 From: Saman Bemel-Benrud Date: Thu, 21 Mar 2013 17:02:22 -0400 Subject: [PATCH 2/6] big commit modal cleanup. --- css/app.css | 183 ++++++++++++++-------------------------- data/core.yaml | 1 + data/locales.js | 1 + js/id/ui/commit.js | 44 +++++----- js/id/ui/confirm.js | 10 +-- js/id/ui/modal.js | 8 +- js/id/ui/preset_grid.js | 6 +- js/id/ui/restore.js | 2 +- js/id/ui/success.js | 23 +++-- js/id/ui/tag_editor.js | 2 +- 10 files changed, 105 insertions(+), 175 deletions(-) diff --git a/css/app.css b/css/app.css index d1348a0f7..8a625152c 100644 --- a/css/app.css +++ b/css/app.css @@ -70,12 +70,12 @@ h2:last-child, h4:last-child { margin-bottom: 0;} h3 { - font-size: 18px; + font-size: 16px; line-height: 1.3333; font-weight: bold; margin-bottom: 10px; text-overflow: ellipsis; - white-space: nowrap + white-space: nowrap; } h4 { @@ -134,6 +134,7 @@ a:hover { textarea { resize: vertical; + font:normal 12px/20px 'Helvetica Neue', Arial, sans-serif; } textarea, @@ -285,9 +286,6 @@ form.hide { } .pad1 {padding: 10px;} -.pad2 {padding: 20px;} -.margin1 {margin: 10px;} -.margin2 {margin: 20px;} .loading { background: url(../img/loader_bg.gif); @@ -443,12 +441,6 @@ button.save.has-count .count::before { border-right: 6px solid rgba(255,255,255,.5); } -button.close { - position: absolute; - top: 10px; - right: 10px; -} - button[disabled] { cursor:auto; background: rgba(255,255,255,.5); @@ -580,6 +572,37 @@ a.selected:hover .toggle.icon { background-position: -40px -180px;} border-radius: 0; } + +/* Header for modals / panes +------------------------------------------------------- */ + +.header { + border-bottom: 1px solid #ccc; + z-index: 2; + position: relative; +} + +.header h3 { + margin-bottom: 0; +} + +.modal > button, +.header button { + height: 100%; + border-radius: 0; + border-left: 1px solid #CCC; + width: 40px; + text-align: center; + overflow: hidden; + position: absolute; + right: 0; +} + +.modal > button { + height: 61px; + z-index: 3; +} + /* Inspector ------------------------------------------------------- */ @@ -616,24 +639,13 @@ a.selected:hover .toggle.icon { background-position: -40px -180px;} position: relative; } -.inspector-wrap .message { - height: 60px; - border-bottom: 1px solid #ccc; - z-index: 100; - position: relative; -} - -.inspector-wrap .message button { - height: 100%; - border-radius: 0; +.inspector-wrap .header button.preset-reset { border-right: 1px solid #CCC; - width: 60px; - text-align: center; - overflow: hidden; position: relative; + width: 60px; } -.inspector-wrap .message button > div { +.inspector-wrap .header button.preset-reset > div { height: 100%; padding: 20px 0; -webkit-transition: opacity 200ms; @@ -641,38 +653,26 @@ a.selected:hover .toggle.icon { background-position: -40px -180px;} transition: opacity 200ms; } -.inspector-wrap .message button .col12:last-child { +.inspector-wrap .header button.preset-reset .col12:last-child { position: absolute; width: 100%; padding: 20px 0; opacity: 0; } -.inspector-wrap .message button:hover .col12:first-child { +.inspector-wrap .header button:hover .col12:first-child { opacity: 0; } -.inspector-wrap .message button:hover .col12:last-child { +.inspector-wrap .header button:hover .col12:last-child { opacity: 1; } -.inspector-wrap .message button.line > div { +.inspector-wrap .header button.line > div { padding: 0; } -.inspector-wrap .message button.fr { - border-left: 1px solid #CCC; - width: 40px; -} - -.inspector-wrap .message h3 { - display: block; - font-size: 16px; - line-height: 20px; - overflow: hidden; -} - -.pane:last-child .message h3 { +.pane:last-child .header h3 { position: absolute; left: 60px; right: 40px; @@ -1639,11 +1639,9 @@ div.typeahead a:first-child { .modal { display: inline-block; position:absolute; - width: 50%; left: 0; right: 0; margin: auto; - max-width: 600px; top: 80px; z-index: 3; } @@ -1652,27 +1650,10 @@ div.typeahead a:first-child { margin-bottom: 10px; } -.modal .content { - margin-bottom: 40px; -} - .modal .description { text-align: center; } -.modal button.close-modal { - float:right; - position: absolute; - right:5px; - top:5px; - opacity: .5; -} - -.modal button.close-modal:hover { - background-color: transparent; - opacity: 1; -} - .shaded { z-index: 2; position: absolute; @@ -1680,6 +1661,7 @@ div.typeahead a:first-child { width: 100%; overflow: auto; } + .shaded:before { content:''; background:rgba(0,0,0,0.5); @@ -1689,29 +1671,7 @@ div.typeahead a:first-child { .modal-section { padding: 20px; -} - -.modal-section:first-child { - border-radius: 4px 4px 0 0; -} - -.modal-section:last-child { - border-radius: 0 0 4px 4px; -} - -.modal-section:only-of-type { - border-radius: 4px; -} - -.modal-section .buttons { - padding-top: 10px; - width: 100%; -} - -.modal-section img.wiki-image { - max-width: 100%; - max-height: 300px; - display: block; + border-bottom: 1px solid #CCC; } .modal-flash .content { @@ -1752,6 +1712,7 @@ div.typeahead a:first-child { .commit-modal .commit-info { margin-top: 10px; + padding-bottom: 20px; } .commit-modal .user-info img { @@ -1775,66 +1736,46 @@ div.typeahead a:first-child { .commit-modal .changeset-list { overflow: auto; border:1px solid #ccc; + border-radius: 4px; background:#fff; max-height: 160px; } +.commit-modal .warning-section .changeset-list { + border-radius: 4px 0 0 4px; +} + .commit-modal .warning-section .changeset-list button { float: right; + position: absolute; + right: 0; + top: 0; + bottom: 0; + border-radius: 0; + height: 100%; + width: 30px; } -.commit-section.modal-section { - padding-bottom: 0; -} - -.commit-section.modal-section:last-child { padding-bottom: 20px;} - .commit-modal .changeset-list li { position: relative; border-top:1px solid #ccc; padding:5px 10px; } -.modal-section { - padding: 20px; -} - -.modal-section img.wiki-image { - max-width: 100%; - max-height: 300px; - display: block; -} - -.modal-flash .content { - box-shadow: none; - border-radius: 4px; - background: #111; - color: #eee; -} - -.modal-flash .close-modal { - display:none; -} - .changeset-list li span.count { font-size:10px; color:#555; } .changeset-list li span.count:before { content: '('; } + .changeset-list li span.count:after { content: ')'; } .changeset-list li:first-child { border-top: 0;} -.commit-modal .changeset-comment { - height: 60px; - width:100%; - /* firefox uses monospace in textareas */ - font:normal 12px/20px 'Helvetica Neue', Arial, sans-serif; -} - /* Success ------------------------------------------------------- */ + a.success-action { display:inline-block; padding:10px; @@ -2098,10 +2039,10 @@ a.success-action { ------------------------------------------------------- */ @media only screen and (max-width: 840px) { - span.label {display: none;} + #bar span.label {display: none;} + #bar .icon.icon-pre-text { margin-right: 0px;} /* override hide for save button */ - .icon.icon-pre-text { margin-right: 0px;} - .save .label, .apply .label, .cancel .label { display: block;} + #bar .save .label { display: block;} } @media only screen and (max-height: 840px) { diff --git a/data/core.yaml b/data/core.yaml index ff65d5278..efe40d55f 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -114,6 +114,7 @@ en: commit: title: Save Changes description_placeholder: Brief description of your contributions + message_label: Commit message upload_explanation: "The changes you upload as {user} will be visible on all maps that use OpenStreetMap data." save: Save cancel: Cancel diff --git a/data/locales.js b/data/locales.js index 9e159756e..159850ab2 100644 --- a/data/locales.js +++ b/data/locales.js @@ -146,6 +146,7 @@ locale.en = { "commit": { "title": "Save Changes", "description_placeholder": "Brief description of your contributions", + "message_label": "Commit message", "upload_explanation": "The changes you upload as {user} will be visible on all maps that use OpenStreetMap data.", "save": "Save", "cancel": "Cancel", diff --git a/js/id/ui/commit.js b/js/id/ui/commit.js index efdc1c190..770bb67f3 100644 --- a/js/id/ui/commit.js +++ b/js/id/ui/commit.js @@ -28,22 +28,30 @@ iD.ui.Commit = function(context) { var changes = selection.datum(), connection = changes.connection, user = connection.user(), - header = selection.append('div').attr('class', 'header modal-section fillL'), + header = selection.append('div').attr('class', 'header modal-section'), body = selection.append('div').attr('class', 'body'); - header.append('h2') + header.append('h3') .text(t('commit.title')); + // Comment Section var commentSection = body.append('div') - .attr('class', 'modal-section fillD'); + .attr('class', 'modal-section preset-field'); - var commentField = commentSection.append('textarea') - .attr('class', 'changeset-comment') - .attr('placeholder', t('commit.description_placeholder')) - .property('value', context.storage('comment') || ''); + commentSection.append('h4') + .attr('for','input-commit-note') + .text(t('commit.message_label')); + + var commentField = commentSection + .append('textarea') + .attr('placeholder', t('commit.description_placeholder')) + .property('value', context.storage('comment') || ''); commentField.node().select(); + // Save Section + var saveSection = body.append('div').attr('class','modal-section cf'); + var userLink = d3.select(document.createElement('div')); if (user.image_url) { @@ -58,18 +66,14 @@ iD.ui.Commit = function(context) { .attr('href', connection.url() + '/user/' + user.display_name) .attr('target', '_blank'); - commentSection.append('p') + saveSection.append('p') .attr('class', 'commit-info') .html(t('commit.upload_explanation', {user: userLink.html()})); // Confirm / Cancel Buttons - var buttonWrap = commentSection.append('div') - .attr('class', 'buttons cf') - .append('div') - .attr('class', 'button-wrap joined col4'); - var saveButton = buttonWrap.append('button') - .attr('class', 'save action col6 button') + var saveButton = saveSection.append('button') + .attr('class', 'action col3 button') .on('click.save', function() { var comment = commentField.node().value; localStorage.comment = comment; @@ -82,21 +86,11 @@ iD.ui.Commit = function(context) { .attr('class', 'label') .text(t('commit.save')); - var cancelButton = buttonWrap.append('button') - .attr('class', 'cancel col6 button') - .on('click.cancel', function() { - event.cancel(); - }); - - cancelButton.append('span') - .attr('class', 'label') - .text(t('commit.cancel')); - var warnings = body.selectAll('div.warning-section') .data(iD.validate(changes, context.graph())) .enter() .append('div') - .attr('class', 'modal-section warning-section fillL'); + .attr('class', 'modal-section warning-section fillL2'); warnings.append('h3') .text(t('commit.warnings')); diff --git a/js/id/ui/confirm.js b/js/id/ui/confirm.js index 6851e739f..5ff8f72f8 100644 --- a/js/id/ui/confirm.js +++ b/js/id/ui/confirm.js @@ -5,7 +5,7 @@ iD.ui.confirm = function(selection) { .classed('modal-alert', true); var section = modal.select('.content') - .attr('class', 'modal-section fillD'); + .attr('class', 'modal-section'); var description = section.append('div') .attr('class', 'description'); @@ -17,13 +17,7 @@ iD.ui.confirm = function(selection) { .attr('class', 'col2 action centered') .on('click.confirm', function() { modal.remove(); - }); - - okbutton.append('span') - .attr('class', 'icon apply icon-pre-text'); - - okbutton.append('span') - .attr('class', 'label') + }) .text('Okay'); return modal; diff --git a/js/id/ui/modal.js b/js/id/ui/modal.js index 539c89de8..5da396a2b 100644 --- a/js/id/ui/modal.js +++ b/js/id/ui/modal.js @@ -21,13 +21,15 @@ iD.ui.modal = function(selection, blocking) { }); var modal = shaded.append('div') - .attr('class', 'modal'); + .attr('class', 'modal fillL col6'); modal.append('button') - .attr('class', 'icon remove') + .attr('class', 'close') .on('click', function() { if (!blocking) shaded.remove(); - }); + }) + .append('div') + .attr('class','icon close'); modal.append('div') .attr('class', 'content'); diff --git a/js/id/ui/preset_grid.js b/js/id/ui/preset_grid.js index 1ed641149..004de7510 100644 --- a/js/id/ui/preset_grid.js +++ b/js/id/ui/preset_grid.js @@ -12,7 +12,7 @@ iD.ui.PresetGrid = function(context, entity) { presets = context.presets().matchGeometry(entity, context.graph()); var messagewrap = selection.append('div') - .attr('class', 'message fillL'); + .attr('class', 'header fillL cf'); var message = messagewrap.append('h3') .attr('class', 'inspector-inner fl') @@ -20,13 +20,13 @@ iD.ui.PresetGrid = function(context, entity) { if (preset) { messagewrap.append('button') - .attr('class', 'tooltip-bottom preset-choose fr') + .attr('class', 'preset-choose') .on('click', event.choose) .append('span') .attr('class', 'icon forward'); } else { messagewrap.append('button') - .attr('class', 'tooltip-bottom preset-close fr') + .attr('class', 'close') .on('click', event.close) .append('span') .attr('class', 'icon close'); diff --git a/js/id/ui/restore.js b/js/id/ui/restore.js index 0c3d0a617..e5d272004 100644 --- a/js/id/ui/restore.js +++ b/js/id/ui/restore.js @@ -16,7 +16,7 @@ iD.ui.Restore = function(context) { .text(t('restore.description')); var buttonWrap = introModal.append('div') - .attr('class', 'modal-section fillD cf col12'); + .attr('class', 'modal-section cf col12'); var buttons = buttonWrap .append('div') diff --git a/js/id/ui/success.js b/js/id/ui/success.js index 4d4799ffd..fd3f14c0b 100644 --- a/js/id/ui/success.js +++ b/js/id/ui/success.js @@ -3,12 +3,10 @@ iD.ui.Success = function(connection) { function success(selection) { var changeset = selection.datum(), - header = selection.append('div').attr('class', 'header fillL modal-section'), + header = selection.append('div').attr('class', 'header modal-section'), body = selection.append('div').attr('class', 'body'); - var section = body.append('div').attr('class','modal-section fillD'); - - header.append('h2').text(t('just_edited')); + header.append('h3').text(t('just_edited')); var m = ''; if (changeset.comment) { @@ -18,7 +16,9 @@ iD.ui.Success = function(connection) { var message = (m || 'Edited OSM!') + connection.changesetUrl(changeset.id); - header.append('a') + var links = body.append('div').attr('class','modal-section'); + + links.append('a') .attr('href', function() { return connection.changesetUrl(changeset.id); }) @@ -26,7 +26,7 @@ iD.ui.Success = function(connection) { .attr('class', 'success-action') .text(t('view_on_osm')); - header.append('a') + links.append('a') .attr('target', '_blank') .attr('href', function() { return 'https://twitter.com/intent/tweet?source=webclient&text=' + @@ -35,17 +35,14 @@ iD.ui.Success = function(connection) { .attr('class', 'success-action') .text('Tweet'); - var buttonwrap = section.append('div') - .attr('class', 'buttons cf'); + var section = body.append('div').attr('class','modal-section cf'); - var okbutton = buttonwrap.append('button') + section.append('button') .attr('class', 'action col2') .on('click.save', function() { event.cancel(); - }); - - okbutton.append('span').attr('class','icon apply icon-pre-text'); - okbutton.append('span').attr('class','label').text('Okay'); + }) + .append('span').attr('class','label').text('Okay'); } return d3.rebind(success, event, 'on'); diff --git a/js/id/ui/tag_editor.js b/js/id/ui/tag_editor.js index 79ebedf9b..a97cb3afe 100644 --- a/js/id/ui/tag_editor.js +++ b/js/id/ui/tag_editor.js @@ -27,7 +27,7 @@ iD.ui.TagEditor = function(context, entity) { selection.html(''); var messagewrap = selection.append('div') - .attr('class', 'message fillL'); + .attr('class', 'header fillL cf'); var back = messagewrap.append('button') .attr('class', 'preset-reset fl ' + geometry) From 5fdb7069c12d4a92174da8c1aa6d32a5b5c1286f Mon Sep 17 00:00:00 2001 From: Saman Bemel-Benrud Date: Thu, 21 Mar 2013 18:16:45 -0400 Subject: [PATCH 3/6] better error modal. --- css/app.css | 4 ++-- js/id/ui/commit.js | 5 ++--- js/id/ui/confirm.js | 12 +++++++----- js/id/ui/restore.js | 2 +- js/id/ui/save.js | 12 ++++++++---- js/id/ui/tag_reference.js | 4 ++-- 6 files changed, 22 insertions(+), 17 deletions(-) diff --git a/css/app.css b/css/app.css index 8a625152c..ff6a5c467 100644 --- a/css/app.css +++ b/css/app.css @@ -1642,7 +1642,7 @@ div.typeahead a:first-child { left: 0; right: 0; margin: auto; - top: 80px; + top: 30px; z-index: 3; } @@ -2039,7 +2039,7 @@ a.success-action { ------------------------------------------------------- */ @media only screen and (max-width: 840px) { - #bar span.label {display: none;} + #bar .label {display: none;} #bar .icon.icon-pre-text { margin-right: 0px;} /* override hide for save button */ #bar .save .label { display: block;} diff --git a/js/id/ui/commit.js b/js/id/ui/commit.js index 770bb67f3..8bba39cb2 100644 --- a/js/id/ui/commit.js +++ b/js/id/ui/commit.js @@ -70,10 +70,9 @@ iD.ui.Commit = function(context) { .attr('class', 'commit-info') .html(t('commit.upload_explanation', {user: userLink.html()})); - // Confirm / Cancel Buttons - + // Confirm Button var saveButton = saveSection.append('button') - .attr('class', 'action col3 button') + .attr('class', 'action col2 button') .on('click.save', function() { var comment = commentField.node().value; localStorage.comment = comment; diff --git a/js/id/ui/confirm.js b/js/id/ui/confirm.js index 5ff8f72f8..c82b4c1ab 100644 --- a/js/id/ui/confirm.js +++ b/js/id/ui/confirm.js @@ -4,17 +4,19 @@ iD.ui.confirm = function(selection) { modal.select('.modal') .classed('modal-alert', true); - var section = modal.select('.content') - .attr('class', 'modal-section'); + var section = modal.select('.content'); + + var modalHeader = section.append('div') + .attr('class', 'modal-section header'); var description = section.append('div') - .attr('class', 'description'); + .attr('class', 'modal-section message-text'); var buttonwrap = section.append('div') - .attr('class', 'buttons cf'); + .attr('class', 'modal-section buttons cf'); var okbutton = buttonwrap.append('button') - .attr('class', 'col2 action centered') + .attr('class', 'col2 action') .on('click.confirm', function() { modal.remove(); }) diff --git a/js/id/ui/restore.js b/js/id/ui/restore.js index e5d272004..72ffa76d8 100644 --- a/js/id/ui/restore.js +++ b/js/id/ui/restore.js @@ -11,7 +11,7 @@ iD.ui.Restore = function(context) { var introModal = modal.select('.content'); introModal.append('div') - .attr('class', 'modal-section fillL') + .attr('class', 'modal-section header') .append('h3') .text(t('restore.description')); diff --git a/js/id/ui/save.js b/js/id/ui/save.js index 7fb733d06..26c6d22a7 100644 --- a/js/id/ui/save.js +++ b/js/id/ui/save.js @@ -39,11 +39,15 @@ iD.ui.Save = function(context) { function(err, changeset_id) { loading.remove(); if (err) { - var desc = iD.ui.confirm(context.container()) - .select('.description'); - desc.append('h2') + var confirm = iD.ui.confirm(context.container()); + confirm + .select('.modal-section.header') + .append('h3') .text(t('save.error')); - desc.append('p').text(err.responseText); + confirm + .select('.modal-section.message-text') + .append('p') + .text(err.responseText); } else { history.reset(); map.flush().redraw(); diff --git a/js/id/ui/tag_reference.js b/js/id/ui/tag_reference.js index 8a8ea2041..67ae91b84 100644 --- a/js/id/ui/tag_reference.js +++ b/js/id/ui/tag_reference.js @@ -4,7 +4,7 @@ iD.ui.tagReference = function(selection) { var selection = d3.select(this); var header = selection.append('div') .attr('class','modal-section fillL header') - .append('h2'); + .append('h3'); header.selectAll('span.icon') .data(g('types')) @@ -23,7 +23,7 @@ iD.ui.tagReference = function(selection) { .attr('class','modal-section fillL2'); referenceBody - .append('h5') + .append('h4') .text(t('tag_reference.description')); if (selection.datum().image) { From fe1f08cf8a9e05242819b9a68995b1d0bc6bbb01 Mon Sep 17 00:00:00 2001 From: Saman Bemel-Benrud Date: Thu, 21 Mar 2013 18:36:19 -0400 Subject: [PATCH 4/6] hide close button for loading modal. --- css/app.css | 8 +++++++- js/id/ui/loading.js | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/css/app.css b/css/app.css index ff6a5c467..8b07300fd 100644 --- a/css/app.css +++ b/css/app.css @@ -272,7 +272,9 @@ ul.link-list li:last-child { .fr { float: right;} div.hide, -form.hide { +form.hide, +button.hide, +a.hide { display: none; } @@ -1674,6 +1676,10 @@ div.typeahead a:first-child { border-bottom: 1px solid #CCC; } +.modal-section:last-child { + border-bottom: 0; +} + .modal-flash .content { box-shadow: none; border-radius: 4px; diff --git a/js/id/ui/loading.js b/js/id/ui/loading.js index c07426a0b..fe161acec 100644 --- a/js/id/ui/loading.js +++ b/js/id/ui/loading.js @@ -8,5 +8,7 @@ iD.ui.loading = function(selection, message, blocking) { loadertext.append('img').attr('class','loader').attr('src', 'img/loader.gif'); loadertext.append('h3').text(message || ''); + modal.select('button.close').attr('class','hide'); + return modal; }; From 426c8972486408723a0a0b602e6a81266f325e11 Mon Sep 17 00:00:00 2001 From: Saman Bemel-Benrud Date: Thu, 21 Mar 2013 19:19:17 -0400 Subject: [PATCH 5/6] commit flow work --- css/app.css | 33 ++++++++-- data/core.yaml | 2 +- data/locales.js | 2 +- img/source/sprite.svg | 140 ++++++++++++++++++++++++++---------------- img/sprite.png | Bin 17122 -> 22557 bytes js/id/svg/surface.js | 2 +- js/id/ui/success.js | 8 +-- 7 files changed, 123 insertions(+), 64 deletions(-) diff --git a/css/app.css b/css/app.css index 8b07300fd..b12f3bf21 100644 --- a/css/app.css +++ b/css/app.css @@ -1782,10 +1782,35 @@ div.typeahead a:first-child { /* Success ------------------------------------------------------- */ -a.success-action { - display:inline-block; - padding:10px; - margin:10px; +.modal a.success-action { + height: 180px; + border-bottom: 1px solid #CCC; + text-align: center; + -webkit-transition: all 200ms; + -moz-transition: all 200ms; + transition: all 200ms; +} + +.modal a.success-action:hover { + background-color: #ececec; +} + +a.success-action.osm { + border-right: 1px solid #CCC; +} + +a.success-action:before { + display: block; + content: ''; + height: 100px; + width: 100px; + margin: auto; + margin-bottom: 20px; + background:transparent url(../img/sprite.png) no-repeat 0px -220px; +} + +a.success-action.twitter:before { + background-position: -100px -220px; } /* Notices diff --git a/data/core.yaml b/data/core.yaml index efe40d55f..821c5c781 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -105,7 +105,7 @@ en: annotation: Split a way. nothing_to_undo: Nothing to undo. nothing_to_redo: Nothing to redo. - just_edited: "You Just Edited OpenStreetMap!" + just_edited: "You just edited OpenStreetMap!" browser_notice: "This editor is supported in Firefox, Chrome, Safari, Opera, and Internet Explorer 9 and above. Please upgrade your browser or use Potlatch 2 to edit the map." view_on_osm: View on OSM zoom_in_edit: zoom in to edit the map diff --git a/data/locales.js b/data/locales.js index 159850ab2..a50d6bdb6 100644 --- a/data/locales.js +++ b/data/locales.js @@ -137,7 +137,7 @@ locale.en = { }, "nothing_to_undo": "Nothing to undo.", "nothing_to_redo": "Nothing to redo.", - "just_edited": "You Just Edited OpenStreetMap!", + "just_edited": "You just edited OpenStreetMap!", "browser_notice": "This editor is supported in Firefox, Chrome, Safari, Opera, and Internet Explorer 9 and above. Please upgrade your browser or use Potlatch 2 to edit the map.", "view_on_osm": "View on OSM", "zoom_in_edit": "zoom in to edit the map", diff --git a/img/source/sprite.svg b/img/source/sprite.svg index d9bdf35df..c651771b8 100644 --- a/img/source/sprite.svg +++ b/img/source/sprite.svg @@ -10,7 +10,7 @@ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="460" - height="220" + height="320" id="svg12393" version="1.1" inkscape:version="0.48.2 r9819" @@ -39,21 +39,21 @@ inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="1" - inkscape:cx="251.84767" - inkscape:cy="109.87116" + inkscape:cx="105.09059" + inkscape:cy="203.92529" inkscape:document-units="px" inkscape:current-layer="layer12" - showgrid="false" + showgrid="true" inkscape:window-width="1280" inkscape:window-height="700" - inkscape:window-x="361" - inkscape:window-y="86" + inkscape:window-x="131" + inkscape:window-y="17" inkscape:window-maximized="0" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" - showguides="false" + showguides="true" inkscape:guide-bbox="true" inkscape:snap-bbox="true" inkscape:snap-nodes="false"> @@ -66,131 +66,131 @@ snapvisiblegridlinesonly="true" /> + width="460" + height="320" + x="-485" + y="-3.0624999e-06" + transform="scale(-1,1)" /> - + + + + + + + + + + diff --git a/img/sprite.png b/img/sprite.png index 0289cad001089cac386d6847480fe54f71f34f14..746c1872529e9b9a9d4df2322e304ff14ca990d7 100644 GIT binary patch literal 22557 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%0A~=EDq&q!=Tu;37DY}X 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 diff --git a/js/id/svg/surface.js b/js/id/svg/surface.js index b37e22e8b..15ef0cca3 100644 --- a/js/id/svg/surface.js +++ b/js/id/svg/surface.js @@ -93,7 +93,7 @@ iD.svg.Surface = function() { .attr({ id: 'sprite', width: 460, - height: 220, + height: 320, 'xlink:href': 'img/sprite.png' }); diff --git a/js/id/ui/success.js b/js/id/ui/success.js index fd3f14c0b..67a75c62b 100644 --- a/js/id/ui/success.js +++ b/js/id/ui/success.js @@ -16,23 +16,23 @@ iD.ui.Success = function(connection) { var message = (m || 'Edited OSM!') + connection.changesetUrl(changeset.id); - var links = body.append('div').attr('class','modal-section'); + var links = body.append('div').attr('class','cf'); links.append('a') + .attr('class','col6 success-action modal-section osm') + .attr('target', '_blank') .attr('href', function() { return connection.changesetUrl(changeset.id); }) - .attr('target', '_blank') - .attr('class', 'success-action') .text(t('view_on_osm')); links.append('a') + .attr('class','col6 success-action modal-section twitter') .attr('target', '_blank') .attr('href', function() { return 'https://twitter.com/intent/tweet?source=webclient&text=' + encodeURIComponent(message); }) - .attr('class', 'success-action') .text('Tweet'); var section = body.append('div').attr('class','modal-section cf'); From 478eb8871aa0e089d470be580f85973748943207 Mon Sep 17 00:00:00 2001 From: Saman Bemel-Benrud Date: Thu, 21 Mar 2013 17:02:22 -0400 Subject: [PATCH 6/6] big commit modal cleanup. --- css/app.css | 183 ++++++++++++++-------------------------- data/core.yaml | 1 + data/locales.js | 1 + js/id/ui/commit.js | 44 +++++----- js/id/ui/confirm.js | 10 +-- js/id/ui/modal.js | 8 +- js/id/ui/preset_grid.js | 6 +- js/id/ui/restore.js | 2 +- js/id/ui/success.js | 23 +++-- js/id/ui/tag_editor.js | 2 +- 10 files changed, 105 insertions(+), 175 deletions(-) diff --git a/css/app.css b/css/app.css index 06b897d74..807b545ba 100644 --- a/css/app.css +++ b/css/app.css @@ -70,12 +70,12 @@ h2:last-child, h4:last-child { margin-bottom: 0;} h3 { - font-size: 18px; + font-size: 16px; line-height: 1.3333; font-weight: bold; margin-bottom: 10px; text-overflow: ellipsis; - white-space: nowrap + white-space: nowrap; } h4 { @@ -134,6 +134,7 @@ a:hover { textarea { resize: vertical; + font:normal 12px/20px 'Helvetica Neue', Arial, sans-serif; } textarea, @@ -285,9 +286,6 @@ form.hide { } .pad1 {padding: 10px;} -.pad2 {padding: 20px;} -.margin1 {margin: 10px;} -.margin2 {margin: 20px;} .loading { background: url(../img/loader_bg.gif); @@ -443,12 +441,6 @@ button.save.has-count .count::before { border-right: 6px solid rgba(255,255,255,.5); } -button.close { - position: absolute; - top: 10px; - right: 10px; -} - button[disabled] { cursor:auto; background: rgba(255,255,255,.5); @@ -580,6 +572,37 @@ a.selected:hover .toggle.icon { background-position: -40px -180px;} border-radius: 0; } + +/* Header for modals / panes +------------------------------------------------------- */ + +.header { + border-bottom: 1px solid #ccc; + z-index: 2; + position: relative; +} + +.header h3 { + margin-bottom: 0; +} + +.modal > button, +.header button { + height: 100%; + border-radius: 0; + border-left: 1px solid #CCC; + width: 40px; + text-align: center; + overflow: hidden; + position: absolute; + right: 0; +} + +.modal > button { + height: 61px; + z-index: 3; +} + /* Inspector ------------------------------------------------------- */ @@ -616,24 +639,13 @@ a.selected:hover .toggle.icon { background-position: -40px -180px;} position: relative; } -.inspector-wrap .message { - height: 60px; - border-bottom: 1px solid #ccc; - z-index: 100; - position: relative; -} - -.inspector-wrap .message button { - height: 100%; - border-radius: 0; +.inspector-wrap .header button.preset-reset { border-right: 1px solid #CCC; - width: 60px; - text-align: center; - overflow: hidden; position: relative; + width: 60px; } -.inspector-wrap .message button > div { +.inspector-wrap .header button.preset-reset > div { height: 100%; padding: 20px 0; -webkit-transition: opacity 200ms; @@ -641,38 +653,26 @@ a.selected:hover .toggle.icon { background-position: -40px -180px;} transition: opacity 200ms; } -.inspector-wrap .message button .col12:last-child { +.inspector-wrap .header button.preset-reset .col12:last-child { position: absolute; width: 100%; padding: 20px 0; opacity: 0; } -.inspector-wrap .message button:hover .col12:first-child { +.inspector-wrap .header button:hover .col12:first-child { opacity: 0; } -.inspector-wrap .message button:hover .col12:last-child { +.inspector-wrap .header button:hover .col12:last-child { opacity: 1; } -.inspector-wrap .message button.line > div { +.inspector-wrap .header button.line > div { padding: 0; } -.inspector-wrap .message button.fr { - border-left: 1px solid #CCC; - width: 40px; -} - -.inspector-wrap .message h3 { - display: block; - font-size: 16px; - line-height: 20px; - overflow: hidden; -} - -.pane:last-child .message h3 { +.pane:last-child .header h3 { position: absolute; left: 60px; right: 40px; @@ -1637,11 +1637,9 @@ div.typeahead a:first-child { .modal { display: inline-block; position:absolute; - width: 50%; left: 0; right: 0; margin: auto; - max-width: 600px; top: 80px; z-index: 3; } @@ -1650,27 +1648,10 @@ div.typeahead a:first-child { margin-bottom: 10px; } -.modal .content { - margin-bottom: 40px; -} - .modal .description { text-align: center; } -.modal button.close-modal { - float:right; - position: absolute; - right:5px; - top:5px; - opacity: .5; -} - -.modal button.close-modal:hover { - background-color: transparent; - opacity: 1; -} - .shaded { z-index: 2; position: absolute; @@ -1678,6 +1659,7 @@ div.typeahead a:first-child { width: 100%; overflow: auto; } + .shaded:before { content:''; background:rgba(0,0,0,0.5); @@ -1687,29 +1669,7 @@ div.typeahead a:first-child { .modal-section { padding: 20px; -} - -.modal-section:first-child { - border-radius: 4px 4px 0 0; -} - -.modal-section:last-child { - border-radius: 0 0 4px 4px; -} - -.modal-section:only-of-type { - border-radius: 4px; -} - -.modal-section .buttons { - padding-top: 10px; - width: 100%; -} - -.modal-section img.wiki-image { - max-width: 100%; - max-height: 300px; - display: block; + border-bottom: 1px solid #CCC; } .modal-flash .content { @@ -1750,6 +1710,7 @@ div.typeahead a:first-child { .commit-modal .commit-info { margin-top: 10px; + padding-bottom: 20px; } .commit-modal .user-info img { @@ -1773,66 +1734,46 @@ div.typeahead a:first-child { .commit-modal .changeset-list { overflow: auto; border:1px solid #ccc; + border-radius: 4px; background:#fff; max-height: 160px; } +.commit-modal .warning-section .changeset-list { + border-radius: 4px 0 0 4px; +} + .commit-modal .warning-section .changeset-list button { float: right; + position: absolute; + right: 0; + top: 0; + bottom: 0; + border-radius: 0; + height: 100%; + width: 30px; } -.commit-section.modal-section { - padding-bottom: 0; -} - -.commit-section.modal-section:last-child { padding-bottom: 20px;} - .commit-modal .changeset-list li { position: relative; border-top:1px solid #ccc; padding:5px 10px; } -.modal-section { - padding: 20px; -} - -.modal-section img.wiki-image { - max-width: 100%; - max-height: 300px; - display: block; -} - -.modal-flash .content { - box-shadow: none; - border-radius: 4px; - background: #111; - color: #eee; -} - -.modal-flash .close-modal { - display:none; -} - .changeset-list li span.count { font-size:10px; color:#555; } .changeset-list li span.count:before { content: '('; } + .changeset-list li span.count:after { content: ')'; } .changeset-list li:first-child { border-top: 0;} -.commit-modal .changeset-comment { - height: 60px; - width:100%; - /* firefox uses monospace in textareas */ - font:normal 12px/20px 'Helvetica Neue', Arial, sans-serif; -} - /* Success ------------------------------------------------------- */ + a.success-action { display:inline-block; padding:10px; @@ -2096,10 +2037,10 @@ a.success-action { ------------------------------------------------------- */ @media only screen and (max-width: 840px) { - span.label {display: none;} + #bar span.label {display: none;} + #bar .icon.icon-pre-text { margin-right: 0px;} /* override hide for save button */ - .icon.icon-pre-text { margin-right: 0px;} - .save .label, .apply .label, .cancel .label { display: block;} + #bar .save .label { display: block;} } @media only screen and (max-height: 840px) { diff --git a/data/core.yaml b/data/core.yaml index bf65bff04..4d9ebb88c 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -114,6 +114,7 @@ en: commit: title: Save Changes description_placeholder: Brief description of your contributions + message_label: Commit message upload_explanation: "The changes you upload as {user} will be visible on all maps that use OpenStreetMap data." save: Save cancel: Cancel diff --git a/data/locales.js b/data/locales.js index 8dba73d28..4dd2da36f 100644 --- a/data/locales.js +++ b/data/locales.js @@ -146,6 +146,7 @@ locale.en = { "commit": { "title": "Save Changes", "description_placeholder": "Brief description of your contributions", + "message_label": "Commit message", "upload_explanation": "The changes you upload as {user} will be visible on all maps that use OpenStreetMap data.", "save": "Save", "cancel": "Cancel", diff --git a/js/id/ui/commit.js b/js/id/ui/commit.js index efdc1c190..770bb67f3 100644 --- a/js/id/ui/commit.js +++ b/js/id/ui/commit.js @@ -28,22 +28,30 @@ iD.ui.Commit = function(context) { var changes = selection.datum(), connection = changes.connection, user = connection.user(), - header = selection.append('div').attr('class', 'header modal-section fillL'), + header = selection.append('div').attr('class', 'header modal-section'), body = selection.append('div').attr('class', 'body'); - header.append('h2') + header.append('h3') .text(t('commit.title')); + // Comment Section var commentSection = body.append('div') - .attr('class', 'modal-section fillD'); + .attr('class', 'modal-section preset-field'); - var commentField = commentSection.append('textarea') - .attr('class', 'changeset-comment') - .attr('placeholder', t('commit.description_placeholder')) - .property('value', context.storage('comment') || ''); + commentSection.append('h4') + .attr('for','input-commit-note') + .text(t('commit.message_label')); + + var commentField = commentSection + .append('textarea') + .attr('placeholder', t('commit.description_placeholder')) + .property('value', context.storage('comment') || ''); commentField.node().select(); + // Save Section + var saveSection = body.append('div').attr('class','modal-section cf'); + var userLink = d3.select(document.createElement('div')); if (user.image_url) { @@ -58,18 +66,14 @@ iD.ui.Commit = function(context) { .attr('href', connection.url() + '/user/' + user.display_name) .attr('target', '_blank'); - commentSection.append('p') + saveSection.append('p') .attr('class', 'commit-info') .html(t('commit.upload_explanation', {user: userLink.html()})); // Confirm / Cancel Buttons - var buttonWrap = commentSection.append('div') - .attr('class', 'buttons cf') - .append('div') - .attr('class', 'button-wrap joined col4'); - var saveButton = buttonWrap.append('button') - .attr('class', 'save action col6 button') + var saveButton = saveSection.append('button') + .attr('class', 'action col3 button') .on('click.save', function() { var comment = commentField.node().value; localStorage.comment = comment; @@ -82,21 +86,11 @@ iD.ui.Commit = function(context) { .attr('class', 'label') .text(t('commit.save')); - var cancelButton = buttonWrap.append('button') - .attr('class', 'cancel col6 button') - .on('click.cancel', function() { - event.cancel(); - }); - - cancelButton.append('span') - .attr('class', 'label') - .text(t('commit.cancel')); - var warnings = body.selectAll('div.warning-section') .data(iD.validate(changes, context.graph())) .enter() .append('div') - .attr('class', 'modal-section warning-section fillL'); + .attr('class', 'modal-section warning-section fillL2'); warnings.append('h3') .text(t('commit.warnings')); diff --git a/js/id/ui/confirm.js b/js/id/ui/confirm.js index 6851e739f..5ff8f72f8 100644 --- a/js/id/ui/confirm.js +++ b/js/id/ui/confirm.js @@ -5,7 +5,7 @@ iD.ui.confirm = function(selection) { .classed('modal-alert', true); var section = modal.select('.content') - .attr('class', 'modal-section fillD'); + .attr('class', 'modal-section'); var description = section.append('div') .attr('class', 'description'); @@ -17,13 +17,7 @@ iD.ui.confirm = function(selection) { .attr('class', 'col2 action centered') .on('click.confirm', function() { modal.remove(); - }); - - okbutton.append('span') - .attr('class', 'icon apply icon-pre-text'); - - okbutton.append('span') - .attr('class', 'label') + }) .text('Okay'); return modal; diff --git a/js/id/ui/modal.js b/js/id/ui/modal.js index 539c89de8..5da396a2b 100644 --- a/js/id/ui/modal.js +++ b/js/id/ui/modal.js @@ -21,13 +21,15 @@ iD.ui.modal = function(selection, blocking) { }); var modal = shaded.append('div') - .attr('class', 'modal'); + .attr('class', 'modal fillL col6'); modal.append('button') - .attr('class', 'icon remove') + .attr('class', 'close') .on('click', function() { if (!blocking) shaded.remove(); - }); + }) + .append('div') + .attr('class','icon close'); modal.append('div') .attr('class', 'content'); diff --git a/js/id/ui/preset_grid.js b/js/id/ui/preset_grid.js index 1ed641149..004de7510 100644 --- a/js/id/ui/preset_grid.js +++ b/js/id/ui/preset_grid.js @@ -12,7 +12,7 @@ iD.ui.PresetGrid = function(context, entity) { presets = context.presets().matchGeometry(entity, context.graph()); var messagewrap = selection.append('div') - .attr('class', 'message fillL'); + .attr('class', 'header fillL cf'); var message = messagewrap.append('h3') .attr('class', 'inspector-inner fl') @@ -20,13 +20,13 @@ iD.ui.PresetGrid = function(context, entity) { if (preset) { messagewrap.append('button') - .attr('class', 'tooltip-bottom preset-choose fr') + .attr('class', 'preset-choose') .on('click', event.choose) .append('span') .attr('class', 'icon forward'); } else { messagewrap.append('button') - .attr('class', 'tooltip-bottom preset-close fr') + .attr('class', 'close') .on('click', event.close) .append('span') .attr('class', 'icon close'); diff --git a/js/id/ui/restore.js b/js/id/ui/restore.js index 0c3d0a617..e5d272004 100644 --- a/js/id/ui/restore.js +++ b/js/id/ui/restore.js @@ -16,7 +16,7 @@ iD.ui.Restore = function(context) { .text(t('restore.description')); var buttonWrap = introModal.append('div') - .attr('class', 'modal-section fillD cf col12'); + .attr('class', 'modal-section cf col12'); var buttons = buttonWrap .append('div') diff --git a/js/id/ui/success.js b/js/id/ui/success.js index 4d4799ffd..fd3f14c0b 100644 --- a/js/id/ui/success.js +++ b/js/id/ui/success.js @@ -3,12 +3,10 @@ iD.ui.Success = function(connection) { function success(selection) { var changeset = selection.datum(), - header = selection.append('div').attr('class', 'header fillL modal-section'), + header = selection.append('div').attr('class', 'header modal-section'), body = selection.append('div').attr('class', 'body'); - var section = body.append('div').attr('class','modal-section fillD'); - - header.append('h2').text(t('just_edited')); + header.append('h3').text(t('just_edited')); var m = ''; if (changeset.comment) { @@ -18,7 +16,9 @@ iD.ui.Success = function(connection) { var message = (m || 'Edited OSM!') + connection.changesetUrl(changeset.id); - header.append('a') + var links = body.append('div').attr('class','modal-section'); + + links.append('a') .attr('href', function() { return connection.changesetUrl(changeset.id); }) @@ -26,7 +26,7 @@ iD.ui.Success = function(connection) { .attr('class', 'success-action') .text(t('view_on_osm')); - header.append('a') + links.append('a') .attr('target', '_blank') .attr('href', function() { return 'https://twitter.com/intent/tweet?source=webclient&text=' + @@ -35,17 +35,14 @@ iD.ui.Success = function(connection) { .attr('class', 'success-action') .text('Tweet'); - var buttonwrap = section.append('div') - .attr('class', 'buttons cf'); + var section = body.append('div').attr('class','modal-section cf'); - var okbutton = buttonwrap.append('button') + section.append('button') .attr('class', 'action col2') .on('click.save', function() { event.cancel(); - }); - - okbutton.append('span').attr('class','icon apply icon-pre-text'); - okbutton.append('span').attr('class','label').text('Okay'); + }) + .append('span').attr('class','label').text('Okay'); } return d3.rebind(success, event, 'on'); diff --git a/js/id/ui/tag_editor.js b/js/id/ui/tag_editor.js index b9881f682..69d29d057 100644 --- a/js/id/ui/tag_editor.js +++ b/js/id/ui/tag_editor.js @@ -24,7 +24,7 @@ iD.ui.TagEditor = function(context, entity) { selection.html(''); var messagewrap = selection.append('div') - .attr('class', 'message fillL'); + .attr('class', 'header fillL cf'); var back = messagewrap.append('button') .attr('class', 'preset-reset fl ' + geometry)