| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | Making your own theme | 
					
						
							|  |  |  | ===================== | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | In MapComplete, it is relatively simple to make your own theme. This guide will give some information on how you can do | 
					
						
							|  |  |  | this. | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | Requirements | 
					
						
							|  |  |  | ------------ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Before you start, you should have the following qualifications: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - You are a longtime contributor and do know the OpenStreetMap tagging scheme very well. | 
					
						
							|  |  |  | - You are not afraid of editing a .JSON-file | 
					
						
							|  |  |  | - You're theme will add well-understood tags (aka: the tags have a wiki page, are not controversial and are objective) | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | - You are in contact with your local OpenStreetMap community and do know some other members to discuss tagging and to | 
					
						
							|  |  |  |   help testing | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | If you do not have those qualifications, reach out to the MapComplete community channel | 
					
						
							|  |  |  | on [Telegram](https://t.me/MapComplete) | 
					
						
							| 
									
										
										
										
											2021-07-11 12:25:16 +02:00
										 |  |  | or [Matrix](https://app.element.io/#/room/#MapComplete:matrix.org). | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | The custom theme generator | 
					
						
							|  |  |  | -------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | The custom theme generator is a special page of MapComplete, where one can create their own theme. It makes it easier to | 
					
						
							|  |  |  | get started. | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | However, the custom theme generator is extremely buggy and built before some updates. This means that some features | 
					
						
							|  |  |  | are _not_ available through the custom theme generator. The custom theme generator is good to get the basics of the | 
					
						
							|  |  |  | theme set up, but you will have to edit the raw JSON-file anyway afterwards. | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-23 19:34:34 +01:00
										 |  |  | [A quick tutorial for the custom theme generator can be found here](https://www.youtube.com/watch?v=nVbFrNVPxPw). | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | Loading your theme | 
					
						
							|  |  |  | ------------------ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | If you have your .json file, there are three ways to distribute your theme: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | - Take the entire JSON-file and [base64](https://www.base64encode.org/) encode it. Then open up the | 
					
						
							|  |  |  |   url `https://mapcomplete.osm.be?userlayout=true#<base64-encoded-json-here>`. Yes, this URL will be huge; and updates | 
					
						
							|  |  |  |   are difficult to distribute as you have to send a new URL to everyone. This is however excellent to have a 'quick and | 
					
						
							|  |  |  |   dirty' test version up and running as these links can be generated from the customThemeGenerator and can be quickly | 
					
						
							|  |  |  |   shared with a few other contributors. | 
					
						
							|  |  |  | - Host the JSON file on a publicly accessible webserver (e.g. github) and open | 
					
						
							|  |  |  |   up `https://mapcomplete.osm.be?userlayout=<url-to-the-raw.json>` | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | - Ask to have your theme included into the official MapComplete - requirements below | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Getting your theme included into the official mapcomplete
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | Did you make an awesome theme that you want to share with the OpenStreetMap community? Have it included in the main | 
					
						
							|  |  |  | application, which makes it more discoverable. | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | Your theme has to be: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | 0) Make sure the theme has an English version. This makes it easier for me to understand what is going on. The more | 
					
						
							|  |  |  |    other languages, the better of course! | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | 1) Make sure your theme has good tagging | 
					
						
							|  |  |  | 3) Make sure there are somewhat decent icons. Note that there is _no_ styleguide at the moment though. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | The preferred way to add your theme is via a Pull Request. A Pull Request is less work for the maintainer (which makes | 
					
						
							|  |  |  | it really easy and for me to add it) and your name will be included in the git history (so you'll be listed as | 
					
						
							|  |  |  | contributor). If that is not possible, send the .Json-file and assets, e.g. as a zip in an issue, per email, ... | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | *Via a pull request:* | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 1) Fork this repository | 
					
						
							|  |  |  | 2) Go to `assets/themes` and create a new directory `yourtheme` | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | 3) Create a new file `yourtheme.json`, paste the theme configuration in there. You can find your theme configuration in | 
					
						
							|  |  |  |    the customThemeBuilder (the tab with the *Floppy disk* icon) | 
					
						
							|  |  |  | 4) Copy all the images into this new directory. **No external sources are allowed!** External image sources leak privacy | 
					
						
							|  |  |  |    or can break. | 
					
						
							| 
									
										
										
										
											2021-04-10 13:41:45 +02:00
										 |  |  |     - Make sure the license is suitable, preferable a Creative Commons license or CC0-license. | 
					
						
							|  |  |  |     - If an SVG version is available, use the SVG version | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |     - Make sure all the links in `yourtheme.json` are updated. You can use `./assets/themes/yourtheme/yourimage.svg` | 
					
						
							|  |  |  |       instead of the HTML link | 
					
						
							|  |  |  |     - Create a file `license_info.json` in the theme directory, which contains metadata on every artwork source | 
					
						
							|  |  |  | 5) Add your theme to the code base: add it into "assets/themes" and make sure all the images are there too. Running ' | 
					
						
							|  |  |  |    ts-node scripts/fixTheme <path to your theme>' will help downloading the images and attempts to get the licenses if | 
					
						
							|  |  |  |    on wikimedia. | 
					
						
							|  |  |  | 6) Add some finishing touches, such as a social image. | 
					
						
							|  |  |  |    See [this blog post](https://www.h3xed.com/web-and-internet/how-to-use-og-image-meta-tag-facebook-reddit) for some | 
					
						
							|  |  |  |    hints | 
					
						
							|  |  |  | 7) Test your theme: run the project as described in [development_deployment](Development_deployment.md) | 
					
						
							|  |  |  | 8) Happy with your theme? Time to open a Pull Request! | 
					
						
							|  |  |  | 9) Thanks a lot for improving MapComplete! | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The .JSON-format | 
					
						
							|  |  |  | ---------------- | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | There are three important levels in the .JSON-file: | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | - The toplevel describes the metadata of the entire theme. It contains the `title`, `description`, `icon`... of the | 
					
						
							|  |  |  |   theme. The most important object is `layers`, which is a list of objects describing layers. | 
					
						
							|  |  |  | - A `layer` describes a layer. It contains the `name`, `icon`, `tags of objects to download from overpass`, and | 
					
						
							|  |  |  |   especially the `icon` and a way to ask dynamically render tags and ask questions. A lot of those fields (`icon` | 
					
						
							|  |  |  |   , `title`, ...) are actually a `TagRendering` | 
					
						
							|  |  |  | - A `TagRendering` is an object describing a relationship between what should be shown on screen and the OSM-tagging. It | 
					
						
							|  |  |  |   works in two ways: if the correct tag is known, the appropriate text will be shown. If the tag is missing (and a | 
					
						
							|  |  |  |   question is defined), the question will be shown. | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | Every field is documented in the source code itself - you can find them here: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-07 23:13:46 +02:00
										 |  |  | - [The top level `LayoutConfig`](https://github.com/pietervdvn/MapComplete/blob/master/Models/ThemeConfig/Json/LayoutConfigJson.ts) | 
					
						
							|  |  |  | - [A layer object `LayerConfig`](https://github.com/pietervdvn/MapComplete/blob/master/Models/ThemeConfig/Json/LayerConfigJson.ts) | 
					
						
							|  |  |  | - [The `TagRendering`](https://github.com/pietervdvn/MapComplete/blob/master/Models/ThemeConfig/Json/TagRenderingConfigJson.ts) | 
					
						
							| 
									
										
										
										
											2021-05-11 10:08:51 +02:00
										 |  |  | - At last, the exact semantics of tags is documented [here](Tags_format.md) | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-07 17:52:05 +01:00
										 |  |  | A JSON-schema file is available in Docs/Schemas - use LayoutConfig.schema.json to validate a theme file. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-22 02:48:01 +01:00
										 |  |  | ### MetaTags
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | There are few tags available that are calculated for convenience - e.g. the country an object is located | 
					
						
							| 
									
										
										
										
											2022-01-14 22:54:11 +01:00
										 |  |  | at. [An overview of all these metatags is available here](CalculatedTags.md) | 
					
						
							| 
									
										
										
										
											2021-03-22 02:48:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-12 01:44:13 +01:00
										 |  |  | ### TagRendering groups
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | A tagRendering can have a `group`-attribute, which acts as a tag. All tagRenderings with the same group name will be | 
					
						
							|  |  |  | rendered together, in the same order as they were defined. | 
					
						
							| 
									
										
										
										
											2021-11-12 01:44:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | For example, if the defined tagrenderings have groups `A A B A A B B B`, the group order is `A B` and first all | 
					
						
							|  |  |  | tagrenderings from group A will be rendered (thus numbers 0, 1, 3 and 4) followed by the question box for this group. | 
					
						
							| 
									
										
										
										
											2021-11-12 01:44:13 +01:00
										 |  |  | Then, all the tagRenderings for group B will be shown, thus number 2, 5, 6 and 7, again followed by their questionbox. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | Additionally, every tagrendering will receive a the groupname as class in the HTML, which can be used to hook up custom | 
					
						
							|  |  |  | CSS. | 
					
						
							| 
									
										
										
										
											2021-11-12 01:44:13 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | If no group tag is given, the group is `` (empty string) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Deciding the questions position
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | By default, the questions are shown just beneath their group. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To override this behaviour, one can add a tagrendering with id `questions` to move the questions up. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To add a title to the questions, one can add a `render` and a condition. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-26 21:40:38 +01:00
										 |  |  | To change the behaviour of the questionbox to show _all_ questions at once, one can use a helperArgs in the freeform | 
					
						
							|  |  |  | field with option `showAllQuestions`. | 
					
						
							| 
									
										
										
										
											2021-11-12 01:44:13 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | For example, to show the questions on top, use: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | "tagRenderings": [ | 
					
						
							|  |  |  |     { "id": "questions" } | 
					
						
							|  |  |  |     { ... some tagrendering ... } | 
					
						
							|  |  |  |     { ... more tagrendering ...} | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To show _all_ the questions of a group at once in the middle of the tagrenderings, with a header, use: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | "tagRenderings": [ | 
					
						
							|  |  |  |     {  | 
					
						
							|  |  |  |       "id": "questions" , | 
					
						
							|  |  |  |       "group": "groupname", | 
					
						
							|  |  |  |       "render": { | 
					
						
							|  |  |  |         "en": "<h3>Technical questions</h3>The following questions are very technical!<br />{questions} | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       "freeform": { | 
					
						
							|  |  |  |         "key": "questions", | 
					
						
							|  |  |  |         "helperArgs": { | 
					
						
							|  |  |  |             "showAllQuestions": true | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     { ... some tagrendering ... } | 
					
						
							|  |  |  |     { ... more tagrendering ...} | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | Some hints | 
					
						
							| 
									
										
										
										
											2021-04-03 21:33:11 +02:00
										 |  |  | ------------ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### Everything is HTML
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | All the texts are actually *HTML*-snippets, so you can use `<b>` to add bold, or `<img src=...>` to add images to | 
					
						
							|  |  |  | mappings or tagrenderings. | 
					
						
							| 
									
										
										
										
											2021-04-03 21:33:11 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | Some remarks: | 
					
						
							| 
									
										
										
										
											2021-04-03 21:33:11 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | - links are disabled when answering a question (e.g. a link in a mapping) as it should trigger the answer - not trigger | 
					
						
							|  |  |  |   to open the link. | 
					
						
							|  |  |  | - If you include images, e.g. to clarify a type, make sure these are _icons_ or _diagrams_ - not actual pictures! If | 
					
						
							|  |  |  |   users see a picture, they think it is a picture of _that actual object_, not a type to clarify the type. An icon is | 
					
						
							|  |  |  |   however perceived as something more abstract. | 
					
						
							| 
									
										
										
										
											2021-03-22 02:48:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | Some pitfalls | 
					
						
							| 
									
										
										
										
											2021-03-22 02:48:01 +01:00
										 |  |  | --------------- | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | ### Not publishing
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | Not publishing because 'it is not good enough'. _Share your theme, even if it is still not great, let the community help | 
					
						
							|  |  |  | it improve_ | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | ### Thinking in terms of a question
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | Making a tagrendering as if it were a question only. If you have a question such as: _Does this bench have a backrest?_, | 
					
						
							|  |  |  | it is very tempting to have as options _yes_ for `backrest=yes` and _no_ for `backrest=no`. However, when this data is | 
					
						
							|  |  |  | known, it will simply show a lone _yes_ or _no_ which is very unclear. | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | The correct way to handle this is to use _This bench does have a backrest_ and _This bench does not have a backrest_ as | 
					
						
							|  |  |  | answers. | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | One has to think first in terms of _what is shown to the user if it is known_, only then in terms of _what is the | 
					
						
							|  |  |  | question I want to ask_ | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-24 01:56:56 +01:00
										 |  |  | ### Forgetting the casual/noob mapper
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | MapComplete is in the first place a tool to help *non-technical* people visualize their interest and contribute to it. | 
					
						
							|  |  |  | In order to maximize contribution: | 
					
						
							| 
									
										
										
										
											2021-03-24 01:56:56 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 1. Use simple language. Avoid difficult words and explain jargon | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | 2. Put the simple questions first and the difficult ones on the back. The contributor can then stop at a difficult point | 
					
						
							|  |  |  |    and go to the next POI | 
					
						
							| 
									
										
										
										
											2021-03-24 01:56:56 +01:00
										 |  |  | 3. Use symbols and images, also in the mappings on questions | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | 4. Make sure the icons (on the map and in the questions) are big enough, clear enough and contrast enough with the | 
					
						
							|  |  |  |    background map | 
					
						
							| 
									
										
										
										
											2021-03-24 01:56:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-23 19:34:34 +01:00
										 |  |  | ### Using layers to distinguish on attributes
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | One layer should portray one kind of physical object, e.g. "benches" or "restaurants". It should contain all of them, | 
					
						
							|  |  |  | disregarding other properties. | 
					
						
							| 
									
										
										
										
											2021-02-23 19:34:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | One should not make one layer for benches with a backrest and one layer for benches without. This is confusing for users | 
					
						
							|  |  |  | and poses problems: what if the backrest status is unknown? What if it is some weird value? Also, it isn't possible to ' | 
					
						
							|  |  |  | move' an attribute to another layer. | 
					
						
							| 
									
										
										
										
											2021-02-23 19:34:34 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | Instead, make one layer for one kind of object and change the icon based on attributes. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | ### Using layers as filters
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Using layers as filters - this doesn't work! | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-12 01:44:13 +01:00
										 |  |  | Use the `filter`-functionality instead | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-06 18:14:37 +02:00
										 |  |  | ### Not reading the .JSON-specs
 | 
					
						
							| 
									
										
										
										
											2021-02-23 19:29:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | There are a few advanced features to do fancy stuff available, which are documented only in the spec above - for | 
					
						
							|  |  |  | example, reusing background images and substituting the colours or HTML-rendering. If you need advanced stuff, read it | 
					
						
							|  |  |  | through! |