Merge branch 'develop' into feature/nsi

This commit is contained in:
Robin van der Linde 2024-05-07 11:08:44 +02:00
commit 22c2f5166d
Signed by untrusted user: Robin-van-der-Linde
GPG key ID: 53956B3252478F0D
116 changed files with 5653 additions and 1538 deletions

View file

@ -6,7 +6,7 @@ runs:
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: "16" node-version: "20"
cache: "npm" cache: "npm"
cache-dependency-path: package-lock.json cache-dependency-path: package-lock.json

View file

@ -13,7 +13,7 @@ jobs:
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: "16" node-version: "20"
cache: "npm" cache: "npm"
cache-dependency-path: package-lock.json cache-dependency-path: package-lock.json

View file

@ -19,7 +19,7 @@ jobs:
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: "16" node-version: "20"
cache: "npm" cache: "npm"
cache-dependency-path: package-lock.json cache-dependency-path: package-lock.json

View file

@ -13,7 +13,7 @@ jobs:
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: "16" node-version: "20"
cache: "npm" cache: "npm"
cache-dependency-path: package-lock.json cache-dependency-path: package-lock.json

View file

@ -11,7 +11,7 @@ jobs:
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: "16" node-version: "20"
cache: "npm" cache: "npm"
cache-dependency-path: package-lock.json cache-dependency-path: package-lock.json

2
.nvmrc
View file

@ -1 +1 @@
16.9.1 20.12.2

View file

@ -204,7 +204,7 @@
"type": "boolean" "type": "boolean"
}, },
"presets": { "presets": {
"description": "<div class='flex'>\n <div>\nPresets for this layer.\n\nA preset consists of one or more attributes (tags), a title and optionally a description and optionally example images.\n\nWhen the contributor wishes to add a point to OpenStreetMap, they'll:\n\n1. Press the 'add new point'-button\n2. Choose a preset from the list of all presets\n3. Confirm the choice. In this step, the `description` (if set) and `exampleImages` (if given) will be shown\n4. Confirm the location\n5. A new point will be created with the attributes that were defined in the preset\n\nIf no presets are defined, the button which invites to add a new preset will not be shown.\n</div>\n<a class='block m-2 min-w-64' href='./Docs/Screenshots/AddNewItemScreencast.webm' target='_blank'> <video controls autoplay muted src='./Docs/Screenshots/AddNewItemScreencast.webm' class='w-64'/></a>\n</div>\n\ngroup: presets", "description": "<div class='flex'>\n <div>\nPresets for this layer.\n\nA preset consists of one or more attributes (tags), a title and optionally a description and optionally example images.\n\nWhen the contributor wishes to add a point to OpenStreetMap, they'll:\n\n1. Press the 'add new point'-button\n2. Choose a preset from the list of all presets\n3. Confirm the choice. In this step, the `description` (if set) and `exampleImages` (if given) will be shown\n4. Confirm the location\n5. A new point will be created with the attributes that were defined in the preset\n\nIf no presets are defined, the button which invites to add a new preset will not be shown.\n</div>\n<video controls autoplay muted src='./Docs/Screenshots/AddNewItemScreencast.webm' class='w-64'/>\n</div>\n\ngroup: presets",
"type": "array", "type": "array",
"items": { "items": {
"type": "object", "type": "object",
@ -379,7 +379,7 @@
"type": "boolean" "type": "boolean"
}, },
"units": { "units": {
"description": "Either a list with [{\"key\": \"unitname\", \"key2\": {\"quantity\": \"unitname\", \"denominations\": [\"denom\", \"denom\"]}}]", "description": "Either a list with [{\"key\": \"unitname\", \"key2\": {\"quantity\": \"unitname\", \"denominations\": [\"denom\", \"denom\"]}}]\n\nUse `\"inverted\": true` if the amount should be _divided_ by the denomination, e.g. for charge over time (`€5/day`)",
"type": "array", "type": "array",
"items": { "items": {
"anyOf": [ "anyOf": [
@ -387,7 +387,7 @@
"$ref": "#/definitions/default_2" "$ref": "#/definitions/default_2"
}, },
{ {
"$ref": "#/definitions/Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;}>" "$ref": "#/definitions/Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;inverted?:boolean|undefined;}>"
} }
] ]
} }
@ -703,7 +703,7 @@
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -717,7 +717,7 @@
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -1238,7 +1238,7 @@
"type": "string" "type": "string"
}, },
"placeholder": { "placeholder": {
"description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert", "description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert\nifunset: No specific placeholder is set, show the type of the textfield",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/Record<string,string>" "$ref": "#/definitions/Record<string,string>"
@ -1386,7 +1386,7 @@
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -1400,7 +1400,7 @@
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -1464,7 +1464,7 @@
"type": "string" "type": "string"
}, },
"placeholder": { "placeholder": {
"description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert", "description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert\nifunset: No specific placeholder is set, show the type of the textfield",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/Record<string,string>" "$ref": "#/definitions/Record<string,string>"
@ -1612,7 +1612,7 @@
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -1626,7 +1626,7 @@
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -1950,7 +1950,7 @@
], ],
"additionalProperties": false "additionalProperties": false
}, },
"Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;}>": { "Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;inverted?:boolean|undefined;}>": {
"type": "object", "type": "object",
"additionalProperties": false "additionalProperties": false
} }

View file

