diff --git a/ACCESSIBILITY.md b/ACCESSIBILITY.md index b0cdab658..02dfeff39 100644 --- a/ACCESSIBILITY.md +++ b/ACCESSIBILITY.md @@ -8,7 +8,7 @@ follow [universal design](https://en.wikipedia.org/wiki/Universal_design) princi This is a living document that details the usability of iD across a number of dimensions, with the intent of identifying and addressing problem areas. Since there are always more -factors to consider, no part of this document should be considered "complete". +factors to consider, no part of this document should be considered complete. Symbols used in this document: @@ -18,7 +18,9 @@ Symbols used in this document: - โŒ No appreciable support - ๐Ÿคท Unknown support, none is assumed -## Browser Compatibility +
+ +## ๐Ÿ”— Browser Compatibility As a web app, iD's browser support is fundamental. The user experience should be as equivalent as possible across the latest versions of all modern browsers on all @@ -28,16 +30,17 @@ should fallback gracefully without breaking other aspects of the app. This table covers high-level compatibility, with individual features to be detailed elsewhere in this document. -| | | Browser | Notes | Issues | +| | Icon | Browser | Notes | Issues | |---|---|---|---|---| -| โœ… | ![chrome logo] | Chrome | | -| โœ…* | ![firefox logo] | Firefox | \*Minor known issues | [#7132] | -| โœ… | ![safari logo] | Safari | | -| ๐ŸŸฉ | ![opera logo] | Opera | | -| ๐ŸŸฉ | ![edge logo] | Edge | | -| ๐ŸŸ  | ![ie logo] | Internet Explorer | IE has been discontinued, but IE 11 is still maintained. iD polyfills ES6 features on IE 11, with varying success. | -| ๐ŸŸฉ | ๐ŸŒ | Others | iD should run without issue on any desktop browser implementing modern web standards. | -| ๐ŸŸ  | ๐Ÿ“ฑ | Mobile browsers | iD has not yet been fully optimized for mobile devices, but some editing is usually possible. | +| โœ… | ![chrome logo] | [Chrome](https://en.wikipedia.org/wiki/Google_Chrome) | | +| โœ…* | ![firefox logo] | [Firefox](https://en.wikipedia.org/wiki/Firefox) | \*Minor known issues | [#7132](https://github.com/openstreetmap/iD/issues/7132) | +| โœ… | ![safari logo] | [Safari](https://en.wikipedia.org/wiki/Safari_(web_browser)) | | +| ๐ŸŸฉ | ![opera logo] | [Opera](https://en.wikipedia.org/wiki/Opera_(web_browser)) | | +| ๐ŸŸฉ | ![edge logo] | [Edge](https://en.wikipedia.org/wiki/Microsoft_Edge) | | +| ๐ŸŸ  | ![ie logo] | [Internet Explorer](https://en.wikipedia.org/wiki/Internet_Explorer) | IE has been discontinued, but [IE 11 is still maintained](https://docs.microsoft.com/en-us/lifecycle/faq/internet-explorer-microsoft-edge). iD [polyfills](https://en.wikipedia.org/wiki/Polyfill_(programming)) modern web features for IE 11 where possible, but full support should not be expected | +| โœ… | ![webkit logo] | [iOS](https://en.wikipedia.org/wiki/IOS) browsers | All browsers on iOS (e.g. Safari, Chrome, Firefox, Edge) use the [WebKit](https://en.wikipedia.org/wiki/WebKit) engine and should thus have equivalent support | +| ๐ŸŸฉ | ![android logo] | [Android](https://en.wikipedia.org/wiki/Android_(operating_system)) browsers | Browsers on Android can use their own engines, so support may vary, but there are currently no known issues | +| ๐ŸŸฉ | ๐ŸŒ | Others | iD should run on any browser implementing [modern web standards](https://www.w3.org/standards/). Hardware factors such as screen size may affect usability | [safari logo]: https://upload.wikimedia.org/wikipedia/commons/thumb/5/52/Safari_browser_logo.svg/30px-Safari_browser_logo.svg.png [opera logo]: https://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Opera_browser_logo_2013_vector.svg/30px-Opera_browser_logo_2013_vector.svg.png @@ -45,10 +48,12 @@ elsewhere in this document. [firefox logo]: https://upload.wikimedia.org/wikipedia/commons/thumb/a/a0/Firefox_logo%2C_2019.svg/30px-Firefox_logo%2C_2019.svg.png [edge logo]: https://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/Microsoft_Edge_logo_%282015%E2%80%932019%29.svg/30px-Microsoft_Edge_logo_%282015%E2%80%932019%29.svg.png [ie logo]: https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Internet_Explorer_10%2B11_logo.svg/30px-Internet_Explorer_10%2B11_logo.svg.png +[webkit logo]: https://upload.wikimedia.org/wikipedia/en/thumb/b/be/WebKit_logo_(2015).svg/35px-WebKit_logo_(2015).svg.png +[android logo]: https://upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Android_robot.svg/28px-Android_robot.svg.png -[#7132]: https://github.com/openstreetmap/iD/issues/7132 +
-## Input Device Support +## ๐Ÿ•น Interaction Support iD has traditionally assumed the mapper will be interacting via a mouse and keyboard, but realistically people want or need to use various other [input devices](https://en.wikipedia.org/wiki/Input_device). @@ -56,9 +61,45 @@ but realistically people want or need to use various other [input devices](https iD relies on modern [pointer events](https://developer.mozilla.org/en-US/docs/Web/API/Pointer_events) for some interactions, so some devices may see degraded functionality on older browsers. -### Setups +### Input Devices -The following table lists iD's usability for different setups. A setup is where +This table details iD's support for specific classes of input devices. + +"Full support" for a device means that iD reasonably handles its entire range of input on supported platforms. Though the given device is not necessarily expected to perform all of iD's functions. + +It's impractical to ensure every single input device works as expected, so the table only reflects the support status to the best of our knowledge. + +| | Icon | Input Device | Notes | Issues | +|---|---|---|---|---| +| ๐ŸŸฉ | ![apple adb mouse] | Single-button [mouse](https://en.wikipedia.org/wiki/Computer_mouse) | Primary click (e.g. left-click) can be used for all pointer interactions. Long-clicking on map features opens the edit menu | +| ๐ŸŸฉ | ![ibm mouse] | Multi-button mouse | Secondary click (e.g. right-click) can be used on map features to open the edit menu. Middle click, etc., are not needed by iD but are passed through to the browser | +| ๐ŸŸฉ | [![magic mouse]](https://en.wikipedia.org/wiki/Magic_Mouse) | Multi-touch mouse | 2D scrolling in the map is treated as panning, not zooming | +| ๐ŸŸ  | ![vertical scroll wheel] | Vertical [scroll wheel](https://en.wikipedia.org/wiki/Scroll_wheel) | Should zoom the map in and out | [#5550](https://github.com/openstreetmap/iD/issues/5550) | +| โŒ | | Horizontal scroll wheel | Currently does nothing in the map | [#7134](https://github.com/openstreetmap/iD/issues/7134) | +| ๐Ÿคท | [![apple mighty mouse]](https://en.wikipedia.org/wiki/Apple_Mighty_Mouse) | Scroll ball | Works like combined vertical/horizontal scroll wheels | +| ๐ŸŸฉ | ๐Ÿ–ฒ | [Trackball](https://en.wikipedia.org/wiki/Trackball) | | +| ๐ŸŸฉ | ![touchpad] | [Trackpad](https://en.wikipedia.org/wiki/Touchpad) | | +| ๐ŸŸฉ | [![macbook trackpad]](https://en.wikipedia.org/wiki/Magic_Trackpad) | Multi-touch trackpad | Pinch-to-zoom and scroll-to-pan are supported in the map | +| ๐ŸŸฉ | ![pointing stick] | [Pointing stick](https://en.wikipedia.org/wiki/Pointing_stick) | | +| ๐ŸŸฉ | โŒจ๏ธ | [Keyboard](https://en.wikipedia.org/wiki/Computer_keyboard) | Any keyboard can be used, but certain functionality may require certain keys | +| ๐Ÿคท | | [Touch bar](https://www.imore.com/touch-bar) | Generic, browser-provided controls should be shown | +| ๐ŸŸฉ | | Multi-touch screen | | +| ๐ŸŸฉ | โœ๏ธ | [Stylus](https://en.wikipedia.org/wiki/Stylus_(computing)) | Works like a single touch for tapping, dragging, scrolling, etc. | +| ๐Ÿคท | ๐Ÿ”ฒ | [Graphics tablet](https://en.wikipedia.org/wiki/Graphics_tablet) | | +| ๐Ÿคท | ๐ŸŽฎ | [Gamepad](https://en.wikipedia.org/wiki/Gamepad) | | + +[ibm mouse]: https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Myszka_IBM.jpg/40px-Myszka_IBM.jpg +[apple adb mouse]: https://upload.wikimedia.org/wikipedia/commons/thumb/a/a8/Apple-ADB-mouse.jpg/70px-Apple-ADB-mouse.jpg +[apple mighty mouse]: https://upload.wikimedia.org/wikipedia/commons/thumb/a/ac/Apple_Mighty_Mouse_top_viewo.jpg/35px-Apple_Mighty_Mouse_top_viewo.jpg +[vertical scroll wheel]: https://upload.wikimedia.org/wikipedia/commons/thumb/9/90/Razer_DeathAdder_2013_Edition-mouse_wheel_PNr%C2%B00405.jpg/50px-Razer_DeathAdder_2013_Edition-mouse_wheel_PNr%C2%B00405.jpg +[magic mouse]: https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Magic_Mouse.jpg/70px-Magic_Mouse.jpg +[pointing stick]: https://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Mouse_pointing_stick.jpeg/70px-Mouse_pointing_stick.jpeg +[touchpad]: https://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Touchpad_F3JA.jpg/70px-Touchpad_F3JA.jpg +[macbook trackpad]: https://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/MacBook_Pro%27s_trackpad.JPG/70px-MacBook_Pro%27s_trackpad.JPG + +### Input Setups + +This table lists iD's usability for different setups. A setup is where a mapper is using only the device(s) given in the row. A setup with "full support" offers functionality equivalent to that of the @@ -66,41 +107,48 @@ highest-functioning setup (generally mouse and keyboard). Certain functions may be accessed differently on different setups, such as opening the edit menu via long-pressing instead of right-clicking. -| | | Input Setup | Notes | -|---|---|---|---| +| | Icon | Input Setup | Notes | Issues | +|---|---|---|---|---| | โœ… | ๐Ÿ–ฑโŒจ๏ธ | [Mouse](https://en.wikipedia.org/wiki/Computer_mouse) + [keyboard](https://en.wikipedia.org/wiki/Computer_keyboard) | iD's original input paradigm. Any mouse-like device such as a [trackpad](https://en.wikipedia.org/wiki/Touchpad), [trackball](https://en.wikipedia.org/wiki/Trackball), or [pointing stick](https://en.wikipedia.org/wiki/Pointing_stick) is grouped into "mouse" for this table | -| โŒ | โŒจ๏ธ | Keyboard only | Not all elements can necessarily be keyed to. Key traps may exists. Geometry editing isn't possible | +| โŒ | โŒจ๏ธ | Keyboard only | Not all elements can necessarily be keyed to. Key traps may exists. Geometry editing isn't possible | [#7770](https://github.com/openstreetmap/iD/issues/7770) | | ๐ŸŸ  | ๐Ÿ–ฑ | Mouse only | The primary [mouse button](https://en.wikipedia.org/wiki/Mouse_button) (e.g. left click) alone is sufficient. Multiselection and disabling of node-snapping aren't possible | -| ๐ŸŸ  | ๐Ÿ– | [Multi-touch](https://en.wikipedia.org/wiki/Multi-touch) on a [touchscreen](https://en.wikipedia.org/wiki/Touchscreen) | Move and rotate aren't possible | -| ๐ŸŸ  | โœ๏ธ | [Stylus](https://en.wikipedia.org/wiki/Stylus_(computing)) on a touchscreen | Move, rotate, and multiselection aren't possible | +| ๐ŸŸ  | ๐Ÿ– | [Multi-touch](https://en.wikipedia.org/wiki/Multi-touch) on a [touchscreen](https://en.wikipedia.org/wiki/Touchscreen) | Moving and rotating selections isn't possible | [#7599](https://github.com/openstreetmap/iD/issues/7599) | +| ๐ŸŸ  | โœ๏ธ | [Stylus](https://en.wikipedia.org/wiki/Stylus_(computing)) on a touchscreen | Moving and rotating selections isn't possible, nor is selecting multiple features | | ๐Ÿคท | โœ๏ธ๐Ÿ”ฒ | Stylus on a [graphics tablet](https://en.wikipedia.org/wiki/Graphics_tablet) | | | ๐Ÿคท | ๐ŸŽฎ | [Gamepad](https://en.wikipedia.org/wiki/Gamepad) | | | ๐Ÿคท | ๐Ÿ—ฃ | [Voice](https://en.wikipedia.org/wiki/Voice_user_interface) | Tools like [Voice Control on macOS](https://support.apple.com/en-us/HT210539) and [Windows Speech Recognition](https://en.wikipedia.org/wiki/Windows_Speech_Recognition) allow navigating webpages with voice commands to some degree | | ๐Ÿคท | ๐Ÿ”˜ | [Switch](https://en.wikipedia.org/wiki/Switch_access) | Tools like [Switch Control on macOS](https://support.apple.com/en-us/HT202865) can theoretically replicate mouse and keyboard interactions in most apps | -### Devices +
-This table details iD's support for specific classes of input devices. +## ๐Ÿ“Ÿ System Compatibility -"Full support" for a device means that iD reasonably handles its entire range of input on supported platforms. But unlike the "setups" table above, a given device is not necessarily expected to perform all of iD's functions. +iD is largely platform-independent, meaning it should work on any system that runs a modern web browser. However, certain hardware and software components can affect iD's usability and functionality. -It's impractical to ensure every single input device works as expected, so the table only reflects the support status to the best of our knowledge. +### Display Support -| | Input Device | Notes | Issues | -|---|---|---|---| -| โœ… | Single-button mouse | E.g. [Chester Mouse](https://duckduckgo.com/?q=chester+one+button+mouse&iar=images&iax=images&ia=images). Primary click (e.g. left-click) can be used for all pointer interactions. A long-click on map features opens the edit menu | -| โœ… | Multi-button mouse | Secondary click (e.g. right-click) can be used on map features to open the edit menu. Middle click, etc., are not needed by iD but are passed through to the browser | -| โœ… | Multi-touch mouse | E.g. [Magic Mouse](https://en.wikipedia.org/wiki/Magic_Mouse). 2D scrolling in the map is treated as panning, not zooming | -| ๐ŸŸ  | Vertical [scroll wheel](https://en.wikipedia.org/wiki/Scroll_wheel) | Should zoom the map in and out | [#5550](https://github.com/openstreetmap/iD/issues/5550) | -| โŒ | Horizontal scroll wheel | Currently does nothing in the map | [#7134](https://github.com/openstreetmap/iD/issues/7134) | -| ๐Ÿคท | Scroll ball | E.g. in [Apple Mighty Mouse](https://en.wikipedia.org/wiki/Apple_Mighty_Mouse) | -| ๐ŸŸฉ | Trackball | | -| ๐ŸŸฉ | Trackpad | | -| โœ… | Multi-touch trackpad | E.g. [Magic Trackpad](https://en.wikipedia.org/wiki/Magic_Trackpad). Pinch-to-zoom and scroll-to-pan are supported in the map | -| ๐ŸŸฉ | Pointing stick | | -| โœ… | Keyboard | | +| | Display | Notes | +|---|---|---| +| โŒ | No display | Non-graphical devices and "[headless](https://en.wikipedia.org/wiki/Headless_software)" use cases aren't supported. See also the [vision accessibility](#-vision-accessibility) section | +| ๐ŸŸ  | Small display | iD is not optimized for smartphone-sized screens or smaller, but some editing is usually possible | +| โœ… | Large display | The map expands to fill the entire browser window | +| ๐ŸŸ  | Low pixel density display | Some icons are not legible on low-res displays | +| โœ… | High [pixel density](https://en.wikipedia.org/wiki/Pixel_density) display | iD's vector graphics scale well to high-resolution screens (e.g. [Retina](https://en.wikipedia.org/wiki/Retina_display)) | +| โœ… | Multiple displays | iD responds accordingly when its browser window is moved between different types of external screens | -## Language Support +### Network Support + +| | Connection | Notes | +|---|---|---| +| โŒ | No connection | iD isn't built for offline use out-of-the-box | +| ๐ŸŸ  | Slow connection | iD downloads a lot of data all throughout use, so slow connections can significantly slow down mapping | +| โœ… | Intermittent connection | Downloaded data can be edited during temporary connection losses. A banner message is displayed. Reconnection is attempted automatically and a "Retry" button is also provided | +| โœ… | [Mobile phone connection](https://en.wikipedia.org/wiki/Cellular_network) | A suitably fast, reliable phone network can be used for mapping, with the risk of iD gobbling up data allowances | +| ๐Ÿคท | [Tor](https://en.wikipedia.org/wiki/Tor_%28anonymity_network%29) connection | | + +
+ +## ๐Ÿ“– Language Support English is the language of tags and relation roles in the OpenStreetMap database. It's also the source language of iD's interface, meaning English is the only language @@ -112,21 +160,24 @@ platform. Some languages have region-specific variants, such as Brazilian Portug Translators are typically volunteers. See the [translation guide](https://github.com/openstreetmap/iD/blob/develop/CONTRIBUTING.md#translating) for more info. -| | Localization Feature | Notes | +| | Multilingual Feature | Notes | |---|---|---| | โœ… | Browser language preference | iD tries to use the language set in the browser | | โŒ | Base language fallback | E.g. if `pt_BR` is incomplete, `pt` should be tried before `en` | | โŒ | Custom fallback language | If the preferred language is incomplete, a user-specified one should be tried before `en` (e.g. `kk` โ†’ `ru`) | +| โŒ | [`lang` HTML attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang) | Helps with text-to-speech, text formatting, and auto-transliteration, particularly when iD mixes strings from different languages | | โœ… | Locale URL parameters | `locale` and `rtl` can be used to manually set iD's locale preferences. See the [API](API.md#url-parameters) | -| ๐ŸŸฉ | Right-to-left layouts | Used for languages like Hebrew and Arabic | +| โŒ | Language selection in UI | The mapper should be able to view and change iD's language in the interface at any time. Useful for public computers with fixed browser languages | +| ๐ŸŸฉ | Right-to-left layouts | The [`dir` HTML attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/dir) is properly set for languages like Hebrew and Arabic | +| ๐ŸŸ  | Label icons | Icons should accompany text labels to illustrate the meaning of untranslated terms | ### Translatability -The following table details which interface elements can adapt to the mapper's +This table details which interface elements can adapt to the mapper's language preferences. This doesn't account for whether they've actually been translated to one or more languages. -| | Interface Element | Notes | Issues | +| | Interface Element | Notes | Issues | |---|---|---|---| | โœ… | Labels and descriptions | | | | โœ… | Help docs and walkthrough | | | @@ -150,6 +201,28 @@ listed here. Visit the [Transifex project page](https://www.transifex.com/openst to see the latest numbers. Typically a few languages (German, Spanish, Japaneseโ€ฆ) are kept close to 100% coverage, while most languages have less than 50% coverage. +
+ +## ๐Ÿ‘ Vision Accessibility + +| | Vision-Access Feature | Notes | Issues | +|---|---|---|---| +| ๐Ÿคท | [Screen reader support](https://en.wikipedia.org/wiki/Screen_reader) | | | +| ๐ŸŸ  | [Browser zoom](https://support.mozilla.org/en-US/kb/accessibility-features-firefox-make-firefox-and-we#w_page-zoom) | Scrolling-to-pan the map may react oddly on some browsers | | +| ๐ŸŸ  | [Text-only browser zoom](https://support.mozilla.org/en-US/kb/accessibility-features-firefox-make-firefox-and-we#w_text-zoom) | Enlarged text can overflow containers that have fixed dimensions | | +| ๐ŸŸ  | [Don't rely on color alone](https://www.wuhcag.com/use-of-colour/) | Some classes of map data are indistinguishable except for their colors | | +| ๐Ÿคท | [High-contrast text colors](https://www.wuhcag.com/contrast-enhanced/) | | | +| โŒ | Dark mode | Many people find light-on-dark UIs easier to read under certain conditions | | +| โŒ | Audio feedback | This would need to be easy to disable or even disabled by default | [#5821](https://github.com/openstreetmap/iD/issues/5821) | + +
+ +## ๐Ÿ‘‚ Hearing Accessibility + +iD itself currently has no audio, so hearing difficulties alone are not expected to impact usability. + +
+ --- _Further sections coming soonโ€ฆ_ diff --git a/css/80_app.css b/css/80_app.css index f4ccd6c3b..41d658d5c 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -16,7 +16,7 @@ position: relative; z-index: 0; - font: normal 12px/1.6667 "-apple-system", BlinkMacSystemFont, + font: normal 12px/1.6667 ui-sans-serif, "-apple-system", BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Arial", sans-serif; @@ -147,8 +147,8 @@ kbd { } code { - font-family: monospace, monospace; - background: #eee; + font-family: ui-monospace, monospace, monospace; + background: rgba(174, 174, 174, 0.25); padding: 1px 2px; } @@ -516,6 +516,14 @@ button[disabled].action { .ideditor[dir='rtl'] .top-toolbar .toolbar-item:last-child .item-content { margin-left: 10px; } +.ideditor[dir='ltr'] .top-toolbar .toolbar-item:last-child .item-label, +.ideditor[dir='rtl'] .top-toolbar .toolbar-item:first-child .item-label { + padding-right: 5px; +} +.ideditor[dir='ltr'] .top-toolbar .toolbar-item:first-child .item-label, +.ideditor[dir='rtl'] .top-toolbar .toolbar-item:last-child .item-label { + padding-left: 5px; +} .top-toolbar .toolbar-item .item-label { text-align: center; font-size: 11px; @@ -632,15 +640,17 @@ button.add-note svg.icon { border-bottom: 1px solid #ccc; height: 60px; position: relative; + display: flex; + align-items: center; + justify-content: center; } .header h3 { text-align: center; margin-bottom: 0; - white-space: nowrap; text-overflow: ellipsis; overflow: hidden; - padding: 20px; + padding: 0; } .header button, @@ -657,20 +667,14 @@ button.add-note svg.icon { } .field-help-title button.close, -.sidebar-component .header button.data-editor-close, -.sidebar-component .header button.note-editor-close, -.sidebar-component .header button.qa-editor-close, -.entity-editor-pane .header button.preset-close, +.sidebar .header button.close, .preset-list-pane .header button.preset-choose { position: absolute; right: 0; top: 0; } .ideditor[dir='rtl'] .field-help-title button.close, -.ideditor[dir='rtl'] .sidebar-component .header button.data-editor-close, -.ideditor[dir='rtl'] .sidebar-component .header button.note-editor-close, -.ideditor[dir='rtl'] .sidebar-component .header button.qa-editor-close, -.ideditor[dir='rtl'] .entity-editor-pane .header button.preset-close, +.ideditor[dir='rtl'] .sidebar .header button.close, .ideditor[dir='rtl'] .preset-list-pane .header button.preset-choose { left: 0; right: auto; @@ -728,6 +732,10 @@ button.add-note svg.icon { justify-content: space-between; } +.header-block { + display: flex; + align-items: center; +} .header-block-outer { width: 20%; } @@ -735,6 +743,7 @@ button.add-note svg.icon { .header-block-close { display: flex; justify-content: flex-end; + height: 100%; } /* Hide/Toggle collapsable sections (aka Disclosure) @@ -1382,12 +1391,17 @@ a.hide-toggle { overflow: hidden; } .field-label .label-text { + overflow: hidden; + text-overflow: ellipsis; flex: 1 1 auto; padding: 5px 0 5px 10px; } .ideditor[dir='rtl'] .field-label .label-text { padding: 5px 10px 5px 0; } +.field-label .label-text span { + white-space: nowrap; +} .label-text .label-textannotation svg.icon { margin: 0 8px; @@ -2808,14 +2822,6 @@ input.key-trap { .qa-details-subsection:empty { display: none; } -.qa-details-container code { - padding: .2em .4em; - margin: 0; - font-size: 85%; - font-family: monospace; - background-color: rgba(27,31,35,.05); - border-radius: 3px; -} .note-save .new-comment-input, .qa-save .new-comment-input { @@ -4664,16 +4670,12 @@ img.tile-debug { padding: 20px; border-bottom: 1px solid #ccc; } -.modal-section p:not(:last-of-type), -.modal-section ul { +.modal-section p:not(:last-of-type) { padding-bottom: 20px; } .modal-section h4 { padding-bottom: 0; } -.modal-section.header h3 { - padding: 0; -} .modal-section.buttons { text-align: center; } @@ -4693,7 +4695,6 @@ img.tile-debug { display: flex; flex-wrap: wrap; justify-content: space-around; - margin-bottom: 30px; } .save-section .buttons .action, @@ -4958,6 +4959,9 @@ svg.mouseclick use.right { .settings-custom-background .instructions-template p { margin-bottom: 0; } +.settings-custom-background .instructions-template ul { + padding-bottom: 20px; +} .settings-custom-background .instructions-template ul li { list-style-type: disc; list-style-position: inside; diff --git a/data/core.yaml b/data/core.yaml index 52605c6dc..b6c13418c 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -1221,7 +1221,6 @@ en: mapillary_map_features: title: "Map Features" tooltip: "Map features from Mapillary" - request_data: "Request Data" construction: flat: crosswalk_plain: plain crosswalk diff --git a/data/deprecated.json b/data/deprecated.json index 84f806ded..df3f1941e 100644 --- a/data/deprecated.json +++ b/data/deprecated.json @@ -1390,6 +1390,22 @@ "old": {"toilets:disposal": "pit_latrine"}, "replace": {"toilets:disposal": "pitlatrine"} }, + { + "old": {"toilets:type": "flush"}, + "replace": {"toilets:disposal": "flush"} + }, + { + "old": {"toilets:type": "pit"}, + "replace": {"toilets:disposal": "pitlatrine"} + }, + { + "old": {"toilets:type": "pitlatrine"}, + "replace": {"toilets:disposal": "pitlatrine"} + }, + { + "old": {"toilets:type": "pit latrine"}, + "replace": {"toilets:disposal": "pitlatrine"} + }, { "old": {"tourism": "bed_and_breakfast"}, "replace": {"tourism": "guest_house", "guest_house": "bed_and_breakfast"} diff --git a/data/presets/presets.json b/data/presets/presets.json index 1d116f123..c9d393404 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -177,7 +177,7 @@ "amenity/planetarium": {"icon": "maki-globe", "fields": ["name", "operator", "address", "building_area", "opening_hours", "opening_hours/covid19"], "moreFields": ["air_conditioning", "charge_fee", "email", "fax", "fee", "gnis/feature_id", "payment_multi_fee", "phone", "website", "wheelchair"], "geometry": ["point", "area"], "terms": ["museum", "astronomy", "observatory"], "tags": {"amenity": "planetarium"}, "name": "Planetarium"}, "amenity/police": {"icon": "temaki-police_officer", "fields": ["name", "operator", "address", "building_area", "opening_hours", "opening_hours/covid19"], "moreFields": ["email", "fax", "gnis/feature_id", "level", "phone", "polling_station", "website", "wheelchair"], "geometry": ["point", "area"], "terms": ["badge", "constable", "constabulary", "cop", "detective", "fed", "law", "enforcement", "officer", "patrol"], "tags": {"amenity": "police"}, "name": "Police"}, "amenity/polling_station": {"icon": "fas-vote-yea", "fields": ["name", "ref", "operator", "address", "opening_hours", "opening_hours/covid19", "building_area"], "moreFields": ["air_conditioning", "email", "fax", "gnis/feature_id", "internet_access", "internet_access/fee", "internet_access/ssid", "level", "phone", "website", "wheelchair"], "geometry": ["point", "area"], "terms": ["ballot box", "ballot drop", "democracy", "elections", "polling place", "vote", "voting booth", "voting machine"], "tags": {"amenity": "polling_station"}, "addTags": {"amenity": "polling_station", "polling_station": "yes"}, "name": "Permanent Polling Place"}, - "amenity/post_box": {"icon": "temaki-post_box", "fields": ["operator", "collection_times", "drive_through", "ref"], "moreFields": ["access_simple", "brand", "covered", "gnis/feature_id", "height", "indoor", "level", "manufacturer", "wheelchair"], "geometry": ["point", "vertex"], "tags": {"amenity": "post_box"}, "terms": ["drop box", "dropbox", "letter drop", "mail box", "mail collection box", "mail drop", "mail dropoff", "mailbox", "package drop", "pillar box", "pillarbox", "post box", "postal box", "postbox"], "name": "Mail Drop Box"}, + "amenity/post_box": {"icon": "temaki-post_box", "fields": ["operator", "collection_times", "drive_through", "ref"], "moreFields": ["access_simple", "brand", "colour", "covered", "gnis/feature_id", "height", "indoor", "level", "manufacturer", "material", "support", "wheelchair"], "geometry": ["point", "vertex"], "tags": {"amenity": "post_box"}, "terms": ["drop box", "dropbox", "letter drop", "mail box", "mail collection box", "mail drop", "mail dropoff", "mailbox", "package drop", "pillar box", "pillarbox", "post box", "postal box", "postbox"], "name": "Mail Drop Box"}, "amenity/post_depot": {"icon": "fas-mail-bulk", "fields": ["name", "operator", "address", "building_area", "phone"], "moreFields": ["email", "fax", "gnis/feature_id", "opening_hours", "opening_hours/covid19", "website", "wheelchair"], "geometry": ["point", "area"], "terms": ["mail processing and distribution center", "post depot"], "tags": {"amenity": "post_depot"}, "name": "Post Sorting Office"}, "amenity/post_office": {"icon": "maki-post", "fields": ["name", "operator", "address", "building_area", "opening_hours", "opening_hours/covid19"], "moreFields": ["brand", "email", "fax", "gnis/feature_id", "internet_access", "internet_access/fee", "internet_access/ssid", "level", "payment_multi", "phone", "polling_station", "website", "wheelchair"], "geometry": ["point", "area"], "terms": ["letter", "mail"], "tags": {"amenity": "post_office"}, "name": "Post Office"}, "amenity/prep_school": {"icon": "temaki-school", "fields": ["name", "operator", "address", "building_area", "opening_hours", "opening_hours/covid19"], "moreFields": ["email", "fax", "gnis/feature_id", "level", "payment_multi", "phone", "website", "wheelchair"], "geometry": ["point", "area"], "terms": ["academic", "ACT", "SAT", "homework", "math", "reading", "test prep", "tutoring", "writing"], "tags": {"amenity": "prep_school"}, "name": "Test Prep / Tutoring School"}, diff --git a/data/presets/presets/amenity/post_box.json b/data/presets/presets/amenity/post_box.json index 91c72f567..abd81baf7 100644 --- a/data/presets/presets/amenity/post_box.json +++ b/data/presets/presets/amenity/post_box.json @@ -9,12 +9,15 @@ "moreFields": [ "access_simple", "brand", + "colour", "covered", "gnis/feature_id", "height", "indoor", "level", "manufacturer", + "material", + "support", "wheelchair" ], "geometry": [ diff --git a/data/taginfo.json b/data/taginfo.json index 5b94a2cdf..aa63944fd 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -2314,6 +2314,10 @@ {"key": "TODO", "description": "๐Ÿ„ณ โžœ fixme=*"}, {"key": "toilets:disposal", "value": "longdrop", "description": "๐Ÿ„ณ โžœ toilets:disposal=pitlatrine"}, {"key": "toilets:disposal", "value": "pit_latrine", "description": "๐Ÿ„ณ โžœ toilets:disposal=pitlatrine"}, + {"key": "toilets:type", "value": "flush", "description": "๐Ÿ„ณ โžœ toilets:disposal=flush"}, + {"key": "toilets:type", "value": "pit", "description": "๐Ÿ„ณ โžœ toilets:disposal=pitlatrine"}, + {"key": "toilets:type", "value": "pitlatrine", "description": "๐Ÿ„ณ โžœ toilets:disposal=pitlatrine"}, + {"key": "toilets:type", "value": "pit latrine", "description": "๐Ÿ„ณ โžœ toilets:disposal=pitlatrine"}, {"key": "tourism", "value": "bed_and_breakfast", "description": "๐Ÿ„ณ โžœ tourism=guest_house + guest_house=bed_and_breakfast"}, {"key": "tower:type", "value": "power", "description": "๐Ÿ„ณ โžœ power=tower"}, {"key": "tower:type", "value": "anchor", "description": "๐Ÿ„ณ โžœ line_attachment=anchor"}, diff --git a/dist/locales/en.json b/dist/locales/en.json index 2f9f8db96..2c79d226b 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -1540,7 +1540,6 @@ "mapillary_map_features": { "title": "Map Features", "tooltip": "Map features from Mapillary", - "request_data": "Request Data", "construction": { "flat": { "crosswalk_plain": "plain crosswalk" diff --git a/modules/behavior/hover.js b/modules/behavior/hover.js index 5be06461a..4f67a11fd 100644 --- a/modules/behavior/hover.js +++ b/modules/behavior/hover.js @@ -78,7 +78,7 @@ export function behaviorHover(context) { .on(_pointerPrefix + 'down.hover', pointerover); d3_select(window) - .on(_pointerPrefix + 'up.hover', pointerout, true) + .on(_pointerPrefix + 'up.hover pointercancel.hover', pointerout, true) .on('keydown.hover', keydown) .on('keyup.hover', keyup); @@ -208,7 +208,7 @@ export function behaviorHover(context) { .on(_pointerPrefix + 'down.hover', null); d3_select(window) - .on(_pointerPrefix + 'up.hover', null, true) + .on(_pointerPrefix + 'up.hover pointercancel.hover', null, true) .on('keydown.hover', null) .on('keyup.hover', null); }; diff --git a/modules/modes/select.js b/modules/modes/select.js index e595e0178..440a6416e 100644 --- a/modules/modes/select.js +++ b/modules/modes/select.js @@ -487,6 +487,8 @@ export function modeSelect(context, selectedIDs) { mode.exit = function() { + _newFeature = false; + _operations.forEach(function(operation) { if (operation.behavior) { context.uninstall(operation.behavior); diff --git a/modules/services/mapillary.js b/modules/services/mapillary.js index 7d0c560eb..50ce60ede 100644 --- a/modules/services/mapillary.js +++ b/modules/services/mapillary.js @@ -14,7 +14,6 @@ var viewercss = 'mapillary-js/mapillary.min.css'; var viewerjs = 'mapillary-js/mapillary.min.js'; var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi'; var mapFeatureConfig = { - organizationKey: 'FI3NAFfzQQgdF081TRdgTy', values: [ 'construction--flat--crosswalk-plain', 'marking--discrete--crosswalk-zebra', @@ -372,8 +371,8 @@ export default { loadMapFeatures: function(projection) { // if we are looking at signs, we'll actually need to fetch images too loadTiles('images', apibase + 'images?sort_by=key', projection); - loadTiles('points', apibase + 'map_features?layers=points&min_nbr_image_detections=2&sort_by=key&shapes_by_organization_keys=' + mapFeatureConfig.organizationKey + '&' + 'values=' + mapFeatureConfig.values + '&', projection); - loadTiles('image_detections', apibase + 'image_detections?layers=points&sort_by=key&shapes_by_organization_keys=' + mapFeatureConfig.organizationKey + '&' + 'values=' + mapFeatureConfig.values + '&', projection); + loadTiles('points', apibase + 'map_features?layers=points&min_nbr_image_detections=2&sort_by=key&values=' + mapFeatureConfig.values + '&', projection); + loadTiles('image_detections', apibase + 'image_detections?layers=points&sort_by=key&values=' + mapFeatureConfig.values + '&', projection); }, diff --git a/modules/services/streetside.js b/modules/services/streetside.js index 3c81d218b..04ee1d41a 100644 --- a/modules/services/streetside.js +++ b/modules/services/streetside.js @@ -469,26 +469,6 @@ export default { options.scenes[sceneID] = _sceneOptions; _pannellumViewer = window.pannellum.viewer('ideditor-viewer-streetside', options); - - var pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse'; - - _pannellumViewer - .on(pointerPrefix + 'down', () => { - d3_select(window) - .on(pointerPrefix + 'move.pannellum', () => { dispatch.call('viewerChanged'); }); - }) - .on(pointerPrefix + 'up', () => { - d3_select(window) - .on(pointerPrefix + 'move.pannellum', null); - - // continue dispatching events for a few seconds, in case viewer has inertia. - let t = d3_timer(elapsed => { - dispatch.call('viewerChanged'); - if (elapsed > 2000) { - t.stop(); - } - }); - }); }, @@ -498,6 +478,8 @@ export default { loadViewer: function(context) { let that = this; + let pointerPrefix = 'PointerEvent' in window ? 'pointer' : 'mouse'; + // create ms-wrapper, a photo wrapper class let wrap = context.container().select('.photoviewer').selectAll('.ms-wrapper') .data([0]); @@ -513,6 +495,24 @@ export default { wrapEnter .append('div') .attr('id', 'ideditor-viewer-streetside') + .on(pointerPrefix + 'down.streetside', () => { + d3_select(window) + .on(pointerPrefix + 'move.streetside', () => { + dispatch.call('viewerChanged'); + }, true); + }) + .on(pointerPrefix + 'up.streetside pointercancel.streetside', () => { + d3_select(window) + .on(pointerPrefix + 'move.streetside', null); + + // continue dispatching events for a few seconds, in case viewer has inertia. + let t = d3_timer(elapsed => { + dispatch.call('viewerChanged'); + if (elapsed > 2000) { + t.stop(); + } + }); + }) .append('div') .attr('class', 'photo-attribution fillD'); diff --git a/modules/svg/data.js b/modules/svg/data.js index c18f9215f..94abf00d5 100644 --- a/modules/svg/data.js +++ b/modules/svg/data.js @@ -500,10 +500,13 @@ export function svgData(projection, context, dispatch) { var map = context.map(); var viewport = map.trimmedExtent().polygon(); var coords = features.reduce(function(coords, feature) { - var c = feature.geometry.coordinates; + var geom = feature.geometry; + if (!geom) return coords; + + var c = geom.coordinates; /* eslint-disable no-fallthrough */ - switch (feature.geometry.type) { + switch (geom.type) { case 'Point': c = [c]; case 'MultiPoint': diff --git a/modules/svg/streetside.js b/modules/svg/streetside.js index 023d333e0..5d489e9aa 100644 --- a/modules/svg/streetside.js +++ b/modules/svg/streetside.js @@ -30,8 +30,8 @@ export function svgStreetside(projection, context, dispatch) { if (services.streetside && !_streetside) { _streetside = services.streetside; _streetside.event - .on('viewerChanged', viewerChanged) - .on('loadedBubbles', throttledRedraw); + .on('viewerChanged.svgStreetside', viewerChanged) + .on('loadedBubbles.svgStreetside', throttledRedraw); } else if (!services.streetside && _streetside) { _streetside = null; } diff --git a/modules/ui/commit.js b/modules/ui/commit.js index a0f494952..01271385a 100644 --- a/modules/ui/commit.js +++ b/modules/ui/commit.js @@ -270,7 +270,7 @@ export function uiCommit(context) { saveSection = saveSection.enter() .append('div') - .attr('class','modal-section save-section fillL cf') + .attr('class','modal-section save-section fillL') .merge(saveSection); var prose = saveSection.selectAll('.commit-info') @@ -355,7 +355,7 @@ export function uiCommit(context) { // enter var buttonEnter = buttonSection.enter() .append('div') - .attr('class', 'buttons fillL cf'); + .attr('class', 'buttons fillL'); buttonEnter .append('button') diff --git a/modules/ui/data_editor.js b/modules/ui/data_editor.js index df5370c24..7048f04a2 100644 --- a/modules/ui/data_editor.js +++ b/modules/ui/data_editor.js @@ -25,7 +25,7 @@ export function uiDataEditor(context) { headerEnter .append('button') - .attr('class', 'fr data-editor-close') + .attr('class', 'close') .on('click', function() { context.enter(modeBrowse(context)); }) diff --git a/modules/ui/entity_editor.js b/modules/ui/entity_editor.js index e18387fda..9cb24141e 100644 --- a/modules/ui/entity_editor.js +++ b/modules/ui/entity_editor.js @@ -45,12 +45,12 @@ export function uiEntityEditor(context) { headerEnter .append('button') - .attr('class', 'fl preset-reset preset-choose') + .attr('class', 'preset-reset preset-choose') .call(svgIcon((localizer.textDirection() === 'rtl') ? '#iD-icon-forward' : '#iD-icon-backward')); headerEnter .append('button') - .attr('class', 'fr preset-close') + .attr('class', 'close') .on('click', function() { context.enter(modeBrowse(context)); }) .call(svgIcon(_modified ? '#iD-icon-apply' : '#iD-icon-close')); diff --git a/modules/ui/improveOSM_editor.js b/modules/ui/improveOSM_editor.js index 784a6b815..932f62f74 100644 --- a/modules/ui/improveOSM_editor.js +++ b/modules/ui/improveOSM_editor.js @@ -30,7 +30,7 @@ export function uiImproveOsmEditor(context) { headerEnter .append('button') - .attr('class', 'fr qa-editor-close') + .attr('class', 'close') .on('click', () => context.enter(modeBrowse(context))) .call(svgIcon('#iD-icon-close')); diff --git a/modules/ui/inspector.js b/modules/ui/inspector.js index 4362d09a0..2dc6825f8 100644 --- a/modules/ui/inspector.js +++ b/modules/ui/inspector.js @@ -17,7 +17,7 @@ export function uiInspector(context) { var _newFeature = false; - function inspector(selection, newFeature) { + function inspector(selection) { presetList .entityIDs(_entityIDs) .autofocus(_newFeature) @@ -25,6 +25,7 @@ export function uiInspector(context) { .on('cancel', function() { wrap.transition() .styleTween('right', function() { return d3_interpolate('-100%', '0%'); }); + editorPane.call(entityEditor); }); entityEditor @@ -66,7 +67,7 @@ export function uiInspector(context) { if (entity.hasNonGeometryTags()) return false; // prompt to select preset if feature is new and untagged - if (newFeature) return true; + if (_newFeature) return true; // all existing features except vertices should default to inspector if (entity.geometry(context.graph()) !== 'vertex') return false; diff --git a/modules/ui/intro/navigation.js b/modules/ui/intro/navigation.js index 7843aac4c..8fe4cc3f5 100644 --- a/modules/ui/intro/navigation.js +++ b/modules/ui/intro/navigation.js @@ -361,7 +361,7 @@ export function uiIntroNavigation(context, reveal) { function closeTownHall() { if (!isTownHallSelected()) return clickTownHall(); - var selector = '.entity-editor-pane button.preset-close svg use'; + var selector = '.entity-editor-pane button.close svg use'; var href = d3_select(selector).attr('href') || '#iD-icon-close'; reveal('.entity-editor-pane', @@ -374,7 +374,7 @@ export function uiIntroNavigation(context, reveal) { context.history().on('change.intro', function() { // update the close icon in the tooltip if the user edits something. - var selector = '.entity-editor-pane button.preset-close svg use'; + var selector = '.entity-editor-pane button.close svg use'; var href = d3_select(selector).attr('href') || '#iD-icon-close'; reveal('.entity-editor-pane', @@ -497,7 +497,7 @@ export function uiIntroNavigation(context, reveal) { function editorStreet() { - var selector = '.entity-editor-pane button.preset-close svg use'; + var selector = '.entity-editor-pane button.close svg use'; var href = d3_select(selector).attr('href') || '#iD-icon-close'; reveal('.entity-editor-pane', @@ -514,7 +514,7 @@ export function uiIntroNavigation(context, reveal) { context.history().on('change.intro', function() { // update the close icon in the tooltip if the user edits something. - var selector = '.entity-editor-pane button.preset-close svg use'; + var selector = '.entity-editor-pane button.close svg use'; var href = d3_select(selector).attr('href') || '#iD-icon-close'; reveal('.entity-editor-pane', diff --git a/modules/ui/intro/point.js b/modules/ui/intro/point.js index 81917c9cd..5daf86937 100644 --- a/modules/ui/intro/point.js +++ b/modules/ui/intro/point.js @@ -244,7 +244,7 @@ export function uiIntroPoint(context, reveal) { // reset pane, in case user happened to change it.. context.container().select('.inspector-wrap .panewrap').style('right', '0%'); - var selector = '.entity-editor-pane button.preset-close svg use'; + var selector = '.entity-editor-pane button.close svg use'; var href = d3_select(selector).attr('href') || '#iD-icon-close'; context.on('exit.intro', function() { diff --git a/modules/ui/keepRight_editor.js b/modules/ui/keepRight_editor.js index 4145d98aa..1cf31797e 100644 --- a/modules/ui/keepRight_editor.js +++ b/modules/ui/keepRight_editor.js @@ -29,7 +29,7 @@ export function uiKeepRightEditor(context) { headerEnter .append('button') - .attr('class', 'fr qa-editor-close') + .attr('class', 'close') .on('click', () => context.enter(modeBrowse(context))) .call(svgIcon('#iD-icon-close')); diff --git a/modules/ui/note_editor.js b/modules/ui/note_editor.js index f16a71339..c49dcdfaa 100644 --- a/modules/ui/note_editor.js +++ b/modules/ui/note_editor.js @@ -46,7 +46,7 @@ export function uiNoteEditor(context) { headerEnter .append('button') - .attr('class', 'fr note-editor-close') + .attr('class', 'close') .on('click', function() { context.enter(modeBrowse(context)); }) diff --git a/modules/ui/osmose_editor.js b/modules/ui/osmose_editor.js index 84c36bec1..6423d23c1 100644 --- a/modules/ui/osmose_editor.js +++ b/modules/ui/osmose_editor.js @@ -29,7 +29,7 @@ export function uiOsmoseEditor(context) { headerEnter .append('button') - .attr('class', 'fr qa-editor-close') + .attr('class', 'close') .on('click', () => context.enter(modeBrowse(context))) .call(svgIcon('#iD-icon-close')); diff --git a/modules/ui/sections/photo_overlays.js b/modules/ui/sections/photo_overlays.js index 2224f6647..b3c83f2b2 100644 --- a/modules/ui/sections/photo_overlays.js +++ b/modules/ui/sections/photo_overlays.js @@ -4,7 +4,6 @@ import { import { t } from '../../core/localizer'; import { uiTooltip } from '../tooltip'; -import { svgIcon } from '../../svg/icon'; import { uiSection } from '../section'; export function uiSectionPhotoOverlays(context) { @@ -93,17 +92,6 @@ export function uiSectionPhotoOverlays(context) { return t(id.replace(/-/g, '_') + '.title'); }); - labelEnter - .filter(function(d) { return d.id === 'mapillary-map-features'; }) - .append('a') - .attr('class', 'request-data-link') - .attr('target', '_blank') - .attr('tabindex', -1) - .call(svgIcon('#iD-icon-out-link', 'inline')) - .attr('href', 'https://mapillary.github.io/mapillary_solutions/data-request') - .append('span') - .text(t('mapillary_map_features.request_data')); - // Update li diff --git a/modules/ui/sidebar.js b/modules/ui/sidebar.js index af3ba323b..0f87ceecb 100644 --- a/modules/ui/sidebar.js +++ b/modules/ui/sidebar.js @@ -238,7 +238,8 @@ export function uiSidebar(context) { if (!inspector.entityIDs() || !utilArrayIdentical(inspector.entityIDs(), [datum.id]) || inspector.state() !== 'hover') { inspector .state('hover') - .entityIDs([datum.id]); + .entityIDs([datum.id]) + .newFeature(false); inspectorWrap .call(inspector); @@ -300,7 +301,7 @@ export function uiSidebar(context) { .newFeature(newFeature); inspectorWrap - .call(inspector, newFeature); + .call(inspector); } } else { diff --git a/modules/ui/success.js b/modules/ui/success.js index f3b62160b..46454d7e2 100644 --- a/modules/ui/success.js +++ b/modules/ui/success.js @@ -72,16 +72,16 @@ export function uiSuccess(context) { .append('div') .attr('class', 'header fillL'); - header - .append('button') - .attr('class', 'fr') - .on('click', () => dispatch.call('cancel')) - .call(svgIcon('#iD-icon-close')); - header .append('h3') .text(t('success.just_edited')); + header + .append('button') + .attr('class', 'close') + .on('click', () => dispatch.call('cancel')) + .call(svgIcon('#iD-icon-close')); + let body = selection .append('div') .attr('class', 'body save-success fillL'); diff --git a/package.json b/package.json index 2bf550ad0..df5a29f02 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,7 @@ "postcss": "^7.0.27", "postcss-selector-prepend": "^0.5.0", "request": "^2.88.0", - "rollup": "~2.18.0", + "rollup": "~2.21.0", "rollup-plugin-includepaths": "~0.2.3", "rollup-plugin-progress": "^1.1.1", "rollup-plugin-visualizer": "~4.0.4",