Merge branch 'develop' into touch-walkthrough-update

This commit is contained in:
Quincy Morgan
2020-07-10 10:32:36 -04:00
28 changed files with 230 additions and 138 deletions
+115 -42
View File
@@ -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
<br/>
## 🔗 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
<br/>
## 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
<br/>
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 | |
<br/>
## 📖 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.
<br/>
## 👁 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) |
<br/>
## 👂 Hearing Accessibility
iD itself currently has no audio, so hearing difficulties alone are not expected to impact usability.
<br/>
---
_Further sections coming soon…_
+31 -27
View File
@@ -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;
-1
View File
@@ -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
+16
View File
@@ -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"}
+1 -1
View File
@@ -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"},
@@ -9,12 +9,15 @@
"moreFields": [
"access_simple",
"brand",
"colour",
"covered",
"gnis/feature_id",
"height",
"indoor",
"level",
"manufacturer",
"material",
"support",
"wheelchair"
],
"geometry": [
+4
View File
@@ -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"},
-1
View File
@@ -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"
+2 -2
View File
@@ -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);
};
+2
View File
@@ -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);
+2 -3
View File
@@ -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);
},
+20 -20
View File
@@ -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');
+5 -2
View File
@@ -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':
+2 -2
View File
@@ -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;
}
+2 -2
View File
@@ -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')
+1 -1
View File
@@ -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));
})
+2 -2
View File
@@ -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'));
+1 -1
View File
@@ -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'));
+3 -2
View File
@@ -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;
+4 -4
View File
@@ -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',
+1 -1
View File
@@ -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() {
+1 -1
View File
@@ -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'));
+1 -1
View File
@@ -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));
})
+1 -1
View File
@@ -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'));
-12
View File
@@ -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
+3 -2
View File
@@ -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 {
+6 -6
View File
@@ -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');
+1 -1
View File
@@ -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",