@ -204,7 +204,7 @@ export default {
"type": "boolean" "type": "boolean"
}, },
"presets": { "presets": {
"description": "<div class='flex'>\n <div>\nPresets for this layer.\n\nA preset consists of one or more attributes (tags), a title and optionally a description and optionally example images.\n\nWhen the contributor wishes to add a point to OpenStreetMap, they'll:\n\n1. Press the 'add new point'-button\n2. Choose a preset from the list of all presets\n3. Confirm the choice. In this step, the `description` (if set) and `exampleImages` (if given) will be shown\n4. Confirm the location\n5. A new point will be created with the attributes that were defined in the preset\n\nIf no presets are defined, the button which invites to add a new preset will not be shown.\n</div>\n<a class='block m-2 min-w-64' href='./Docs/Screenshots/AddNewItemScreencast.webm' target='_blank'> <video controls autoplay muted src='./Docs/Screenshots/AddNewItemScreencast.webm' class='w-64'/></a>\n</div>\n\ngroup: presets", "description": "<div class='flex'>\n <div>\nPresets for this layer.\n\nA preset consists of one or more attributes (tags), a title and optionally a description and optionally example images.\n\nWhen the contributor wishes to add a point to OpenStreetMap, they'll:\n\n1. Press the 'add new point'-button\n2. Choose a preset from the list of all presets\n3. Confirm the choice. In this step, the `description` (if set) and `exampleImages` (if given) will be shown\n4. Confirm the location\n5. A new point will be created with the attributes that were defined in the preset\n\nIf no presets are defined, the button which invites to add a new preset will not be shown.\n</div>\n<video controls autoplay muted src='./Docs/Screenshots/AddNewItemScreencast.webm' class='w-64'/>\n</div>\n\ngroup: presets",
"type": "array", "type": "array",
"items": { "items": {
"type": "object", "type": "object",
@ -379,7 +379,7 @@ export default {
"type": "boolean" "type": "boolean"
}, },
"units": { "units": {
"description": "Either a list with [{\"key\": \"unitname\", \"key2\": {\"quantity\": \"unitname\", \"denominations\": [\"denom\", \"denom\"]}}]", "description": "Either a list with [{\"key\": \"unitname\", \"key2\": {\"quantity\": \"unitname\", \"denominations\": [\"denom\", \"denom\"]}}]\n\nUse `\"inverted\": true` if the amount should be _divided_ by the denomination, e.g. for charge over time (`€5/day`)",
"type": "array", "type": "array",
"items": { "items": {
"anyOf": [ "anyOf": [
@ -387,7 +387,7 @@ export default {
"$ref": "#/definitions/default_2" "$ref": "#/definitions/default_2"
}, },
{ {
"$ref": "#/definitions/Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;}>" "$ref": "#/definitions/Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;inverted?:boolean|undefined;}>"
} }
] ]
} }
@ -696,7 +696,7 @@ export default {
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -710,7 +710,7 @@ export default {
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -1225,7 +1225,7 @@ export default {
"type": "string" "type": "string"
}, },
"placeholder": { "placeholder": {
"description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert", "description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert\nifunset: No specific placeholder is set, show the type of the textfield",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/Record<string,string>" "$ref": "#/definitions/Record<string,string>"
@ -1373,7 +1373,7 @@ export default {
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -1387,7 +1387,7 @@ export default {
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -1450,7 +1450,7 @@ export default {
"type": "string" "type": "string"
}, },
"placeholder": { "placeholder": {
"description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert", "description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert\nifunset: No specific placeholder is set, show the type of the textfield",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/Record<string,string>" "$ref": "#/definitions/Record<string,string>"
@ -1598,7 +1598,7 @@ export default {
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -1612,7 +1612,7 @@ export default {
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -1930,7 +1930,7 @@ export default {
"applicableUnits" "applicableUnits"
] ]
}, },
"Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;}>": { "Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;inverted?:boolean|undefined;}>": {
"type": "object" "type": "object"
} }
}, },

View file

@ -593,7 +593,7 @@
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -607,7 +607,7 @@
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -1128,7 +1128,7 @@
"type": "string" "type": "string"
}, },
"placeholder": { "placeholder": {
"description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert", "description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert\nifunset: No specific placeholder is set, show the type of the textfield",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/Record<string,string>" "$ref": "#/definitions/Record<string,string>"
@ -1276,7 +1276,7 @@
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -1290,7 +1290,7 @@
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -1354,7 +1354,7 @@
"type": "string" "type": "string"
}, },
"placeholder": { "placeholder": {
"description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert", "description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert\nifunset: No specific placeholder is set, show the type of the textfield",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/Record<string,string>" "$ref": "#/definitions/Record<string,string>"
@ -1502,7 +1502,7 @@
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -1516,7 +1516,7 @@
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -1840,7 +1840,7 @@
], ],
"additionalProperties": false "additionalProperties": false
}, },
"Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;}>": { "Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;inverted?:boolean|undefined;}>": {
"type": "object", "type": "object",
"additionalProperties": false "additionalProperties": false
}, },
@ -2095,7 +2095,7 @@
"type": "boolean" "type": "boolean"
}, },
"presets": { "presets": {
"description": "<div class='flex'>\n <div>\nPresets for this layer.\n\nA preset consists of one or more attributes (tags), a title and optionally a description and optionally example images.\n\nWhen the contributor wishes to add a point to OpenStreetMap, they'll:\n\n1. Press the 'add new point'-button\n2. Choose a preset from the list of all presets\n3. Confirm the choice. In this step, the `description` (if set) and `exampleImages` (if given) will be shown\n4. Confirm the location\n5. A new point will be created with the attributes that were defined in the preset\n\nIf no presets are defined, the button which invites to add a new preset will not be shown.\n</div>\n<a class='block m-2 min-w-64' href='./Docs/Screenshots/AddNewItemScreencast.webm' target='_blank'> <video controls autoplay muted src='./Docs/Screenshots/AddNewItemScreencast.webm' class='w-64'/></a>\n</div>\n\ngroup: presets", "description": "<div class='flex'>\n <div>\nPresets for this layer.\n\nA preset consists of one or more attributes (tags), a title and optionally a description and optionally example images.\n\nWhen the contributor wishes to add a point to OpenStreetMap, they'll:\n\n1. Press the 'add new point'-button\n2. Choose a preset from the list of all presets\n3. Confirm the choice. In this step, the `description` (if set) and `exampleImages` (if given) will be shown\n4. Confirm the location\n5. A new point will be created with the attributes that were defined in the preset\n\nIf no presets are defined, the button which invites to add a new preset will not be shown.\n</div>\n<video controls autoplay muted src='./Docs/Screenshots/AddNewItemScreencast.webm' class='w-64'/>\n</div>\n\ngroup: presets",
"type": "array", "type": "array",
"items": { "items": {
"type": "object", "type": "object",
@ -2270,7 +2270,7 @@
"type": "boolean" "type": "boolean"
}, },
"units": { "units": {
"description": "Either a list with [{\"key\": \"unitname\", \"key2\": {\"quantity\": \"unitname\", \"denominations\": [\"denom\", \"denom\"]}}]", "description": "Either a list with [{\"key\": \"unitname\", \"key2\": {\"quantity\": \"unitname\", \"denominations\": [\"denom\", \"denom\"]}}]\n\nUse `\"inverted\": true` if the amount should be _divided_ by the denomination, e.g. for charge over time (`€5/day`)",
"type": "array", "type": "array",
"items": { "items": {
"anyOf": [ "anyOf": [
@ -2278,7 +2278,7 @@
"$ref": "#/definitions/default_2" "$ref": "#/definitions/default_2"
}, },
{ {
"$ref": "#/definitions/Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;}>" "$ref": "#/definitions/Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;inverted?:boolean|undefined;}>"
} }
] ]
} }
@ -2514,7 +2514,7 @@
"type": "boolean" "type": "boolean"
}, },
"presets": { "presets": {
"description": "<div class='flex'>\n <div>\nPresets for this layer.\n\nA preset consists of one or more attributes (tags), a title and optionally a description and optionally example images.\n\nWhen the contributor wishes to add a point to OpenStreetMap, they'll:\n\n1. Press the 'add new point'-button\n2. Choose a preset from the list of all presets\n3. Confirm the choice. In this step, the `description` (if set) and `exampleImages` (if given) will be shown\n4. Confirm the location\n5. A new point will be created with the attributes that were defined in the preset\n\nIf no presets are defined, the button which invites to add a new preset will not be shown.\n</div>\n<a class='block m-2 min-w-64' href='./Docs/Screenshots/AddNewItemScreencast.webm' target='_blank'> <video controls autoplay muted src='./Docs/Screenshots/AddNewItemScreencast.webm' class='w-64'/></a>\n</div>\n\ngroup: presets", "description": "<div class='flex'>\n <div>\nPresets for this layer.\n\nA preset consists of one or more attributes (tags), a title and optionally a description and optionally example images.\n\nWhen the contributor wishes to add a point to OpenStreetMap, they'll:\n\n1. Press the 'add new point'-button\n2. Choose a preset from the list of all presets\n3. Confirm the choice. In this step, the `description` (if set) and `exampleImages` (if given) will be shown\n4. Confirm the location\n5. A new point will be created with the attributes that were defined in the preset\n\nIf no presets are defined, the button which invites to add a new preset will not be shown.\n</div>\n<video controls autoplay muted src='./Docs/Screenshots/AddNewItemScreencast.webm' class='w-64'/>\n</div>\n\ngroup: presets",
"type": "array", "type": "array",
"items": { "items": {
"type": "object", "type": "object",
@ -2689,7 +2689,7 @@
"type": "boolean" "type": "boolean"
}, },
"units": { "units": {
"description": "Either a list with [{\"key\": \"unitname\", \"key2\": {\"quantity\": \"unitname\", \"denominations\": [\"denom\", \"denom\"]}}]", "description": "Either a list with [{\"key\": \"unitname\", \"key2\": {\"quantity\": \"unitname\", \"denominations\": [\"denom\", \"denom\"]}}]\n\nUse `\"inverted\": true` if the amount should be _divided_ by the denomination, e.g. for charge over time (`€5/day`)",
"type": "array", "type": "array",
"items": { "items": {
"anyOf": [ "anyOf": [
@ -2697,7 +2697,7 @@
"$ref": "#/definitions/default_2" "$ref": "#/definitions/default_2"
}, },
{ {
"$ref": "#/definitions/Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;}>" "$ref": "#/definitions/Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;inverted?:boolean|undefined;}>"
} }
] ]
} }

View file

@ -586,7 +586,7 @@ export default {
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -600,7 +600,7 @@ export default {
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -1115,7 +1115,7 @@ export default {
"type": "string" "type": "string"
}, },
"placeholder": { "placeholder": {
"description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert", "description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert\nifunset: No specific placeholder is set, show the type of the textfield",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/Record<string,string>" "$ref": "#/definitions/Record<string,string>"
@ -1263,7 +1263,7 @@ export default {
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -1277,7 +1277,7 @@ export default {
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -1340,7 +1340,7 @@ export default {
"type": "string" "type": "string"
}, },
"placeholder": { "placeholder": {
"description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert", "description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert\nifunset: No specific placeholder is set, show the type of the textfield",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/Record<string,string>" "$ref": "#/definitions/Record<string,string>"
@ -1488,7 +1488,7 @@ export default {
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -1502,7 +1502,7 @@ export default {
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -1820,7 +1820,7 @@ export default {
"applicableUnits" "applicableUnits"
] ]
}, },
"Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;}>": { "Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;inverted?:boolean|undefined;}>": {
"type": "object" "type": "object"
}, },
"default": { "default": {
@ -2073,7 +2073,7 @@ export default {
"type": "boolean" "type": "boolean"
}, },
"presets": { "presets": {
"description": "<div class='flex'>\n <div>\nPresets for this layer.\n\nA preset consists of one or more attributes (tags), a title and optionally a description and optionally example images.\n\nWhen the contributor wishes to add a point to OpenStreetMap, they'll:\n\n1. Press the 'add new point'-button\n2. Choose a preset from the list of all presets\n3. Confirm the choice. In this step, the `description` (if set) and `exampleImages` (if given) will be shown\n4. Confirm the location\n5. A new point will be created with the attributes that were defined in the preset\n\nIf no presets are defined, the button which invites to add a new preset will not be shown.\n</div>\n<a class='block m-2 min-w-64' href='./Docs/Screenshots/AddNewItemScreencast.webm' target='_blank'> <video controls autoplay muted src='./Docs/Screenshots/AddNewItemScreencast.webm' class='w-64'/></a>\n</div>\n\ngroup: presets", "description": "<div class='flex'>\n <div>\nPresets for this layer.\n\nA preset consists of one or more attributes (tags), a title and optionally a description and optionally example images.\n\nWhen the contributor wishes to add a point to OpenStreetMap, they'll:\n\n1. Press the 'add new point'-button\n2. Choose a preset from the list of all presets\n3. Confirm the choice. In this step, the `description` (if set) and `exampleImages` (if given) will be shown\n4. Confirm the location\n5. A new point will be created with the attributes that were defined in the preset\n\nIf no presets are defined, the button which invites to add a new preset will not be shown.\n</div>\n<video controls autoplay muted src='./Docs/Screenshots/AddNewItemScreencast.webm' class='w-64'/>\n</div>\n\ngroup: presets",
"type": "array", "type": "array",
"items": { "items": {
"type": "object", "type": "object",
@ -2248,7 +2248,7 @@ export default {
"type": "boolean" "type": "boolean"
}, },
"units": { "units": {
"description": "Either a list with [{\"key\": \"unitname\", \"key2\": {\"quantity\": \"unitname\", \"denominations\": [\"denom\", \"denom\"]}}]", "description": "Either a list with [{\"key\": \"unitname\", \"key2\": {\"quantity\": \"unitname\", \"denominations\": [\"denom\", \"denom\"]}}]\n\nUse `\"inverted\": true` if the amount should be _divided_ by the denomination, e.g. for charge over time (`€5/day`)",
"type": "array", "type": "array",
"items": { "items": {
"anyOf": [ "anyOf": [
@ -2256,7 +2256,7 @@ export default {
"$ref": "#/definitions/default_2" "$ref": "#/definitions/default_2"
}, },
{ {
"$ref": "#/definitions/Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;}>" "$ref": "#/definitions/Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;inverted?:boolean|undefined;}>"
} }
] ]
} }
@ -2491,7 +2491,7 @@ export default {
"type": "boolean" "type": "boolean"
}, },
"presets": { "presets": {
"description": "<div class='flex'>\n <div>\nPresets for this layer.\n\nA preset consists of one or more attributes (tags), a title and optionally a description and optionally example images.\n\nWhen the contributor wishes to add a point to OpenStreetMap, they'll:\n\n1. Press the 'add new point'-button\n2. Choose a preset from the list of all presets\n3. Confirm the choice. In this step, the `description` (if set) and `exampleImages` (if given) will be shown\n4. Confirm the location\n5. A new point will be created with the attributes that were defined in the preset\n\nIf no presets are defined, the button which invites to add a new preset will not be shown.\n</div>\n<a class='block m-2 min-w-64' href='./Docs/Screenshots/AddNewItemScreencast.webm' target='_blank'> <video controls autoplay muted src='./Docs/Screenshots/AddNewItemScreencast.webm' class='w-64'/></a>\n</div>\n\ngroup: presets", "description": "<div class='flex'>\n <div>\nPresets for this layer.\n\nA preset consists of one or more attributes (tags), a title and optionally a description and optionally example images.\n\nWhen the contributor wishes to add a point to OpenStreetMap, they'll:\n\n1. Press the 'add new point'-button\n2. Choose a preset from the list of all presets\n3. Confirm the choice. In this step, the `description` (if set) and `exampleImages` (if given) will be shown\n4. Confirm the location\n5. A new point will be created with the attributes that were defined in the preset\n\nIf no presets are defined, the button which invites to add a new preset will not be shown.\n</div>\n<video controls autoplay muted src='./Docs/Screenshots/AddNewItemScreencast.webm' class='w-64'/>\n</div>\n\ngroup: presets",
"type": "array", "type": "array",
"items": { "items": {
"type": "object", "type": "object",
@ -2666,7 +2666,7 @@ export default {
"type": "boolean" "type": "boolean"
}, },
"units": { "units": {
"description": "Either a list with [{\"key\": \"unitname\", \"key2\": {\"quantity\": \"unitname\", \"denominations\": [\"denom\", \"denom\"]}}]", "description": "Either a list with [{\"key\": \"unitname\", \"key2\": {\"quantity\": \"unitname\", \"denominations\": [\"denom\", \"denom\"]}}]\n\nUse `\"inverted\": true` if the amount should be _divided_ by the denomination, e.g. for charge over time (`€5/day`)",
"type": "array", "type": "array",
"items": { "items": {
"anyOf": [ "anyOf": [
@ -2674,7 +2674,7 @@ export default {
"$ref": "#/definitions/default_2" "$ref": "#/definitions/default_2"
}, },
{ {
"$ref": "#/definitions/Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;}>" "$ref": "#/definitions/Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;inverted?:boolean|undefined;}>"
} }
] ]
} }

View file

@ -379,7 +379,7 @@
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -393,7 +393,7 @@
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"

View file

@ -372,7 +372,7 @@ export default {
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -386,7 +386,7 @@ export default {
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"

View file

@ -406,7 +406,7 @@
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -420,7 +420,7 @@
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"

View file

@ -399,7 +399,7 @@ export default {
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -413,7 +413,7 @@ export default {
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"

View file

@ -453,7 +453,7 @@
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -467,7 +467,7 @@
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"

View file

@ -446,7 +446,7 @@ export default {
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -460,7 +460,7 @@ export default {
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"

View file

@ -29,7 +29,7 @@
"type": "string" "type": "string"
}, },
"placeholder": { "placeholder": {
"description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert", "description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert\nifunset: No specific placeholder is set, show the type of the textfield",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/Record<string,string>" "$ref": "#/definitions/Record<string,string>"
@ -177,7 +177,7 @@
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -191,7 +191,7 @@
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -510,7 +510,7 @@
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -524,7 +524,7 @@
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"

View file

@ -29,7 +29,7 @@ export default {
"type": "string" "type": "string"
}, },
"placeholder": { "placeholder": {
"description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert", "description": "question: What placeholder text should be shown in the input-element if there is no input?\nA (translated) text that is shown (as gray text) within the textfield\ntype: translation\ngroup: expert\nifunset: No specific placeholder is set, show the type of the textfield",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/Record<string,string>" "$ref": "#/definitions/Record<string,string>"
@ -177,7 +177,7 @@ export default {
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -191,7 +191,7 @@ export default {
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -503,7 +503,7 @@ export default {
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -517,7 +517,7 @@ export default {
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"

View file

@ -332,7 +332,7 @@
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -346,7 +346,7 @@
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"

View file

@ -325,7 +325,7 @@ export default {
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -339,7 +339,7 @@ export default {
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"

View file

@ -64,7 +64,7 @@
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -78,7 +78,7 @@
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"

View file

@ -64,7 +64,7 @@ export default {
] ]
}, },
"condition": { "condition": {
"description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or ask the question if unkown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```", "description": "question: When should this item be shown?\ntype: tag\nifunset: No specific condition set; always show this tagRendering or show this question if unknown\n\nOnly show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\n\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\n\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"
@ -78,7 +78,7 @@ export default {
] ]
}, },
"metacondition": { "metacondition": {
"description": "question: When should this item be shown (including special conditions)?\ntype: tag\n\nIf set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_", "description": "question: When should this item be shown (including special conditions)?\ntype: tag\nifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown\n\nIf set, this tag will be evaluated against the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options (at the settings-tab).\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_",
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/{and:TagConfigJson[];}" "$ref": "#/definitions/{and:TagConfigJson[];}"

View file

@ -46,3 +46,9 @@ mapcomplete.osm.be {
to http://127.0.0.1:1236 to http://127.0.0.1:1236
} }
} }
cache.mapcomplete.org {
reverse_proxy /summary/* {
to http://127.0.0.1:2345
}
}

View file

@ -3,3 +3,10 @@
This server hosts the studio files and is used for expermintal builds. This server hosts the studio files and is used for expermintal builds.
For used hosts, see the Caddyfile For used hosts, see the Caddyfile
## Cache forwarding
As the ISP of Nerdlab is a bit picky, we use SSH-port-forwarding on the cache server:
`ssh -R 5445:127.0.0.1:5445 hetzner`

View file

@ -13,9 +13,9 @@ This theme contains the following layers:
- [walls_and_buildings](../Layers/walls_and_buildings.md)
- [advertising](../Layers/advertising.md) - [advertising](../Layers/advertising.md)
- [shelter](../Layers/shelter.md) - [shelter](../Layers/shelter.md)
- [walls_and_buildings](../Layers/walls_and_buildings.md)
- [selected_element](../Layers/selected_element.md) - [selected_element](../Layers/selected_element.md)
- [gps_location](../Layers/gps_location.md) - [gps_location](../Layers/gps_location.md)
- [gps_location_history](../Layers/gps_location_history.md) - [gps_location_history](../Layers/gps_location_history.md)

View file

@ -13,8 +13,8 @@ This theme contains the following layers:
- [walls_and_buildings](../Layers/walls_and_buildings.md)
- [defibrillator](../Layers/defibrillator.md) - [defibrillator](../Layers/defibrillator.md)
- [walls_and_buildings](../Layers/walls_and_buildings.md)
- [selected_element](../Layers/selected_element.md) - [selected_element](../Layers/selected_element.md)
- [gps_location](../Layers/gps_location.md) - [gps_location](../Layers/gps_location.md)
- [gps_location_history](../Layers/gps_location_history.md) - [gps_location_history](../Layers/gps_location_history.md)

View file

@ -13,8 +13,8 @@ This theme contains the following layers:
- [walls_and_buildings](../Layers/walls_and_buildings.md)
- [artwork](../Layers/artwork.md) - [artwork](../Layers/artwork.md)
- [walls_and_buildings](../Layers/walls_and_buildings.md)
- [selected_element](../Layers/selected_element.md) - [selected_element](../Layers/selected_element.md)
- [gps_location](../Layers/gps_location.md) - [gps_location](../Layers/gps_location.md)
- [gps_location_history](../Layers/gps_location_history.md) - [gps_location_history](../Layers/gps_location_history.md)

View file

@ -13,8 +13,8 @@ This theme contains the following layers:
- [walls_and_buildings](../Layers/walls_and_buildings.md)
- [clock](../Layers/clock.md) - [clock](../Layers/clock.md)
- [walls_and_buildings](../Layers/walls_and_buildings.md)
- [selected_element](../Layers/selected_element.md) - [selected_element](../Layers/selected_element.md)
- [gps_location](../Layers/gps_location.md) - [gps_location](../Layers/gps_location.md)
- [gps_location_history](../Layers/gps_location_history.md) - [gps_location_history](../Layers/gps_location_history.md)

View file

@ -13,8 +13,8 @@ This theme contains the following layers:
- [walls_and_buildings](../Layers/walls_and_buildings.md)
- [facadegardens](../Layers/facadegardens.md) - [facadegardens](../Layers/facadegardens.md)
- [walls_and_buildings](../Layers/walls_and_buildings.md)
- [selected_element](../Layers/selected_element.md) - [selected_element](../Layers/selected_element.md)
- [gps_location](../Layers/gps_location.md) - [gps_location](../Layers/gps_location.md)
- [gps_location_history](../Layers/gps_location_history.md) - [gps_location_history](../Layers/gps_location_history.md)

View file

@ -13,9 +13,9 @@ This theme contains the following layers:
- [walls_and_buildings](../Layers/walls_and_buildings.md)
- [ghostsigns](../Layers/ghostsigns.md) - [ghostsigns](../Layers/ghostsigns.md)
- [advertising_wall_paintings](../Layers/advertising_wall_paintings.md) - [advertising_wall_paintings](../Layers/advertising_wall_paintings.md)
- [walls_and_buildings](../Layers/walls_and_buildings.md)
- [selected_element](../Layers/selected_element.md) - [selected_element](../Layers/selected_element.md)
- [gps_location](../Layers/gps_location.md) - [gps_location](../Layers/gps_location.md)
- [gps_location_history](../Layers/gps_location_history.md) - [gps_location_history](../Layers/gps_location_history.md)

View file

@ -13,7 +13,6 @@ This theme contains the following layers:
- [named_streets](../Layers/named_streets.md)
- [osm_buildings_no_points](../Layers/osm_buildings_no_points.md) - [osm_buildings_no_points](../Layers/osm_buildings_no_points.md)
- [grb](../Layers/grb.md) - [grb](../Layers/grb.md)
- [service_ways](../Layers/service_ways.md) - [service_ways](../Layers/service_ways.md)
@ -21,6 +20,7 @@ This theme contains the following layers:
- [address](../Layers/address.md) - [address](../Layers/address.md)
- [crab_address](../Layers/crab_address.md) - [crab_address](../Layers/crab_address.md)
- [current_view](../Layers/current_view.md) - [current_view](../Layers/current_view.md)
- [named_streets](../Layers/named_streets.md)
- [selected_element](../Layers/selected_element.md) - [selected_element](../Layers/selected_element.md)
- [gps_location](../Layers/gps_location.md) - [gps_location](../Layers/gps_location.md)
- [gps_location_history](../Layers/gps_location_history.md) - [gps_location_history](../Layers/gps_location_history.md)

View file

@ -13,7 +13,6 @@ This theme contains the following layers:
- [walls_and_buildings](../Layers/walls_and_buildings.md)
- [indoors](../Layers/indoors.md) - [indoors](../Layers/indoors.md)
- [stairs](../Layers/stairs.md) - [stairs](../Layers/stairs.md)
- [pedestrian_path](../Layers/pedestrian_path.md) - [pedestrian_path](../Layers/pedestrian_path.md)
@ -36,6 +35,7 @@ This theme contains the following layers:
- [bench](../Layers/bench.md) - [bench](../Layers/bench.md)
- [drinking_water](../Layers/drinking_water.md) - [drinking_water](../Layers/drinking_water.md)
- [departures_board](../Layers/departures_board.md) - [departures_board](../Layers/departures_board.md)
- [walls_and_buildings](../Layers/walls_and_buildings.md)
- [selected_element](../Layers/selected_element.md) - [selected_element](../Layers/selected_element.md)
- [gps_location](../Layers/gps_location.md) - [gps_location](../Layers/gps_location.md)
- [gps_location_history](../Layers/gps_location_history.md) - [gps_location_history](../Layers/gps_location_history.md)

View file

@ -13,9 +13,9 @@ This theme contains the following layers:
- [walls_and_buildings](../Layers/walls_and_buildings.md)
- [surveillance_camera](../Layers/surveillance_camera.md) - [surveillance_camera](../Layers/surveillance_camera.md)
- [speed_camera](../Layers/speed_camera.md) - [speed_camera](../Layers/speed_camera.md)
- [walls_and_buildings](../Layers/walls_and_buildings.md)
- [selected_element](../Layers/selected_element.md) - [selected_element](../Layers/selected_element.md)
- [gps_location](../Layers/gps_location.md) - [gps_location](../Layers/gps_location.md)
- [gps_location_history](../Layers/gps_location_history.md) - [gps_location_history](../Layers/gps_location_history.md)

View file

@ -13,11 +13,11 @@ This theme contains the following layers:
- [address](../Layers/address.md)
- [raw_inspire_polygons](../Layers/raw_inspire_polygons.md) - [raw_inspire_polygons](../Layers/raw_inspire_polygons.md)
- [to_import](../Layers/to_import.md) - [to_import](../Layers/to_import.md)
- [uk_address](../Layers/uk_address.md) - [uk_address](../Layers/uk_address.md)
- [named_streets](../Layers/named_streets.md) - [named_streets](../Layers/named_streets.md)
- [address](../Layers/address.md)
- [selected_element](../Layers/selected_element.md) - [selected_element](../Layers/selected_element.md)
- [gps_location](../Layers/gps_location.md) - [gps_location](../Layers/gps_location.md)
- [gps_location_history](../Layers/gps_location_history.md) - [gps_location_history](../Layers/gps_location_history.md)

View file

@ -13,10 +13,10 @@ This theme contains the following layers:
- [indoors](../Layers/indoors.md)
- [pedestrian_path](../Layers/pedestrian_path.md)
- [walls_and_buildings](../Layers/walls_and_buildings.md) - [walls_and_buildings](../Layers/walls_and_buildings.md)
- [entrance](../Layers/entrance.md) - [entrance](../Layers/entrance.md)
- [indoors](../Layers/indoors.md)
- [pedestrian_path](../Layers/pedestrian_path.md)
- [selected_element](../Layers/selected_element.md) - [selected_element](../Layers/selected_element.md)
- [gps_location](../Layers/gps_location.md) - [gps_location](../Layers/gps_location.md)
- [gps_location_history](../Layers/gps_location_history.md) - [gps_location_history](../Layers/gps_location_history.md)

View file

@ -291,7 +291,7 @@ z
The initial/current zoom level The initial/current zoom level
This documentation is defined in the source code at [InitialMapPositioning.ts](/src/Logic/Actors/InitialMapPositioning.ts#L28) This documentation is defined in the source code at [InitialMapPositioning.ts](/src/Logic/Actors/InitialMapPositioning.ts#L34)
The default value is _1_ The default value is _1_
@ -300,7 +300,7 @@ lat
The initial/current latitude The initial/current latitude
This documentation is defined in the source code at [InitialMapPositioning.ts](/src/Logic/Actors/InitialMapPositioning.ts#L28) This documentation is defined in the source code at [InitialMapPositioning.ts](/src/Logic/Actors/InitialMapPositioning.ts#L34)
The default value is _0_ The default value is _0_
@ -309,7 +309,7 @@ lon
The initial/current longitude of the app The initial/current longitude of the app
This documentation is defined in the source code at [InitialMapPositioning.ts](/src/Logic/Actors/InitialMapPositioning.ts#L28) This documentation is defined in the source code at [InitialMapPositioning.ts](/src/Logic/Actors/InitialMapPositioning.ts#L34)
The default value is _0_ The default value is _0_

View file

@ -155,8 +155,8 @@
{ {
"if": "backrest=yes", "if": "backrest=yes",
"then": { "then": {
"en": "Does have a backrest", "en": "This bench does have a backrest",
"de": "Die Sitzbank hat eine Rückenlehne", "de": "Diese Sitzbank hat eine Rückenlehne",
"fr": "Dossier : Oui", "fr": "Dossier : Oui",
"nl": "Heeft een rugleuning", "nl": "Heeft een rugleuning",
"es": "Tiene respaldo", "es": "Tiene respaldo",
@ -186,8 +186,8 @@
"two_sided=" "two_sided="
], ],
"then": { "then": {
"en": "Does <b>not</b> have a backrest", "en": "This bench does <b>not</b> have a backrest",
"de": "Die Sitzbank hat <b>keine</b> Rückenlehne", "de": "Diese Sitzbank hat <b>keine</b> Rückenlehne",
"fr": "Dossier : Non", "fr": "Dossier : Non",
"nl": "Heeft <b>geen</b> rugleuning", "nl": "Heeft <b>geen</b> rugleuning",
"es": "<b>No</b> tiene respaldo", "es": "<b>No</b> tiene respaldo",
@ -236,8 +236,8 @@
}, },
{ {
"render": { "render": {
"en": "{seats} seats", "en": "This bench has {seats} seats",
"de": "Die Sitzbank hat {seats} Sitzplätze", "de": "Diese Sitzbank hat {seats} Sitzplätze",
"fr": "{seats} places", "fr": "{seats} places",
"nl": "{seats} zitplaatsen", "nl": "{seats} zitplaatsen",
"es": "{seats} asientos", "es": "{seats} asientos",
@ -882,7 +882,7 @@
"bench-questions" "bench-questions"
], ],
"render": { "render": {
"en": "This bench does have the following inscription:<br/><p><i>{inscription}</i></p>", "en": "This bench has the following inscription:<br/><p><i>{inscription}</i></p>",
"nl": "Deze bank heeft een inscriptie: <br/><p><i>{inscription}</i></p>", "nl": "Deze bank heeft een inscriptie: <br/><p><i>{inscription}</i></p>",
"de": "Diese Bank hat folgende Inschrift:<br/><p><i>{inscription}</i></p>", "de": "Diese Bank hat folgende Inschrift:<br/><p><i>{inscription}</i></p>",
"fr": "Ce banc a l'inscription suivante :<br/><p><i>{inscription}</i></p>", "fr": "Ce banc a l'inscription suivante :<br/><p><i>{inscription}</i></p>",
@ -931,7 +931,7 @@
{ {
"if": "inscription=", "if": "inscription=",
"then": { "then": {
"en": "This bench does <span class='subtle'>(probably)</span> not have an inscription", "en": "This bench <span class='subtle'>(probably)</span> does not not have an inscription",
"nl": "Deze bank heeft <span class='subtle'>(waarschijnlijk)</span> geen inscriptie", "nl": "Deze bank heeft <span class='subtle'>(waarschijnlijk)</span> geen inscriptie",
"de": "Diese Bank hat <span class='subtle'>(wahrscheinlich)</span> keine Inschrift", "de": "Diese Bank hat <span class='subtle'>(wahrscheinlich)</span> keine Inschrift",
"fr": "Ce banc n'a <span class='subtle'>(probablement)</span> pas d'inscription", "fr": "Ce banc n'a <span class='subtle'>(probablement)</span> pas d'inscription",

View file

@ -998,6 +998,16 @@
"weeks", "weeks",
"months" "months"
] ]
},
"charge": {
"quantity": "duration",
"inverted": true,
"denominations": [
"days",
"weeks",
"months",
"years"
]
} }
} }
] ]

View file

@ -5,12 +5,7 @@
"nl": "Oplaadpunten", "nl": "Oplaadpunten",
"de": "Ladestationen" "de": "Ladestationen"
}, },
"description": { "minzoom": 10,
"en": "A charging station",
"nl": "Oplaadpunten",
"ca": "Una estació de càrrega",
"de": "Eine Ladestation"
},
"source": { "source": {
"osmTags": { "osmTags": {
"and": [ "and": [
@ -25,7 +20,6 @@
] ]
} }
}, },
"minzoom": 10,
"title": { "title": {
"render": { "render": {
"en": "Charging station", "en": "Charging station",
@ -71,103 +65,13 @@
} }
] ]
}, },
"pointRendering": [ "description": {
{ "en": "A charging station",
"location": [ "nl": "Oplaadpunten",
"point", "ca": "Una estació de càrrega",
"centroid" "de": "Eine Ladestation"
], },
"marker": [ "#": "no-question-hint-check",
{
"icon": "pin",
"color": "#fff"
},
{
"icon": {
"render": "./assets/themes/charging_stations/plug.svg",
"mappings": [
{
"if": "bicycle=yes",
"then": "./assets/themes/charging_stations/bicycle.svg"
},
{
"if": {
"or": [
"car=yes",
"motorcar=yes"
]
},
"then": "./assets/themes/charging_stations/car.svg"
}
]
}
}
],
"iconBadges": [
{
"if": {
"or": [
"disused:amenity=charging_station",
"operational_status=broken"
]
},
"then": "close:#c22;"
},
{
"if": {
"or": [
"proposed:amenity=charging_station",
"planned:amenity=charging_station"
]
},
"then": "./assets/layers/charging_station/under_construction.svg"
},
{
"if": {
"and": [
"bicycle=yes",
{
"or": [
"motorcar=yes",
"car=yes"
]
}
]
},
"then": "circle:#fff;./assets/themes/charging_stations/car.svg"
}
],
"anchor": "bottom",
"iconSize": "50,50"
}
],
"lineRendering": [],
"presets": [
{
"tags": [
"amenity=charging_station",
"motorcar=no",
"bicycle=yes"
],
"title": {
"en": "charging station for electrical bikes",
"nl": "oplaadpunt voor elektrische fietsen",
"de": "Ladestation für Elektrofahrräder"
}
},
{
"tags": [
"amenity=charging_station",
"motorcar=yes",
"bicycle=no"
],
"title": {
"en": "charging station for cars",
"nl": "oplaadstation voor elektrische auto's",
"de": "Ladestation für Autos"
}
}
],
"tagRenderings": [ "tagRenderings": [
"images", "images",
{ {
@ -2509,6 +2413,103 @@
} }
} }
], ],
"lineRendering": [],
"pointRendering": [
{
"location": [
"point",
"centroid"
],
"marker": [
{
"icon": "pin",
"color": "#fff"
},
{
"icon": {
"render": "./assets/themes/charging_stations/plug.svg",
"mappings": [
{
"if": "bicycle=yes",
"then": "./assets/themes/charging_stations/bicycle.svg"
},
{
"if": {
"or": [
"car=yes",
"motorcar=yes"
]
},
"then": "./assets/themes/charging_stations/car.svg"
}
]
}
}
],
"iconBadges": [
{
"if": {
"or": [
"disused:amenity=charging_station",
"operational_status=broken"
]
},
"then": "close:#c22;"
},
{
"if": {
"or": [
"proposed:amenity=charging_station",
"planned:amenity=charging_station"
]
},
"then": "./assets/layers/charging_station/under_construction.svg"
},
{
"if": {
"and": [
"bicycle=yes",
{
"or": [
"motorcar=yes",
"car=yes"
]
}
]
},
"then": "circle:#fff;./assets/themes/charging_stations/car.svg"
}
],
"anchor": "bottom",
"iconSize": "50,50"
}
],
"presets": [
{
"tags": [
"amenity=charging_station",
"motorcar=no",
"bicycle=yes"
],
"title": {
"en": "charging station for electrical bikes",
"nl": "oplaadpunt voor elektrische fietsen",
"de": "Ladestation für Elektrofahrräder"
}
},
{
"tags": [
"amenity=charging_station",
"motorcar=yes",
"bicycle=no"
],
"title": {
"en": "charging station for cars",
"nl": "oplaadstation voor elektrische auto's",
"de": "Ladestation für Autos"
}
}
],
"filter": [ "filter": [
{ {
"id": "vehicle-type", "id": "vehicle-type",
@ -2714,19 +2715,6 @@
] ]
} }
], ],
"deletion": {
"softDeletionTags": {
"and": [
"amenity=",
"disused:amenity=charging_station"
]
},
"neededChangesets": 10
},
"allowMove": {
"enableRelocation": false,
"enableImproveAccuracy": true
},
"units": [ "units": [
{ {
"maxstay": { "maxstay": {
@ -2885,5 +2873,17 @@
} }
} }
], ],
"#": "no-question-hint-check" "allowMove": {
} "enableRelocation": false,
"enableImproveAccuracy": true
},
"deletion": {
"softDeletionTags": {
"and": [
"amenity=",
"disused:amenity=charging_station"
]
},
"neededChangesets": 10
}
}

View file

@ -3,14 +3,17 @@
"title": { "title": {
"en": "Changes made with MapComplete" "en": "Changes made with MapComplete"
}, },
"description": {
"en": "This maps shows all the changes made with MapComplete"
},
"shortDescription": { "shortDescription": {
"en": "Shows changes made by MapComplete" "en": "Shows changes made by MapComplete"
}, },
"description": {
"en": "This maps shows all the changes made with MapComplete"
},
"icon": "./assets/svg/logo.svg", "icon": "./assets/svg/logo.svg",
"hideFromOverview": true, "hideFromOverview": true,
"startLat": 0,
"startLon": 0,
"startZoom": 1,
"layers": [ "layers": [
{ {
"id": "mapcomplete-changes", "id": "mapcomplete-changes",

View file

@ -9225,4 +9225,4 @@
"render": "Turbina eòlica" "render": "Turbina eòlica"
} }
} }
} }

View file

@ -9481,4 +9481,4 @@
"render": "větrná turbína" "render": "větrná turbína"
} }
} }
} }

View file

@ -2713,4 +2713,4 @@
"render": "vindmølle" "render": "vindmølle"
} }
} }
} }

View file

@ -845,10 +845,10 @@
"then": "Diese Bank ist zweiseitig und teilt sich die Rückenlehne" "then": "Diese Bank ist zweiseitig und teilt sich die Rückenlehne"
}, },
"1": { "1": {
"then": "Die Sitzbank hat eine Rückenlehne" "then": "Diese Sitzbank hat eine Rückenlehne"
}, },
"2": { "2": {
"then": "Die Sitzbank hat <b>keine</b> Rückenlehne" "then": "Diese Sitzbank hat <b>keine</b> Rückenlehne"
} }
}, },
"question": "Hat diese Sitzbank eine Rückenlehne?" "question": "Hat diese Sitzbank eine Rückenlehne?"
@ -942,7 +942,7 @@
} }
}, },
"question": "Wie viele Sitzplätze hat diese Bank?", "question": "Wie viele Sitzplätze hat diese Bank?",
"render": "Die Sitzbank hat {seats} Sitzplätze" "render": "Diese Sitzbank hat {seats} Sitzplätze"
}, },
"bench-survey:date": { "bench-survey:date": {
"mappings": { "mappings": {

View file

@ -393,27 +393,6 @@
} }
}, },
"question": "What is the purpose of the animal shelter?" "question": "What is the purpose of the animal shelter?"
},
"boarded_animals": {
"mappings": {
"0": {
"then": "Dogs are kept here"
},
"1": {
"then": "Cats are kept here"
},
"2": {
"then": "Horses are kept here"
},
"3": {
"then": "Birds are kept here"
},
"4": {
"then": "Wild animals are kept here"
}
},
"question": "Which animals are accepted here?",
"render": "{animal_shelter} is kept here"
} }
}, },
"title": { "title": {
@ -866,10 +845,10 @@
"then": "This bench is two-sided and shares the backrest" "then": "This bench is two-sided and shares the backrest"
}, },
"1": { "1": {
"then": "Does have a backrest" "then": "This bench does have a backrest"
}, },
"2": { "2": {
"then": "Does <b>not</b> have a backrest" "then": "This bench does <b>not</b> have a backrest"
} }
}, },
"question": "Does this bench have a backrest?" "question": "Does this bench have a backrest?"
@ -914,12 +893,12 @@
"then": "This bench does not have an inscription" "then": "This bench does not have an inscription"
}, },
"1": { "1": {
"then": "This bench does <span class='subtle'>(probably)</span> not have an inscription" "then": "This bench <span class='subtle'>(probably)</span> does not not have an inscription"
} }
}, },
"question": "Does this bench have an inscription?", "question": "Does this bench have an inscription?",
"questionHint": "E.g. on a mounted plaque, in the backrest, …", "questionHint": "E.g. on a mounted plaque, in the backrest, …",
"render": "This bench does have the following inscription:<br/><p><i>{inscription}</i></p>" "render": "This bench has the following inscription:<br/><p><i>{inscription}</i></p>"
}, },
"bench-material": { "bench-material": {
"mappings": { "mappings": {
@ -963,7 +942,7 @@
} }
}, },
"question": "How many seats does this bench have?", "question": "How many seats does this bench have?",
"render": "{seats} seats" "render": "This bench has {seats} seats"
}, },
"bench-survey:date": { "bench-survey:date": {
"mappings": { "mappings": {
@ -1511,18 +1490,10 @@
}, },
"question": "Are these bicycle parkings free to use?" "question": "Are these bicycle parkings free to use?"
}, },
"maxstay": {
"question": "What is the maximum allowed parking duration?",
"questionHint": "If the bicycle is parked for a longer amount, it might be removed by the operator",
"render": "A bike can be parked here for at most {canonical(maxstay)}"
},
"operator": { "operator": {
"question": "Who maintains this bicycle parking?", "question": "Who maintains this bicycle parking?",
"render": "This bicycle parking is maintained by {operator}" "render": "This bicycle parking is maintained by {operator}"
}, },
"operator_email": {
"question": "What is the email address of the operator of this bicycle parking?"
},
"operator_phone": { "operator_phone": {
"question": "What is the phone number of the operator of this bicycle parking?", "question": "What is the phone number of the operator of this bicycle parking?",
"questionHint": "One might be able to call this number in case of problems, e.g. to remove unmaintained bicycles" "questionHint": "One might be able to call this number in case of problems, e.g. to remove unmaintained bicycles"
@ -2190,9 +2161,6 @@
}, },
"16": { "16": {
"question": "Has a <div style='display: inline-block'><b><b>Bosch Active Connect with 5 pins</b> and cable</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/bosch-5pin.svg'/></div> connector" "question": "Has a <div style='display: inline-block'><b><b>Bosch Active Connect with 5 pins</b> and cable</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/bosch-5pin.svg'/></div> connector"
},
"17": {
"question": "Has a <div style='display: inline-block'><b><b>BS1363</b> (Type G)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/bs1363.svg'/></div> connector"
} }
} }
} }
@ -2337,12 +2305,6 @@
}, },
"31": { "31": {
"then": "<b>Bosch Active Connect with 5 pins</b> and cable" "then": "<b>Bosch Active Connect with 5 pins</b> and cable"
},
"32": {
"then": "<b>BS1363</b> (Type G)"
},
"33": {
"then": "<b>BS1363</b> (Type G)"
} }
}, },
"question": "Which charging connections are available here?" "question": "Which charging connections are available here?"
@ -2577,9 +2539,6 @@
}, },
"15": { "15": {
"2": "<b>Bosch Active Connect with 5 pins</b> and cable" "2": "<b>Bosch Active Connect with 5 pins</b> and cable"
},
"16": {
"2": "<b>BS1363</b> (Type G)"
} }
} }
} }
@ -5154,22 +5113,6 @@
"render": "Restaurant" "render": "Restaurant"
} }
}, },
"food_courts": {
"description": "Food courts with a variety of food options.",
"name": "Food Courts",
"tagRenderings": {
"name": {
"freeform": {
"placeholder": "Name of the food court"
},
"question": "What is the name of this food court?",
"render": "This food court is called <b>{name}</b>."
}
},
"title": {
"render": "Food Court"
}
},
"ghost_bike": { "ghost_bike": {
"description": "A layer showing memorials for cyclists, killed in road accidents", "description": "A layer showing memorials for cyclists, killed in road accidents",
"name": "Ghost bikes", "name": "Ghost bikes",
@ -6682,74 +6625,6 @@
"render": "OSM Community Index" "render": "OSM Community Index"
} }
}, },
"outdoor_seating": {
"description": "Outdoor seating areas, usually located near cafes and restaurants.",
"name": "Outdoor Seating",
"tagRenderings": {
"access": {
"mappings": {
"0": {
"then": "Anyone can use this outdoor seating area."
},
"1": {
"then": "Only customers can use this outdoor seating area."
},
"2": {
"then": "This outdoor seating area is private."
}
},
"question": "Who can use this outdoor seating area?"
},
"covered": {
"mappings": {
"0": {
"then": "This outdoor seating area is covered."
},
"1": {
"then": "This outdoor seating area is not covered."
}
},
"question": "Is this outdoor seating area covered?"
},
"heating": {
"mappings": {
"0": {
"then": "This outdoor seating area is heated."
},
"1": {
"then": "This outdoor seating area is not heated."
}
},
"question": "Is this outdoor seating area heated?"
},
"seasonal": {
"mappings": {
"0": {
"then": "This outdoor seating area is available all year round."
},
"1": {
"then": "This outdoor seating area is available in spring."
},
"2": {
"then": "This outdoor seating area is available in summer."
},
"3": {
"then": "This outdoor seating area is available in autumn."
},
"4": {
"then": "This outdoor seating area is available in winter."
},
"5": {
"then": "This outdoor seating area is available in the dry season."
}
},
"question": "Is this outdoor seating area seasonal?"
}
},
"title": {
"render": "Outdoor Seating area"
}
},
"parcel_lockers": { "parcel_lockers": {
"description": "Layer showing parcel lockers for collecting and sending parcels.", "description": "Layer showing parcel lockers for collecting and sending parcels.",
"name": "Parcel Lockers", "name": "Parcel Lockers",
@ -9068,10 +8943,6 @@
} }
}, },
"tagRenderings": { "tagRenderings": {
"camera_direction": {
"question": "In which geographical direction does this camera film?",
"render": "Films to a compass heading of {direction}"
},
"maxspeed": { "maxspeed": {
"freeform": { "freeform": {
"placeholder": "Maximum speed allowed" "placeholder": "Maximum speed allowed"
@ -11395,4 +11266,4 @@
"render": "wind turbine" "render": "wind turbine"
} }
} }
} }

View file

@ -275,4 +275,4 @@
} }
} }
} }
} }

View file

@ -4884,4 +4884,4 @@
} }
} }
} }
} }

View file

@ -289,4 +289,4 @@
} }
} }
} }
} }

View file

@ -126,4 +126,4 @@
"render": "Asetukset" "render": "Asetukset"
} }
} }
} }

View file

@ -135,4 +135,4 @@
} }
} }
} }
} }

View file

@ -394,4 +394,4 @@
} }
} }
} }
} }

View file

@ -484,4 +484,4 @@
} }
} }
} }
} }

View file

@ -968,4 +968,4 @@
"render": "szélerőmű" "render": "szélerőmű"
} }
} }
} }

View file

@ -942,4 +942,4 @@
"render": "turbin angin" "render": "turbin angin"
} }
} }
} }

View file

@ -3102,4 +3102,4 @@
"render": "pala eolica" "render": "pala eolica"
} }
} }
} }

View file

@ -642,4 +642,4 @@
"render": "店" "render": "店"
} }
} }
} }

View file

@ -847,4 +847,4 @@
} }
} }
} }
} }

View file

@ -1227,18 +1227,10 @@
}, },
"question": "Is deze fietsenstalling gratis te gebruiken?" "question": "Is deze fietsenstalling gratis te gebruiken?"
}, },
"maxstay": {
"question": "Wat is de toegestane, maximale parkeerduur?",
"questionHint": "Indien een fiets langer geparkeerd staat, kan deze verwijderd worden door de beheerder",
"render": "Een fiets mag hier maximaal {canonical(maxstay)} parkeren"
},
"operator": { "operator": {
"question": "Wie beheert deze fietsenstalling?", "question": "Wie beheert deze fietsenstalling?",
"render": "Deze fietsenstalling wordt beheerd door {operator}" "render": "Deze fietsenstalling wordt beheerd door {operator}"
}, },
"operator_email": {
"question": "Wat is het emailadres van de beheerder van deze parking?"
},
"operator_phone": { "operator_phone": {
"question": "Wat is het telefoonnummer van de operator van deze fietsenstalling?", "question": "Wat is het telefoonnummer van de operator van deze fietsenstalling?",
"questionHint": "Men kan dit nummer bellen om bv. fietswrakken of defecten te melden" "questionHint": "Men kan dit nummer bellen om bv. fietswrakken of defecten te melden"
@ -1882,9 +1874,6 @@
}, },
"16": { "16": {
"question": "Heeft een <div style='display: inline-block'><b><b>Bosch Active Connect met 5 pinnen</b> aan een kabel</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/bosch-5pin.svg'/></div>" "question": "Heeft een <div style='display: inline-block'><b><b>Bosch Active Connect met 5 pinnen</b> aan een kabel</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/bosch-5pin.svg'/></div>"
},
"17": {
"question": "Heeft een <div style='display: inline-block'><b><b>BS1363</b> (VK 3-pin)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/bs1363.svg'/></div>"
} }
} }
} }
@ -2029,12 +2018,6 @@
}, },
"31": { "31": {
"then": "<b>Bosch Active Connect met 5 pinnen</b> aan een kabel" "then": "<b>Bosch Active Connect met 5 pinnen</b> aan een kabel"
},
"32": {
"then": "<b>BS1363</b> (VK 3-pin)"
},
"33": {
"then": "<b>BS1363</b> (VK 3-pin)"
} }
}, },
"question": "Welke aansluitingen zijn hier beschikbaar?" "question": "Welke aansluitingen zijn hier beschikbaar?"
@ -2269,9 +2252,6 @@
}, },
"15": { "15": {
"2": "<b>Bosch Active Connect met 5 pinnen</b> aan een kabel" "2": "<b>Bosch Active Connect met 5 pinnen</b> aan een kabel"
},
"16": {
"2": "<b>BS1363</b> (VK 3-pin)"
} }
} }
} }
@ -7349,10 +7329,6 @@
} }
}, },
"tagRenderings": { "tagRenderings": {
"camera_direction": {
"question": "In welke geografische richting filmt deze camera?",
"render": "Filmt in kompasrichting {direction}"
},
"maxspeed": { "maxspeed": {
"freeform": { "freeform": {
"placeholder": "Maximum toegestane snelheid" "placeholder": "Maximum toegestane snelheid"
@ -9433,4 +9409,4 @@
"render": "windturbine" "render": "windturbine"
} }
} }
} }

View file

@ -293,4 +293,4 @@
} }
} }
} }
} }

View file

@ -2718,4 +2718,4 @@
"render": "turbina wiatrowa" "render": "turbina wiatrowa"
} }
} }
} }

View file

@ -1925,4 +1925,4 @@
} }
} }
} }
} }

View file

@ -1589,4 +1589,4 @@
} }
} }
} }
} }

View file

@ -1970,4 +1970,4 @@
} }
} }
} }
} }

View file

@ -463,4 +463,4 @@
} }
} }
} }
} }

View file

@ -137,4 +137,4 @@
} }
} }
} }
} }

View file

@ -6,4 +6,4 @@
"artwork": { "artwork": {
"description": "ⵢⴰⵜ ⵜⴽⴰⵕⴹⴰ ⵉⵕⵥⵎⵏ ⵅⴼ ⵉⵙⴼⵔⵉⵙⵏ, ⵉⵖⵔⴰⵙⵏ ⴷ ⵜⵡⵓⵔⵉⵡⵉⵏ ⵜⵉⵏⴰⵥⵓⵕⵉⵏ ⵢⴰⴹⵏⵉⵏ ⴳ ⵓⵎⴰⴹⴰⵍ" "description": "ⵢⴰⵜ ⵜⴽⴰⵕⴹⴰ ⵉⵕⵥⵎⵏ ⵅⴼ ⵉⵙⴼⵔⵉⵙⵏ, ⵉⵖⵔⴰⵙⵏ ⴷ ⵜⵡⵓⵔⵉⵡⵉⵏ ⵜⵉⵏⴰⵥⵓⵕⵉⵏ ⵢⴰⴹⵏⵉⵏ ⴳ ⵓⵎⴰⴹⴰⵍ"
} }
} }

View file

@ -627,4 +627,4 @@
} }
} }
} }
} }

View file

@ -856,4 +856,4 @@
"render": "風機" "render": "風機"
} }
} }
} }

View file

@ -899,6 +899,33 @@
"onwheels": { "onwheels": {
"description": "En aquest mapa, es mostren llocs públics accessibles per a cadira de rodes i es poden afegir fàcilment", "description": "En aquest mapa, es mostren llocs públics accessibles per a cadira de rodes i es poden afegir fàcilment",
"layers": { "layers": {
"19": {
"override": {
"=title": {
"render": "Estadístiques"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importar"
}
}
},
"1": {
"render": {
"special": {
"message": "Afegiu totes les etiquetes suggerides"
}
}
}
}
}
},
"4": { "4": {
"override": { "override": {
"filter": { "filter": {
@ -941,33 +968,6 @@
"override": { "override": {
"name": "Places d'aparcament per a minusvàlids" "name": "Places d'aparcament per a minusvàlids"
} }
},
"19": {
"override": {
"=title": {
"render": "Estadístiques"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importar"
}
}
},
"1": {
"render": {
"special": {
"message": "Afegiu totes les etiquetes suggerides"
}
}
}
}
}
} }
}, },
"title": "Sobre rodes" "title": "Sobre rodes"
@ -1128,10 +1128,6 @@
"stations": { "stations": {
"description": "Veure, editar i afegir detalls a una estació de tren", "description": "Veure, editar i afegir detalls a una estació de tren",
"layers": { "layers": {
"3": {
"description": "Capa que mostra les estacions de tren",
"name": "Estació de tren"
},
"16": { "16": {
"description": "Pantalles que mostren els trens que sortiran de l'estació", "description": "Pantalles que mostren els trens que sortiran de l'estació",
"name": "Taulers de sortides", "name": "Taulers de sortides",
@ -1163,6 +1159,10 @@
"title": { "title": {
"render": "Tauler de sortides" "render": "Tauler de sortides"
} }
},
"3": {
"description": "Capa que mostra les estacions de tren",
"name": "Estació de tren"
} }
}, },
"title": "Estacions de tren" "title": "Estacions de tren"
@ -1284,4 +1284,4 @@
"shortDescription": "Un mapa amb papereres", "shortDescription": "Un mapa amb papereres",
"title": "Papepera" "title": "Papepera"
} }
} }

View file

@ -906,6 +906,33 @@
"onwheels": { "onwheels": {
"description": "Na této mapě jsou zobrazena veřejně přístupná místa pro vozíčkáře, a lze je také snadno přidat", "description": "Na této mapě jsou zobrazena veřejně přístupná místa pro vozíčkáře, a lze je také snadno přidat",
"layers": { "layers": {
"19": {
"override": {
"=title": {
"render": "Statistiky"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Dovoz"
}
}
},
"1": {
"render": {
"special": {
"message": "Přidat všechny navrhované značky"
}
}
}
}
}
},
"4": { "4": {
"override": { "override": {
"filter": { "filter": {
@ -948,33 +975,6 @@
"override": { "override": {
"name": "Parkovací místa pro osoby se zdravotním postižením" "name": "Parkovací místa pro osoby se zdravotním postižením"
} }
},
"19": {
"override": {
"=title": {
"render": "Statistiky"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Dovoz"
}
}
},
"1": {
"render": {
"special": {
"message": "Přidat všechny navrhované značky"
}
}
}
}
}
} }
}, },
"title": "Na kolečkách" "title": "Na kolečkách"
@ -1135,10 +1135,6 @@
"stations": { "stations": {
"description": "Zobrazení, úprava a přidání podrobností o vlakovém nádraží", "description": "Zobrazení, úprava a přidání podrobností o vlakovém nádraží",
"layers": { "layers": {
"3": {
"description": "Vrstva zobrazující vlaková nádraží",
"name": "Vlaková nádraží"
},
"16": { "16": {
"description": "Zobrazuje vlaky odjíždějící z této stanice", "description": "Zobrazuje vlaky odjíždějící z této stanice",
"name": "Odjezdové tabule", "name": "Odjezdové tabule",
@ -1170,6 +1166,10 @@
"title": { "title": {
"render": "Odjezdová tabule" "render": "Odjezdová tabule"
} }
},
"3": {
"description": "Vrstva zobrazující vlaková nádraží",
"name": "Vlaková nádraží"
} }
}, },
"title": "Vlaková nádraží" "title": "Vlaková nádraží"
@ -1306,4 +1306,4 @@
"shortDescription": "Mapa odpadkových košů", "shortDescription": "Mapa odpadkových košů",
"title": "Odpadkový koš" "title": "Odpadkový koš"
} }
} }

View file

@ -631,6 +631,33 @@
"onwheels": { "onwheels": {
"description": "På dette kort vises steder, der er offentligt tilgængelige for kørestolsbrugere, og de kan nemt tilføjes", "description": "På dette kort vises steder, der er offentligt tilgængelige for kørestolsbrugere, og de kan nemt tilføjes",
"layers": { "layers": {
"19": {
"override": {
"=title": {
"render": "Statistikker"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importere"
}
}
},
"1": {
"render": {
"special": {
"message": "Tilføj alle de foreslåede tags"
}
}
}
}
}
},
"4": { "4": {
"override": { "override": {
"filter": { "filter": {
@ -668,33 +695,6 @@
} }
} }
} }
},
"19": {
"override": {
"=title": {
"render": "Statistikker"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importere"
}
}
},
"1": {
"render": {
"special": {
"message": "Tilføj alle de foreslåede tags"
}
}
}
}
}
} }
} }
}, },
@ -915,4 +915,4 @@
"shortDescription": "Et kort med affaldskurve", "shortDescription": "Et kort med affaldskurve",
"title": "Affaldskurv" "title": "Affaldskurv"
} }
} }

View file

@ -975,6 +975,133 @@
}, },
"title": "Bordsteine und Überwege" "title": "Bordsteine und Überwege"
}, },
"mapcomplete-changes": {
"description": "Diese Karte zeigt alle mit MapComplete vorgenommenen Änderungen",
"layers": {
"0": {
"description": "Alle MapComplete-Änderungen anzeigen",
"filter": {
"0": {
"options": {
"0": {
"question": "Themenname enthält {search}"
}
}
},
"1": {
"options": {
"0": {
"question": "Themename enthält <b>not</b> {search}"
}
}
},
"10": {
"options": {
"0": {
"question": "Etymologie-Thema ausschließen"
}
}
},
"2": {
"options": {
"0": {
"question": "Erstellt vom Mitwirkenden {search}"
}
}
},
"3": {
"options": {
"0": {
"question": "<b>Nicht</b> erstellt von Mitwirkendem {search}"
}
}
},
"4": {
"options": {
"0": {
"question": "Erstellt vor {search}"
}
}
},
"5": {
"options": {
"0": {
"question": "Erstellt nach {search}"
}
}
},
"6": {
"options": {
"0": {
"question": "Benutzersprache (ISO-Code) {search}"
}
}
},
"7": {
"options": {
"0": {
"question": "Erstellt mit Host {search}"
}
}
},
"8": {
"options": {
"0": {
"question": "Änderungssatz hat mindestens ein Bild hinzugefügt"
}
}
},
"9": {
"options": {
"0": {
"question": "GRB-Thema ausschließen"
}
}
}
},
"name": "Zentrum der Änderungssätze",
"tagRenderings": {
"contributor": {
"question": "Welcher Mitwirkende hat diese Änderung vorgenommen?",
"render": "Änderung vorgenommen von <a href='https://openstreetmap.org/user/{user}' target='_blank'>{user}</a>"
},
"host": {
"question": "Über welchen Host (Webseite) wurde diese Änderung vorgenommen?",
"render": "Änderung über <a href='{host}'>{host}</a>"
},
"locale": {
"question": "In welcher Benutzersprache wurde die Änderung vorgenommen?",
"render": "Benutzersprache {locale}"
},
"show_changeset_id": {
"render": "Änderungssatz <a href='https://openstreetmap.org/changeset/{id}' target='_blank'>{id}</a>"
},
"theme-id": {
"question": "Welches Thema wurde für die Änderung verwendet?",
"render": "Geändert mit Thema <a href='https://mapcomplete.osm.be/{theme}'>{theme}</a>"
},
"version": {
"question": "Mit welcher MapComplete Version wurde die Änderung vorgenommen?",
"render": "Erstellt mit {editor}"
}
},
"title": {
"render": "Änderungssatz für {theme}"
}
},
"1": {
"override": {
"tagRenderings+": {
"0": {
"render": "Weitere Statistiken gibt es <a href='https://github.com/pietervdvn/MapComplete/tree/develop/Docs/Tools/graphs' target='_blank'>hier</a>"
}
}
}
}
},
"shortDescription": "Änderungen von MapComplete anzeigen",
"title": "Änderungen mit MapComplete"
},
"maproulette": { "maproulette": {
"description": "Thema mit MapRoulette-Aufgaben, die Sie suchen, filtern und beheben können.", "description": "Thema mit MapRoulette-Aufgaben, die Sie suchen, filtern und beheben können.",
"title": "MapRoulette-Aufgaben" "title": "MapRoulette-Aufgaben"
@ -1010,6 +1137,33 @@
"onwheels": { "onwheels": {
"description": "Auf dieser Karte können Sie öffentlich zugängliche Orte für Rollstuhlfahrer ansehen, bearbeiten oder hinzufügen", "description": "Auf dieser Karte können Sie öffentlich zugängliche Orte für Rollstuhlfahrer ansehen, bearbeiten oder hinzufügen",
"layers": { "layers": {
"19": {
"override": {
"=title": {
"render": "Statistik"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Import"
}
}
},
"1": {
"render": {
"special": {
"message": "Alle vorgeschlagenen Tags hinzufügen"
}
}
}
}
}
},
"4": { "4": {
"override": { "override": {
"filter": { "filter": {
@ -1052,33 +1206,6 @@
"override": { "override": {
"name": "Barrierefreie Parkplätze" "name": "Barrierefreie Parkplätze"
} }
},
"19": {
"override": {
"=title": {
"render": "Statistik"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Import"
}
}
},
"1": {
"render": {
"special": {
"message": "Alle vorgeschlagenen Tags hinzufügen"
}
}
}
}
}
} }
}, },
"title": "Auf Rädern" "title": "Auf Rädern"
@ -1320,10 +1447,6 @@
"stations": { "stations": {
"description": "Bahnhofsdetails ansehen, bearbeiten und hinzufügen", "description": "Bahnhofsdetails ansehen, bearbeiten und hinzufügen",
"layers": { "layers": {
"3": {
"description": "Ebene mit Bahnhöfen",
"name": "Bahnhöfe"
},
"16": { "16": {
"description": "Anzeigen der Züge, die von diesem Bahnhof abfahren", "description": "Anzeigen der Züge, die von diesem Bahnhof abfahren",
"name": "Abfahrtstafeln", "name": "Abfahrtstafeln",
@ -1355,6 +1478,10 @@
"title": { "title": {
"render": "Abfahrtstafel" "render": "Abfahrtstafel"
} }
},
"3": {
"description": "Ebene mit Bahnhöfen",
"name": "Bahnhöfe"
} }
}, },
"title": "Bahnhöfe" "title": "Bahnhöfe"

View file

@ -676,7 +676,7 @@
}, },
"5": { "5": {
"override": { "override": {
"=name": "Toursistic places without etymology information" "=name": "Touristic places without etymology information"
} }
}, },
"6": { "6": {
@ -995,6 +995,13 @@
} }
} }
}, },
"10": {
"options": {
"0": {
"question": "Exclude etymology theme"
}
}
},
"2": { "2": {
"options": { "options": {
"0": { "0": {
@ -1050,13 +1057,6 @@
"question": "Exclude GRB theme" "question": "Exclude GRB theme"
} }
} }
},
"10": {
"options": {
"0": {
"question": "Exclude etymology theme"
}
}
} }
}, },
"name": "Changeset centers", "name": "Changeset centers",
@ -1137,6 +1137,33 @@
"onwheels": { "onwheels": {
"description": "On this map, publicly weelchair accessible places are shown and can be easily added", "description": "On this map, publicly weelchair accessible places are shown and can be easily added",
"layers": { "layers": {
"19": {
"override": {
"=title": {
"render": "Statistics"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Import"
}
}
},
"1": {
"render": {
"special": {
"message": "Add all the suggested tags"
}
}
}
}
}
},
"4": { "4": {
"override": { "override": {
"filter": { "filter": {
@ -1179,33 +1206,6 @@
"override": { "override": {
"name": "Disabled parking spaces" "name": "Disabled parking spaces"
} }
},
"19": {
"override": {
"=title": {
"render": "Statistics"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Import"
}
}
},
"1": {
"render": {
"special": {
"message": "Add all the suggested tags"
}
}
}
}
}
} }
}, },
"title": "OnWheels" "title": "OnWheels"
@ -1447,10 +1447,6 @@
"stations": { "stations": {
"description": "View, edit and add details to a train station", "description": "View, edit and add details to a train station",
"layers": { "layers": {
"3": {
"description": "Layer showing train stations",
"name": "Train Stations"
},
"16": { "16": {
"description": "Displays showing the trains that will leave from this station", "description": "Displays showing the trains that will leave from this station",
"name": "Departures boards", "name": "Departures boards",
@ -1482,6 +1478,10 @@
"title": { "title": {
"render": "Departures board" "render": "Departures board"
} }
},
"3": {
"description": "Layer showing train stations",
"name": "Train Stations"
} }
}, },
"title": "Train Stations" "title": "Train Stations"
@ -1660,4 +1660,4 @@
"shortDescription": "A map with waste baskets", "shortDescription": "A map with waste baskets",
"title": "Waste Baskets" "title": "Waste Baskets"
} }
} }

View file

@ -956,6 +956,33 @@
"onwheels": { "onwheels": {
"description": "En este mapa se muestran los lugares accesibles al público en silla de ruedas, que pueden añadirse fácilmente", "description": "En este mapa se muestran los lugares accesibles al público en silla de ruedas, que pueden añadirse fácilmente",
"layers": { "layers": {
"19": {
"override": {
"=title": {
"render": "Estadísticas"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importar"
}
}
},
"1": {
"render": {
"special": {
"message": "Añadir todas las etiquetas sugeridas"
}
}
}
}
}
},
"4": { "4": {
"override": { "override": {
"filter": { "filter": {
@ -998,33 +1025,6 @@
"override": { "override": {
"name": "Plazas de aparcamiento para discapacitados" "name": "Plazas de aparcamiento para discapacitados"
} }
},
"19": {
"override": {
"=title": {
"render": "Estadísticas"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importar"
}
}
},
"1": {
"render": {
"special": {
"message": "Añadir todas las etiquetas sugeridas"
}
}
}
}
}
} }
}, },
"title": "Sobre ruedas" "title": "Sobre ruedas"
@ -1240,10 +1240,6 @@
"stations": { "stations": {
"description": "Ver, editar y añadir detalles a una estación de tren", "description": "Ver, editar y añadir detalles a una estación de tren",
"layers": { "layers": {
"3": {
"description": "Capa que muestra las estaciones de tren",
"name": "Estación de Tren"
},
"16": { "16": {
"description": "Pantallas que muestran los trenes que saldrán de esta estación", "description": "Pantallas que muestran los trenes que saldrán de esta estación",
"name": "Tableros de salidas", "name": "Tableros de salidas",
@ -1275,6 +1271,10 @@
"title": { "title": {
"render": "Tablero de salidas" "render": "Tablero de salidas"
} }
},
"3": {
"description": "Capa que muestra las estaciones de tren",
"name": "Estación de Tren"
} }
}, },
"title": "Estaciones de tren" "title": "Estaciones de tren"
@ -1453,4 +1453,4 @@
"shortDescription": "Un mapa con papeleras", "shortDescription": "Un mapa con papeleras",
"title": "Papeleras" "title": "Papeleras"
} }
} }

View file

@ -93,6 +93,9 @@
"shortDescription": "Carte des bancs", "shortDescription": "Carte des bancs",
"title": "Bancs" "title": "Bancs"
}, },
"bicycle_parkings": {
"title": "Stationnement vélo"
},
"bicycle_rental": { "bicycle_rental": {
"description": "Vous trouverez sur cette carte toutes les stations de location de vélo telles qu'elles sont référencées dans OpenStreetMap", "description": "Vous trouverez sur cette carte toutes les stations de location de vélo telles qu'elles sont référencées dans OpenStreetMap",
"shortDescription": "Une carte avec des stations et magasins de location de vélos", "shortDescription": "Une carte avec des stations et magasins de location de vélos",
@ -861,6 +864,33 @@
"onwheels": { "onwheels": {
"description": "Sur cette carte nous pouvons voir et ajouter les différents endroits publiques accessibles aux chaises roulantes", "description": "Sur cette carte nous pouvons voir et ajouter les différents endroits publiques accessibles aux chaises roulantes",
"layers": { "layers": {
"19": {
"override": {
"=title": {
"render": "Statistiques"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importation"
}
}
},
"1": {
"render": {
"special": {
"message": "Ajouter tous les attributs suggérés"
}
}
}
}
}
},
"4": { "4": {
"override": { "override": {
"filter": { "filter": {
@ -903,33 +933,6 @@
"override": { "override": {
"name": "Places de stationnement pour personnes handicapées" "name": "Places de stationnement pour personnes handicapées"
} }
},
"19": {
"override": {
"=title": {
"render": "Statistiques"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importation"
}
}
},
"1": {
"render": {
"special": {
"message": "Ajouter tous les attributs suggérés"
}
}
}
}
}
} }
}, },
"title": "OnWheels" "title": "OnWheels"
@ -1090,10 +1093,6 @@
"stations": { "stations": {
"description": "Voir, modifier et ajouter des détails à une gare ferroviaire", "description": "Voir, modifier et ajouter des détails à une gare ferroviaire",
"layers": { "layers": {
"3": {
"description": "Couche montrant les gares",
"name": "Gares ferroviaires"
},
"16": { "16": {
"description": "Panneau affichant les trains au départ depuis cette gare", "description": "Panneau affichant les trains au départ depuis cette gare",
"name": "Panneaux des départs", "name": "Panneaux des départs",
@ -1125,6 +1124,10 @@
"title": { "title": {
"render": "Tableau des départs" "render": "Tableau des départs"
} }
},
"3": {
"description": "Couche montrant les gares",
"name": "Gares ferroviaires"
} }
}, },
"title": "Gares ferroviaires" "title": "Gares ferroviaires"
@ -1246,4 +1249,4 @@
"shortDescription": "Une carte des poubelles", "shortDescription": "Une carte des poubelles",
"title": "Poubelles" "title": "Poubelles"
} }
} }

View file

@ -494,19 +494,6 @@
}, },
"onwheels": { "onwheels": {
"layers": { "layers": {
"4": {
"override": {
"filter": {
"0": {
"options": {
"1": {
"question": "Uten breddeinfo"
}
}
}
}
}
},
"19": { "19": {
"override": { "override": {
"=title": { "=title": {
@ -533,6 +520,19 @@
} }
} }
} }
},
"4": {
"override": {
"filter": {
"0": {
"options": {
"1": {
"question": "Uten breddeinfo"
}
}
}
}
}
} }
}, },
"title": "På hjul" "title": "På hjul"
@ -626,10 +626,6 @@
}, },
"stations": { "stations": {
"layers": { "layers": {
"3": {
"description": "Lag som viser togstasjoner",
"name": "Togstasjoner"
},
"16": { "16": {
"tagRenderings": { "tagRenderings": {
"type": { "type": {
@ -640,6 +636,10 @@
} }
} }
} }
},
"3": {
"description": "Lag som viser togstasjoner",
"name": "Togstasjoner"
} }
}, },
"title": "Togstasjoner" "title": "Togstasjoner"
@ -735,4 +735,4 @@
"shortDescription": "Oversikt over søppelkurver", "shortDescription": "Oversikt over søppelkurver",
"title": "Søppelkurv" "title": "Søppelkurv"
} }
} }

View file

@ -908,6 +908,33 @@
"onwheels": { "onwheels": {
"description": "Op deze kaart kan je informatie rond rolstoeltoegankelijkheid zien, zoals toegangsdeuren met hun breedte en drempelhoogte, toiletten met toegankelijkheidsinformatie, recepties maar ook winkels, cafés en restaurants.", "description": "Op deze kaart kan je informatie rond rolstoeltoegankelijkheid zien, zoals toegangsdeuren met hun breedte en drempelhoogte, toiletten met toegankelijkheidsinformatie, recepties maar ook winkels, cafés en restaurants.",
"layers": { "layers": {
"19": {
"override": {
"=title": {
"render": "Statistieken"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importeren"
}
}
},
"1": {
"render": {
"special": {
"message": "Voeg alle gesuggereerde tags toe"
}
}
}
}
}
},
"4": { "4": {
"override": { "override": {
"filter": { "filter": {
@ -950,33 +977,6 @@
"override": { "override": {
"name": "Parkeerplaatsen voor personen met een beperking" "name": "Parkeerplaatsen voor personen met een beperking"
} }
},
"19": {
"override": {
"=title": {
"render": "Statistieken"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importeren"
}
}
},
"1": {
"render": {
"special": {
"message": "Voeg alle gesuggereerde tags toe"
}
}
}
}
}
} }
}, },
"title": "OnWheels" "title": "OnWheels"
@ -1183,10 +1183,6 @@
"stations": { "stations": {
"description": "Bekijk, bewerk en voeg details to aan een treinstation", "description": "Bekijk, bewerk en voeg details to aan een treinstation",
"layers": { "layers": {
"3": {
"description": "Laag met treinstations",
"name": "Treinstations"
},
"16": { "16": {
"description": "Schermen die treinen tonen die van dit station vertrekken", "description": "Schermen die treinen tonen die van dit station vertrekken",
"name": "Vertrektijdenborden", "name": "Vertrektijdenborden",
@ -1218,6 +1214,10 @@
"title": { "title": {
"render": "Vertrektijdenbord" "render": "Vertrektijdenbord"
} }
},
"3": {
"description": "Laag met treinstations",
"name": "Treinstations"
} }
}, },
"title": "Treinstations" "title": "Treinstations"
@ -1387,4 +1387,4 @@
"shortDescription": "Een kaart met vuilnisbakken", "shortDescription": "Een kaart met vuilnisbakken",
"title": "Vuilnisbakken" "title": "Vuilnisbakken"
} }
} }

View file

@ -875,6 +875,33 @@
"onwheels": { "onwheels": {
"description": "Na tej mapie pokazane są miejsca publicznie dostępne dla wózków inwalidzkich, które można łatwo dodać", "description": "Na tej mapie pokazane są miejsca publicznie dostępne dla wózków inwalidzkich, które można łatwo dodać",
"layers": { "layers": {
"19": {
"override": {
"=title": {
"render": "Statystyki"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Import"
}
}
},
"1": {
"render": {
"special": {
"message": "Dodaj wszystkie sugerowane znaczniki"
}
}
}
}
}
},
"4": { "4": {
"override": { "override": {
"filter": { "filter": {
@ -917,33 +944,6 @@
"override": { "override": {
"name": "Miejsca parkingowe dla niepełnosprawnych" "name": "Miejsca parkingowe dla niepełnosprawnych"
} }
},
"19": {
"override": {
"=title": {
"render": "Statystyki"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Import"
}
}
},
"1": {
"render": {
"special": {
"message": "Dodaj wszystkie sugerowane znaczniki"
}
}
}
}
}
} }
}, },
"title": "Na kółkach" "title": "Na kółkach"
@ -1104,10 +1104,6 @@
"stations": { "stations": {
"description": "Przeglądaj, edytuj i dodawaj szczegóły do stacji kolejowej", "description": "Przeglądaj, edytuj i dodawaj szczegóły do stacji kolejowej",
"layers": { "layers": {
"3": {
"description": "Warstwa pokazująca stacje kolejowe",
"name": "Stacje Kolejowe"
},
"16": { "16": {
"description": "Ekrany wyświetlające pokazujące pociągi, które odjadą z tej stacji", "description": "Ekrany wyświetlające pokazujące pociągi, które odjadą z tej stacji",
"name": "Tablice odjazdów", "name": "Tablice odjazdów",
@ -1139,6 +1135,10 @@
"title": { "title": {
"render": "Tablica odjazdów" "render": "Tablica odjazdów"
} }
},
"3": {
"description": "Warstwa pokazująca stacje kolejowe",
"name": "Stacje Kolejowe"
} }
}, },
"title": "Stacje Kolejowe" "title": "Stacje Kolejowe"
@ -1260,4 +1260,4 @@
"shortDescription": "Mapa koszy na śmieci", "shortDescription": "Mapa koszy na śmieci",
"title": "Kosz na śmieci" "title": "Kosz na śmieci"
} }
} }

3988
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -173,6 +173,7 @@
"marked": "^12.0.2", "marked": "^12.0.2",
"monaco-editor": "^0.46.0", "monaco-editor": "^0.46.0",
"name-suggestion-index": "^6.0.20240422", "name-suggestion-index": "^6.0.20240422",
"npm": "^10.7.0",
"opening_hours": "^3.6.0", "opening_hours": "^3.6.0",
"osm-auth": "^2.2.0", "osm-auth": "^2.2.0",
"osmtogeojson": "^3.0.0-beta.5", "osmtogeojson": "^3.0.0-beta.5",

View file

@ -31,7 +31,7 @@
::before, ::before,
::after { ::after {
--tw-content: ""; --tw-content: '';
} }
/* /*
@ -50,12 +50,10 @@ html {
/* 3 */ /* 3 */
tab-size: 4; tab-size: 4;
/* 3 */ /* 3 */
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
"Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
"Segoe UI Symbol", "Noto Color Emoji";
/* 4 */ /* 4 */
-webkit-font-feature-settings: normal; -webkit-font-feature-settings: normal;
font-feature-settings: normal; font-feature-settings: normal;
/* 5 */ /* 5 */
} }
@ -92,7 +90,7 @@ Add the correct text decoration in Chrome, Edge, and Safari.
abbr:where([title]) { abbr:where([title]) {
-webkit-text-decoration: underline dotted; -webkit-text-decoration: underline dotted;
text-decoration: underline dotted; text-decoration: underline dotted;
} }
/* /*
@ -136,8 +134,7 @@ code,
kbd, kbd,
samp, samp,
pre { pre {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
"Courier New", monospace;
/* 1 */ /* 1 */
font-size: 1em; font-size: 1em;
/* 2 */ /* 2 */
@ -228,9 +225,9 @@ select {
*/ */
button, button,
[type="button"], [type='button'],
[type="reset"], [type='reset'],
[type="submit"] { [type='submit'] {
-webkit-appearance: button; -webkit-appearance: button;
/* 1 */ /* 1 */
background-color: transparent; background-color: transparent;
@ -277,7 +274,7 @@ Correct the cursor style of increment and decrement buttons in Safari.
2. Correct the outline style in Safari. 2. Correct the outline style in Safari.
*/ */
[type="search"] { [type='search'] {
-webkit-appearance: textfield; -webkit-appearance: textfield;
/* 1 */ /* 1 */
outline-offset: -2px; outline-offset: -2px;
@ -362,8 +359,7 @@ textarea {
2. Set the default placeholder color to the user's configured gray 400 color. 2. Set the default placeholder color to the user's configured gray 400 color.
*/ */
input::-webkit-input-placeholder, input::-webkit-input-placeholder, textarea::-webkit-input-placeholder {
textarea::-webkit-input-placeholder {
opacity: 1; opacity: 1;
/* 1 */ /* 1 */
color: #9ca3af; color: #9ca3af;
@ -431,9 +427,7 @@ video {
display: none; display: none;
} }
*, *, ::before, ::after {
::before,
::after {
--tw-border-spacing-x: 0; --tw-border-spacing-x: 0;
--tw-border-spacing-y: 0; --tw-border-spacing-y: 0;
--tw-translate-x: 0; --tw-translate-x: 0;
@ -443,16 +437,16 @@ video {
--tw-skew-y: 0; --tw-skew-y: 0;
--tw-scale-x: 1; --tw-scale-x: 1;
--tw-scale-y: 1; --tw-scale-y: 1;
--tw-pan-x: ; --tw-pan-x: ;
--tw-pan-y: ; --tw-pan-y: ;
--tw-pinch-zoom: ; --tw-pinch-zoom: ;
--tw-scroll-snap-strictness: proximity; --tw-scroll-snap-strictness: proximity;
--tw-ordinal: ; --tw-ordinal: ;
--tw-slashed-zero: ; --tw-slashed-zero: ;
--tw-numeric-figure: ; --tw-numeric-figure: ;
--tw-numeric-spacing: ; --tw-numeric-spacing: ;
--tw-numeric-fraction: ; --tw-numeric-fraction: ;
--tw-ring-inset: ; --tw-ring-inset: ;
--tw-ring-offset-width: 0px; --tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff; --tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-color: rgb(59 130 246 / 0.5);
@ -460,24 +454,24 @@ video {
--tw-ring-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000;
--tw-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000;
--tw-shadow-colored: 0 0 #0000; --tw-shadow-colored: 0 0 #0000;
--tw-blur: ; --tw-blur: ;
--tw-brightness: ; --tw-brightness: ;
--tw-contrast: ; --tw-contrast: ;
--tw-grayscale: ; --tw-grayscale: ;
--tw-hue-rotate: ; --tw-hue-rotate: ;
--tw-invert: ; --tw-invert: ;
--tw-saturate: ; --tw-saturate: ;
--tw-sepia: ; --tw-sepia: ;
--tw-drop-shadow: ; --tw-drop-shadow: ;
--tw-backdrop-blur: ; --tw-backdrop-blur: ;
--tw-backdrop-brightness: ; --tw-backdrop-brightness: ;
--tw-backdrop-contrast: ; --tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ; --tw-backdrop-grayscale: ;
--tw-backdrop-hue-rotate: ; --tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ; --tw-backdrop-invert: ;
--tw-backdrop-opacity: ; --tw-backdrop-opacity: ;
--tw-backdrop-saturate: ; --tw-backdrop-saturate: ;
--tw-backdrop-sepia: ; --tw-backdrop-sepia: ;
} }
::-webkit-backdrop { ::-webkit-backdrop {
@ -490,16 +484,16 @@ video {
--tw-skew-y: 0; --tw-skew-y: 0;
--tw-scale-x: 1; --tw-scale-x: 1;
--tw-scale-y: 1; --tw-scale-y: 1;
--tw-pan-x: ; --tw-pan-x: ;
--tw-pan-y: ; --tw-pan-y: ;
--tw-pinch-zoom: ; --tw-pinch-zoom: ;
--tw-scroll-snap-strictness: proximity; --tw-scroll-snap-strictness: proximity;
--tw-ordinal: ; --tw-ordinal: ;
--tw-slashed-zero: ; --tw-slashed-zero: ;
--tw-numeric-figure: ; --tw-numeric-figure: ;
--tw-numeric-spacing: ; --tw-numeric-spacing: ;
--tw-numeric-fraction: ; --tw-numeric-fraction: ;
--tw-ring-inset: ; --tw-ring-inset: ;
--tw-ring-offset-width: 0px; --tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff; --tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-color: rgb(59 130 246 / 0.5);
@ -507,24 +501,24 @@ video {
--tw-ring-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000;
--tw-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000;
--tw-shadow-colored: 0 0 #0000; --tw-shadow-colored: 0 0 #0000;
--tw-blur: ; --tw-blur: ;
--tw-brightness: ; --tw-brightness: ;
--tw-contrast: ; --tw-contrast: ;
--tw-grayscale: ; --tw-grayscale: ;
--tw-hue-rotate: ; --tw-hue-rotate: ;
--tw-invert: ; --tw-invert: ;
--tw-saturate: ; --tw-saturate: ;
--tw-sepia: ; --tw-sepia: ;
--tw-drop-shadow: ; --tw-drop-shadow: ;
--tw-backdrop-blur: ; --tw-backdrop-blur: ;
--tw-backdrop-brightness: ; --tw-backdrop-brightness: ;
--tw-backdrop-contrast: ; --tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ; --tw-backdrop-grayscale: ;
--tw-backdrop-hue-rotate: ; --tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ; --tw-backdrop-invert: ;
--tw-backdrop-opacity: ; --tw-backdrop-opacity: ;
--tw-backdrop-saturate: ; --tw-backdrop-saturate: ;
--tw-backdrop-sepia: ; --tw-backdrop-sepia: ;
} }
::backdrop { ::backdrop {
@ -537,16 +531,16 @@ video {
--tw-skew-y: 0; --tw-skew-y: 0;
--tw-scale-x: 1; --tw-scale-x: 1;
--tw-scale-y: 1; --tw-scale-y: 1;
--tw-pan-x: ; --tw-pan-x: ;
--tw-pan-y: ; --tw-pan-y: ;
--tw-pinch-zoom: ; --tw-pinch-zoom: ;
--tw-scroll-snap-strictness: proximity; --tw-scroll-snap-strictness: proximity;
--tw-ordinal: ; --tw-ordinal: ;
--tw-slashed-zero: ; --tw-slashed-zero: ;
--tw-numeric-figure: ; --tw-numeric-figure: ;
--tw-numeric-spacing: ; --tw-numeric-spacing: ;
--tw-numeric-fraction: ; --tw-numeric-fraction: ;
--tw-ring-inset: ; --tw-ring-inset: ;
--tw-ring-offset-width: 0px; --tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff; --tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-color: rgb(59 130 246 / 0.5);
@ -554,24 +548,24 @@ video {
--tw-ring-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000;
--tw-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000;
--tw-shadow-colored: 0 0 #0000; --tw-shadow-colored: 0 0 #0000;
--tw-blur: ; --tw-blur: ;
--tw-brightness: ; --tw-brightness: ;
--tw-contrast: ; --tw-contrast: ;
--tw-grayscale: ; --tw-grayscale: ;
--tw-hue-rotate: ; --tw-hue-rotate: ;
--tw-invert: ; --tw-invert: ;
--tw-saturate: ; --tw-saturate: ;
--tw-sepia: ; --tw-sepia: ;
--tw-drop-shadow: ; --tw-drop-shadow: ;
--tw-backdrop-blur: ; --tw-backdrop-blur: ;
--tw-backdrop-brightness: ; --tw-backdrop-brightness: ;
--tw-backdrop-contrast: ; --tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ; --tw-backdrop-grayscale: ;
--tw-backdrop-hue-rotate: ; --tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ; --tw-backdrop-invert: ;
--tw-backdrop-opacity: ; --tw-backdrop-opacity: ;
--tw-backdrop-saturate: ; --tw-backdrop-saturate: ;
--tw-backdrop-sepia: ; --tw-backdrop-sepia: ;
} }
.container { .container {
@ -787,10 +781,6 @@ video {
float: left; float: left;
} }
.m-2 {
margin: 0.5rem;
}
.m-4 { .m-4 {
margin: 1rem; margin: 1rem;
} }
@ -807,6 +797,10 @@ video {
margin: 2rem; margin: 2rem;
} }
.m-2 {
margin: 0.5rem;
}
.m-1 { .m-1 {
margin: 0.25rem; margin: 0.25rem;
} }
@ -1332,40 +1326,32 @@ video {
} }
.transform { .transform {
-webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) -webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate))
skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x))
scaleY(var(--tw-scale-y));
} }
.\!transform { .\!transform {
-webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) -webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) !important;
rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) !important;
scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) !important;
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate))
skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x))
scaleY(var(--tw-scale-y)) !important;
} }
@-webkit-keyframes spin { @-webkit-keyframes spin {
to { to {
-webkit-transform: rotate(360deg); -webkit-transform: rotate(360deg);
transform: rotate(360deg); transform: rotate(360deg);
} }
} }
@keyframes spin { @keyframes spin {
to { to {
-webkit-transform: rotate(360deg); -webkit-transform: rotate(360deg);
transform: rotate(360deg); transform: rotate(360deg);
} }
} }
.animate-spin { .animate-spin {
-webkit-animation: spin 1s linear infinite; -webkit-animation: spin 1s linear infinite;
animation: spin 1s linear infinite; animation: spin 1s linear infinite;
} }
.cursor-pointer { .cursor-pointer {
@ -1382,7 +1368,7 @@ video {
.appearance-none { .appearance-none {
-webkit-appearance: none; -webkit-appearance: none;
appearance: none; appearance: none;
} }
.grid-cols-3 { .grid-cols-3 {
@ -1471,17 +1457,17 @@ video {
.gap-x-4 { .gap-x-4 {
-webkit-column-gap: 1rem; -webkit-column-gap: 1rem;
column-gap: 1rem; column-gap: 1rem;
} }
.gap-x-0\.5 { .gap-x-0\.5 {
-webkit-column-gap: 0.125rem; -webkit-column-gap: 0.125rem;
column-gap: 0.125rem; column-gap: 0.125rem;
} }
.gap-x-0 { .gap-x-0 {
-webkit-column-gap: 0px; -webkit-column-gap: 0px;
column-gap: 0px; column-gap: 0px;
} }
.gap-y-2 { .gap-y-2 {
@ -1490,12 +1476,12 @@ video {
.gap-x-1 { .gap-x-1 {
-webkit-column-gap: 0.25rem; -webkit-column-gap: 0.25rem;
column-gap: 0.25rem; column-gap: 0.25rem;
} }
.gap-x-2 { .gap-x-2 {
-webkit-column-gap: 0.5rem; -webkit-column-gap: 0.5rem;
column-gap: 0.5rem; column-gap: 0.5rem;
} }
.gap-y-8 { .gap-y-8 {
@ -2044,44 +2030,37 @@ video {
.ordinal { .ordinal {
--tw-ordinal: ordinal; --tw-ordinal: ordinal;
font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);
var(--tw-numeric-spacing) var(--tw-numeric-fraction);
} }
.slashed-zero { .slashed-zero {
--tw-slashed-zero: slashed-zero; --tw-slashed-zero: slashed-zero;
font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);
var(--tw-numeric-spacing) var(--tw-numeric-fraction);
} }
.lining-nums { .lining-nums {
--tw-numeric-figure: lining-nums; --tw-numeric-figure: lining-nums;
font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);
var(--tw-numeric-spacing) var(--tw-numeric-fraction);
} }
.oldstyle-nums { .oldstyle-nums {
--tw-numeric-figure: oldstyle-nums; --tw-numeric-figure: oldstyle-nums;
font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);
var(--tw-numeric-spacing) var(--tw-numeric-fraction);
} }
.proportional-nums { .proportional-nums {
--tw-numeric-spacing: proportional-nums; --tw-numeric-spacing: proportional-nums;
font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);
var(--tw-numeric-spacing) var(--tw-numeric-fraction);
} }
.tabular-nums { .tabular-nums {
--tw-numeric-spacing: tabular-nums; --tw-numeric-spacing: tabular-nums;
font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);
var(--tw-numeric-spacing) var(--tw-numeric-fraction);
} }
.diagonal-fractions { .diagonal-fractions {
--tw-numeric-fraction: diagonal-fractions; --tw-numeric-fraction: diagonal-fractions;
font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);
var(--tw-numeric-spacing) var(--tw-numeric-fraction);
} }
.tracking-tight { .tracking-tight {
@ -2140,8 +2119,7 @@ video {
.shadow { .shadow {
--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
var(--tw-shadow);
} }
.outline-none { .outline-none {
@ -2154,10 +2132,8 @@ video {
} }
.ring { .ring {
--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
var(--tw-ring-offset-color); --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);
--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width))
var(--tw-ring-color);
box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
} }
@ -2167,137 +2143,89 @@ video {
.blur { .blur {
--tw-blur: blur(8px); --tw-blur: blur(8px);
-webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale)
var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
} }
.drop-shadow-md { .drop-shadow-md {
--tw-drop-shadow: drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) --tw-drop-shadow: drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06));
drop-shadow(0 2px 2px rgb(0 0 0 / 0.06)); -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
-webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale)
var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
} }
.drop-shadow-2xl { .drop-shadow-2xl {
--tw-drop-shadow: drop-shadow(0 25px 25px rgb(0 0 0 / 0.15)); --tw-drop-shadow: drop-shadow(0 25px 25px rgb(0 0 0 / 0.15));
-webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale)
var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
} }
.drop-shadow { .drop-shadow {
--tw-drop-shadow: drop-shadow(0 1px 2px rgb(0 0 0 / 0.1)) drop-shadow(0 1px 1px rgb(0 0 0 / 0.06)); --tw-drop-shadow: drop-shadow(0 1px 2px rgb(0 0 0 / 0.1)) drop-shadow(0 1px 1px rgb(0 0 0 / 0.06));
-webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale)
var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
} }
.grayscale { .grayscale {
--tw-grayscale: grayscale(100%); --tw-grayscale: grayscale(100%);
-webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale)
var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
} }
.invert { .invert {
--tw-invert: invert(100%); --tw-invert: invert(100%);
-webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale)
var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
} }
.sepia { .sepia {
--tw-sepia: sepia(100%); --tw-sepia: sepia(100%);
-webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale)
var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
} }
.filter { .filter {
-webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale)
var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
} }
.\!filter { .\!filter {
-webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) !important;
var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) !important; filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) !important;
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale)
var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) !important;
} }
.backdrop-blur { .backdrop-blur {
--tw-backdrop-blur: blur(8px); --tw-backdrop-blur: blur(8px);
-webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate)
var(--tw-backdrop-sepia);
backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast)
var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert)
var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
} }
.backdrop-grayscale { .backdrop-grayscale {
--tw-backdrop-grayscale: grayscale(100%); --tw-backdrop-grayscale: grayscale(100%);
-webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate)
var(--tw-backdrop-sepia);
backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast)
var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert)
var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
} }
.backdrop-invert { .backdrop-invert {
--tw-backdrop-invert: invert(100%); --tw-backdrop-invert: invert(100%);
-webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate)
var(--tw-backdrop-sepia);
backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast)
var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert)
var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
} }
.backdrop-sepia { .backdrop-sepia {
--tw-backdrop-sepia: sepia(100%); --tw-backdrop-sepia: sepia(100%);
-webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate)
var(--tw-backdrop-sepia);
backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast)
var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert)
var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
} }
.backdrop-filter { .backdrop-filter {
-webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate)
var(--tw-backdrop-sepia);
backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast)
var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert)
var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
} }
.transition { .transition {
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, -webkit-transform, -webkit-filter, -webkit-backdrop-filter;
opacity, box-shadow, -webkit-transform, -webkit-filter, -webkit-backdrop-filter; transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-transform, -webkit-filter, -webkit-backdrop-filter;
opacity, box-shadow, transform, filter, backdrop-filter;
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke,
opacity, box-shadow, transform, filter, backdrop-filter, -webkit-transform, -webkit-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms; transition-duration: 150ms;
} }
@ -2428,7 +2356,7 @@ input {
color: var(--foreground-color); color: var(--foreground-color);
} }
input[type="text"] { input[type=text] {
width: 100%; width: 100%;
} }
@ -2451,12 +2379,12 @@ input[type="text"] {
.low-interaction { .low-interaction {
background: var(--low-interaction-background); background: var(--low-interaction-background);
color: var(--low-interaction-foreground); color: var(--low-interaction-foreground)
} }
.interactive { .interactive {
background: var(--interactive-background); background: var(--interactive-background);
color: var(--interactive-foreground); color: var(--interactive-foreground)
} }
.border-interactive { .border-interactive {
@ -2475,8 +2403,7 @@ input[type="text"] {
* This very important section defines what the various input elements look like within the 'low-interaction' and 'interactive'-blocks * This very important section defines what the various input elements look like within the 'low-interaction' and 'interactive'-blocks
*/ */
button.small, button.small, .button.small {
.button.small {
line-height: 1rem; line-height: 1rem;
margin: 0; margin: 0;
margin-left: 0.5rem; margin-left: 0.5rem;
@ -2497,8 +2424,7 @@ button.small,
color: var(--low-interaction-foreground); color: var(--low-interaction-foreground);
} }
button, button, .button {
.button {
align-items: center; align-items: center;
display: inline-flex; display: inline-flex;
line-height: 1.25rem; line-height: 1.25rem;
@ -2521,72 +2447,60 @@ button,
box-shadow: 0 5px 10px #88888888; box-shadow: 0 5px 10px #88888888;
} }
button.selected, button.selected, .button.selected {
.button.selected {
background-color: var(--catch-detail-color); background-color: var(--catch-detail-color);
border-color: var(--catch-detail-color); border-color: var(--catch-detail-color);
color: var(--catch-detail-foregroundcolor); color: var(--catch-detail-foregroundcolor);
} }
button.selected svg path, button.selected svg path, .button.selected svg path {
.button.selected svg path {
fill: var(--catch-detail-foregroundcolor) !important; fill: var(--catch-detail-foregroundcolor) !important;
} }
button:not(.no-image-background):not(.soft) svg path, button:not(.no-image-background):not(.soft) svg path, .button:not(.no-image-background):not(.soft) svg path {
.button:not(.no-image-background):not(.soft) svg path {
fill: var(--interactive-foreground) !important; fill: var(--interactive-foreground) !important;
transition: all 250ms; transition: all 250ms;
} }
.interactive button, .interactive button, .interactive .button {
.interactive .button {
background: var(--interactive-background); background: var(--interactive-background);
color: var(--interactive-foreground); color: var(--interactive-foreground);
} }
button:hover, button:hover, .button:hover {
.button:hover {
background-color: var(--catch-detail-color); background-color: var(--catch-detail-color);
color: var(--catch-detail-foregroundcolor); color: var(--catch-detail-foregroundcolor);
border: 2px solid var(--catch-detail-color-contrast); border: 2px solid var(--catch-detail-color-contrast);
} }
button:hover:not(.no-image-background) img, button:hover:not(.no-image-background) img, .button:hover:not(.no-image-background) img {
.button:hover:not(.no-image-background) img {
background: var(--low-interaction-background); background: var(--low-interaction-background);
border-radius: 100rem; border-radius: 100rem;
} }
button:hover:not(.no-image-background) svg path, button:hover:not(.no-image-background) svg path, .button:hover:not(.no-image-background) svg path {
.button:hover:not(.no-image-background) svg path {
fill: var(--catch-detail-foregroundcolor) !important; fill: var(--catch-detail-foregroundcolor) !important;
} }
button.disabled:hover:not(.no-image-background) svg path, button.disabled:hover:not(.no-image-background) svg path, .button.disabled:hover:not(.no-image-background) svg path {
.button.disabled:hover:not(.no-image-background) svg path {
fill: var(--low-interaction-foreground) !important; fill: var(--low-interaction-foreground) !important;
} }
button.primary, button.primary, .button.primary {
.button.primary {
color: var(--button-foreground); color: var(--button-foreground);
background: var(--button-background); background: var(--button-background);
} }
button.primary:not(.no-image-background) svg path, button.primary:not(.no-image-background) svg path, .button.primary:not(.no-image-background) svg path {
.button.primary:not(.no-image-background) svg path {
fill: var(--button-foreground) !important; fill: var(--button-foreground) !important;
transition: all 250ms; transition: all 250ms;
} }
button.disabled.low-interaction, button.disabled.low-interaction, .button.disabled.low-interaction {
.button.disabled.low-interaction {
background-color: var(--low-interaction-background-50); background-color: var(--low-interaction-background-50);
} }
button.disabled, button.disabled, .button.disabled {
.button.disabled {
cursor: default; cursor: default;
border: 2px dashed var(--button-background); border: 2px dashed var(--button-background);
background: unset; background: unset;
@ -2594,8 +2508,7 @@ button.disabled,
box-shadow: none; box-shadow: none;
} }
button.disabled:hover, button.disabled:hover, .button.disabled:hover {
.button.disabled:hover {
cursor: default; cursor: default;
border: 2px dashed var(--button-background); border: 2px dashed var(--button-background);
background: unset; background: unset;
@ -2609,41 +2522,36 @@ button.link {
} }
button.link:hover { button.link:hover {
color: unset; color:unset;
} }
.interactive button.disabled svg path, .interactive button.disabled svg path, .interactive .button.disabled svg path {
.interactive .button.disabled svg path {
fill: var(--interactive-foreground) !important; fill: var(--interactive-foreground) !important;
} }
.low-interaction button.disabled svg path, .low-interaction button.disabled svg path, .low-interaction .button.disabled svg path {
.low-interaction .button.disabled svg path {
fill: var(--low-interaction-foreground) !important; fill: var(--low-interaction-foreground) !important;
} }
.normal-background button.disabled svg path, .normal-background button.disabled svg path, .normal-background .button.disabled svg path {
.normal-background .button.disabled svg path {
fill: var(--foreground-color) !important; fill: var(--foreground-color) !important;
} }
.links-w-full a:not(.weblate-link) { .links-w-full a:not(.weblate-link) {
display: flex; display: flex;
-webkit-column-gap: 0.25rem; -webkit-column-gap: 0.25rem;
column-gap: 0.25rem; column-gap: 0.25rem;
padding-left: 0.5rem; padding-left: 0.5rem;
padding-right: 0.5rem; padding-right: 0.5rem;
width: 100%; width: 100%;
} }
button.soft, button.soft, .button.soft {
.button.soft {
border: 2px solid var(--interactive-background); border: 2px solid var(--interactive-background);
margin: 0; margin: 0;
} }
button.soft:hover, button.soft:hover, .button.soft:hover {
.button.soft:hover {
background-color: var(--interactive-background); background-color: var(--interactive-background);
color: var(--interactive-foreground); color: var(--interactive-foreground);
border: 2px solid var(--catch-detail-color-contrast); border: 2px solid var(--catch-detail-color-contrast);
@ -2681,7 +2589,7 @@ select:hover {
border-color: var(--catch-detail-color-contrast); border-color: var(--catch-detail-color-contrast);
} }
.neutral-label { .neutral-label{
/** This label styles as normal text. It's power comes from the many :not(.neutral-label) entries. /** This label styles as normal text. It's power comes from the many :not(.neutral-label) entries.
* Placed here for autocompletion * Placed here for autocompletion
*/ */
@ -2709,7 +2617,7 @@ label.button {
label:hover:not(.neutral-label) { label:hover:not(.neutral-label) {
background-color: var(--catch-detail-color); background-color: var(--catch-detail-color);
color: var(--catch-detail-foregroundcolor); color: var(--catch-detail-foregroundcolor);
border: 2px solid var(--interactive-contrast); border: 2px solid var(--interactive-contrast)
} }
label:not(.no-image-background):not(.neutral-label) img { label:not(.no-image-background):not(.neutral-label) img {
@ -2813,12 +2721,11 @@ textarea {
.link-underline .subtle a { .link-underline .subtle a {
-webkit-text-decoration: underline 1px #7193bb88; -webkit-text-decoration: underline 1px #7193bb88;
text-decoration: underline 1px #7193bb88; text-decoration: underline 1px #7193bb88;
color: #7193bb; color: #7193bb;
} }
.literal-code, .literal-code, code {
code {
/* A codeblock */ /* A codeblock */
display: inline-block; display: inline-block;
background-color: lightgray; background-color: lightgray;
@ -2879,7 +2786,7 @@ code {
border: unset; border: unset;
border-radius: 5rem; border-radius: 5rem;
-webkit-backdrop-filter: var(--low-interaction-background); -webkit-backdrop-filter: var(--low-interaction-background);
backdrop-filter: var(--low-interaction-background); backdrop-filter: var(--low-interaction-background);
} }
.no-weblate .weblate-link { .no-weblate .weblate-link {
@ -2888,12 +2795,12 @@ code {
.link-underline a { .link-underline a {
-webkit-text-decoration: underline 1px var(--foreground-color); -webkit-text-decoration: underline 1px var(--foreground-color);
text-decoration: underline 1px var(--foreground-color); text-decoration: underline 1px var(--foreground-color);
} }
a.link-underline { a.link-underline {
-webkit-text-decoration: underline 1px var(--foreground-color); -webkit-text-decoration: underline 1px var(--foreground-color);
text-decoration: underline 1px var(--foreground-color); text-decoration: underline 1px var(--foreground-color);
} }
.link-no-underline a { .link-no-underline a {
@ -2941,30 +2848,30 @@ a.link-underline {
} }
svg.apply-fill path { svg.apply-fill path {
fill: var(--svg-color); fill: var(--svg-color)
} }
.compass_arrow { .compass_arrow {
width: calc(2.5rem - 1px); width: calc( 2.5rem - 1px ) ;
height: calc(2.5rem - 1px); height: calc( 2.5rem - 1px )
} }
@media (min-width: 640px) { @media (min-width: 640px) {
.compass_arrow { .compass_arrow {
width: calc(2.75rem - 1px); width: calc( 2.75rem - 1px ) ;
height: calc(2.75rem - 1px); height: calc( 2.75rem - 1px )
} }
} }
@-webkit-keyframes glowing-drop-shadow { @-webkit-keyframes glowing-drop-shadow {
from { from {
-webkit-filter: drop-shadow(5px 5px 60px rgb(128 128 128 / 0.6)); -webkit-filter: drop-shadow(5px 5px 60px rgb(128 128 128 / 0.6));
filter: drop-shadow(5px 5px 60px rgb(128 128 128 / 0.6)); filter: drop-shadow(5px 5px 60px rgb(128 128 128 / 0.6));
} }
to { to {
-webkit-filter: drop-shadow(5px 5px 80px rgb(0.5 0.5 0.5 / 0.8)); -webkit-filter: drop-shadow(5px 5px 80px rgb(0.5 0.5 0.5 / 0.8));
filter: drop-shadow(5px 5px 80px rgb(0.5 0.5 0.5 / 0.8)); filter: drop-shadow(5px 5px 80px rgb(0.5 0.5 0.5 / 0.8));
} }
} }
@ -2973,12 +2880,12 @@ svg.apply-fill path {
from { from {
-webkit-transform: translateX(0%); -webkit-transform: translateX(0%);
transform: translateX(0%); transform: translateX(0%);
} }
to { to {
-webkit-transform: translateX(calc(-100% + 42px)); -webkit-transform: translateX(calc(-100% + 42px));
transform: translateX(calc(-100% + 42px)); transform: translateX(calc(-100% + 42px));
} }
} }
@ -2987,12 +2894,12 @@ svg.apply-fill path {
from { from {
-webkit-transform: translateX(0%); -webkit-transform: translateX(0%);
transform: translateX(0%); transform: translateX(0%);
} }
to { to {
-webkit-transform: translateX(calc(-100% + 42px)); -webkit-transform: translateX(calc(-100% + 42px));
transform: translateX(calc(-100% + 42px)); transform: translateX(calc(-100% + 42px));
} }
} }

View file

@ -224,10 +224,12 @@ export default class ScriptUtils {
}) })
const timeoutPromise = new Promise<any>((resolve, reject) => { const timeoutPromise = new Promise<any>((resolve, reject) => {
setTimeout( setTimeout(
() => () => {
timeoutSecs === undefined if(timeoutSecs === undefined){
? reject(new Error("Timout reached")) return // No resolve
: resolve("timeout"), }
resolve("timeout")
},
(timeoutSecs ?? 10) * 1000 (timeoutSecs ?? 10) * 1000
) )
}) })

View file

@ -38,6 +38,7 @@ class OsmPoiDatabase {
this._client = new Client(connectionString) this._client = new Client(connectionString)
} }
async getCount( async getCount(
layer: string, layer: string,
bbox: [[number, number], [number, number]] = undefined bbox: [[number, number], [number, number]] = undefined

View file

@ -91,6 +91,12 @@ export class Server {
try { try {
const result = await handler.handle(path, url.searchParams) const result = await handler.handle(path, url.searchParams)
if(result === undefined){
res.writeHead(500)
res.write("Could not fetch this website, probably blocked by them")
res.end()
return
}
if (typeof result !== "string") { if (typeof result !== "string") {
console.error( console.error(
"Internal server error: handling", "Internal server error: handling",
@ -103,7 +109,7 @@ export class Server {
} }
const extraHeaders = handler.addHeaders ?? {} const extraHeaders = handler.addHeaders ?? {}
res.writeHead(200, { "Content-Type": handler.mimetype, ...extraHeaders }) res.writeHead(200, { "Content-Type": handler.mimetype, ...extraHeaders })
res.write(result) res.write(""+result)
res.end() res.end()
} catch (e) { } catch (e) {
console.error("Could not handle request:", e) console.error("Could not handle request:", e)

View file

@ -4,26 +4,30 @@ import parse from "node-html-parser"
import ScriptUtils from "./ScriptUtils" import ScriptUtils from "./ScriptUtils"
class ServerLdScrape extends Script { class ServerLdScrape extends Script {
constructor() { constructor() {
super("Starts a server which fetches a webpage and returns embedded LD+JSON") super("Starts a server which fetches a webpage and returns embedded LD+JSON")
} }
private static async attemptDownload(url: string) { private static async attemptDownload(url: string) {
const host = new URL(url).host const host = new URL(url).host
const random = Math.floor(Math.random()*100)
const random1 = Math.floor(Math.random()*100)
const headers = [ const headers = [
{ {
"User-Agent": "User-Agent":
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36", `Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.${random}.${random1} Safari/537.36`,
"accept": "application/html" "accept": "application/html"
}, }
{ /* {
"User-Agent": "MapComplete/openstreetmap scraper; pietervdvn@posteo.net; https://github.com/pietervdvn/MapComplete", "User-Agent": "MapComplete/openstreetmap scraper; pietervdvn@posteo.net; https://github.com/pietervdvn/MapComplete",
"accept": "application/html" "accept": "application/html"
}, },
{ {
Host: host, Host: host,
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; rv:122.0) Gecko/20100101 Firefox/122.0", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; rv:122.0) Gecko/20100101 Firefox/122.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,* /*;q=0.8", TODO remove space in * /*
"Accept-Language": "en-US,en;q=0.5", "Accept-Language": "en-US,en;q=0.5",
"Accept-Encoding": "gzip, deflate, br", "Accept-Encoding": "gzip, deflate, br",
"Alt-Used": host, "Alt-Used": host,
@ -36,7 +40,7 @@ class ServerLdScrape extends Script {
"Sec-Fetch-User":"?1", "Sec-Fetch-User":"?1",
"TE": "trailers", "TE": "trailers",
Connection: "keep-alive" Connection: "keep-alive"
} }*/
] ]
for (let i = 0; i < headers.length; i++) { for (let i = 0; i < headers.length; i++) {
try { try {
@ -47,7 +51,7 @@ class ServerLdScrape extends Script {
10 10
) )
} catch (e) { } catch (e) {
console.error("Could not download", url, "with headers", headers[i]) console.error("Could not download", url, "with headers", headers[i], "due to", e)
} }
} }
} }
@ -67,10 +71,9 @@ class ServerLdScrape extends Script {
console.log("URL", url) console.log("URL", url)
if (cache[url] !== undefined) { if (cache[url] !== undefined) {
const { date, contents } = cache[url] const { date, contents } = cache[url]
console.log(">>>", date, contents)
// In seconds // In seconds
const tdiff = (new Date().getTime() - (date?.getTime() ?? 0)) / 1000 const tdiff = (new Date().getTime() - (date?.getTime() ?? 0)) / 1000
if (tdiff < 24 * 60 * 60) { if (tdiff < 31 * 24 * 60 * 60) {
return JSON.stringify(contents) return JSON.stringify(contents)
} }
} }
@ -83,6 +86,9 @@ class ServerLdScrape extends Script {
if (dloaded === "timeout") { if (dloaded === "timeout") {
return "{\"#\":\"timout reached\"}" return "{\"#\":\"timout reached\"}"
} }
if(dloaded === undefined){
return undefined
}
} while (dloaded["redirect"]) } while (dloaded["redirect"])
if (dloaded["content"].startsWith("{")) { if (dloaded["content"].startsWith("{")) {

View file

@ -2,10 +2,15 @@ import { ImmutableStore, Store, UIEventSource } from "../UIEventSource"
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig" import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"
import { LocalStorageSource } from "../Web/LocalStorageSource" import { LocalStorageSource } from "../Web/LocalStorageSource"
import { QueryParameters } from "../Web/QueryParameters" import { QueryParameters } from "../Web/QueryParameters"
import Hash from "../Web/Hash"
import OsmObjectDownloader from "../Osm/OsmObjectDownloader"
import { OsmObject } from "../Osm/OsmObject"
import Constants from "../../Models/Constants"
/** /**
* This actor is responsible to set the map location. * This actor is responsible to set the map location.
* It will attempt to * It will attempt to
* - Set the map to the position of the selected element
* - Set the map to the position as passed in by the query parameters (if available) * - Set the map to the position as passed in by the query parameters (if available)
* - Set the map to the position remembered in LocalStorage (if available) * - Set the map to the position remembered in LocalStorage (if available)
* - Set the map to the layout default * - Set the map to the layout default
@ -16,6 +21,7 @@ export default class InitialMapPositioning {
public zoom: UIEventSource<number> public zoom: UIEventSource<number>
public location: UIEventSource<{ lon: number; lat: number }> public location: UIEventSource<{ lon: number; lat: number }>
public useTerrain: Store<boolean> public useTerrain: Store<boolean>
constructor(layoutToUse: LayoutConfig) { constructor(layoutToUse: LayoutConfig) {
function localStorageSynced( function localStorageSynced(
key: string, key: string,
@ -38,6 +44,8 @@ export default class InitialMapPositioning {
return src return src
} }
const initialHash = Hash.hash.data
// -- Location control initialization // -- Location control initialization
this.zoom = localStorageSynced( this.zoom = localStorageSynced(
"z", "z",
@ -62,5 +70,19 @@ export default class InitialMapPositioning {
lon.setData(loc.lon) lon.setData(loc.lon)
}) })
this.useTerrain = new ImmutableStore<boolean>(layoutToUse.enableTerrain) this.useTerrain = new ImmutableStore<boolean>(layoutToUse.enableTerrain)
if (initialHash?.match(/^(node|way|relation)\/[0-9]+$/)) {
const [type, id] = initialHash.split("/")
OsmObjectDownloader.RawDownloadObjectAsync(type, Number(id), Constants.osmAuthConfig.url + "/").then(osmObject => {
if (osmObject === "deleted") {
return
}
const targetLayer = layoutToUse.getMatchingLayer(osmObject.tags)
this.zoom.setData(Math.max(this.zoom.data, targetLayer.minzoom))
const [lat, lon] = osmObject.centerpoint()
this.location.setData({ lon, lat })
})
}
} }
} }

View file

@ -127,7 +127,9 @@ export abstract class OsmObject {
return result return result
} }
// The centerpoint of the feature, as [lat, lon] /** The centerpoint of the feature, as [lat, lon]
*
*/
public abstract centerpoint(): [number, number] public abstract centerpoint(): [number, number]
public abstract asGeoJson(): any public abstract asGeoJson(): any

View file

@ -62,7 +62,7 @@ export default class OsmObjectDownloader {
if (idN < 0) { if (idN < 0) {
obj = this.constructObject(<"node" | "way" | "relation">type, idN) obj = this.constructObject(<"node" | "way" | "relation">type, idN)
} else { } else {
obj = await this.RawDownloadObjectAsync(type, idN, maxCacheAgeInSecs) obj = await OsmObjectDownloader.RawDownloadObjectAsync(type, idN, this.backend, maxCacheAgeInSecs)
} }
if (obj === "deleted") { if (obj === "deleted") {
return obj return obj
@ -211,13 +211,22 @@ export default class OsmObjectDownloader {
} }
} }
private async RawDownloadObjectAsync( /**
* Only to be used in exceptional cases
* @param type
* @param idN
* @param backend
* @param maxCacheAgeInSecs
* @constructor
*/
public static async RawDownloadObjectAsync(
type: string, type: string,
idN: number, idN: number,
backend: string,
maxCacheAgeInSecs?: number maxCacheAgeInSecs?: number
): Promise<OsmObject | "deleted"> { ): Promise<OsmObject | "deleted"> {
const full = type !== "node" ? "/full" : "" const full = type !== "node" ? "/full" : ""
const url = `${this.backend}api/0.6/${type}/${idN}${full}` const url = `${backend}api/0.6/${type}/${idN}${full}`
const rawData = await Utils.downloadJsonCachedAdvanced( const rawData = await Utils.downloadJsonCachedAdvanced(
url, url,
(maxCacheAgeInSecs ?? 10) * 1000 (maxCacheAgeInSecs ?? 10) * 1000
@ -227,7 +236,7 @@ export default class OsmObjectDownloader {
} }
// A full query might contain more then just the requested object (e.g. nodes that are part of a way, where we only want the way) // A full query might contain more then just the requested object (e.g. nodes that are part of a way, where we only want the way)
const parsed = OsmObject.ParseObjects(rawData["content"].elements) const parsed = OsmObject.ParseObjects(rawData["content"].elements)
// Lets fetch the object we need // Let us fetch the object we need
for (const osmObject of parsed) { for (const osmObject of parsed) {
if (osmObject.type !== type) { if (osmObject.type !== type) {
continue continue

View file

@ -435,7 +435,7 @@ export default class SimpleMetaTaggers {
() => feature.properties["_country"] () => feature.properties["_country"]
) )
let canonical = let canonical =
denomination?.canonicalValue(value, defaultDenom == denomination) ?? denomination?.canonicalValue(value, defaultDenom == denomination, unit.inverted) ??
undefined undefined
if (canonical === value) { if (canonical === value) {
break break

View file

@ -331,6 +331,9 @@ export default class LinkedDataLoader {
return return
} }
output[key] = output[key].map((v) => applyF(v)) output[key] = output[key].map((v) => applyF(v))
if(!output[key].some(v => v !== undefined)){
delete output[key]
}
} }
function asBoolean(key: string, invert: boolean = false) { function asBoolean(key: string, invert: boolean = false) {
@ -379,6 +382,7 @@ export default class LinkedDataLoader {
} }
return "€" + Number(p) return "€" + Number(p)
}) })
if (output["charge"] && output["timeUnit"]) { if (output["charge"] && output["timeUnit"]) {
const duration = const duration =
Number(output["chargeEnd"] ?? "1") - Number(output["chargeStart"] ?? "0") Number(output["chargeEnd"] ?? "1") - Number(output["chargeStart"] ?? "0")

View file

@ -1,6 +1,7 @@
import { Translation, TypedTranslation } from "../UI/i18n/Translation" import { Translation, TypedTranslation } from "../UI/i18n/Translation"
import { DenominationConfigJson } from "./ThemeConfig/Json/UnitConfigJson" import { DenominationConfigJson } from "./ThemeConfig/Json/UnitConfigJson"
import Translations from "../UI/i18n/Translations" import Translations from "../UI/i18n/Translations"
import { Validator } from "../UI/InputElement/Validator"
/** /**
* A 'denomination' is one way to write a certain quantity. * A 'denomination' is one way to write a certain quantity.
@ -15,6 +16,7 @@ export class Denomination {
public readonly alternativeDenominations: string[] public readonly alternativeDenominations: string[]
public readonly human: TypedTranslation<{ quantity: string }> public readonly human: TypedTranslation<{ quantity: string }>
public readonly humanSingular?: Translation public readonly humanSingular?: Translation
private readonly _validator: Validator
private constructor( private constructor(
canonical: string, canonical: string,
@ -24,7 +26,8 @@ export class Denomination {
addSpace: boolean, addSpace: boolean,
alternativeDenominations: string[], alternativeDenominations: string[],
_human: TypedTranslation<{ quantity: string }>, _human: TypedTranslation<{ quantity: string }>,
_humanSingular?: Translation _humanSingular: Translation,
validator: Validator
) { ) {
this.canonical = canonical this.canonical = canonical
this._canonicalSingular = _canonicalSingular this._canonicalSingular = _canonicalSingular
@ -34,9 +37,10 @@ export class Denomination {
this.alternativeDenominations = alternativeDenominations this.alternativeDenominations = alternativeDenominations
this.human = _human this.human = _human
this.humanSingular = _humanSingular this.humanSingular = _humanSingular
this._validator = validator
} }
public static fromJson(json: DenominationConfigJson, context: string) { public static fromJson(json: DenominationConfigJson, validator: Validator, context: string) {
context = `${context}.unit(${json.canonicalDenomination})` context = `${context}.unit(${json.canonicalDenomination})`
const canonical = json.canonicalDenomination.trim() const canonical = json.canonicalDenomination.trim()
if (canonical === undefined) { if (canonical === undefined) {
@ -68,7 +72,8 @@ export class Denomination {
json.addSpace ?? false, json.addSpace ?? false,
json.alternativeDenomination?.map((v) => v.trim()) ?? [], json.alternativeDenomination?.map((v) => v.trim()) ?? [],
humanTexts, humanTexts,
Translations.T(json.humanSingular, context + "humanSingular") Translations.T(json.humanSingular, context + "humanSingular"),
validator
) )
} }
@ -81,7 +86,8 @@ export class Denomination {
this.addSpace, this.addSpace,
this.alternativeDenominations, this.alternativeDenominations,
this.human, this.human,
this.humanSingular this.humanSingular,
this._validator
) )
} }
@ -94,7 +100,8 @@ export class Denomination {
this.addSpace, this.addSpace,
[this.canonical, ...this.alternativeDenominations], [this.canonical, ...this.alternativeDenominations],
this.human, this.human,
this.humanSingular this.humanSingular,
this._validator
) )
} }
@ -103,19 +110,21 @@ export class Denomination {
* @param value the value from OSM * @param value the value from OSM
* @param actAsDefault if set and the value can be parsed as number, will be parsed and trimmed * @param actAsDefault if set and the value can be parsed as number, will be parsed and trimmed
* *
* import Validators from "../UI/InputElement/Validators"
*
* const unit = Denomination.fromJson({ * const unit = Denomination.fromJson({
* canonicalDenomination: "m", * canonicalDenomination: "m",
* alternativeDenomination: ["meter"], * alternativeDenomination: ["meter"],
* human: { * human: {
* en: "{quantity} meter" * en: "{quantity} meter"
* } * }
* }, "test") * }, Validators.get("float"), "test")
* unit.canonicalValue("42m", true) // =>"42 m" * unit.canonicalValue("42m", true, false) // =>"42 m"
* unit.canonicalValue("42", true) // =>"42 m" * unit.canonicalValue("42", true, false) // =>"42 m"
* unit.canonicalValue("42 m", true) // =>"42 m" * unit.canonicalValue("42 m", true, false) // =>"42 m"
* unit.canonicalValue("42 meter", true) // =>"42 m" * unit.canonicalValue("42 meter", true, false) // =>"42 m"
* unit.canonicalValue("42m", true) // =>"42 m" * unit.canonicalValue("42m", true, false) // =>"42 m"
* unit.canonicalValue("42", true) // =>"42 m" * unit.canonicalValue("42", true, false) // =>"42 m"
* *
* // Should be trimmed if canonical is empty * // Should be trimmed if canonical is empty
* const unit = Denomination.fromJson({ * const unit = Denomination.fromJson({
@ -124,22 +133,26 @@ export class Denomination {
* human: { * human: {
* en: "{quantity} meter" * en: "{quantity} meter"
* } * }
* }, "test") * }, Validators.get("float"), "test")
* unit.canonicalValue("42m", true) // =>"42" * unit.canonicalValue("42m", true, false) // =>"42"
* unit.canonicalValue("42", true) // =>"42" * unit.canonicalValue("42", true, false) // =>"42"
* unit.canonicalValue("42 m", true) // =>"42" * unit.canonicalValue("42 m", true, false) // =>"42"
* unit.canonicalValue("42 meter", true) // =>"42" * unit.canonicalValue("42 meter", true, false) // =>"42"
* *
* *
*/ */
public canonicalValue(value: string, actAsDefault: boolean): string { public canonicalValue(value: string, actAsDefault: boolean, inverted: boolean): string {
if (value === undefined) { if (value === undefined) {
return undefined return undefined
} }
const stripped = this.StrippedValue(value, actAsDefault) const stripped = this.StrippedValue(value, actAsDefault, inverted)
if (stripped === null) { if (stripped === null) {
return null return null
} }
if(inverted){
return (stripped + "/" + this.canonical).trim()
}
if (stripped === "1" && this._canonicalSingular !== undefined) { if (stripped === "1" && this._canonicalSingular !== undefined) {
return ("1 " + this._canonicalSingular).trim() return ("1 " + this._canonicalSingular).trim()
} }
@ -153,8 +166,8 @@ export class Denomination {
* *
* Returns null if it doesn't match this unit * Returns null if it doesn't match this unit
*/ */
public StrippedValue(value: string, actAsDefault: boolean): string { public StrippedValue(value: string, actAsDefault: boolean, inverted: boolean): string {
if (value === undefined) { if (value === undefined || value === "") {
return undefined return undefined
} }
@ -171,10 +184,16 @@ export class Denomination {
function substr(key) { function substr(key) {
if (self.prefix) { if (self.prefix) {
return value.substr(key.length).trim() return value.substring(key.length).trim()
} else {
return value.substring(0, value.length - key.length).trim()
} }
let trimmed = value.substring(0, value.length - key.length).trim()
if(!inverted){
return trimmed
}
if(trimmed.endsWith("/")){
trimmed = trimmed.substring(0, trimmed.length - 1).trim()
}
return trimmed
} }
if (this.canonical !== "" && startsWith(this.canonical.toLowerCase())) { if (this.canonical !== "" && startsWith(this.canonical.toLowerCase())) {
@ -199,11 +218,13 @@ export class Denomination {
return null return null
} }
const parsed = Number(value.trim()) if(!this._validator.isValid(value.trim())){
if (!isNaN(parsed)) { return null
return value.trim()
} }
return this._validator.reformat(value.trim())
}
return null withValidator(validator: Validator) {
return new Denomination(this.canonical, this._canonicalSingular, this.useIfNoUnitGiven, this.prefix, this.addSpace, this.alternativeDenominations, this.human, this.humanSingular, validator)
} }
} }

View file

@ -519,6 +519,7 @@ export interface LayerConfigJson {
/** /**
* Either a list with [{"key": "unitname", "key2": {"quantity": "unitname", "denominations": ["denom", "denom"]}}] * Either a list with [{"key": "unitname", "key2": {"quantity": "unitname", "denominations": ["denom", "denom"]}}]
* *
* Use `"inverted": true` if the amount should be _divided_ by the denomination, e.g. for charge over time (`€5/day`)
* *
* @see UnitConfigJson * @see UnitConfigJson
* *
@ -526,7 +527,7 @@ export interface LayerConfigJson {
*/ */
units?: ( units?: (
| UnitConfigJson | UnitConfigJson
| Record<string, string | { quantity: string; denominations: string[]; canonical?: string }> | Record<string, string | { quantity: string; denominations: string[]; canonical?: string, inverted?: boolean }>
)[] )[]
/** /**

View file

@ -229,6 +229,7 @@ export interface QuestionableTagRenderingConfigJson extends TagRenderingConfigJs
* A (translated) text that is shown (as gray text) within the textfield * A (translated) text that is shown (as gray text) within the textfield
* type: translation * type: translation
* group: expert * group: expert
* ifunset: No specific placeholder is set, show the type of the textfield
*/ */
placeholder?: Translatable placeholder?: Translatable

View file

@ -88,7 +88,7 @@ export interface TagRenderingConfigJson {
* *
* question: When should this item be shown? * question: When should this item be shown?
* type: tag * type: tag
* ifunset: No specific condition set; always show this tagRendering or ask the question if unkown * ifunset: No specific condition set; always show this tagRendering or show this question if unknown
* *
* Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`. * Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.
* *
@ -132,9 +132,10 @@ export interface TagRenderingConfigJson {
/** question: When should this item be shown (including special conditions)? /** question: When should this item be shown (including special conditions)?
* type: tag * type: tag
* ifunset: No specific metacondition set which is evaluated against the <i>usersettings/application state</i>; always show this tagRendering or show this question if unknown
* *
* If set, this tag will be evaluated agains the _usersettings/application state_ table. * If set, this tag will be evaluated against the _usersettings/application state_ table.
* Enable 'show debug info' in user settings to see available options. * Enable 'show debug info' in user settings to see available options (at the settings-tab).
* Note that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_ * Note that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_
*/ */
metacondition?: TagConfigJson metacondition?: TagConfigJson

View file

@ -97,18 +97,6 @@ export default class LayerConfig extends WithContextLoader {
this.allowSplit = json.allowSplit ?? false this.allowSplit = json.allowSplit ?? false
this.name = Translations.T(json.name, translationContext + ".name") this.name = Translations.T(json.name, translationContext + ".name")
if (json.units !== undefined && !Array.isArray(json.units)) {
throw (
"At " +
context +
".units: the 'units'-section should be a list; you probably have an object there"
)
}
this.units = [].concat(
...(json.units ?? []).map((unitJson, i) =>
Unit.fromJson(unitJson, `${context}.unit[${i}]`)
)
)
if (json.description !== undefined) { if (json.description !== undefined) {
if (Object.keys(json.description).length === 0) { if (Object.keys(json.description).length === 0) {
@ -280,6 +268,18 @@ export default class LayerConfig extends WithContextLoader {
this.id + ".tagRenderings[" + i + "]" this.id + ".tagRenderings[" + i + "]"
) )
) )
if (json.units !== undefined && !Array.isArray(json.units)) {
throw (
"At " +
context +
".units: the 'units'-section should be a list; you probably have an object there"
)
}
this.units = [].concat(
...(json.units ?? []).map((unitJson, i) =>
Unit.fromJson(unitJson, this.tagRenderings,`${context}.unit[${i}]`)
)
)
if ( if (
json.filter !== undefined && json.filter !== undefined &&

View file

@ -2,6 +2,10 @@ import BaseUIElement from "../UI/BaseUIElement"
import { Denomination } from "./Denomination" import { Denomination } from "./Denomination"
import UnitConfigJson from "./ThemeConfig/Json/UnitConfigJson" import UnitConfigJson from "./ThemeConfig/Json/UnitConfigJson"
import unit from "../../assets/layers/unit/unit.json" import unit from "../../assets/layers/unit/unit.json"
import { QuestionableTagRenderingConfigJson } from "./ThemeConfig/Json/QuestionableTagRenderingConfigJson"
import TagRenderingConfig from "./ThemeConfig/TagRenderingConfig"
import Validators, { ValidatorType } from "../UI/InputElement/Validators"
import { Validator } from "../UI/InputElement/Validator"
export class Unit { export class Unit {
private static allUnits = this.initUnits() private static allUnits = this.initUnits()
@ -10,14 +14,20 @@ export class Unit {
public readonly denominationsSorted: Denomination[] public readonly denominationsSorted: Denomination[]
public readonly eraseInvalid: boolean public readonly eraseInvalid: boolean
public readonly quantity: string public readonly quantity: string
private readonly _validator: Validator
public readonly inverted: boolean
constructor( constructor(
quantity: string, quantity: string,
appliesToKeys: string[], appliesToKeys: string[],
applicableDenominations: Denomination[], applicableDenominations: Denomination[],
eraseInvalid: boolean eraseInvalid: boolean,
validator: Validator,
inverted: boolean = false
) { ) {
this.quantity = quantity this.quantity = quantity
this._validator = validator
this.inverted = inverted
this.appliesToKeys = new Set(appliesToKeys) this.appliesToKeys = new Set(appliesToKeys)
this.denominations = applicableDenominations this.denominations = applicableDenominations
this.eraseInvalid = eraseInvalid this.eraseInvalid = eraseInvalid
@ -66,13 +76,47 @@ export class Unit {
static fromJson( static fromJson(
json: json:
| UnitConfigJson | UnitConfigJson
| Record<string, string | { quantity: string; denominations: string[] }>, | Record<string, string | { quantity: string; denominations: string[], inverted?: boolean }>,
tagRenderings: TagRenderingConfig[],
ctx: string ctx: string
): Unit[] { ): Unit[] {
if (!json.appliesToKey && !json.quantity) {
return this.loadFromLibrary(<any>json, ctx) let types: Record<string, ValidatorType> = {}
for (const tagRendering of tagRenderings) {
if (tagRendering.freeform?.type) {
types[tagRendering.freeform.key] = tagRendering.freeform.type
}
} }
return [this.parse(<UnitConfigJson>json, ctx)]
if (!json.appliesToKey && !json.quantity) {
return this.loadFromLibrary(<any>json, types, ctx)
}
return this.parse(<UnitConfigJson>json, types, ctx)
}
private static parseDenomination(json: UnitConfigJson, validator: Validator, appliesToKey: string, ctx: string): Unit {
const applicable = json.applicableUnits.map((u, i) =>
Denomination.fromJson(u, validator, `${ctx}.units[${i}]`)
)
if (
json.defaultInput &&
!applicable.some((denom) => denom.canonical.trim() === json.defaultInput)
) {
throw `${ctx}: no denomination has the specified default denomination. The default denomination is '${
json.defaultInput
}', but the available denominations are ${applicable
.map((denom) => denom.canonical)
.join(", ")}`
}
return new Unit(
json.quantity ?? "",
appliesToKey === undefined ? undefined : [appliesToKey],
applicable,
json.eraseInvalidValues ?? false,
validator
)
} }
/** /**
@ -113,7 +157,7 @@ export class Unit {
* ] * ]
* }, "test") * }, "test")
*/ */
private static parse(json: UnitConfigJson, ctx: string): Unit { private static parse(json: UnitConfigJson, types: Record<string, ValidatorType>, ctx: string): Unit[] {
const appliesTo = json.appliesToKey const appliesTo = json.appliesToKey
for (let i = 0; i < (appliesTo ?? []).length; i++) { for (let i = 0; i < (appliesTo ?? []).length; i++) {
let key = appliesTo[i] let key = appliesTo[i]
@ -127,32 +171,22 @@ export class Unit {
} }
// Some keys do have unit handling // Some keys do have unit handling
const applicable = json.applicableUnits.map((u, i) =>
Denomination.fromJson(u, `${ctx}.units[${i}]`)
)
if ( const units: Unit[] = []
json.defaultInput && if (appliesTo === undefined) {
!applicable.some((denom) => denom.canonical.trim() === json.defaultInput) units.push(this.parseDenomination(json, Validators.get("float"), undefined, ctx))
) {
throw `${ctx}: no denomination has the specified default denomination. The default denomination is '${
json.defaultInput
}', but the available denominations are ${applicable
.map((denom) => denom.canonical)
.join(", ")}`
} }
return new Unit( for (const key of appliesTo ?? []) {
json.quantity ?? "", const validator = Validators.get(types[key] ?? "float")
appliesTo, units.push(this.parseDenomination(json, validator, undefined, ctx))
applicable, }
json.eraseInvalidValues ?? false return units
)
} }
private static initUnits(): Map<string, Unit> { private static initUnits(): Map<string, Unit> {
const m = new Map<string, Unit>() const m = new Map<string, Unit>()
const units = (<UnitConfigJson[]>unit.units).map((json, i) => const units = (<UnitConfigJson[]>unit.units).flatMap((json, i) =>
this.parse(json, "unit.json.units." + i) this.parse(json, {}, "unit.json.units." + i)
) )
for (const unit of units) { for (const unit of units) {
@ -179,17 +213,19 @@ export class Unit {
private static loadFromLibrary( private static loadFromLibrary(
spec: Record< spec: Record<
string, string,
string | { quantity: string; denominations: string[]; canonical?: string } string | { quantity: string; denominations: string[]; canonical?: string, inverted?: boolean }
>, >,
types: Record<string, ValidatorType>,
ctx: string ctx: string
): Unit[] { ): Unit[] {
const units: Unit[] = [] const units: Unit[] = []
for (const key in spec) { for (const key in spec) {
const toLoad = spec[key] const toLoad = spec[key]
const validator = Validators.get(types[key] ?? "float")
if (typeof toLoad === "string") { if (typeof toLoad === "string") {
const loaded = this.getFromLibrary(toLoad, ctx) const loaded = this.getFromLibrary(toLoad, ctx)
units.push( units.push(
new Unit(loaded.quantity, [key], loaded.denominations, loaded.eraseInvalid) new Unit(loaded.quantity, [key], loaded.denominations, loaded.eraseInvalid, validator, toLoad["inverted"])
) )
continue continue
} }
@ -213,12 +249,13 @@ export class Unit {
const denoms = toLoad.denominations const denoms = toLoad.denominations
.map((d) => d.toLowerCase()) .map((d) => d.toLowerCase())
.map((d) => fetchDenom(d)) .map((d) => fetchDenom(d))
.map(d => d.withValidator(validator))
if (toLoad.canonical) { if (toLoad.canonical) {
const canonical = fetchDenom(toLoad.canonical) const canonical = fetchDenom(toLoad.canonical).withValidator(validator)
denoms.unshift(canonical.withBlankCanonical()) denoms.unshift(canonical.withBlankCanonical())
} }
units.push(new Unit(loaded.quantity, [key], denoms, loaded.eraseInvalid)) units.push(new Unit(loaded.quantity, [key], denoms, loaded.eraseInvalid, validator, toLoad["inverted"]))
} }
return units return units
} }
@ -240,7 +277,7 @@ export class Unit {
} }
const defaultDenom = this.getDefaultDenomination(country) const defaultDenom = this.getDefaultDenomination(country)
for (const denomination of this.denominationsSorted) { for (const denomination of this.denominationsSorted) {
const bare = denomination.StrippedValue(valueWithDenom, defaultDenom === denomination) const bare = denomination.StrippedValue(valueWithDenom, defaultDenom === denomination, this.inverted)
if (bare !== null) { if (bare !== null) {
return [bare, denomination] return [bare, denomination]
} }
@ -253,10 +290,13 @@ export class Unit {
return undefined return undefined
} }
const [stripped, denom] = this.findDenomination(value, country) const [stripped, denom] = this.findDenomination(value, country)
const human = denom?.human
if(this.inverted ){
return human.Subs({quantity: stripped+"/"})
}
if (stripped === "1") { if (stripped === "1") {
return denom?.humanSingular ?? stripped return denom?.humanSingular ?? stripped
} }
const human = denom?.human
if (human === undefined) { if (human === undefined) {
return stripped ?? value return stripped ?? value
} }
@ -266,6 +306,10 @@ export class Unit {
public toOsm(value: string, denomination: string) { public toOsm(value: string, denomination: string) {
const denom = this.denominations.find((d) => d.canonical === denomination) const denom = this.denominations.find((d) => d.canonical === denomination)
if(this.inverted){
return value+"/"+denom._canonicalSingular
}
const space = denom.addSpace ? " " : "" const space = denom.addSpace ? " " : ""
if (denom.prefix) { if (denom.prefix) {
return denom.canonical + space + value return denom.canonical + space + value
@ -273,7 +317,7 @@ export class Unit {
return value + space + denom.canonical return value + space + denom.canonical
} }
public getDefaultDenomination(country: () => string) { public getDefaultDenomination(country: () => string): Denomination {
for (const denomination of this.denominations) { for (const denomination of this.denominations) {
if (denomination.useIfNoUnitGiven === true) { if (denomination.useIfNoUnitGiven === true) {
return denomination return denomination

View file

@ -0,0 +1,55 @@
<script lang="ts">
import ExtraLinkConfig from "../../Models/ThemeConfig/ExtraLinkConfig"
import Locale from "../i18n/Locale"
import { Utils } from "../../Utils"
import Translations from "../i18n/Translations"
import type { SpecialVisualizationState } from "../SpecialVisualization"
import Pop_out from "../../assets/svg/Pop_out.svelte"
import Tr from "../Base/Tr.svelte"
import Icon from "../Map/Icon.svelte"
export let state: SpecialVisualizationState
let theme = state.layout?.id ?? ""
let config: ExtraLinkConfig = state.layout.extraLink
const isIframe = window !== window.top
let basepath = window.location.host
let showWelcomeMessageSwitch = state.featureSwitches.featureSwitchWelcomeMessage
const t = Translations.t.general
const href = state.mapProperties.location.map(
(loc) => {
const subs = {
...loc,
theme: theme,
basepath,
language: Locale.language.data
}
return Utils.SubstituteKeys(config.href, subs)
},
[state.mapProperties.zoom]
)
</script>
{#if config !== undefined &&
!(config.requirements.has("iframe") && !isIframe) &&
!(config.requirements.has("no-iframe") && isIframe) &&
!(config.requirements.has("welcome-message") && !$showWelcomeMessageSwitch) &&
!(config.requirements.has("no-welcome-message") && $showWelcomeMessageSwitch)}
<div class="links-as-button">
<a href={$href} target={config.newTab ? "_blank" : ""} rel="noopener"
class="flex pointer-events-auto rounded-full border-black">
<Icon icon={config.icon} clss="w-6 h-6 m-2"/>
{#if config.text}
<Tr t={config.text} />
{:else}
<Tr t={t.screenToSmall.Subs({theme: state.layout.title})} />
{/if}
</a>
</div>
{/if}

View file

@ -1,101 +0,0 @@
import { UIElement } from "../UIElement"
import BaseUIElement from "../BaseUIElement"
import { Store } from "../../Logic/UIEventSource"
import ExtraLinkConfig from "../../Models/ThemeConfig/ExtraLinkConfig"
import Img from "../Base/Img"
import { SubtleButton } from "../Base/SubtleButton"
import Toggle from "../Input/Toggle"
import Locale from "../i18n/Locale"
import { Utils } from "../../Utils"
import Svg from "../../Svg"
import Translations from "../i18n/Translations"
import { Translation } from "../i18n/Translation"
interface ExtraLinkButtonState {
layout: { id: string; title: Translation }
featureSwitches: { featureSwitchWelcomeMessage: Store<boolean> }
mapProperties: {
location: Store<{ lon: number; lat: number }>
zoom: Store<number>
}
}
export default class ExtraLinkButton extends UIElement {
private readonly _config: ExtraLinkConfig
private readonly state: ExtraLinkButtonState
constructor(state: ExtraLinkButtonState, config: ExtraLinkConfig) {
super()
this.state = state
this._config = config
}
protected InnerRender(): BaseUIElement {
if (this._config === undefined) {
return undefined
}
const c = this._config
const isIframe = window !== window.top
if (c.requirements?.has("iframe") && !isIframe) {
return undefined
}
if (c.requirements?.has("no-iframe") && isIframe) {
return undefined
}
let link: BaseUIElement
const theme = this.state.layout?.id ?? ""
const basepath = window.location.host
const href = this.state.mapProperties.location.map(
(loc) => {
const subs = {
...loc,
theme: theme,
basepath,
language: Locale.language.data,
}
return Utils.SubstituteKeys(c.href, subs)
},
[this.state.mapProperties.zoom]
)
let img: BaseUIElement = Svg.pop_out_svg()
if (c.icon !== undefined) {
img = new Img(c.icon).SetClass("h-6")
}
let text: Translation
if (c.text === undefined) {
text = Translations.t.general.screenToSmall.Subs({
theme: this.state.layout.title,
})
} else {
text = c.text.Clone()
}
link = new SubtleButton(img, text, {
url: href,
newTab: c.newTab,
})
if (c.requirements?.has("no-welcome-message")) {
link = new Toggle(
undefined,
link,
this.state.featureSwitches.featureSwitchWelcomeMessage
)
}
if (c.requirements?.has("welcome-message")) {
link = new Toggle(
link,
undefined,
this.state.featureSwitches.featureSwitchWelcomeMessage
)
}
return link
}
}

View file

@ -91,11 +91,6 @@
return return
} }
if (unit !== undefined && isNaN(Number(v))) {
value.setData(undefined)
return
}
feedback?.setData(undefined) feedback?.setData(undefined)
if (selectedUnit.data) { if (selectedUnit.data) {
value.setData(unit.toOsm(v, selectedUnit.data)) value.setData(unit.toOsm(v, selectedUnit.data))

View file

@ -34,6 +34,7 @@
import { LinkIcon } from "@babeard/svelte-heroicons/mini" import { LinkIcon } from "@babeard/svelte-heroicons/mini"
import Square_rounded from "../../assets/svg/Square_rounded.svelte" import Square_rounded from "../../assets/svg/Square_rounded.svelte"
import Bug from "../../assets/svg/Bug.svelte" import Bug from "../../assets/svg/Bug.svelte"
import Pop_out from "../../assets/svg/Pop_out.svelte"
/** /**
* Renders a single icon. * Renders a single icon.
@ -123,6 +124,9 @@
<AddSmall {color} class={clss} /> <AddSmall {color} class={clss} />
{:else if icon === "link"} {:else if icon === "link"}
<LinkIcon style="--svg-color: {color}" class={twMerge(clss, "apply-fill")} /> <LinkIcon style="--svg-color: {color}" class={twMerge(clss, "apply-fill")} />
{:else if icon === "popout"}
<LinkIcon style="--svg-color: {color}" />
{:else} {:else}
<img class={clss ?? "h-full w-full"} src={icon} aria-hidden="true" alt="" /> <img class={clss ?? "h-full w-full"} src={icon} aria-hidden="true" alt="" />
{/if} {/if}

Some files were not shown because too many files have changed in this diff Show more