Fix deploy

This commit is contained in:
Pieter Vander Vennet 2020-11-06 01:58:26 +01:00
parent 9c53fe9868
commit 3f8b6e88d3
39 changed files with 381 additions and 562 deletions

View file

@ -1,8 +1,8 @@
import {AndOrTagConfigJson} from "./TagConfigJson"; import {AndOrTagConfigJson} from "./TagConfigJson";
import {And, Or, RegexTag, Tag, TagsFilter} from "../../Logic/Tags"; import {And, Or, RegexTag, Tag, TagsFilter} from "../../Logic/Tags";
import {Translation} from "../../UI/i18n/Translations";
import {Utils} from "../../Utils"; import {Utils} from "../../Utils";
import {Translation} from "../../UI/i18n/Translation";
export class FromJSON { export class FromJSON {

View file

@ -1,10 +1,11 @@
import Translations, {Translation} from "../../UI/i18n/Translations"; import Translations from "../../UI/i18n/Translations";
import TagRenderingConfig from "./TagRenderingConfig"; import TagRenderingConfig from "./TagRenderingConfig";
import {Tag, TagsFilter} from "../../Logic/Tags"; import {Tag, TagsFilter} from "../../Logic/Tags";
import {LayerConfigJson} from "./LayerConfigJson"; import {LayerConfigJson} from "./LayerConfigJson";
import {FromJSON} from "./FromJSON"; import {FromJSON} from "./FromJSON";
import SharedTagRenderings from "../SharedTagRenderings"; import SharedTagRenderings from "../SharedTagRenderings";
import {TagRenderingConfigJson} from "./TagRenderingConfigJson"; import {TagRenderingConfigJson} from "./TagRenderingConfigJson";
import {Translation} from "../../UI/i18n/Translation";
export default class LayerConfig { export default class LayerConfig {
id: string; id: string;

View file

@ -1,9 +1,9 @@
import {Translation} from "../../UI/i18n/Translations";
import {TagsFilter} from "../../Logic/Tags"; import {TagsFilter} from "../../Logic/Tags";
import {TagRenderingConfigJson} from "./TagRenderingConfigJson"; import {TagRenderingConfigJson} from "./TagRenderingConfigJson";
import Translations from "../../UI/i18n/Translations"; import Translations from "../../UI/i18n/Translations";
import {FromJSON} from "./FromJSON"; import {FromJSON} from "./FromJSON";
import ValidatedTextField from "../../UI/Input/ValidatedTextField"; import ValidatedTextField from "../../UI/Input/ValidatedTextField";
import {Translation} from "../../UI/i18n/Translation";
/*** /***
* The parsed version of TagRenderingConfigJSON * The parsed version of TagRenderingConfigJSON

View file

@ -2,11 +2,13 @@ import {UIElement} from "../UI/UIElement";
import Translations from "../UI/i18n/Translations"; import Translations from "../UI/i18n/Translations";
import Combine from "../UI/Base/Combine"; import Combine from "../UI/Base/Combine";
import State from "../State"; import State from "../State";
import {Translation} from "../UI/i18n/Translations";
import LayerConfig from "./JSON/LayerConfig"; import LayerConfig from "./JSON/LayerConfig";
import {LayoutConfigJson} from "./JSON/LayoutConfigJson"; import {LayoutConfigJson} from "./JSON/LayoutConfigJson";
import TagRenderingConfig from "./JSON/TagRenderingConfig"; import TagRenderingConfig from "./JSON/TagRenderingConfig";
import {FromJSON} from "./JSON/FromJSON"; import {FromJSON} from "./JSON/FromJSON";
import {Translation} from "../UI/i18n/Translation";
import Svg from "../Svg";
import {Img} from "../UI/Img";
/** /**
* A layout is a collection of settings of the global view (thus: welcome text, title, selection of layers). * A layout is a collection of settings of the global view (thus: welcome text, title, selection of layers).
@ -14,7 +16,7 @@ import {FromJSON} from "./JSON/FromJSON";
export class Layout { export class Layout {
public id: string; public id: string;
public icon: string = "./assets/logo.svg"; public icon: string = Img.AsData(Svg.bug);
public title: UIElement; public title: UIElement;
public maintainer: string; public maintainer: string;
public version: string; public version: string;

View file

@ -10,7 +10,6 @@ import {FilteredLayer} from "./Logic/FilteredLayer";
import {Basemap} from "./Logic/Leaflet/Basemap"; import {Basemap} from "./Logic/Leaflet/Basemap";
import State from "./State"; import State from "./State";
import {WelcomeMessage} from "./UI/WelcomeMessage"; import {WelcomeMessage} from "./UI/WelcomeMessage";
import {Img} from "./UI/Img";
import {LayerSelection} from "./UI/LayerSelection"; import {LayerSelection} from "./UI/LayerSelection";
import {VariableUiElement} from "./UI/Base/VariableUIElement"; import {VariableUiElement} from "./UI/Base/VariableUIElement";
import {UpdateFromOverpass} from "./Logic/UpdateFromOverpass"; import {UpdateFromOverpass} from "./Logic/UpdateFromOverpass";
@ -35,6 +34,8 @@ import BackgroundSelector from "./UI/BackgroundSelector";
import AvailableBaseLayers from "./Logic/AvailableBaseLayers"; import AvailableBaseLayers from "./Logic/AvailableBaseLayers";
import {FeatureInfoBox} from "./UI/Popup/FeatureInfoBox"; import {FeatureInfoBox} from "./UI/Popup/FeatureInfoBox";
import SharedLayers from "./Customizations/SharedLayers"; import SharedLayers from "./Customizations/SharedLayers";
import Svg from "./Svg";
import Link from "./UI/Base/Link";
export class InitUiElements { export class InitUiElements {
@ -197,9 +198,9 @@ export class InitUiElements {
if ((window != window.top && !State.state.featureSwitchWelcomeMessage.data) || State.state.featureSwitchIframe.data) { if ((window != window.top && !State.state.featureSwitchWelcomeMessage.data) || State.state.featureSwitchIframe.data) {
const currentLocation = State.state.locationControl; const currentLocation = State.state.locationControl;
const url = `${window.location.origin}${window.location.pathname}?z=${currentLocation.data.zoom}&lat=${currentLocation.data.lat}&lon=${currentLocation.data.lon}`; const url = `${window.location.origin}${window.location.pathname}?z=${currentLocation.data.zoom}&lat=${currentLocation.data.lat}&lon=${currentLocation.data.lon}`;
const content = `<a href='${url}' target='_blank'><span class='iframe-escape'><img src='assets/pop-out.svg'></span></a>`; const content = new Link(Svg.pop_out_ui().SetClass("iframe-escape"), url, true);
new FixedUiElement(content).AttachTo("messagesbox"); new FixedUiElement(content.Render()).AttachTo("help-button-mobile")
new FixedUiElement(content).AttachTo("help-button-mobile") content.AttachTo("messagesbox");
} }
@ -269,26 +270,28 @@ export class InitUiElements {
const tabs = [ const tabs = [
{header: `<img src='${layoutToUse.icon}'>`, content: welcome}, {header: `<img src='${layoutToUse.icon}'>`, content: welcome},
{header: `<img src='./assets/osm-logo.svg'>`, content: {
Translations.t.general.openStreetMapIntro}, header: Svg.osm_logo_img,
content: Translations.t.general.openStreetMapIntro as UIElement
},
] ]
if (State.state.featureSwitchShareScreen.data) { if (State.state.featureSwitchShareScreen.data) {
tabs.push({header: `<img src='./assets/share.svg'>`, content: new ShareScreen()}); tabs.push({header: Svg.share_img, content: new ShareScreen()});
} }
if (State.state.featureSwitchMoreQuests.data) { if (State.state.featureSwitchMoreQuests.data) {
tabs.push({ tabs.push({
header: `<img src='./assets/add.svg'>`, header: Svg.add_img,
content: new MoreScreen() content: new MoreScreen()
}); });
} }
tabs.push({ tabs.push({
header: `<img src='./assets/help.svg'>`, header: Svg.help_img,
content: new VariableUiElement(State.state.osmConnection.userDetails.map(userdetails => { content: new VariableUiElement(State.state.osmConnection.userDetails.map(userdetails => {
if (userdetails.csCount < State.userJourney.mapCompleteHelpUnlock) { if (userdetails.csCount < State.userJourney.mapCompleteHelpUnlock) {
return "" return ""
@ -309,14 +312,16 @@ export class InitUiElements {
const fullOptions = this.CreateWelcomePane(); const fullOptions = this.CreateWelcomePane();
const help = new FixedUiElement(`<div class='collapse-button-img'><img src='assets/help.svg' alt='help'></div>`); const help = Svg.help_ui().SetClass("open-welcome-button");
const close = new FixedUiElement(`<div class='collapse-button-img'><img src='assets/close.svg' alt='close'></div>`); const close = Svg.close_ui().SetClass("close-welcome-button");
const checkbox = new CheckBox( const checkbox = new CheckBox(
new Combine([ new Combine([
"<span class='collapse-button'>", close, "</span>", close,
"<span id='welcomeMessage'>", fullOptions.onClick(() => { fullOptions
}), "</span>"]), .SetClass("welcomeMessage")
new Combine(["<span class='open-button'>", help, "</span>"]) .onClick(() => {/*Catch the click*/
})]),
help
, true , true
).AttachTo("messagesbox"); ).AttachTo("messagesbox");
const openedTime = new Date().getTime(); const openedTime = new Date().getTime();
@ -331,9 +336,13 @@ export class InitUiElements {
const fullOptions2 = this.CreateWelcomePane(); const fullOptions2 = this.CreateWelcomePane();
State.state.fullScreenMessage.setData(fullOptions2) State.state.fullScreenMessage.setData(fullOptions2)
new FixedUiElement(`<div class='collapse-button-img shadow'><img src='assets/help.svg' alt='help'></div>`).onClick(() => {
State.state.fullScreenMessage.setData(fullOptions2) Svg.help_ui()
}).AttachTo("help-button-mobile"); .SetClass("open-welcome-button")
.SetClass("shadow")
.onClick(() => {
State.state.fullScreenMessage.setData(fullOptions2)
}).AttachTo("help-button-mobile");
} }
@ -366,20 +375,18 @@ export class InitUiElements {
} }
layerControlPanel.SetStyle("display:block;padding:1em;border-radius:1em;"); layerControlPanel.SetStyle("display:block;padding:1em;border-radius:1em;");
const closeButton = new Combine([Img.openFilterButton]) const closeButton = Svg.close_ui().SetClass("layer-selection-toggle").SetStyle(" background: #e5f5ff;")
.SetStyle("display:block; width: min-content; background: #e5f5ff;padding:1em; border-radius:1em;");
const checkbox = new CheckBox( const checkbox = new CheckBox(
new Combine([ new Combine([
closeButton, closeButton,
layerControlPanel]).SetStyle("display:flex;flex-direction:row;") layerControlPanel]).SetStyle("display:flex;flex-direction:row;")
.SetClass("hidden-on-mobile") .SetClass("hidden-on-mobile")
, ,
new Combine([Img.closedFilterButton]) Svg.layers_ui().SetClass("layer-selection-toggle"),
.SetStyle("display:block;border-radius:50%;background:white;padding:1em;"),
State.state.layerControlIsOpened State.state.layerControlIsOpened
); );
checkbox
.AttachTo("layer-selection"); checkbox.AttachTo("layer-selection");
State.state.bm.Location.addCallback(() => { State.state.bm.Location.addCallback(() => {
@ -402,27 +409,26 @@ export class InitUiElements {
}); });
} }
static InitBaseMap(){
const bm = new Basemap("leafletDiv", State.state.locationControl, new VariableUiElement( static CreateAttribution() {
return new VariableUiElement(
State.state.locationControl.map((location) => { State.state.locationControl.map((location) => {
const mapComplete = `<a href='https://github.com/pietervdvn/MapComplete' target='_blank'>Mapcomplete ${State.vNumber}</a>` const mapComplete = new Link(`Mapcomplete ${State.vNumber}`, 'https://github.com/pietervdvn/MapComplete', true);
const reportBug = `<a href='https://github.com/pietervdvn/MapComplete/issues' target='_blank'><img src='./assets/bug.svg' class='small-userbadge-icon'></a>`; const reportBug = new Link(Svg.bug_img, "https://github.com/pietervdvn/MapComplete/issues", true);
const layoutId = State.state.layoutToUse.data.id; const layoutId = State.state.layoutToUse.data.id;
const osmChaLink = `https://osmcha.org/?filters=%7B%22comment%22%3A%5B%7B%22label%22%3A%22%23${layoutId}%22%2C%22value%22%3A%22%23${layoutId}%22%7D%5D%2C%22date__gte%22%3A%5B%7B%22label%22%3A%222020-07-05%22%2C%22value%22%3A%222020-07-05%22%7D%5D%2C%22editor%22%3A%5B%7B%22label%22%3A%22MapComplete%22%2C%22value%22%3A%22MapComplete%22%7D%5D%7D` const osmChaLink = `https://osmcha.org/?filters=%7B%22comment%22%3A%5B%7B%22label%22%3A%22%23${layoutId}%22%2C%22value%22%3A%22%23${layoutId}%22%7D%5D%2C%22date__gte%22%3A%5B%7B%22label%22%3A%222020-07-05%22%2C%22value%22%3A%222020-07-05%22%7D%5D%2C%22editor%22%3A%5B%7B%22label%22%3A%22MapComplete%22%2C%22value%22%3A%22MapComplete%22%7D%5D%7D`
const stats = `<a href='${osmChaLink}' target='_blank'><img src='./assets/statistics.svg' class='small-userbadge-icon'></a>`; const stats = new Link(Svg.statistics_img, osmChaLink, true)
let editHere = ""; let editHere: (UIElement | string) = "";
if (location !== undefined) { if (location !== undefined) {
editHere = const idLink = `https://www.openstreetmap.org/edit?editor=id#map=${location.zoom}/${location.lat}/${location.lon}`
"<a href='https://www.openstreetmap.org/edit?editor=id#map=" + location.zoom + "/" + location.lat + "/" + location.lon + "' target='_blank'>" + editHere = new Link(Svg.pencil_img, idLink, true);
"<img src='./assets/pencil.svg' alt='edit here' class='small-userbadge-icon'>" +
"</a>"
} }
let editWithJosm = "" let editWithJosm: (UIElement | string) = ""
if(location !== undefined && if (location !== undefined &&
State.state.osmConnection !== undefined && State.state.osmConnection !== undefined &&
State.state.bm !== undefined && State.state.bm !== undefined &&
State.state.osmConnection.userDetails.data.csCount >= State.userJourney.tagsVisibleAndWikiLinked){ State.state.osmConnection.userDetails.data.csCount >= State.userJourney.tagsVisibleAndWikiLinked) {
const bounds = (State.state.bm as Basemap).map.getBounds(); const bounds = (State.state.bm as Basemap).map.getBounds();
const top = bounds.getNorth(); const top = bounds.getNorth();
const bottom = bounds.getSouth(); const bottom = bounds.getSouth();
@ -430,21 +436,24 @@ export class InitUiElements {
const left = bounds.getWest(); const left = bounds.getWest();
const josmLink = `http://127.0.0.1:8111/load_and_zoom?left=${left}&right=${right}&top=${top}&bottom=${bottom}` const josmLink = `http://127.0.0.1:8111/load_and_zoom?left=${left}&right=${right}&top=${top}&bottom=${bottom}`
editWithJosm = editWithJosm = new Link(Svg.josm_logo_img, josmLink, true);
`<a href='${josmLink}' target='_blank'><img src='./assets/josm_logo.svg' alt='edit here' class='small-userbadge-icon'></a>`
} }
return new Combine([mapComplete, reportBug, " | ", stats, " | ", editHere, editWithJosm]).Render(); return new Combine([mapComplete, reportBug, " | ", stats, " | ", editHere, editWithJosm]).Render();
}, [State.state.osmConnection.userDetails]) }, [State.state.osmConnection.userDetails])
)
); ).SetClass("map-attribution")
}
static InitBaseMap() {
const bm = new Basemap("leafletDiv", State.state.locationControl, this.CreateAttribution());
State.state.bm = bm; State.state.bm = bm;
State.state.layerUpdater = new UpdateFromOverpass(State.state); State.state.layerUpdater = new UpdateFromOverpass(State.state);
State.state.availableBackgroundLayers = new AvailableBaseLayers(State.state).availableEditorLayers; State.state.availableBackgroundLayers = new AvailableBaseLayers(State.state).availableEditorLayers;
const queryParam = QueryParameters.GetQueryParameter("background", State.state.layoutToUse.data.defaultBackground); const queryParam = QueryParameters.GetQueryParameter("background", State.state.layoutToUse.data.defaultBackground);
queryParam.addCallbackAndRun((selectedId:string) => { queryParam.addCallbackAndRun((selectedId: string) => {
const available = State.state.availableBackgroundLayers.data; const available = State.state.availableBackgroundLayers.data;
for (const layer of available) { for (const layer of available) {
if (layer.id === selectedId) { if (layer.id === selectedId) {

View file

@ -53,7 +53,7 @@ export class FilteredLayer {
this._showOnPopup = showOnPopup; this._showOnPopup = showOnPopup;
this._style = (tags) => { this._style = (tags) => {
const iconUrl = layerDef.icon?.GetRenderValue(tags)?.txt ?? "./assets/bug.svg"; const iconUrl = layerDef.icon?.GetRenderValue(tags)?.txt;
const iconSize = (layerDef.iconSize?.GetRenderValue(tags)?.txt ?? "40,40,center").split(","); const iconSize = (layerDef.iconSize?.GetRenderValue(tags)?.txt ?? "40,40,center").split(",");

View file

@ -9,6 +9,8 @@ import {PersonalLayout} from "./PersonalLayout";
import {Layout} from "../Customizations/Layout"; import {Layout} from "../Customizations/Layout";
import {SubtleButton} from "../UI/Base/SubtleButton"; import {SubtleButton} from "../UI/Base/SubtleButton";
import {FixedUiElement} from "../UI/Base/FixedUiElement"; import {FixedUiElement} from "../UI/Base/FixedUiElement";
import {Img} from "../UI/Img";
import Svg from "../Svg";
export class PersonalLayersPanel extends UIElement { export class PersonalLayersPanel extends UIElement {
private checkboxes: UIElement[] = []; private checkboxes: UIElement[] = [];
@ -50,10 +52,10 @@ export class PersonalLayersPanel extends UIElement {
if (typeof layer === "string") { if (typeof layer === "string") {
continue; continue;
} }
let icon = layer.icon ?? "./assets/checkmark.svg"; let icon = layer.icon ?? Img.AsData(Svg.checkmark);
let iconUnset = layer.icon ?? ""; let iconUnset = layer.icon ?? "";
if (layer.icon !== undefined && typeof (layer.icon) !== "string") { if (layer.icon !== undefined && typeof (layer.icon) !== "string") {
icon = layer.icon.GetContent({"id": "node/-123456"}).txt ?? "./assets/checkmark.svg"; icon = layer.icon.GetRenderValue({"id": "node/-123456"}).txt ?? Img.AsData(Svg.checkmark)
iconUnset = icon; iconUnset = icon;
} }

View file

@ -1,5 +1,7 @@
import {Layout} from "../Customizations/Layout"; import {Layout} from "../Customizations/Layout";
import Translations from "../UI/i18n/Translations"; import Translations from "../UI/i18n/Translations";
import {Img} from "../UI/Img";
import Svg from "../Svg";
export class PersonalLayout extends Layout { export class PersonalLayout extends Layout {
@ -18,7 +20,7 @@ export class PersonalLayout extends Layout {
); );
this.maintainer = "MapComplete" this.maintainer = "MapComplete"
this.description = "The personal theme allows to select one or more layers from all the layouts, creating a truly personal editor" this.description = "The personal theme allows to select one or more layers from all the layouts, creating a truly personal editor"
this.icon = "./assets/add.svg" this.icon = Img.AsData(Svg.add)
} }
} }

4
Svg.ts
View file

@ -100,6 +100,10 @@ export default class Svg {
public static logout_img = Img.AsImageElement(Svg.logout) public static logout_img = Img.AsImageElement(Svg.logout)
public static logout_ui() { return new FixedUiElement(Svg.logout_img);} public static logout_ui() { return new FixedUiElement(Svg.logout_img);}
public static mapillary = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" fill=\"none\" viewBox=\"0 0 32 32\"><path fill=\"#fff\" fill-rule=\"evenodd\" d=\"M32 16c0 8.837-7.163 16-16 16S0 24.837 0 16 7.163 0 16 0s16 7.163 16 16zm-24.44-.974c-.371-.201-.303-.725.166-.859.398-.113 3.627-1.196 4.605-1.524a.59.59 0 00.373-.369l1.57-4.603c.146-.43.678-.432.894-.015.024.046.325.593.731 1.331v.001c.896 1.629 2.302 4.185 2.372 4.34a.473.473 0 01-.194.617c-.133.083-.314.19-.469.28l-.269.16c-.237.148-.464.045-.573-.183-.065-.137-.39-.719-.713-1.299-.217-.389-.433-.776-.57-1.027-.17-.313-.682-.433-.854.072l-.566 1.66a.613.613 0 01-.376.373l-1.703.564c-.336.111-.5.626-.046.843.038.018.383.202.798.423h.001c.631.337 1.425.76 1.552.82.21.1.328.39.204.595-.168.28-.384.635-.462.75a.48.48 0 01-.626.149c-.223-.119-5.711-3.027-5.844-3.099zm7.378 3.9c.288.147 7.276 3.844 7.496 3.963.441.238.907-.222.668-.652-.041-.073-.507-.929-1.107-2.034l-.002-.004c-1.166-2.144-2.84-5.224-2.925-5.365-.128-.214-.442-.322-.678-.178-.232.14-.498.298-.648.374-.3.153-.338.383-.203.639.297.562 1.232 2.267 1.34 2.446.223.374-.276.801-.615.615-.054-.03-.408-.217-.834-.442-.697-.368-1.587-.839-1.684-.896-.157-.09-.435-.09-.626.218-.138.224-.308.502-.386.642-.155.274-.084.527.204.674z\" clip-rule=\"evenodd\" style=\"transition: all 0.2s ease 0s;\"></path></svg>"
public static mapillary_img = Img.AsImageElement(Svg.mapillary)
public static mapillary_ui() { return new FixedUiElement(Svg.mapillary_img);}
public static or = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?> <svg xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\" xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" width=\"275.9444\" height=\"243.66881\" version=\"1.1\" id=\"svg6\" sodipodi:docname=\"or.svg\" inkscape:version=\"0.92.4 (5da689c313, 2019-01-14)\"> <metadata id=\"metadata12\"> <rdf:RDF> <cc:Work rdf:about=\"\"> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" /> </cc:Work> </rdf:RDF> </metadata> <defs id=\"defs10\" /> <sodipodi:namedview pagecolor=\"#ffffff\" bordercolor=\"#666666\" borderopacity=\"1\" objecttolerance=\"10\" gridtolerance=\"10\" guidetolerance=\"10\" inkscape:pageopacity=\"0\" inkscape:pageshadow=\"2\" inkscape:window-width=\"1920\" inkscape:window-height=\"1001\" id=\"namedview8\" showgrid=\"false\" inkscape:zoom=\"1.5567312\" inkscape:cx=\"116.77734\" inkscape:cy=\"95.251996\" inkscape:window-x=\"1560\" inkscape:window-y=\"1060\" inkscape:window-maximized=\"1\" inkscape:current-layer=\"svg6\" /> <path style=\"fill:none;stroke:#000000;stroke-width:27.45802498;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\" d=\"M 136.18279,27.932469 V 214.66155\" id=\"path812\" inkscape:connector-curvature=\"0\" /> </svg> " public static or = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?> <svg xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\" xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" width=\"275.9444\" height=\"243.66881\" version=\"1.1\" id=\"svg6\" sodipodi:docname=\"or.svg\" inkscape:version=\"0.92.4 (5da689c313, 2019-01-14)\"> <metadata id=\"metadata12\"> <rdf:RDF> <cc:Work rdf:about=\"\"> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" /> </cc:Work> </rdf:RDF> </metadata> <defs id=\"defs10\" /> <sodipodi:namedview pagecolor=\"#ffffff\" bordercolor=\"#666666\" borderopacity=\"1\" objecttolerance=\"10\" gridtolerance=\"10\" guidetolerance=\"10\" inkscape:pageopacity=\"0\" inkscape:pageshadow=\"2\" inkscape:window-width=\"1920\" inkscape:window-height=\"1001\" id=\"namedview8\" showgrid=\"false\" inkscape:zoom=\"1.5567312\" inkscape:cx=\"116.77734\" inkscape:cy=\"95.251996\" inkscape:window-x=\"1560\" inkscape:window-y=\"1060\" inkscape:window-maximized=\"1\" inkscape:current-layer=\"svg6\" /> <path style=\"fill:none;stroke:#000000;stroke-width:27.45802498;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\" d=\"M 136.18279,27.932469 V 214.66155\" id=\"path812\" inkscape:connector-curvature=\"0\" /> </svg> "
public static or_img = Img.AsImageElement(Svg.or) public static or_img = Img.AsImageElement(Svg.or)
public static or_ui() { return new FixedUiElement(Svg.or_img);} public static or_ui() { return new FixedUiElement(Svg.or_img);}

View file

@ -1,4 +1,5 @@
import {UIElement} from "../UIElement"; import {UIElement} from "../UIElement";
import Translations from "../i18n/Translations";
export default class Link extends UIElement { export default class Link extends UIElement {
@ -6,9 +7,9 @@ export default class Link extends UIElement {
private readonly _target: string; private readonly _target: string;
private readonly _newTab: string; private readonly _newTab: string;
constructor(embeddedShow: UIElement, target: string, newTab: boolean = false) { constructor(embeddedShow: UIElement | string, target: string, newTab: boolean = false) {
super(); super();
this._embeddedShow = embeddedShow; this._embeddedShow = Translations.W(embeddedShow);
this._target = target; this._target = target;
this._newTab = ""; this._newTab = "";
if (newTab) { if (newTab) {

View file

@ -5,6 +5,7 @@ import {Imgur} from "../../Logic/Web/Imgur";
import {Mapillary} from "../../Logic/Web/Mapillary"; import {Mapillary} from "../../Logic/Web/Mapillary";
import {Img} from "../Img"; import {Img} from "../Img";
import {FixedUiElement} from "../Base/FixedUiElement"; import {FixedUiElement} from "../Base/FixedUiElement";
import Svg from "../../Svg";
export class MapillaryImage extends UIElement { export class MapillaryImage extends UIElement {
@ -53,8 +54,7 @@ export class MapillaryImage extends UIElement {
return "<div class='imgWithAttr'>" + return "<div class='imgWithAttr'>" +
image + image +
"<div class='attribution'>" + "<div class='attribution'>" +
Svg.mapillary_ui().Render() +
new FixedUiElement(Img.mapillaryLogo).SetStyle("height: 1.5em").Render() +
attribution + attribution +
"</div>" + "</div>" +
"</div>"; "</div>";

View file

@ -1,6 +1,10 @@
import {UIElement} from "../UIElement"; import {UIElement} from "../UIElement";
import {LicenseInfo, Wikimedia} from "../../Logic/Web/Wikimedia"; import {LicenseInfo, Wikimedia} from "../../Logic/Web/Wikimedia";
import {UIEventSource} from "../../Logic/UIEventSource"; import {UIEventSource} from "../../Logic/UIEventSource";
import Svg from "../../Svg";
import Link from "../Base/Link";
import {FixedUiElement} from "../Base/FixedUiElement";
import Combine from "../Base/Combine";
export class WikimediaImage extends UIElement { export class WikimediaImage extends UIElement {
@ -8,7 +12,7 @@ export class WikimediaImage extends UIElement {
static allLicenseInfos: any = {}; static allLicenseInfos: any = {};
private readonly _imageMeta: UIEventSource<LicenseInfo>; private readonly _imageMeta: UIEventSource<LicenseInfo>;
private readonly _imageLocation : string; private readonly _imageLocation: string;
constructor(source: string) { constructor(source: string) {
super(undefined) super(undefined)
@ -33,21 +37,17 @@ export class WikimediaImage extends UIElement {
let url = Wikimedia.ImageNameToUrl(this._imageLocation, 500, 400); let url = Wikimedia.ImageNameToUrl(this._imageLocation, 500, 400);
url = url.replace(/'/g, '%27'); url = url.replace(/'/g, '%27');
const wikimediaLink = const wikimediaLink = new Link(Svg.wikimedia_commons_white_img,
"<a href='https://commons.wikimedia.org/wiki/" + this._imageLocation + "' target='_blank'>" + `https://commons.wikimedia.org/wiki/${this._imageLocation}`, true)
"<img style='width:2em;height: 2em' class='wikimedia-link' src='./assets/wikimedia-commons-white.svg' alt='Wikimedia Commons Logo'/>" + .SetStyle("width:2em;height: 2em");
"</a> ";
const attribution = const attribution = new FixedUiElement(this._imageMeta.data.artist ?? "").SetClass("attribution-author");
"<span class='attribution-author'>" + (this._imageMeta.data.artist ?? "") + "</span>" + " <span class='license'>" + (this._imageMeta.data.licenseShortName ?? "") + "</span>"; const license = new FixedUiElement(this._imageMeta.data.licenseShortName ?? "").SetClass("license");
const image = "<img src='" + url + "' " + "alt='" + this._imageMeta.data.description + "' >"; const image = "<img src='" + url + "' " + "alt='" + this._imageMeta.data.description + "' >";
return "<div class='imgWithAttr'>" + return "<div class='imgWithAttr'>" +
image + image +
"<div class='attribution'>" + new Combine([wikimediaLink, attribution]).SetClass("attribution").Render() +
wikimediaLink +
attribution +
"</div>" +
"</div>"; "</div>";
} }

View file

@ -1,6 +1,3 @@
import {UIElement} from "./UIElement";
import {FixedUiElement} from "./Base/FixedUiElement";
export class Img { export class Img {
static AsData(source:string){ static AsData(source:string){
@ -10,25 +7,7 @@ export class Img {
static AsImageElement(source: string): string{ static AsImageElement(source: string): string{
return `<img src="${Img.AsData(source)}">`; return `<img src="${Img.AsData(source)}">`;
} }
static AsImage(source: string): UIElement{
return new FixedUiElement(Img.AsImageElement(source))
}
static readonly checkmark = `<svg width="26" height="18" viewBox="0 0 26 18" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M3 7.28571L10.8261 15L23 3" stroke="black" stroke-width="4" stroke-linejoin="round"/></svg>`; static readonly checkmark = `<svg width="26" height="18" viewBox="0 0 26 18" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M3 7.28571L10.8261 15L23 3" stroke="black" stroke-width="4" stroke-linejoin="round"/></svg>`;
static readonly no_checkmark = `<svg width="26" height="18" viewBox="0 0 26 18" fill="none" xmlns="http://www.w3.org/2000/svg"></svg>`; static readonly no_checkmark = `<svg width="26" height="18" viewBox="0 0 26 18" fill="none" xmlns="http://www.w3.org/2000/svg"></svg>`;
static closedFilterButton: string = `<svg width="27" height="27" viewBox="0 0 27 27" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M26.5353 8.13481C26.4422 8.35428 26.2683 8.47598 26.0632 8.58537C21.9977 10.7452 17.935 12.9085 13.8758 15.0799C13.6475 15.2016 13.4831 15.1962 13.2568 15.0751C9.19822 12.903 5.13484 10.7404 1.07215 8.5758C0.490599 8.26608 0.448478 7.52562 0.991303 7.13796C1.0803 7.07438 1.17813 7.0231 1.2746 6.97045C5.15862 4.86462 9.04536 2.7629 12.9246 0.648187C13.3805 0.399316 13.7779 0.406837 14.2311 0.65434C18.0954 2.76153 21.9658 4.85779 25.8383 6.94926C26.1569 7.12155 26.411 7.32872 26.5353 7.67604C26.5353 7.82919 26.5353 7.98166 26.5353 8.13481Z" fill="#003B8B"/>
<path d="M13.318 26.535C12.1576 25.9046 10.9972 25.2736 9.83614 24.6439C6.96644 23.0877 4.09674 21.533 1.22704 19.9762C0.694401 19.6876 0.466129 19.2343 0.669943 18.7722C0.759621 18.5691 0.931505 18.3653 1.11969 18.2512C1.66659 17.9182 2.23727 17.6228 2.80863 17.3329C2.89423 17.2892 3.04981 17.3206 3.14493 17.3712C6.40799 19.1031 9.66969 20.837 12.9239 22.5845C13.3703 22.8238 13.7609 22.83 14.208 22.59C17.4554 20.8472 20.7117 19.1202 23.9605 17.3801C24.1493 17.2789 24.2838 17.283 24.4632 17.3876C24.8926 17.6386 25.3301 17.8772 25.7751 18.1001C26.11 18.2683 26.3838 18.4857 26.5346 18.8385C26.5346 18.9916 26.5346 19.1441 26.5346 19.2972C26.4049 19.6528 26.1399 19.8613 25.8152 20.0363C22.9964 21.5549 20.1831 23.0829 17.3684 24.609C16.1863 25.2496 15.0055 25.893 13.8248 26.535C13.6556 26.535 13.4865 26.535 13.318 26.535Z" fill="#003B8B"/>
<path d="M26.3988 13.7412C26.2956 13.9661 26.1026 14.081 25.8927 14.1924C21.8198 16.3577 17.749 18.5258 13.6815 20.7013C13.492 20.8025 13.3602 20.7902 13.1795 20.6938C9.09638 18.5114 5.01059 16.3359 0.924798 14.1582C0.399637 13.8786 0.307921 13.2646 0.735251 12.838C0.829005 12.7443 0.947217 12.6705 1.06407 12.6055C1.56545 12.3279 2.07635 12.0654 2.57297 11.7789C2.74214 11.6812 2.86579 11.6921 3.03291 11.7817C6.27492 13.5155 9.52303 15.2378 12.761 16.9792C13.2352 17.2343 13.6394 17.2322 14.1129 16.9772C17.3509 15.2358 20.5996 13.5142 23.8416 11.7796C24.0095 11.69 24.1338 11.6818 24.3016 11.7789C24.7384 12.0339 25.1821 12.2794 25.6352 12.5037C25.9701 12.6691 26.2426 12.8831 26.3995 13.2304C26.3988 13.4014 26.3988 13.5716 26.3988 13.7412Z" fill="#003B8B"/>
</svg> `
static openFilterButton: string = `<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20 2L2 20M20 20L2 2" stroke="#003B8B" stroke-width="4"/>
</svg> `
static mapillaryLogo = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" fill=\"none\" viewBox=\"0 0 32 32\"><path fill=\"#fff\" fill-rule=\"evenodd\" d=\"M32 16c0 8.837-7.163 16-16 16S0 24.837 0 16 7.163 0 16 0s16 7.163 16 16zm-24.44-.974c-.371-.201-.303-.725.166-.859.398-.113 3.627-1.196 4.605-1.524a.59.59 0 00.373-.369l1.57-4.603c.146-.43.678-.432.894-.015.024.046.325.593.731 1.331v.001c.896 1.629 2.302 4.185 2.372 4.34a.473.473 0 01-.194.617c-.133.083-.314.19-.469.28l-.269.16c-.237.148-.464.045-.573-.183-.065-.137-.39-.719-.713-1.299-.217-.389-.433-.776-.57-1.027-.17-.313-.682-.433-.854.072l-.566 1.66a.613.613 0 01-.376.373l-1.703.564c-.336.111-.5.626-.046.843.038.018.383.202.798.423h.001c.631.337 1.425.76 1.552.82.21.1.328.39.204.595-.168.28-.384.635-.462.75a.48.48 0 01-.626.149c-.223-.119-5.711-3.027-5.844-3.099zm7.378 3.9c.288.147 7.276 3.844 7.496 3.963.441.238.907-.222.668-.652-.041-.073-.507-.929-1.107-2.034l-.002-.004c-1.166-2.144-2.84-5.224-2.925-5.365-.128-.214-.442-.322-.678-.178-.232.14-.498.298-.648.374-.3.153-.338.383-.203.639.297.562 1.232 2.267 1.34 2.446.223.374-.276.801-.615.615-.054-.03-.408-.217-.834-.442-.697-.368-1.587-.839-1.684-.896-.157-.09-.435-.09-.626.218-.138.224-.308.502-.386.642-.155.274-.084.527.204.674z\" clip-rule=\"evenodd\" style=\"transition: all 0.2s ease 0s;\"></path></svg>"
} }

View file

@ -4,6 +4,8 @@ import {UIElement} from "../UIElement";
import Combine from "../Base/Combine"; import Combine from "../Base/Combine";
import {SubtleButton} from "../Base/SubtleButton"; import {SubtleButton} from "../Base/SubtleButton";
import {FixedUiElement} from "../Base/FixedUiElement"; import {FixedUiElement} from "../Base/FixedUiElement";
import Svg from "../../Svg";
import {Img} from "../Img";
export class MultiInput<T> extends InputElement<T[]> { export class MultiInput<T> extends InputElement<T[]> {
@ -28,7 +30,7 @@ export class MultiInput<T> extends InputElement<T[]> {
this.ListenTo(value.map((latest : T[]) => latest.length)); this.ListenTo(value.map((latest : T[]) => latest.length));
this._options = options ?? {}; this._options = options ?? {};
this.addTag = new SubtleButton("./assets/addSmall.svg", addAElement) this.addTag = new SubtleButton(Img.AsData(Svg.addSmall), addAElement)
.SetClass("small-button") .SetClass("small-button")
.onClick(() => { .onClick(() => {
this.IsSelected.setData(true); this.IsSelected.setData(true);
@ -70,7 +72,7 @@ export class MultiInput<T> extends InputElement<T[]> {
this.inputELements.push(input); this.inputELements.push(input);
input.IsSelected.addCallback(() => this.UpdateIsSelected()); input.IsSelected.addCallback(() => this.UpdateIsSelected());
const moveUpBtn = new FixedUiElement("<img src='./assets/up.svg' style='max-width: 1.5em; margin-left: 5px;'>") const moveUpBtn = new FixedUiElement(Img.AsData(Svg.up))
.onClick(() => { .onClick(() => {
const v = self._value.data[i]; const v = self._value.data[i];
self._value.data[i] = self._value.data[i - 1]; self._value.data[i] = self._value.data[i - 1];

View file

@ -8,6 +8,8 @@ import State from "../State";
import {VariableUiElement} from "./Base/VariableUIElement"; import {VariableUiElement} from "./Base/VariableUIElement";
import {PersonalLayout} from "../Logic/PersonalLayout"; import {PersonalLayout} from "../Logic/PersonalLayout";
import {Layout} from "../Customizations/Layout"; import {Layout} from "../Customizations/Layout";
import Svg from "../Svg";
import {Img} from "./Img";
export class MoreScreen extends UIElement { export class MoreScreen extends UIElement {
@ -77,7 +79,8 @@ export class MoreScreen extends UIElement {
if (userDetails.csCount < State.userJourney.themeGeneratorReadOnlyUnlock) { if (userDetails.csCount < State.userJourney.themeGeneratorReadOnlyUnlock) {
return tr.requestATheme.Render(); return tr.requestATheme.Render();
} }
return new SubtleButton("./assets/pencil.svg", tr.createYourOwnTheme, { return new SubtleButton(
Img.AsData(Svg.pencil), tr.createYourOwnTheme, {
url: "./customGenerator.html", url: "./customGenerator.html",
newTab: false newTab: false
}).Render(); }).Render();

View file

@ -1,12 +1,12 @@
import {UIElement} from "../UIElement"; import {UIElement} from "../UIElement";
import {UIEventSource} from "../../Logic/UIEventSource"; import {UIEventSource} from "../../Logic/UIEventSource";
import TagRenderingConfig from "../../Customizations/JSON/TagRenderingConfig"; import TagRenderingConfig from "../../Customizations/JSON/TagRenderingConfig";
import {FixedUiElement} from "../Base/FixedUiElement";
import TagRenderingQuestion from "./TagRenderingQuestion"; import TagRenderingQuestion from "./TagRenderingQuestion";
import Translations from "../i18n/Translations"; import Translations from "../i18n/Translations";
import Combine from "../Base/Combine"; import Combine from "../Base/Combine";
import TagRenderingAnswer from "./TagRenderingAnswer"; import TagRenderingAnswer from "./TagRenderingAnswer";
import State from "../../State"; import State from "../../State";
import Svg from "../../Svg";
export default class EditableTagRendering extends UIElement { export default class EditableTagRendering extends UIElement {
private _tags: UIEventSource<any>; private _tags: UIEventSource<any>;
@ -35,9 +35,8 @@ export default class EditableTagRendering extends UIElement {
if (this._configuration.question !== undefined) { if (this._configuration.question !== undefined) {
// 2.3em total width // 2.3em total width
this._editButton = new FixedUiElement( this._editButton =
"<img style='width: 1.3em;height: 1.3em;padding: 0.5em;border-radius: 0.65em;border: solid black 1px;font-size: medium;float: right;' " + Svg.pencil_ui().SetClass("edit-button")
"src='./assets/pencil.svg' alt='edit'>")
.onClick(() => { .onClick(() => {
self._editMode.setData(true); self._editMode.setData(true);
}); });

View file

@ -42,7 +42,7 @@ export class FeatureInfoBox extends UIElement {
new Combine([this._title, this._titleIcons]) new Combine([this._title, this._titleIcons])
.SetClass("featureinfobox-titlebar"), .SetClass("featureinfobox-titlebar"),
...this._renderings, ...this._renderings,
this._questionBox this._questionBox,
]).Render(); ]).Render();
} }

View file

@ -5,7 +5,6 @@ import TagRenderingConfig from "../../Customizations/JSON/TagRenderingConfig";
import {InputElement} from "../Input/InputElement"; import {InputElement} from "../Input/InputElement";
import {And, Tag, TagsFilter, TagUtils} from "../../Logic/Tags"; import {And, Tag, TagsFilter, TagUtils} from "../../Logic/Tags";
import ValidatedTextField from "../Input/ValidatedTextField"; import ValidatedTextField from "../Input/ValidatedTextField";
import {Translation} from "../i18n/Translations";
import {FixedInputElement} from "../Input/FixedInputElement"; import {FixedInputElement} from "../Input/FixedInputElement";
import {SubstitutedTranslation} from "../SpecialVisualizations"; import {SubstitutedTranslation} from "../SpecialVisualizations";
import {RadioButton} from "../Input/RadioButton"; import {RadioButton} from "../Input/RadioButton";
@ -18,6 +17,7 @@ import {Changes} from "../../Logic/Osm/Changes";
import {VariableUiElement} from "../Base/VariableUIElement"; import {VariableUiElement} from "../Base/VariableUIElement";
import Translations from "../i18n/Translations"; import Translations from "../i18n/Translations";
import {FixedUiElement} from "../Base/FixedUiElement"; import {FixedUiElement} from "../Base/FixedUiElement";
import {Translation} from "../i18n/Translation";
/** /**
* Shows the question element. * Shows the question element.

View file

@ -1,30 +1,28 @@
import Locale from "./i18n/Locale"; import Locale from "./i18n/Locale";
import {UIElement} from "./UIElement"; import {UIElement} from "./UIElement";
import Translation from "./i18n/Translation";
import {VariableUiElement} from "./Base/VariableUIElement"; import {VariableUiElement} from "./Base/VariableUIElement";
import {FixedUiElement} from "./Base/FixedUiElement";
import {TextField} from "./Input/TextField"; import {TextField} from "./Input/TextField";
import {Geocoding} from "../Logic/Osm/Geocoding"; import {Geocoding} from "../Logic/Osm/Geocoding";
import Translations from "./i18n/Translations"; import Translations from "./i18n/Translations";
import State from "../State"; import State from "../State";
import {UIEventSource} from "../Logic/UIEventSource"; import {UIEventSource} from "../Logic/UIEventSource";
import Svg from "../Svg";
import {Translation} from "./i18n/Translation";
export class SearchAndGo extends UIElement { export class SearchAndGo extends UIElement {
private _placeholder = new UIEventSource<Translation>(Translations.t.general.search.search) private _placeholder = new UIEventSource<Translation>(Translations.t.general.search.search)
private _searchField = new TextField<string>({ private _searchField = new TextField({
placeholder: new VariableUiElement( placeholder: new VariableUiElement(
this._placeholder.map(uiElement => uiElement.InnerRender(), [Locale.language]) this._placeholder.map(uiElement => uiElement.InnerRender(), [Locale.language])
), ),
fromString: str => str,
toString: str => str,
value: new UIEventSource<string>("") value: new UIEventSource<string>("")
} }
); );
private _foundEntries = new UIEventSource([]); private _foundEntries = new UIEventSource([]);
private _goButton = new FixedUiElement("<img class='search-go' src='./assets/search.svg' alt='GO'>"); private _goButton = Svg.search_ui().SetClass('search-go');
constructor() { constructor() {
super(undefined); super(undefined);

View file

@ -11,9 +11,10 @@ import {Basemap} from "../Logic/Leaflet/Basemap";
import {FilteredLayer} from "../Logic/FilteredLayer"; import {FilteredLayer} from "../Logic/FilteredLayer";
import {Utils} from "../Utils"; import {Utils} from "../Utils";
import {UIEventSource} from "../Logic/UIEventSource"; import {UIEventSource} from "../Logic/UIEventSource";
import Translation from "./i18n/Translation";
import {SubtleButton} from "./Base/SubtleButton"; import {SubtleButton} from "./Base/SubtleButton";
import {Layout} from "../Customizations/Layout"; import {Layout} from "../Customizations/Layout";
import Svg from "../Svg";
import {Translation} from "./i18n/Translation";
export class ShareScreen extends UIElement { export class ShareScreen extends UIElement {
private readonly _options: UIElement; private readonly _options: UIElement;
@ -186,7 +187,7 @@ export class ShareScreen extends UIElement {
return ""; return "";
} }
return new SubtleButton("./assets/pencil.svg", return new SubtleButton(Img.AsData(Svg.pencil),
new Combine([tr.editThisTheme.SetClass("bold"), "<br/>", new Combine([tr.editThisTheme.SetClass("bold"), "<br/>",
tr.editThemeDescription]), tr.editThemeDescription]),
{url: `./customGenerator.html#${State.state.layoutDefinition}`, newTab: true}).Render(); {url: `./customGenerator.html#${State.state.layoutDefinition}`, newTab: true}).Render();

View file

@ -8,6 +8,8 @@ import Locale from "./i18n/Locale";
import State from "../State"; import State from "../State";
import {UIEventSource} from "../Logic/UIEventSource"; import {UIEventSource} from "../Logic/UIEventSource";
import {Img} from "./Img";
import Svg from "../Svg";
/** /**
* Asks to add a feature at the last clicked location, at least if zoom is sufficient * Asks to add a feature at the last clicked location, at least if zoom is sufficient
@ -28,7 +30,7 @@ export class SimpleAddUI extends UIElement {
private confirmButton: UIElement = undefined; private confirmButton: UIElement = undefined;
private openLayerControl: UIElement; private openLayerControl: UIElement;
private cancelButton: UIElement; private cancelButton: UIElement;
private goToInboxButton: UIElement = new SubtleButton("./assets/envelope.svg", private goToInboxButton: UIElement = new SubtleButton(Img.AsData(Svg.envelope),
Translations.t.general.goToInbox, {url:"https://www.openstreetmap.org/messages/inbox", newTab: false}); Translations.t.general.goToInbox, {url:"https://www.openstreetmap.org/messages/inbox", newTab: false});
constructor() { constructor() {
@ -52,8 +54,7 @@ export class SimpleAddUI extends UIElement {
const presets = layer.layerDef.presets; const presets = layer.layerDef.presets;
for (const preset of presets) { for (const preset of presets) {
let icon: string = layer.layerDef.icon.GetRenderValue( let icon: string = layer.layerDef.icon.GetRenderValue(
TagUtils.KVtoProperties(preset.tags ?? [])).txt ?? TagUtils.KVtoProperties(preset.tags ?? [])).txt
"./assets/bug.svg";
const csCount = State.state.osmConnection.userDetails.data.csCount; const csCount = State.state.osmConnection.userDetails.data.csCount;
let tagInfo = ""; let tagInfo = "";
@ -97,14 +98,14 @@ export class SimpleAddUI extends UIElement {
} }
this.cancelButton = new SubtleButton( this.cancelButton = new SubtleButton(
"./assets/close.svg", Img.AsData(Svg.close),
Translations.t.general.cancel Translations.t.general.cancel
).onClick(() => { ).onClick(() => {
self._confirmPreset.setData(undefined); self._confirmPreset.setData(undefined);
}) })
this.openLayerControl = new SubtleButton( this.openLayerControl = new SubtleButton(
"./assets/layers.svg", Img.AsData(Svg.layers),
Translations.t.general.add.openLayerControl Translations.t.general.add.openLayerControl
).onClick(() => { ).onClick(() => {
State.state.layerControlIsOpened.setData(true); State.state.layerControlIsOpened.setData(true);
@ -169,9 +170,8 @@ export class SimpleAddUI extends UIElement {
} }
if (userDetails.data.unreadMessages > 0 && userDetails.data.csCount < State.userJourney.addNewPointWithUnreadMessagesUnlock) { if (userDetails.data.unreadMessages > 0 && userDetails.data.csCount < State.userJourney.addNewPointWithUnreadMessagesUnlock) {
return new Combine([header, "<span class='alert'>", return new Combine([header,
Translations.t.general.readYourMessages, Translations.t.general.readYourMessages.Clone().SetClass("alert"),
"</span>",
this.goToInboxButton this.goToInboxButton
]).Render(); ]).Render();

View file

@ -4,11 +4,11 @@ import {UIEventSource} from "../Logic/UIEventSource";
import {VariableUiElement} from "./Base/VariableUIElement"; import {VariableUiElement} from "./Base/VariableUIElement";
import LiveQueryHandler from "../Logic/Web/LiveQueryHandler"; import LiveQueryHandler from "../Logic/Web/LiveQueryHandler";
import {ImageCarousel} from "./Image/ImageCarousel"; import {ImageCarousel} from "./Image/ImageCarousel";
import {Translation} from "./i18n/Translations";
import Combine from "./Base/Combine"; import Combine from "./Base/Combine";
import {FixedUiElement} from "./Base/FixedUiElement"; import {FixedUiElement} from "./Base/FixedUiElement";
import Locale from "../UI/i18n/Locale"; import Locale from "../UI/i18n/Locale";
import {ImageUploadFlow} from "./Image/ImageUploadFlow"; import {ImageUploadFlow} from "./Image/ImageUploadFlow";
import {Translation} from "./i18n/Translation";
export class SubstitutedTranslation extends UIElement { export class SubstitutedTranslation extends UIElement {
private readonly tags: UIEventSource<any>; private readonly tags: UIEventSource<any>;

View file

@ -7,10 +7,10 @@ import {UserDetails} from "../Logic/Osm/OsmConnection";
import State from "../State"; import State from "../State";
import {UIEventSource} from "../Logic/UIEventSource"; import {UIEventSource} from "../Logic/UIEventSource";
import Combine from "./Base/Combine"; import Combine from "./Base/Combine";
import Locale from "./i18n/Locale";
import Svg from "../Svg"; import Svg from "../Svg";
import Link from "./Base/Link"; import Link from "./Base/Link";
import {Img} from "./Img"; import {Img} from "./Img";
import LanguagePicker from "./LanguagePicker";
/** /**
* Handles and updates the user badge * Handles and updates the user badge
@ -26,7 +26,7 @@ export class UserBadge extends UIElement {
constructor() { constructor() {
super(State.state.osmConnection.userDetails); super(State.state.osmConnection.userDetails);
this._userDetails = State.state.osmConnection.userDetails; this._userDetails = State.state.osmConnection.userDetails;
this._languagePicker = (Locale.CreateLanguagePicker(State.state.layoutToUse.data.supportedLanguages) ?? new FixedUiElement("")) this._languagePicker = (LanguagePicker.CreateLanguagePicker(State.state.layoutToUse.data.supportedLanguages) ?? new FixedUiElement(""))
.SetStyle("display:inline-block;width:min-content;"); .SetStyle("display:inline-block;width:min-content;");
this._loginButton = Translations.t.general.loginWithOpenStreetMap this._loginButton = Translations.t.general.loginWithOpenStreetMap

View file

@ -3,6 +3,7 @@ import Locale from "../UI/i18n/Locale";
import State from "../State"; import State from "../State";
import Translations from "./i18n/Translations"; import Translations from "./i18n/Translations";
import Combine from "./Base/Combine"; import Combine from "./Base/Combine";
import LanguagePicker from "./LanguagePicker";
export class WelcomeMessage extends UIElement { export class WelcomeMessage extends UIElement {
@ -17,7 +18,7 @@ export class WelcomeMessage extends UIElement {
constructor() { constructor() {
super(State.state.osmConnection.userDetails); super(State.state.osmConnection.userDetails);
this.ListenTo(Locale.language); this.ListenTo(Locale.language);
this.languagePicker = Locale.CreateLanguagePicker(State.state.layoutToUse.data.supportedLanguages, Translations.t.general.pickLanguage); this.languagePicker = LanguagePicker.CreateLanguagePicker(State.state.layoutToUse.data.supportedLanguages, Translations.t.general.pickLanguage);
const layout = State.state.layoutToUse.data; const layout = State.state.layoutToUse.data;
this.description =Translations.W(layout.welcomeMessage); this.description =Translations.W(layout.welcomeMessage);

103
UI/i18n/Translation.ts Normal file
View file

@ -0,0 +1,103 @@
import {UIElement} from "../UIElement";
import Combine from "../Base/Combine";
import Locale from "./Locale";
import {Utils} from "../../Utils";
export class Translation extends UIElement {
private static forcedLanguage = undefined;
public Subs(text: any): Translation {
const newTranslations = {};
for (const lang in this.translations) {
let template: string = this.translations[lang];
for (const k in text) {
const combined = [];
const parts = template.split("{" + k + "}");
const el: string | UIElement = text[k];
if (el === undefined) {
continue;
}
let rtext: string = "";
if (typeof (el) === "string") {
rtext = el;
} else {
Translation.forcedLanguage = lang; // This is a very dirty hack - it'll bite me one day
rtext = el.InnerRender();
}
for (let i = 0; i < parts.length - 1; i++) {
combined.push(parts[i]);
combined.push(rtext)
}
combined.push(parts[parts.length - 1]);
template = new Combine(combined).InnerRender();
}
newTranslations[lang] = template;
}
Translation.forcedLanguage = undefined;
return new Translation(newTranslations);
}
get txt(): string {
if (this.translations["*"]) {
return this.translations["*"];
}
const txt = this.translations[Translation.forcedLanguage ?? Locale.language.data];
if (txt !== undefined) {
return txt;
}
const en = this.translations["en"];
if (en !== undefined) {
return en;
}
for (const i in this.translations) {
return this.translations[i]; // Return a random language
}
console.error("Missing language ", Locale.language.data, "for", this.translations)
return undefined;
}
InnerRender(): string {
return this.txt
}
public readonly translations: object
constructor(translations: object) {
super(Locale.language)
let count = 0;
for (const translationsKey in translations) {
count++;
}
this.translations = translations
}
public replace(a: string, b: string) {
if (a.startsWith("{") && a.endsWith("}")) {
a = a.substr(1, a.length - 2);
}
const result = this.Subs({[a]: b});
return result;
}
public Clone() {
return new Translation(this.translations)
}
FirstSentence() {
const tr = {};
for (const lng in this.translations) {
let txt = this.translations[lng];
txt = txt.replace(/\..*/, "");
txt = Utils.EllipsesAfter(txt, 255);
tr[lng] = txt;
}
return new Translation(tr);
}
}

View file

@ -1,110 +1,7 @@
import {UIElement} from "../UIElement"; import {UIElement} from "../UIElement";
import {FixedUiElement} from "../Base/FixedUiElement"; import {FixedUiElement} from "../Base/FixedUiElement";
import Combine from "../Base/Combine"; import AllTranslationAssets from "../../AllTranslationAssets";
import Locale from "./Locale"; import {Translation} from "./Translation";
import {Utils} from "../../Utils";
import * as TranslationsJson from "../../assets/translations.json"
export class Translation extends UIElement {
private static forcedLanguage = undefined;
public Subs(text: any): Translation {
const newTranslations = {};
for (const lang in this.translations) {
let template: string = this.translations[lang];
for (const k in text) {
const combined = [];
const parts = template.split("{" + k + "}");
const el: string | UIElement = text[k];
if (el === undefined) {
continue;
}
let rtext: string = "";
if (typeof (el) === "string") {
rtext = el;
} else {
Translation.forcedLanguage = lang; // This is a very dirty hack - it'll bite me one day
rtext = el.InnerRender();
}
for (let i = 0; i < parts.length - 1; i++) {
combined.push(parts[i]);
combined.push(rtext)
}
combined.push(parts[parts.length - 1]);
template = new Combine(combined).InnerRender();
}
newTranslations[lang] = template;
}
Translation.forcedLanguage = undefined;
return new Translation(newTranslations);
}
get txt(): string {
if (this.translations["*"]) {
return this.translations["*"];
}
const txt = this.translations[Translation.forcedLanguage ?? Locale.language.data];
if (txt !== undefined) {
return txt;
}
const en = this.translations["en"];
if (en !== undefined) {
return en;
}
for (const i in this.translations) {
return this.translations[i]; // Return a random language
}
console.error("Missing language ",Locale.language.data,"for",this.translations)
return undefined;
}
InnerRender(): string {
return this.txt
}
public readonly translations: object
constructor(translations: object) {
super(Locale.language)
let count = 0;
for (const translationsKey in translations) {
count++;
}
this.translations = translations
}
public replace(a: string, b: string) {
if(a.startsWith("{") && a.endsWith("}")){
a = a.substr(1, a.length - 2);
}
const result= this.Subs({[a]: b});
return result;
}
public Clone() {
return new Translation(this.translations)
}
FirstSentence() {
const tr = {};
for (const lng in this.translations) {
let txt = this.translations[lng];
txt = txt.replace(/\..*/, "");
txt = Utils.EllipsesAfter(txt, 255);
tr[lng] = txt;
}
return new Translation(tr);
}
}
export default class Translations { export default class Translations {
@ -112,7 +9,7 @@ export default class Translations {
throw "Translations is static. If you want to intitialize a new translation, use the singular form" throw "Translations is static. If you want to intitialize a new translation, use the singular form"
} }
static t = TranslationsJson; static t = AllTranslationAssets.t;
private static isTranslation(tr: any): boolean { private static isTranslation(tr: any): boolean {
for (const key in tr) { for (const key in tr) {
@ -123,27 +20,6 @@ export default class Translations {
return true; return true;
} }
private static InitT(): boolean {
const queue = [Translations.t]
while (queue.length > 0) {
const tr = queue.pop();
const copy = {}
for (const subKey in tr) {
if (Translations.isTranslation(tr[subKey])) {
copy[subKey] = new Translation(tr[subKey]);
} else if(tr[subKey].translations === undefined /**should not be a translation already*/){
queue.push(tr[subKey]);
}
}
for (const subKey in copy) {
tr[subKey] = copy[subKey]
}
}
return true;
}
private static isInited = Translations.InitT();
public static W(s: string | UIElement): UIElement { public static W(s: string | UIElement): UIElement {
if (typeof (s) === "string") { if (typeof (s) === "string") {

View file

@ -1,3 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg height="16px" id="Layer_1" style="enable-background:new 0 0 16 16;" version="1.1" viewBox="0 0 16 16" width="16px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M15.45,7L14,5.551V2c0-0.55-0.45-1-1-1h-1c-0.55,0-1,0.45-1,1v0.553L9,0.555C8.727,0.297,8.477,0,8,0S7.273,0.297,7,0.555 L0.55,7C0.238,7.325,0,7.562,0,8c0,0.563,0.432,1,1,1h1v6c0,0.55,0.45,1,1,1h3v-5c0-0.55,0.45-1,1-1h2c0.55,0,1,0.45,1,1v5h3 c0.55,0,1-0.45,1-1V9h1c0.568,0,1-0.437,1-1C16,7.562,15.762,7.325,15.45,7z"/></svg>

Before

Width:  |  Height:  |  Size: 689 B

View file

@ -1,208 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" viewBox="0 0 1000 1000" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>JOSM Logotype 2019</title>
<defs>
<linearGradient id="linearGradient9147">
<stop stop-color="#ffd555" offset="0"/>
<stop stop-color="#ffcb27" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient3892" x1="716.07" x2="787.83" y1="454.99" y2="219.39" gradientTransform="matrix(.98704 .23824 -.9468 1.3017 230.53 -134.51)" gradientUnits="userSpaceOnUse">
<stop offset="0"/>
<stop stop-color="#3c3c3c" stop-opacity="0" offset="1"/>
</linearGradient>
<filter id="filter4005">
<feGaussianBlur stdDeviation="10"/>
</filter>
<linearGradient id="linearGradient4017" x1="455" x2="532.2" y1="690" y2="656.35" gradientTransform="matrix(1.0062 .23807 -.23807 1.0062 94.828 -143.1)" gradientUnits="userSpaceOnUse">
<stop stop-opacity=".36869" offset="0"/>
<stop stop-color="#3c3c3c" stop-opacity="0" offset="1"/>
</linearGradient>
<filter id="filter3987" x="-.033087" y="-.30881" width="1.0662" height="1.6176">
<feGaussianBlur stdDeviation="11.58046"/>
</filter>
<filter id="filter4629-1" color-interpolation-filters="sRGB">
<feGaussianBlur stdDeviation="0.5"/>
</filter>
<clipPath id="clipPath3411">
<path d="m1320 320c15 5 25 20 25 20 10 15 10 40 10 40 5 10 5 30 0 40 0 0 0 25-10 40 0 0-10 15-25 20h540l40-20 20-40v-40l-20-40-40-20z" fill="none" stroke="#000" stroke-width="1px"/>
</clipPath>
<clipPath id="clipPath3446">
<path d="m1320 320-200 80 200 80 60-20v-120z" fill="#dfc4b3"/>
</clipPath>
<clipPath>
<path d="m1478.6-6.6948v326.69h264.09v-326.69z" fill="#fff"/>
</clipPath>
<clipPath id="clipPath5203">
<rect x="80" y="140" width="800" height="800" fill="none" stroke="#515151" stroke-dasharray="8, 8" stroke-width="4" style="paint-order:normal"/>
</clipPath>
<clipPath>
<rect x="80" y="140" width="800" height="800" fill="none" stroke="#515151" stroke-dasharray="8, 8" stroke-width="4" style="paint-order:normal"/>
</clipPath>
<clipPath id="clipPath9081">
<rect transform="matrix(.98233 .18717 0 1 0 0)" x="255.85" y="-55.827" width="427.56" height="1040" fill="#fff" fill-opacity=".17172" style="paint-order:normal"/>
</clipPath>
<clipPath id="clipPath9114">
<path d="m31.923 874.34 200.04 100.23 419.97-80.09 199.44 99.734v-840.06l-199.44-99.73-419.97 80.091-200.04-100.23z" fill="#ff4dcf" fill-opacity=".17172"/>
</clipPath>
<clipPath id="clipPath9126">
<path d="m24.202 100.97 225.77 18.969 9.9354 7.2365 4.9204 812.94-14.817 19.843-225.81 112.71z" fill="none" stroke="#515151" stroke-dasharray="7.37136328, 7.37136328" stroke-width="3.6857" style="paint-order:normal"/>
</clipPath>
<clipPath id="clipPath9132">
<path d="m670.56 120.09 220.5-38.478-6.6071 882.19-213.89-3.6131-16.826-7.4582-3.1965-803.02z" fill="none" stroke="#515151" stroke-dasharray="8.19754535, 8.19754535" stroke-width="4.0988" style="paint-order:normal"/>
</clipPath>
<linearGradient id="linearGradient9261" x1="146.47" x2="826.26" y1="211.9" y2="900.62" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient9147"/>
<linearGradient id="linearGradient9439" x1="1240" x2="1240" y1="480" y2="320" gradientUnits="userSpaceOnUse">
<stop stop-color="#ad7a4a" offset="0"/>
<stop stop-color="#edb096" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient1085" x1="215.46" x2="280.41" y1="753.18" y2="715.68" gradientTransform="translate(1555.5 -347.95)" gradientUnits="userSpaceOnUse">
<stop stop-color="#e6b636" offset="0"/>
<stop stop-color="#f1cf09" offset=".5"/>
<stop stop-color="#f0d609" offset=".5625"/>
<stop stop-color="#f0b10a" offset=".625"/>
<stop stop-color="#f0ce0b" offset=".6875"/>
<stop stop-color="#f0aa0c" offset=".75"/>
<stop stop-color="#ffd900" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient1686" x1="1655.9" x2="1561.9" y1="655.03" y2="367.53" gradientTransform="translate(-73.236 -11.978)" gradientUnits="userSpaceOnUse">
<stop stop-color="#1e427c" offset="0"/>
<stop stop-color="#5373a7" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient1141" x1="893.78" x2="1255.8" y1="-484.92" y2="1410.1" gradientUnits="userSpaceOnUse">
<stop stop-color="#1e427c" offset="0"/>
<stop stop-color="#4471aa" offset="1"/>
</linearGradient>
<radialGradient id="radialGradient1164" cx="494" cy="556.57" r="1922" gradientTransform="matrix(1.0725 -.64308 .38446 .64115 -249.77 517.41)" gradientUnits="userSpaceOnUse">
<stop stop-color="#e3e5fc" stop-opacity=".28283" offset="0"/>
<stop stop-color="#7ca4e5" stop-opacity="0" offset="1"/>
</radialGradient>
<clipPath id="clipPath1210">
<path d="m80 140v800h800v-800z" fill="url(#linearGradient1214)"/>
</clipPath>
<linearGradient id="linearGradient1214" x1="146.47" x2="826.26" y1="211.9" y2="900.62" gradientTransform="translate(-289.08 -8.1047)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient9147"/>
</defs>
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title>JOSM Logotype 2019</dc:title>
<dc:date>2019-08-05</dc:date>
<dc:creator>
<cc:Agent>
<dc:title>Diamond00744</dc:title>
</cc:Agent>
</dc:creator>
<dc:rights>
<cc:Agent>
<dc:title>Public Domain</dc:title>
</cc:Agent>
</dc:rights>
</cc:Work>
</rdf:RDF>
</metadata>
<g display="none">
<rect x="-2053.4" y="-1194.9" width="5871.8" height="3264" fill="url(#linearGradient1141)" style="paint-order:stroke fill markers"/>
</g>
<g display="none">
<rect x="-2552" y="-1640" width="6912" height="4221.1" fill="url(#radialGradient1164)" style="paint-order:stroke fill markers"/>
</g>
<g display="none" fill="none" stroke="#eaf4ff" stroke-dasharray="28, 28" stroke-opacity=".14646" stroke-width="7">
<path d="m-8.4853-1197.7c47.111 86.643 70.205 115.9 137.36 181.59 185.99 181.92 170.87 310.74 351.96 418.04 84.996 50.361 132.32 249.25 48.083 370.52-105.99 152.61-85.579 254.78-95.196 334.78"/>
<path d="m154.51-1201.7c33.581 25.249 46.873 65.448 76.368 89.338 124.18 100.58 92.794 127.5 180.24 253.47 16.291 23.469 134.24 144.69 157.4 161.82 120.45 89.119 143.9 309.39 59.397 438.41-151.39 231.13-107.72 267.5-117.97 357.75"/>
<path d="m613.77 882.62c-4.8013 5.6138-28.135 21.151-22.489 50.855 3.428 18.035-33.063 25.07-37.845 28.258-27.543 18.362-15.746-29.349-33.711-59.314"/>
<path d="m110 892c-47.659 68.525-79.01 140.02-116 214-37.539 75.079 81.241 233.52 74 248-24.76 49.52-22.686 106.74-36 160-14.026 56.104-46.616 112.54-68 166-28.498 71.245-113.33 166.65-148 236-16.131 32.263-65.92 50.861-86 86-24.257 42.45-45.633 96.042-76 134"/>
<path d="m178 2076c70.928-81.82 80-202.19 80-306 0-194.09-48.906-380.65-46-574 1.153-76.721 120.87-190.07 138-146 7.6446 19.665 65.662 16.765 62 46-4.3284 34.551 141.47-30.407 102 8-15.17 14.763 18.872 54.561 52 60 71.852 11.797 103.51-20.048 116-42 11.231-19.731 61.669 5.8195 72 6 127.7 2.2312 90.204-96.578 134-100 63.884-4.991 69.116 12.994 116.46 18.567 32.325 3.8047 66.516 87.759 71.47 116.16 10.159-65.215-6.9881-103.17-9.0036-108.92-6.7324-19.226-52.482-65.605-82.929-73.799-106.33-28.615-110.3-54.497-146-114"/>
<path d="m1075.9 1162.7c21 79-69.932 106.28-69.932 183.28"/>
</g>
<g display="none" shape-rendering="auto">
<path d="m364.01 1281.2c-21.552 0-33.852 4.0186-41.337 9.7764-3.7425 2.8789-6.0956 6.2209-7.3367 9.0856-1.2416 2.8646-1.4125 6.1813-1.4125 6.1813v109.56s0.17215 3.3167 1.4125 6.1813c1.2411 2.8646 3.5942 6.2067 7.3367 9.0856 7.4851 5.7577 19.786 9.7764 41.337 9.7764 21.552 0 33.852-4.0187 41.337-9.7764 3.7425-2.8789 6.0956-6.221 7.3368-9.0856 1.2415-2.8646 1.4124-6.1813 1.4124-6.1813v-109.56s-0.17215-3.3167-1.4124-6.1813c-1.2412-2.8647-3.5943-6.2067-7.3368-9.0856-7.4851-5.7578-19.786-9.7764-41.337-9.7764zm122.09 0c-21.552 0-33.852 4.0186-41.337 9.7764-3.7424 2.8789-6.0956 6.2209-7.3368 9.0856-1.2415 2.8646-1.4124 6.1813-1.4124 6.1813v31.304c0 6.026 3.4641 10.09 6.6888 12.925 3.2249 2.835 6.9417 5.022 11.134 7.1718 8.3841 4.2997 18.721 8.2357 28.895 12.149 10.174 3.913 20.185 7.803 27.061 11.33 3.4382 1.7631 6.08 3.4892 7.3061 4.5672 0.3068 0.2707 0.21921 0.2013 0.3068 0.3056v28.675c-0.0593 0.1453-0.20029 0.5821-1.4246 1.5224-2.6906 2.0687-10.737 5.8759-29.88 5.8759-19.144 0-27.191-3.8075-29.879-5.8756-1.286-0.9893-1.4544-1.4937-1.4979-1.6019-1.4857-11.68-18.749-10.558-18.709 1.2167 0 0 0.17214 3.3167 1.4124 6.1813 1.2412 2.8646 3.5945 6.2067 7.3368 9.0856 7.4851 5.7577 19.786 9.7764 41.337 9.7764 21.552 0 33.852-4.0187 41.337-9.7764 3.7425-2.8789 6.0956-6.221 7.3368-9.0856 1.2415-2.8646 1.4125-6.1813 1.4125-6.1813v-31.304c0-6.0261-3.4642-10.09-6.6889-12.925-3.2249-2.835-6.9417-5.022-11.134-7.1718-8.3842-4.2997-18.721-8.2357-28.895-12.149-10.174-3.913-20.185-7.803-27.061-11.33-3.4381-1.7631-6.08-3.4892-7.306-4.5672-0.30996-0.2708-0.21909-0.2012-0.30681-0.3055v-28.675c0.0593-0.1452 0.20029-0.5819 1.4247-1.5224 2.6906-2.0685 10.737-5.8758 29.88-5.8758 19.144 0 27.191 3.8074 29.88 5.8757 1.2859 0.9892 1.4544 1.4936 1.4978 1.6019 1.4857 11.68 18.749 10.558 18.709-1.2167 0 0-0.17227-3.3167-1.4125-6.1813-1.2412-2.8647-3.5943-6.2067-7.3368-9.0856-7.4851-5.7578-19.786-9.7764-41.337-9.7764zm-203.62 2.9959c-5.1842 0.078-9.3248 4.3414-9.2506 9.5257v124.64c-1.5583 1.5205-4.0301 3.7113-6.2608 3.7113h-31.304c-3.1304 0-7.8383-5.2092-7.8383-5.2092-6.8897-10.692-22.847-0.054-15.628 10.418 0 0 7.8138 13.573 23.466 13.573h31.304c15.652 0 23.466-13.573 23.466-13.573 1.0283-1.5426 1.5774-3.3552 1.5774-5.2092v-128.35c0.0757-5.2944-4.2375-9.605-9.532-9.5257zm378.64 0.1406c-3.2524 0.097-6.223 1.8718-7.8508 4.6895l-38.824 67.298-38.824-67.298c-4.8068-8.3135-17.517-4.9075-17.523 4.6956v134.61c-0.17846 12.7 18.962 12.7 18.782 0v-99.537l29.433 51.016c3.6159 6.2569 12.648 6.2569 16.264 0l29.433-51.016v99.537c-0.17846 12.7 18.962 12.7 18.783 0v-134.61c0-5.2958-4.3788-9.5431-9.6724-9.3851zm-297.11 15.646c19.144 0 27.191 3.8074 29.88 5.8757 1.2227 0.9405 1.3638 1.377 1.4246 1.5224v107.29c-0.0593 0.1452-0.20041 0.5819-1.4246 1.5224-2.6888 2.0681-10.736 5.8756-29.88 5.8756-19.144 0-27.191-3.8075-29.879-5.8756-1.2228-0.9405-1.3639-1.377-1.4247-1.5224v-107.29c0.0593-0.1453 0.20041-0.5819 1.4247-1.5224 2.6887-2.0683 10.736-5.8757 29.879-5.8757z" color="#000000" color-rendering="auto" display="inline" dominant-baseline="auto" fill="#182f51" fill-opacity=".4596" image-rendering="auto" solid-color="#000000" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal"/>
<path d="m361.31 1277.6c-21.552 0-33.852 4.0187-41.337 9.7764-3.7425 2.8789-6.0956 6.221-7.3368 9.0856-1.2415 2.8646-1.4124 6.1813-1.4124 6.1813v109.56s0.17214 3.3167 1.4124 6.1813c1.2412 2.8647 3.5943 6.2067 7.3368 9.0856 7.4851 5.7578 19.786 9.7764 41.337 9.7764 21.552 0 33.852-4.0186 41.337-9.7764 3.7425-2.8789 6.0956-6.2209 7.3368-9.0856 1.2415-2.8646 1.4124-6.1813 1.4124-6.1813v-109.56s-0.17214-3.3167-1.4124-6.1813c-1.2412-2.8646-3.5943-6.2067-7.3368-9.0856-7.4851-5.7577-19.786-9.7764-41.337-9.7764zm122.09 0c-21.552 0-33.852 4.0187-41.337 9.7764-3.7424 2.8789-6.0956 6.221-7.3368 9.0856-1.2415 2.8646-1.4124 6.1813-1.4124 6.1813v31.304c0 6.0261 3.4641 10.09 6.6888 12.925 3.2249 2.835 6.9417 5.022 11.134 7.1718 8.3842 4.2997 18.721 8.2357 28.895 12.149 10.174 3.913 20.185 7.8032 27.061 11.33 3.4381 1.7631 6.08 3.4892 7.306 4.5672 0.30681 0.2708 0.21922 0.2013 0.30681 0.3056v28.675c-0.0593 0.1451-0.20029 0.5819-1.4246 1.5223-2.6906 2.0686-10.737 5.8759-29.88 5.8759-19.144 0-27.191-3.8074-29.88-5.8757-1.2859-0.9893-1.4543-1.4936-1.4978-1.6019-1.4857-11.68-18.749-10.558-18.709 1.2167 0 0 0.17215 3.3167 1.4124 6.1813 1.2412 2.8647 3.5945 6.2067 7.3368 9.0856 7.4851 5.7578 19.786 9.7764 41.337 9.7764 21.552 0 33.852-4.0186 41.337-9.7764 3.7425-2.8789 6.0956-6.2209 7.3368-9.0856 1.2415-2.8646 1.4125-6.1813 1.4125-6.1813v-31.304c0-6.026-3.4642-10.09-6.6889-12.925-3.2249-2.835-6.9417-5.022-11.134-7.1718-8.3842-4.2997-18.721-8.2357-28.895-12.149-10.174-3.913-20.185-7.803-27.061-11.33-3.4382-1.7631-6.08-3.4892-7.306-4.5671-0.30997-0.2708-0.2191-0.2013-0.30681-0.3055v-28.675c0.0593-0.1453 0.20029-0.582 1.4247-1.5225 2.6904-2.0685 10.737-5.8757 29.88-5.8757 19.144 0 27.191 3.8073 29.879 5.8756 1.286 0.9892 1.4544 1.4937 1.4979 1.6019 1.4857 11.68 18.749 10.558 18.709-1.2167 0 0-0.17227-3.3167-1.4125-6.1813-1.2412-2.8646-3.5943-6.2067-7.3368-9.0856-7.4851-5.7577-19.786-9.7764-41.337-9.7764zm-203.62 2.9959c-5.1843 0.078-9.3248 4.3415-9.2506 9.5258v124.64c-1.5583 1.5206-4.0301 3.7114-6.2608 3.7114h-31.304c-3.1304 0-7.8383-5.2093-7.8383-5.2093-6.8897-10.692-22.847-0.054-15.628 10.418 0 0 7.8138 13.573 23.466 13.573h31.304c15.652 0 23.466-13.573 23.466-13.573 1.0284-1.5426 1.5774-3.3552 1.5774-5.2091v-128.35c0.0745-5.2945-4.2374-9.6051-9.5318-9.5258zm378.64 0.1406c-3.2524 0.097-6.223 1.8719-7.8508 4.6895l-38.824 67.298-38.824-67.298c-4.8068-8.3135-17.518-4.9075-17.523 4.6957v134.61c-0.17845 12.7 18.962 12.7 18.782 0v-99.538l29.433 51.016c3.6159 6.2569 12.648 6.2569 16.264 0l29.433-51.016v99.538c-0.17845 12.7 18.962 12.7 18.783 0v-134.61c0-5.2959-4.3788-9.5431-9.6724-9.3852zm-297.11 15.646c19.144 0 27.191 3.8073 29.88 5.8756 1.2227 0.9405 1.3638 1.377 1.4246 1.5224v107.29c-0.0593 0.1453-0.20042 0.5819-1.4246 1.5224-2.6888 2.0683-10.736 5.8757-29.88 5.8757-19.144 0-27.191-3.8074-29.879-5.8757-1.2228-0.9405-1.3639-1.377-1.4247-1.5224v-107.29c0.0593-0.1452 0.20041-0.5819 1.4247-1.5224 2.6887-2.0683 10.736-5.8756 29.879-5.8756z" color="#000000" color-rendering="auto" display="inline" dominant-baseline="auto" fill="#d6e3fa" fill-opacity=".93939" image-rendering="auto" solid-color="#000000" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal"/>
</g>
<g display="none" shape-rendering="auto">
<path d="m1321.2 365.6c-36.24 0-56.924 6.7575-69.51 16.439-6.2931 4.841-10.25 10.461-12.337 15.278-2.0877 4.8169-2.3751 10.394-2.3751 10.394v184.24s0.2896 5.5773 2.3751 10.394c2.0872 4.8169 6.044 10.437 12.337 15.278 12.586 9.682 33.27 16.439 69.51 16.439 36.24 0 56.924-6.7575 69.51-16.439 6.2931-4.841 10.25-10.461 12.337-15.278 2.0876-4.8169 2.3751-10.394 2.3751-10.394v-184.24s-0.2896-5.5773-2.3751-10.394c-2.0872-4.8169-6.044-10.437-12.337-15.278-12.586-9.682-33.27-16.439-69.51-16.439zm205.29 0c-36.24 0-56.924 6.7575-69.51 16.439-6.293 4.841-10.25 10.461-12.337 15.278-2.0877 4.8169-2.3751 10.394-2.3751 10.394v52.639c0 10.133 5.8251 16.967 11.247 21.734 5.423 4.7672 11.673 8.4446 18.722 12.06 14.098 7.2301 31.48 13.849 48.588 20.429 17.108 6.5799 33.941 13.121 45.504 19.051 5.7813 2.9648 10.224 5.8673 12.285 7.68 0.5159 0.45533 0.3685 0.33847 0.5159 0.51376v48.218c-0.1001 0.24424-0.337 0.97861-2.3957 2.56-4.5243 3.4783-18.054 9.8804-50.245 9.8804s-45.722-6.4023-50.244-9.8801c-2.1624-1.6635-2.4456-2.5116-2.5188-2.6936-2.4982-19.641-31.527-17.753-31.46 2.0459 0 0 0.2896 5.5773 2.3751 10.394 2.0872 4.8169 6.0441 10.437 12.337 15.278 12.586 9.682 33.271 16.439 69.51 16.439 36.24 0 56.924-6.7575 69.51-16.439 6.2931-4.841 10.25-10.461 12.337-15.278 2.0876-4.8169 2.3751-10.394 2.3751-10.394v-52.639c0-10.133-5.8251-16.967-11.248-21.734-5.4228-4.7672-11.673-8.4446-18.722-12.06-14.098-7.2301-31.48-13.849-48.588-20.429-17.108-6.5799-33.941-13.121-45.504-19.051-5.7814-2.9648-10.224-5.8673-12.286-7.68-0.5211-0.45533-0.3684-0.33847-0.5158-0.51376v-48.218c0.1-0.24425 0.3368-0.97862 2.3956-2.56 4.5243-3.4783 18.054-9.8804 50.245-9.8804s45.722 6.4023 50.244 9.8801c2.1624 1.6634 2.4456 2.5116 2.5187 2.6936 2.4983 19.641 31.527 17.753 31.46-2.0459 0 0-0.2895-5.5773-2.3751-10.394-2.0872-4.8169-6.044-10.437-12.337-15.278-12.586-9.682-33.27-16.439-69.51-16.439zm-342.39 5.0377c-8.7175 0.13055-15.68 7.3003-15.555 16.018v209.58c-2.6203 2.5568-6.7768 6.2406-10.528 6.2406h-52.639c-5.2639 0-13.18-8.7595-13.18-8.7595-11.585-17.979-38.419-0.0905-26.278 17.519 0 0 13.139 22.824 39.459 22.824h52.639c26.319 0 39.459-22.824 39.459-22.824 1.7292-2.594 2.6526-5.6419 2.6526-8.7595v-215.82c0.1262-8.9028-7.1253-16.151-16.028-16.018zm636.7 0.23636c-5.4692 0.16422-10.464 3.1477-13.201 7.8857l-65.285 113.16-65.285-113.16c-8.0827-13.98-29.456-8.2522-29.466 7.8959v226.35c-0.3001 21.356 31.886 21.356 31.583 0v-167.38l49.493 85.785c6.0804 10.521 21.268 10.521 27.348 0l49.493-85.785v167.38c-0.3 21.356 31.886 21.356 31.584 0v-226.35c0-8.9051-7.3631-16.047-16.264-15.781zm-499.6 26.309c32.191 0 45.722 6.4023 50.244 9.8801 2.0561 1.5814 2.2934 2.3155 2.3956 2.56v180.41c-0.1 0.24424-0.3369 0.97861-2.3956 2.56-4.5212 3.4778-18.053 9.8801-50.244 9.8801-32.191 0-45.722-6.4023-50.244-9.8801-2.0561-1.5814-2.2934-2.3155-2.3957-2.56v-180.41c0.1001-0.24425 0.337-0.97862 2.3957-2.56 4.5212-3.4778 18.053-9.8801 50.244-9.8801z" color="#000000" color-rendering="auto" display="inline" dominant-baseline="auto" fill="#182f51" fill-opacity=".5303" image-rendering="auto" solid-color="#000000" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal"/>
<path d="m1316.7 359.51c-36.24 0-56.924 6.7575-69.51 16.439-6.2931 4.841-10.25 10.461-12.337 15.278-2.0876 4.8169-2.3751 10.394-2.3751 10.394v184.24s0.2896 5.5773 2.3751 10.394c2.0872 4.8169 6.044 10.437 12.337 15.278 12.586 9.682 33.27 16.439 69.51 16.439 36.24 0 56.924-6.7575 69.51-16.439 6.2931-4.841 10.25-10.461 12.337-15.278 2.0877-4.8169 2.3751-10.394 2.3751-10.394v-184.24s-0.2896-5.5773-2.3751-10.394c-2.0872-4.8169-6.044-10.437-12.337-15.278-12.586-9.682-33.27-16.439-69.51-16.439zm205.29 0c-36.24 0-56.924 6.7575-69.51 16.439-6.293 4.841-10.25 10.461-12.337 15.278-2.0876 4.8169-2.3751 10.394-2.3751 10.394v52.639c0 10.133 5.8251 16.967 11.248 21.734 5.4229 4.7672 11.673 8.4446 18.722 12.06 14.098 7.2301 31.48 13.849 48.588 20.429 17.108 6.5799 33.941 13.121 45.504 19.051 5.7813 2.9648 10.224 5.8673 12.285 7.68 0.5159 0.45533 0.3685 0.33847 0.5159 0.51377v48.218c-0.1 0.24425-0.3369 0.97862-2.3956 2.56-4.5243 3.4783-18.054 9.8804-50.245 9.8804-32.191 0-45.722-6.4023-50.244-9.8801-2.1624-1.6634-2.4455-2.5116-2.5187-2.6936-2.4982-19.641-31.527-17.753-31.46 2.0459 0 0 0.2896 5.5773 2.3751 10.394 2.0872 4.8169 6.0441 10.437 12.337 15.278 12.586 9.682 33.271 16.439 69.51 16.439 36.24 0 56.924-6.7575 69.511-16.439 6.293-4.841 10.25-10.461 12.337-15.278 2.0877-4.8169 2.3752-10.394 2.3752-10.394v-52.639c0-10.133-5.8252-16.967-11.248-21.734-5.4229-4.7672-11.673-8.4446-18.722-12.06-14.098-7.2301-31.48-13.849-48.588-20.429-17.108-6.5799-33.941-13.121-45.504-19.051-5.7814-2.9648-10.224-5.8673-12.286-7.68-0.5211-0.45533-0.3684-0.33847-0.5158-0.51376v-48.218c0.1001-0.24424 0.3369-0.97861 2.3957-2.56 4.5243-3.4783 18.054-9.8804 50.245-9.8804 32.191 0 45.722 6.4023 50.244 9.8801 2.1624 1.6635 2.4456 2.5116 2.5188 2.6936 2.4982 19.641 31.527 17.753 31.46-2.0459 0 0-0.2896-5.5773-2.3752-10.394-2.0872-4.8169-6.044-10.437-12.337-15.278-12.587-9.682-33.271-16.439-69.511-16.439zm-342.39 5.0377c-8.7176 0.13054-15.68 7.3003-15.555 16.018v209.58c-2.6203 2.5568-6.7768 6.2406-10.528 6.2406h-52.639c-5.264 0-13.18-8.7595-13.18-8.7595-11.585-17.979-38.419-0.0905-26.279 17.519 0 0 13.139 22.824 39.459 22.824h52.639c26.32 0 39.459-22.824 39.459-22.824 1.7292-2.594 2.6525-5.6418 2.6525-8.7595v-215.82c0.1263-8.9028-7.1253-16.151-16.028-16.018zm636.7 0.23635c-5.4692 0.16423-10.464 3.1477-13.201 7.8857l-65.285 113.16-65.285-113.16c-8.0827-13.98-29.456-8.2522-29.466 7.8959v226.35c-0.3001 21.356 31.886 21.356 31.584 0v-167.38l49.493 85.785c6.0803 10.521 21.268 10.521 27.348 0l49.493-85.785v167.38c-0.3 21.356 31.886 21.356 31.584 0v-226.35c0-8.9051-7.3632-16.047-16.264-15.781zm-499.6 26.309c32.191 0 45.722 6.4023 50.244 9.8801 2.0561 1.5814 2.2934 2.3155 2.3957 2.56v180.41c-0.1001 0.24425-0.337 0.97862-2.3957 2.56-4.5212 3.4778-18.053 9.8801-50.244 9.8801s-45.722-6.4023-50.244-9.8801c-2.0561-1.5814-2.2934-2.3155-2.3956-2.56v-180.41c0.1-0.24424 0.3369-0.97861 2.3956-2.56 4.5212-3.4778 18.053-9.8801 50.244-9.8801z" color="#000000" color-rendering="auto" display="inline" dominant-baseline="auto" fill="#bdd2f3" image-rendering="auto" solid-color="#000000" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal"/>
</g>
<g display="none" shape-rendering="auto">
<path d="m1364.5 335.87c-44.454 0-69.825 8.289-85.264 20.165-7.7194 5.9381-12.573 12.832-15.133 18.74-2.5608 5.9086-2.9134 12.75-2.9134 12.75v225.99s0.3552 6.8413 2.9134 12.75c2.5602 5.9086 7.4138 12.802 15.133 18.74 15.439 11.876 40.811 20.165 85.264 20.165 44.453 0 69.825-8.289 85.264-20.165 7.7194-5.9381 12.573-12.832 15.133-18.74 2.5608-5.9086 2.9134-12.75 2.9134-12.75v-225.99s-0.3552-6.8413-2.9134-12.75c-2.5602-5.9086-7.4138-12.802-15.133-18.74-15.439-11.876-40.811-20.165-85.264-20.165zm251.82 0c-44.453 0-69.825 8.289-85.264 20.165-7.7193 5.9381-12.573 12.832-15.133 18.74-2.5608 5.9086-2.9134 12.75-2.9134 12.75v64.569c0 12.43 7.1453 20.812 13.797 26.66 6.652 5.8476 14.318 10.359 22.965 14.793 17.294 8.8687 38.615 16.987 59.6 25.058 20.985 8.0712 41.634 16.095 55.818 23.369 7.0916 3.6368 12.541 7.197 15.07 9.4206 0.6328 0.55853 0.452 0.41518 0.6328 0.63021v59.147c-0.1227 0.2996-0.4133 1.2004-2.9386 3.1402-5.5497 4.2667-22.146 12.12-61.633 12.12-39.487 0-56.085-7.8533-61.631-12.119-2.6525-2.0405-2.9998-3.0808-3.0896-3.3041-3.0644-24.093-38.672-21.777-38.591 2.5096 0 0 0.3552 6.8413 2.9134 12.75 2.5602 5.9086 7.4139 12.802 15.133 18.74 15.439 11.876 40.811 20.165 85.264 20.165 44.454 0 69.825-8.289 85.265-20.165 7.7193-5.9381 12.573-12.832 15.133-18.74 2.5608-5.9086 2.9135-12.75 2.9135-12.75v-64.569c0-12.43-7.1454-20.812-13.797-26.66-6.6519-5.8476-14.318-10.359-22.965-14.793-17.294-8.8687-38.615-16.987-59.6-25.058-20.985-8.0712-41.634-16.095-55.818-23.369-7.0917-3.6368-12.541-7.197-15.07-9.4206-0.6392-0.55853-0.4519-0.41518-0.6327-0.6302v-59.147c0.1227-0.2996 0.4132-1.2004 2.9386-3.1402 5.5497-4.2667 22.146-12.12 61.633-12.12 39.487 0 56.085 7.8533 61.631 12.119 2.6525 2.0405 2.9999 3.0808 3.0896 3.3041 3.0645 24.093 38.672 21.777 38.591-2.5096 0 0-0.3552-6.8413-2.9135-12.75-2.5602-5.9086-7.4138-12.802-15.133-18.74-15.439-11.876-40.811-20.165-85.265-20.165zm-419.99 6.1795c-10.693 0.16013-19.234 8.9549-19.081 19.648v257.08c-3.2142 3.1363-8.3127 7.655-12.914 7.655h-64.569c-6.457 0-16.168-10.745-16.168-10.745-14.211-22.054-47.126-0.11106-32.234 21.489 0 0 16.117 27.997 48.402 27.997h64.569c32.285 0 48.402-27.997 48.402-27.997 2.1211-3.1819 3.2537-6.9205 3.2537-10.745v-264.73c0.1549-10.921-8.7402-19.812-19.661-19.648zm781 0.28992c-6.7088 0.20145-12.836 3.8611-16.193 9.6729l-80.081 138.81-80.081-138.81c-9.9146-17.148-36.132-10.122-36.144 9.6854v277.65c-0.3681 26.196 39.112 26.196 38.742 0v-205.31l60.71 105.23c7.4584 12.906 26.088 12.906 33.546 0l60.71-105.23v205.31c-0.368 26.196 39.112 26.196 38.742 0v-277.65c0-10.923-9.032-19.684-19.951-19.358zm-612.83 32.272c39.487 0 56.085 7.8533 61.631 12.119 2.5221 1.9398 2.8132 2.8403 2.9386 3.1402v221.3c-0.1227 0.2996-0.4133 1.2004-2.9386 3.1402-5.5459 4.266-22.144 12.119-61.631 12.119-39.487 0-56.085-7.8533-61.631-12.119-2.5221-1.9398-2.8132-2.8403-2.9386-3.1402v-221.3c0.1227-0.2996 0.4133-1.2004 2.9386-3.1402 5.5459-4.266 22.144-12.119 61.631-12.119z" color="#000000" color-rendering="auto" display="inline" dominant-baseline="auto" fill="#182f51" fill-opacity=".075758" image-rendering="auto" solid-color="#000000" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal"/>
<path d="m1359 328.4c-44.454 0-69.825 8.289-85.264 20.165-7.7194 5.9381-12.573 12.832-15.133 18.74-2.5608 5.9086-2.9134 12.75-2.9134 12.75v225.99s0.3552 6.8413 2.9134 12.75c2.5602 5.9086 7.4138 12.802 15.133 18.74 15.439 11.876 40.811 20.165 85.264 20.165 44.453 0 69.825-8.289 85.264-20.165 7.7194-5.9381 12.573-12.832 15.133-18.74 2.5608-5.9086 2.9134-12.75 2.9134-12.75v-225.99s-0.3552-6.8413-2.9134-12.75c-2.5602-5.9086-7.4138-12.802-15.133-18.74-15.439-11.876-40.811-20.165-85.264-20.165zm251.82 0c-44.453 0-69.825 8.289-85.264 20.165-7.7193 5.9381-12.573 12.832-15.133 18.74-2.5608 5.9086-2.9134 12.75-2.9134 12.75v64.569c0 12.43 7.1453 20.812 13.797 26.66 6.652 5.8476 14.318 10.359 22.965 14.793 17.294 8.8687 38.615 16.987 59.6 25.058 20.985 8.0712 41.634 16.095 55.818 23.369 7.0916 3.6368 12.541 7.197 15.07 9.4206 0.6328 0.55853 0.452 0.41518 0.6328 0.63021v59.147c-0.1227 0.2996-0.4133 1.2004-2.9386 3.1402-5.5497 4.2667-22.146 12.12-61.633 12.12-39.487 0-56.085-7.8533-61.631-12.119-2.6525-2.0405-2.9998-3.0808-3.0896-3.3041-3.0644-24.093-38.672-21.777-38.591 2.5096 0 0 0.3552 6.8413 2.9134 12.75 2.5602 5.9086 7.4139 12.802 15.133 18.74 15.439 11.876 40.811 20.165 85.264 20.165 44.454 0 69.825-8.289 85.265-20.165 7.7193-5.9381 12.573-12.832 15.133-18.74 2.5608-5.9086 2.9135-12.75 2.9135-12.75v-64.569c0-12.43-7.1454-20.812-13.797-26.66-6.6519-5.8476-14.318-10.359-22.965-14.793-17.294-8.8687-38.615-16.987-59.6-25.058-20.985-8.0712-41.634-16.095-55.818-23.369-7.0917-3.6368-12.541-7.197-15.07-9.4206-0.6392-0.55853-0.4519-0.41518-0.6327-0.6302v-59.147c0.1227-0.2996 0.4132-1.2004 2.9386-3.1402 5.5497-4.2667 22.146-12.12 61.633-12.12 39.487 0 56.085 7.8533 61.631 12.119 2.6525 2.0405 2.9999 3.0808 3.0896 3.3041 3.0645 24.093 38.672 21.777 38.591-2.5096 0 0-0.3552-6.8413-2.9135-12.75-2.5602-5.9086-7.4138-12.802-15.133-18.74-15.439-11.876-40.811-20.165-85.265-20.165zm-419.99 6.1795c-10.693 0.16013-19.234 8.9549-19.081 19.648v257.08c-3.2142 3.1363-8.3127 7.655-12.914 7.655h-64.569c-6.457 0-16.168-10.745-16.168-10.745-14.211-22.054-47.126-0.11106-32.234 21.489 0 0 16.117 27.997 48.402 27.997h64.569c32.285 0 48.402-27.997 48.402-27.997 2.1211-3.1819 3.2537-6.9205 3.2537-10.745v-264.73c0.1549-10.921-8.7402-19.812-19.661-19.648zm781 0.28992c-6.7088 0.20145-12.836 3.8611-16.193 9.6729l-80.081 138.81-80.081-138.81c-9.9146-17.148-36.132-10.122-36.144 9.6854v277.65c-0.3681 26.196 39.112 26.196 38.742 0v-205.31l60.71 105.23c7.4584 12.906 26.088 12.906 33.546 0l60.71-105.23v205.31c-0.368 26.196 39.112 26.196 38.742 0v-277.65c0-10.923-9.032-19.684-19.951-19.358zm-612.83 32.272c39.487 0 56.085 7.8533 61.631 12.119 2.5221 1.9398 2.8132 2.8403 2.9386 3.1402v221.3c-0.1227 0.2996-0.4133 1.2004-2.9386 3.1402-5.5459 4.266-22.144 12.119-61.631 12.119-39.487 0-56.085-7.8533-61.631-12.119-2.5221-1.9398-2.8132-2.8403-2.9386-3.1402v-221.3c0.1227-0.2996 0.4133-1.2004 2.9386-3.1402 5.5459-4.266 22.144-12.119 61.631-12.119z" color="#000000" color-rendering="auto" display="inline" dominant-baseline="auto" fill="url(#linearGradient1686)" image-rendering="auto" solid-color="#000000" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal"/>
</g>
<g display="none">
<g fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="6">
<path d="m1085 185v30s0 15-15 15c-3 0-5-3-5-3" display="inline"/>
<path d="m1100 220v-25s0-12 15-12 15 12 15 12v25s1 12-15 12c-15 0-15-12-15-12z" display="inline"/>
<path d="m1175 188s0-5-15-5-15 17-15 17c0 10 30 5 30 15 0 0 0 17-15 17s-15-7-15-7" display="inline"/>
<path d="m1190 230v-45l15 25 15-25v45" display="inline"/>
<path d="m1085 261v41s-2 3-5 3h-10c-3 0-5-3-5-3" display="inline"/>
<path d="m1100 300v-35s0-5 15-5 15 5 15 5v35s1 5-15 5c-15 0-15-5-15-5z" display="inline"/>
<path d="m1190 304v-43l15 26 15-26v43" display="inline"/>
<path d="m1175 265s0-5-15-5-15 5-15 5v10c0 5 30 10 30 15v10s1 5-15 5c-15 0-15-5-15-5" display="inline"/>
<path d="m1085 331v41s-2 3-5 3h-10c-3 0-5-3-5-3" display="inline"/>
<path d="m1098 370v-35s0-5 15-5 15 5 15 5v35s1 5-15 5c-15 0-15-5-15-5z" display="inline"/>
<path d="m1184 374v-43l15 26 15-26v43" display="inline"/>
<path d="m1171 335s0-5-15-5-15 5-15 5v10c0 5 30 10 30 15v10s1 5-15 5c-15 0-15-5-15-5" display="inline"/>
<path d="m1085 395v41s-2 3-5 3h-10c-3 0-5-3-5-3" display="inline"/>
<path d="m1098 434v-35s0-5 13-5 13 5 13 5v35s0 5-13 5-13-5-13-5z" display="inline"/>
<path d="m1176 438v-43l15 26 15-26v43" display="inline"/>
<path d="m1163 399s0-5-13-5-13 5-13 5v10c0 5 26 10 26 15v10s0 5-13 5-13-5-13-5" display="inline"/>
</g>
<path d="m1110 452c-6.8846 0-10.814 1.2837-13.205 3.123-1.1955 0.91965-1.9472 1.9873-2.3437 2.9023-0.3966 0.91508-0.4512 1.9746-0.4512 1.9746v35s0.055 1.0595 0.4512 1.9746c0.3965 0.91508 1.1482 1.9827 2.3437 2.9023 2.3911 1.8393 6.3205 3.123 13.205 3.123s10.814-1.2837 13.205-3.123c1.1955-0.91965 1.9472-1.9873 2.3437-2.9023 0.3966-0.91508 0.4512-1.9746 0.4512-1.9746v-35s-0.055-1.0595-0.4512-1.9746c-0.3965-0.91508-1.1482-1.9827-2.3437-2.9023-2.3911-1.8393-6.3205-3.123-13.205-3.123zm39 0c-6.8846 0-10.814 1.2837-13.205 3.123-1.1955 0.91965-1.9472 1.9873-2.3437 2.9023-0.3966 0.91508-0.4512 1.9746-0.4512 1.9746v10c0 1.925 1.1066 3.2233 2.1367 4.1289 1.0302 0.90563 2.2175 1.6042 3.5567 2.291 2.6783 1.3735 5.9804 2.6309 9.2304 3.8809s6.4479 2.4927 8.6446 3.6191c1.0983 0.56324 1.9422 1.1146 2.3339 1.459 0.098 0.0865 0.07 0.0643 0.098 0.0976v9.1602c-0.019 0.0464-0.064 0.18591-0.4551 0.48633-0.8595 0.66079-3.4298 1.877-9.5452 1.877s-8.686-1.2163-9.5449-1.877c-0.4108-0.31601-0.4646-0.47713-0.4785-0.51172-0.4746-3.7313-5.9892-3.3726-5.9766 0.38867 0 0 0.055 1.0595 0.4512 1.9746 0.3965 0.91508 1.1482 1.9827 2.3437 2.9023 2.3911 1.8393 6.3205 3.123 13.205 3.123s10.814-1.2837 13.205-3.123c1.1955-0.91965 1.9472-1.9873 2.3437-2.9023 0.3966-0.91508 0.4512-1.9746 0.4512-1.9746v-10c0-1.925-1.1066-3.2233-2.1367-4.1289-1.0302-0.90563-2.2175-1.6042-3.5567-2.291-2.6783-1.3735-5.9804-2.6309-9.2304-3.8809s-6.4479-2.4927-8.6446-3.6191c-1.0983-0.56324-1.9422-1.1146-2.3339-1.459-0.099-0.0865-0.07-0.0643-0.098-0.0976v-9.1602c0.019-0.0464 0.064-0.18591 0.4551-0.48633 0.8595-0.66079 3.4298-1.877 9.5452-1.877s8.686 1.2163 9.5449 1.877c0.4108 0.31601 0.4646 0.47713 0.4785 0.51172 0.4746 3.7313 5.9892 3.3726 5.9766-0.38867 0 0-0.055-1.0595-0.4512-1.9746-0.3965-0.91508-1.1482-1.9827-2.3437-2.9023-2.3911-1.8393-6.3205-3.123-13.205-3.123zm-65.045 0.95703c-1.6561 0.0248-2.9788 1.3869-2.9551 3.043v39.814c-0.4978 0.48573-1.2874 1.1856-2 1.1856h-10c-1 0-2.5039-1.6641-2.5039-1.6641-2.2009-3.4156-7.2985-0.0172-4.9922 3.3281 0 0 2.4961 4.3359 7.4961 4.3359h10c5 0 7.4961-4.3359 7.4961-4.3359 0.3285-0.49279 0.5039-1.0718 0.5039-1.6641v-41c0.024-1.6913-1.3536-3.0683-3.0449-3.043zm120.96 0.0449c-1.039 0.0312-1.9879 0.59798-2.5079 1.4981l-12.402 21.498-12.402-21.498c-1.5355-2.6557-5.5959-1.5677-5.5977 1.5v43c-0.057 4.057 6.0574 4.057 6 0v-31.797l9.4023 16.297c1.1551 1.9987 4.0403 1.9987 5.1954 0l9.4023-16.297v31.797c-0.057 4.057 6.0574 4.057 6 0v-43c-5e-4 -1.6917-1.3988-3.0485-3.0898-2.998zm-94.91 4.9981c6.1154 0 8.686 1.2163 9.5449 1.877 0.3906 0.30042 0.4357 0.43989 0.4551 0.48633v34.273c-0.019 0.0464-0.064 0.18591-0.4551 0.48633-0.8589 0.66069-3.4295 1.877-9.5449 1.877s-8.686-1.2163-9.5449-1.877c-0.3906-0.30042-0.4357-0.43989-0.4551-0.48633v-34.273c0.019-0.0464 0.064-0.18591 0.4551-0.48633 0.8589-0.66069 3.4295-1.877 9.5449-1.877z" color="#000000" color-rendering="auto" display="inline" dominant-baseline="auto" image-rendering="auto" shape-rendering="auto" solid-color="#000000" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal"/>
</g>
<g display="none">
<g id="g3773" transform="translate(-40,-320)">
<path d="m1320 320-126.92 50.767-31.082 21.733-42 7.5 41.772 3.2586 31.203 25.931 127.03 50.81 60-20v-120z" display="inline" fill="url(#linearGradient9439)"/>
<g clip-path="url(#clipPath3411)">
<path d="m1280 350v100h660v-100z" clip-path="none" display="inline" fill="#853909"/>
<path d="m1940 380v-40l-85-10h-480l-95 10v40z" clip-path="none" fill="#974613"/>
<path d="m1940 420v40l-85 10h-495l-80-10v-40z" clip-path="none" fill="#642b06"/>
<path d="m1280 320v20h660v-20z" clip-path="none" display="inline" fill="#b25c28"/>
<path d="m1280 460v20h660v-20z" clip-path="none" display="inline" fill="#4d2105"/>
</g>
<path d="m1780.1 386.07c-3.9797 0-6.2505 0.74145-7.6328 1.8047-0.691 0.53161-1.1262 1.1488-1.3554 1.6777-0.2288 0.52896-0.2618 1.1406-0.2618 1.1406v20.232s0.033 0.61361 0.2618 1.1426c0.2292 0.52897 0.6644 1.1461 1.3554 1.6777 1.3823 1.0632 3.6531 1.8047 7.6328 1.8047 3.9798 0 6.2506-0.74146 7.6328-1.8047 0.6911-0.53162 1.1263-1.1488 1.3555-1.6777 0.2288-0.52897 0.2598-1.1426 0.2598-1.1426v-20.232s-0.031-0.61167-0.2598-1.1406c-0.2292-0.52898-0.6643-1.1461-1.3555-1.6777-1.3821-1.0632-3.653-1.8047-7.6328-1.8047zm22.545 0c-3.9798 0-6.2526 0.74145-7.6348 1.8047-0.6911 0.53161-1.1243 1.1488-1.3535 1.6777-0.2297 0.52896-0.2617 1.1406-0.2617 1.1406v5.7812c0 1.1128 0.6388 1.8632 1.2343 2.3867 0.5955 0.52351 1.2826 0.92722 2.0567 1.3242 1.5483 0.79397 3.4572 1.5216 5.3359 2.2441s3.7282 1.4406 4.9981 2.0918c0.6349 0.32559 1.1212 0.64468 1.3476 0.84375 0.059 0.0496 0.043 0.0373 0.059 0.0566v5.2949c-0.011 0.0268-0.038 0.10759-0.2637 0.28125-0.4968 0.38198-1.9824 1.084-5.5175 1.084s-5.0212-0.70207-5.5176-1.084c-0.2374-0.18268-0.2674-0.27688-0.2774-0.29688-0.2731-2.1586-3.465-1.9512-3.455 0.22461 0 0 0.033 0.61361 0.2617 1.1426 0.2292 0.52897 0.6625 1.1461 1.3535 1.6777 1.3822 1.0632 3.6551 1.8047 7.6348 1.8047s6.2506-0.74146 7.6328-1.8047c0.691-0.53162 1.1261-1.1488 1.3554-1.6777 0.2298-0.52897 0.2598-1.1426 0.2598-1.1426v-5.7793c0-1.1128-0.639-1.8632-1.2344-2.3867-0.5956-0.52351-1.2825-0.92919-2.0566-1.3262-1.5483-0.79398-3.4572-1.5196-5.3359-2.2422-1.8787-0.7226-3.7263-1.4406-4.9961-2.0918-0.6349-0.32558-1.1232-0.64468-1.3496-0.84375-0.057-0.0496-0.041-0.0373-0.057-0.0566v-5.2949c0.011-0.0268 0.038-0.10759 0.2637-0.28125 0.4968-0.38198 1.9825-1.0859 5.5176-1.0859s5.021 0.70402 5.5175 1.0859c0.2374 0.18267 0.2654 0.27492 0.2754 0.29492 0.2721 2.1597 3.4651 1.9522 3.4551-0.22461 0 0-0.031-0.61167-0.2598-1.1406-0.2293-0.52898-0.6644-1.1461-1.3554-1.6777-1.3822-1.0632-3.6531-1.8047-7.6328-1.8047zm-37.602 0.55274c-0.9572 0.015-1.721 0.80261-1.707 1.7598v23.014c-0.2878 0.28077-0.7444 0.68555-1.1563 0.68555h-5.7812c-0.5781 0-1.4473-0.96094-1.4473-0.96094-1.2643-2.0118-4.2562-0.0165-2.8848 1.9238 0 0 1.4418 2.5059 4.3321 2.5059h5.7812c2.8903 0 4.332-2.5059 4.332-2.5059 0.1907-0.28495 0.2926-0.62003 0.293-0.96289v-23.699c0.014-0.97858-0.7832-1.7753-1.7617-1.7598zm52.719 0.0234c-0.9047-0.0348-1.8222 0.62738-1.8222 1.7363v24.855c-0.01 2.3208 3.4787 2.3208 3.4687 0v-18.381l5.4336 9.4219c0.6675 1.1561 2.3363 1.1561 3.0039 0l5.4356-9.4219v18.381c-0.01 2.3208 3.4787 2.3208 3.4687 0v-24.855c4e-4 -0.97885-0.8087-1.7642-1.7871-1.7344-0.6007 0.0185-1.149 0.34656-1.4492 0.86718l-7.1699 12.426-7.168-12.426c-0.3327-0.5762-0.8712-0.84826-1.4141-0.86914zm-37.662 2.8906c3.5351 0 5.0211 0.70403 5.5176 1.0859 0.2257 0.17367 0.2527 0.25445 0.2637 0.28125v19.812c-0.011 0.0268-0.038 0.10759-0.2637 0.28125-0.4965 0.38192-1.9825 1.084-5.5176 1.084s-5.0209-0.70206-5.5175-1.084c-0.2257-0.17366-0.2527-0.25445-0.2637-0.28125v-19.812c0.011-0.0268 0.038-0.10758 0.2637-0.28125 0.4966-0.38191 1.9824-1.0859 5.5175-1.0859z" display="inline" fill="#120e02" fill-opacity=".84343" filter="url(#filter4629-1)" style="paint-order:normal"/>
<path d="m1115 400 65-40c30 15 30 65 0 80z" clip-path="url(#clipPath3446)" fill="#3d3d3d"/>
<path d="m1779.5 385.19c-3.9797 0-6.2511 0.74208-7.6334 1.8053-0.691 0.53161-1.1255 1.1488-1.3548 1.6777-0.2292 0.52896-0.2608 1.1414-0.2608 1.1414v20.232s0.032 0.61248 0.2608 1.1414c0.2293 0.52897 0.6638 1.1461 1.3548 1.6777 1.3823 1.0632 3.6537 1.8053 7.6334 1.8053 3.9798 0 6.2512-0.74208 7.6334-1.8053 0.6911-0.53162 1.1256-1.1488 1.3548-1.6777s0.2609-1.1414 0.2609-1.1414v-20.232s-0.032-0.61248-0.2609-1.1414c-0.2292-0.52898-0.6637-1.1461-1.3548-1.6777-1.3822-1.0632-3.6536-1.8053-7.6334-1.8053zm22.544 0c-3.9798 0-6.2512 0.74208-7.6334 1.8053-0.6911 0.53161-1.1256 1.1488-1.3548 1.6777-0.2292 0.52896-0.2609 1.1414-0.2609 1.1414v5.7806c0 1.1128 0.6397 1.8633 1.2352 2.3868 0.5955 0.52351 1.2819 0.92735 2.056 1.3244 1.5483 0.79397 3.4571 1.5208 5.3358 2.2434s3.7272 1.4409 4.9971 2.0921c0.6349 0.32559 1.1227 0.64432 1.3491 0.84339 0.057 0.05 0.041 0.0371 0.057 0.0564v5.2951c-0.011 0.0268-0.037 0.10747-0.2631 0.28113-0.4968 0.38198-1.9826 1.085-5.5177 1.085s-5.0211-0.70308-5.5175-1.085c-0.2376-0.18268-0.2686-0.27582-0.2767-0.29581a1.7344 1.7344 0 0 0-3.4548 0.22467s0.032 0.61248 0.2608 1.1414c0.2292 0.52897 0.6638 1.1461 1.3548 1.6777 1.3822 1.0632 3.6537 1.8053 7.6334 1.8053s6.2512-0.74208 7.6334-1.8053c0.691-0.53162 1.1255-1.1488 1.3548-1.6777s0.2608-1.1414 0.2608-1.1414v-5.7806c0-1.1128-0.6397-1.8632-1.2351-2.3868-0.5956-0.52351-1.2819-0.92736-2.056-1.3244-1.5483-0.79398-3.4571-1.5208-5.3358-2.2434-1.8787-0.72259-3.7273-1.4409-4.9971-2.0921-0.6349-0.32558-1.1227-0.64432-1.3491-0.84339-0.058-0.05-0.041-0.0371-0.057-0.0564v-5.2951c0.011-0.0268 0.037-0.10747 0.2631-0.28113 0.4968-0.38198 1.9826-1.085 5.5177-1.085s5.0211 0.70308 5.5176 1.085c0.2374 0.18267 0.2685 0.27581 0.2765 0.29581a1.7344 1.7344 0 0 0 3.4549-0.22468s-0.032-0.61248-0.2608-1.1414c-0.2293-0.52898-0.6638-1.1461-1.3548-1.6777-1.3822-1.0632-3.6537-1.8053-7.6334-1.8053zm-37.6 0.55322a1.7344 1.7344 0 0 0-1.7082 1.759v23.015c-0.2878 0.28077-0.7442 0.68532-1.1561 0.68532h-5.7806c-0.5781 0-1.4474-0.96193-1.4474-0.96193a1.7344 1.7344 0 1 0-2.8858 1.9239s1.4429 2.5064 4.3332 2.5064h5.7806c2.8903 0 4.3332-2.5064 4.3332-2.5064a1.7344 1.7344 0 0 0 0.2913-0.96193v-23.701a1.7344 1.7344 0 0 0-1.7602-1.759zm69.92 0.026a1.7344 1.7344 0 0 0-1.4498 0.86597l-7.1693 12.427-7.1693-12.427a1.7344 1.7344 0 0 0-3.2358 0.8671v24.857a1.7344 1.7344 0 1 0 3.4684 0v-18.381l5.4351 9.4206a1.7344 1.7344 0 0 0 3.0033 0l5.4351-9.4206v18.381a1.7344 1.7344 0 1 0 3.4684 0v-24.857a1.7344 1.7344 0 0 0-1.7861-1.7331zm-54.864 2.8892c3.5351 0 5.0211 0.70308 5.5176 1.085 0.2258 0.17367 0.2518 0.25429 0.2631 0.28114v19.812c-0.011 0.0268-0.037 0.10747-0.2631 0.28113-0.4965 0.38192-1.9825 1.085-5.5176 1.085s-5.021-0.70307-5.5176-1.085c-0.2257-0.17366-0.2518-0.25429-0.263-0.28113v-19.812c0.011-0.0268 0.037-0.10747 0.263-0.28114 0.4966-0.38191 1.9825-1.085 5.5176-1.085z" color="#000000" color-rendering="auto" display="inline" dominant-baseline="auto" fill="url(#linearGradient1085)" image-rendering="auto" shape-rendering="auto" solid-color="#000000" stroke="#000" stroke-opacity=".13433" stroke-width=".5" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal"/>
</g>
</g>
<g display="none">
<g id="g8930" clip-path="url(#clipPath1210)">
<path d="m80 140v800h800v-800h-533.33z" display="inline" fill="url(#linearGradient9261)"/>
<path d="m531.5 222.5 15 92 35 55.5 70 68 12.5 59.5 38 206.5 49 69 58.257-28.161s-2.1864-22.553-4.9461-33.497c-3.0728-12.186-6.5571-24.564-12.837-35.45-6.7681-11.733-19.666-19.213-26.147-31.107-8.2251-15.095-7.3774-33.969-15.183-49.285-6.7183-13.182-20.046-22.257-26.644-35.5-9.1263-18.319-13.796-38.786-17-59-4.6213-29.153 5.0205-60.094-3-88.5-8.4371-29.882-24.655-58.45-46-81-19.069-20.145-50.438-25.333-70-45-11.836-11.9-20.345-27.092-27-42.5-11.185-25.894-20.895-82-20.895-82l-12.105-4.0005zm-191.75 616.43s63.309 0.96432 94.581 5.3432c23.45 3.2836 46.793 8.2605 69.296 15.627 18.808 6.1569 34.679 22.427 54.426 23.716 16.721 1.0915 35.08-3.6281 48.304-13.919 11.784-9.1705 18.18-24.415 22.596-38.679 4.4046-14.228 5.7993-29.902 3.201-44.569-4.0062-22.613-28.243-62.841-28.243-62.841l107.44 79.811-16 127.22-41.559 11.355-93.244 1-218.56-23.598z" fill="#fff3aa"/>
<path d="m550.71 133.99-61.414 0.70711c-10 20-29.293 64.072-29.293 105.3 0 110 43.061 102.8 70 170 26.924 67.167 25.747 148.73 40 220 10 50 26.769 121.42 70 145 12.415 6.772 40 65 40 95 0 31.181-14.254 51.281-32.71 74l235.71-2 3-83c-10-80-136-189-170.28-233.28-48.427-62.554-31.486-96.719-45.719-170.72-16.322-84.86-90.308-90.354-110-155-33.636-110.42-9.2929-126.01-9.2929-166.01zm-187.79 696.02c-47.495-5.0249-87.293 15.056-126.93 33.75-22.567 10.642-36.972-11.182-77.421 79.236l408.48 1c-25.217-26.943-59.673-69.761-113.61-77.117-44.093-6.0127-19.929-29.401-90.515-36.868z" fill="#316ed9"/>
<path d="m410.16 136.5c-10 20-34.115 55.17-59.539 71.06-24.626 15.391-90.258 24.027-128.91 19.938-45.235-4.7851-54.207-16.326-147.71-2.5097l3-88.988z" fill="#009d00"/>
</g>
</g>
<g display="none">
<g id="g5199" clip-path="url(#clipPath5203)">
<rect transform="rotate(-5.9986)" x="-125.68" y="332" width="266.73" height="297.25" fill="#8c133f" style="paint-order:normal"/>
<rect transform="rotate(-5.9986)" x="211.04" y="436.22" width="108.51" height="193.02" ry="0" display="inline" fill="#33757c" style="paint-order:normal"/>
<path d="m-23.249 725.65 457.48-48.083" display="inline" fill="none" stroke="#234868" stroke-opacity=".87879" stroke-width="50"/>
<path d="m19.638 942.35 165.96-238.66" display="inline" fill="none" stroke="#234868" stroke-opacity=".87879" stroke-width="40"/>
<path d="m220.71 694.29c5.1944 19.388-6.3115 39.315-25.699 44.51-19.388 5.1944-39.315-6.3116-44.51-25.699-5.1944-19.388 6.3115-39.315 25.699-44.51 19.388-5.1944 39.315 6.3115 44.51 25.699z" display="inline" fill="#fff" stroke="#0d4474" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".87879" stroke-width="8" style="paint-order:stroke fill markers"/>
<path d="m469.34 668.16c5.1944 19.388-6.3116 39.315-25.699 44.51-19.388 5.1944-39.315-6.3116-44.51-25.699-5.1944-19.388 6.3116-39.315 25.699-44.51 19.388-5.1944 39.315 6.3116 44.51 25.699z" display="inline" fill="#fff" stroke="#0d4474" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".87879" stroke-width="8" style="paint-order:stroke fill markers"/>
</g>
</g>
<g display="none">
<g id="g8961" transform="matrix(1.0501 0 0 1.0501 -44.07 -27.074)">
<use width="100%" height="100%" display="inline" xlink:href="#g8930"/>
<use width="100%" height="100%" display="inline" xlink:href="#g5199"/>
</g>
</g>
<g>
<path transform="matrix(1.1752 0 0 1.1752 -3.5969 -179.75)" d="m42.5 875 157 82.5 339.5-49.5 167.42 58.282-159.72-193.81-349.3 31.287z" filter="url(#filter3987)"/>
</g>
<g>
<use transform="matrix(.93735 .46871 0 .98421 13.567 -378.78)" width="100%" height="100%" clip-path="url(#clipPath9132)" xlink:href="#g8961"/>
<use transform="matrix(.93735 .46968 0 .98421 -5.5112 -103.04)" width="100%" height="100%" clip-path="url(#clipPath9126)" xlink:href="#g8961"/>
<use transform="matrix(.98421 -.18753 0 .98421 -18.576 61.421)" width="100%" height="100%" clip-path="url(#clipPath9081)" xlink:href="#g8961"/>
</g>
<g>
<path transform="matrix(.98421 0 0 .98421 .50408 .023626)" d="m31.074 33.33-0.32002 842.49 201.21 100.42v-843.52zm620.77 20.744v843.93l202.14 98.428-1.3149-843.29z" clip-path="url(#clipPath9114)" fill="#fff" fill-opacity=".40909"/>
</g>
<g>
<path transform="matrix(1.0219 .16971 -.15751 1.02 2.6685 -114.58)" d="m572.1 580.75-95.569 102.6 204.98-117.81 25.757-36.294 161.97-75.173-34.804-178.53-170.78 127.79z" fill="url(#linearGradient3892)" filter="url(#filter4005)"/>
<path d="m382.15 663.32 195.91-58.147-3.4364-48.982z" fill="url(#linearGradient4017)"/>
</g>
<g>
<use transform="matrix(.69887 -.76199 .76199 .69887 -433.6 1430.4)" width="100%" height="100%" xlink:href="#g3773"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 45 KiB

View file

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="1278.000000pt" height="1280.000000pt" viewBox="0 0 1278.000000 1280.000000" preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.15, written by Peter Selinger 2001-2017
</metadata>
<g transform="translate(0.000000,1280.000000) scale(0.100000,-0.100000)" fill="#000000" stroke="none">
<path d="M6760 12443 c-137 -26 -302 -163 -453 -375 -207 -293 -384 -645 -802 -1598 -347 -790 -486 -1070 -667 -1337 -211 -311 -357 -373 -878 -374 -303 0 -573 22 -1315 106 -310 36 -666 73 -930 97 -191 17 -792 17 -905 0 -359 -56 -525 -174 -538 -382 -7 -128 43 -265 161 -442 197 -294 514 -612 1317 -1323 955 -845 1247 -1174 1290 -1452 37 -234 -95 -656 -453 -1458 -364 -816 -430 -963 -490 -1110 -252 -611 -352 -998 -318 -1236 31 -222 145 -333 357 -346 311 -21 768 169 1699 704 749 431 885 508 1051 596 451 240 718 338 924 341 121 1 161 -10 310 -84 265 -133 574 -380 1300 -1040 1006 -916 1405 -1206 1752 -1276 102 -21 173 -13 255 27 103 50 160 135 204 304 21 81 23 111 23 315 0 125 -5 267 -12 320 -51 379 -107 674 -253 1335 -229 1034 -279 1327 -279 1647 0 162 16 260 55 346 101 221 462 490 1275 952 661 375 831 473 1005 578 739 446 1065 761 1065 1027 0 155 -96 273 -306 378 -300 150 -748 236 -1764 342 -1052 108 -1334 148 -1637 225 -387 100 -514 201 -648 515 -117 276 -211 629 -391 1482 -135 644 -212 973 -289 1237 -115 398 -240 668 -380 824 -94 105 -221 156 -335 135z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve">
<metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>
<g><path d="M255,567.4v312.4h147V567.4l-73.5-61.3L255,567.4L255,567.4z M10,879.8h147V640.9L10,757.3V879.8L10,879.8z M745,493.9v385.9h147V371.4L745,493.9L745,493.9z M500,647v232.8h147V573.5l-116.4,98L500,647L500,647z M990,120.3H708.3l116.4,110.2l-300.1,245l-196-165.4L10,561.3v110.2l318.5-251.1l202.1,165.4l361.4-294l98,91.9L990,120.3L990,120.3z"/></g>
</svg>

Before

Width:  |  Height:  |  Size: 833 B

1
assets/svg/mapillary.svg Normal file
View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none" viewBox="0 0 32 32"><path fill="#fff" fill-rule="evenodd" d="M32 16c0 8.837-7.163 16-16 16S0 24.837 0 16 7.163 0 16 0s16 7.163 16 16zm-24.44-.974c-.371-.201-.303-.725.166-.859.398-.113 3.627-1.196 4.605-1.524a.59.59 0 00.373-.369l1.57-4.603c.146-.43.678-.432.894-.015.024.046.325.593.731 1.331v.001c.896 1.629 2.302 4.185 2.372 4.34a.473.473 0 01-.194.617c-.133.083-.314.19-.469.28l-.269.16c-.237.148-.464.045-.573-.183-.065-.137-.39-.719-.713-1.299-.217-.389-.433-.776-.57-1.027-.17-.313-.682-.433-.854.072l-.566 1.66a.613.613 0 01-.376.373l-1.703.564c-.336.111-.5.626-.046.843.038.018.383.202.798.423h.001c.631.337 1.425.76 1.552.82.21.1.328.39.204.595-.168.28-.384.635-.462.75a.48.48 0 01-.626.149c-.223-.119-5.711-3.027-5.844-3.099zm7.378 3.9c.288.147 7.276 3.844 7.496 3.963.441.238.907-.222.668-.652-.041-.073-.507-.929-1.107-2.034l-.002-.004c-1.166-2.144-2.84-5.224-2.925-5.365-.128-.214-.442-.322-.678-.178-.232.14-.498.298-.648.374-.3.153-.338.383-.203.639.297.562 1.232 2.267 1.34 2.446.223.374-.276.801-.615.615-.054-.03-.408-.217-.834-.442-.697-.368-1.587-.839-1.684-.896-.157-.09-.435-.09-.626.218-.138.224-.308.502-.386.642-.155.274-.084.527.204.674z" clip-rule="evenodd" style="transition: all 0.2s ease 0s;"></path></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -7,8 +7,8 @@ import {Layout} from "./Customizations/Layout";
import {readFileSync, writeFile, writeFileSync} from "fs"; import {readFileSync, writeFile, writeFileSync} from "fs";
import Locale from "./UI/i18n/Locale"; import Locale from "./UI/i18n/Locale";
import svg2img from 'promise-svg2img'; import svg2img from 'promise-svg2img';
import {Translation} from "./UI/i18n/Translations";
import Translations from "./UI/i18n/Translations"; import Translations from "./UI/i18n/Translations";
import {Translation} from "./UI/i18n/Translation";
function enc(str: string): string { function enc(str: string): string {
return encodeURIComponent(str.toLowerCase()); return encodeURIComponent(str.toLowerCase());

View file

@ -8,6 +8,10 @@ Contains tweaks for small screens
@media only screen and (max-width: 600px), only screen and (max-height: 600px) { @media only screen and (max-width: 600px), only screen and (max-height: 600px) {
.leaflet-control-attribution {
display: none;
}
.only-on-mobile { .only-on-mobile {
display: unset; display: unset;
} }

View file

@ -109,3 +109,13 @@ input:checked + label .question-option-with-border {
font-weight: bold; font-weight: bold;
border-radius: 1.5em; border-radius: 1.5em;
} }
.edit-button img {
width: 1.3em;
height: 1.3em;
padding: 0.5em;
border-radius: 0.65em;
border: solid black 1px;
font-size: medium;
float: right;
}

View file

@ -50,12 +50,6 @@
display: block; display: block;
} }
.small-userbadge-icon {
width: 1em;
height: 1em;
fill: black;
border-radius: 0;
}
#profile-pic { #profile-pic {
float: left; float: left;

View file

@ -1,28 +1,69 @@
import * as fs from "fs"; import * as fs from "fs";
import {Utils} from "./Utils";
console.log("Generating images") function genImages() {
const dir = fs.readdirSync("./assets/svg") console.log("Generating images")
console.log(dir) const dir = fs.readdirSync("./assets/svg")
let module = "import {Img} from \"./UI/Img\";\nimport {FixedUiElement} from \"./UI/Base/FixedUiElement\";\n\nexport default class Svg {\n\n\n"; let module = "import {Img} from \"./UI/Img\";\nimport {FixedUiElement} from \"./UI/Base/FixedUiElement\";\n\nexport default class Svg {\n\n\n";
for (const path of dir) { for (const path of dir) {
if(!path.endsWith(".svg")){ if (!path.endsWith(".svg")) {
throw "Non-svg file detected in the svg files: "+path; throw "Non-svg file detected in the svg files: " + path;
}
const svg = fs.readFileSync("./assets/svg/" + path, "utf-8")
.replace(/\n/g, " ")
.replace(/\r/g, "")
.replace(/\\/g, "\\")
.replace(/"/g, "\\\"")
const name = path.substr(0, path.length - 4)
.replace(/[ -]/g, "_");
module += ` public static ${name} = "${svg}"\n`
module += ` public static ${name}_img = Img.AsImageElement(Svg.${name})\n`
module += ` public static ${name}_ui() { return new FixedUiElement(Svg.${name}_img);}\n\n`
}
module += "}\n";
fs.writeFileSync("Svg.ts", module);
console.log("Done")
}
function isTranslation(tr: any): boolean {
for (const key in tr) {
if (typeof tr[key] !== "string") {
return false;
}
}
return true;
}
function transformTranslation(obj: any, depth = 1) {
if (isTranslation(obj)) {
return `new Translation( ${JSON.stringify(obj)} )`
} }
const svg = fs.readFileSync("./assets/svg/"+path, "utf-8") let values = ""
.replace(/\n/g, " ") for (const key in obj) {
.replace(/\r/g, "") values += (Utils.Times((_) => " ", depth)) + key + ": " + transformTranslation(obj[key], depth + 1) + ",\n"
.replace(/\\/g, "\\") }
.replace(/"/g, "\\\"") return `{${values}}`;
const name = path.substr(0, path.length-4)
.replace(/[ -]/g, "_");
module += ` public static ${name} = "${svg}"\n`
module += ` public static ${name}_img = Img.AsImageElement(Svg.${name})\n`
module += ` public static ${name}_ui() { return new FixedUiElement(Svg.${name}_img);}\n\n`
} }
module += "}\n";
fs.writeFileSync("Svg.ts", module); function genTranslations() {
console.log("Done") const translations = JSON.parse(fs.readFileSync("./assets/translations.json", "utf-8"))
const transformed = transformTranslation(translations);
let module = `import {Translation} from "./UI/i18n/Translation"\n\nexport default class AllTranslationAssets {\n\n`;
module += " public static t = " + transformed;
module += "}"
fs.writeFileSync("AllTranslationAssets.ts", module);
}
genTranslations()
genImages()

129
index.css
View file

@ -42,6 +42,20 @@ body {
background-color: white; background-color: white;
border-radius: 1em; border-radius: 1em;
cursor: pointer; cursor: pointer;
box-shadow: 0 0 10px #00000066;
}
.layer-selection-toggle {
border-top-left-radius: 1em;
border-bottom-left-radius: 1em;
display: flex;
flex-direction: column-reverse;
}
.layer-selection-toggle img {
display: block;
width: 2em;
padding: 1em;
} }
/**************** GENERIC ****************/ /**************** GENERIC ****************/
@ -158,7 +172,7 @@ body {
box-sizing: border-box; box-sizing: border-box;
} }
.search-go { .search-go img {
position: relative; position: relative;
float: right; float: right;
height: 1.2em; height: 1.2em;
@ -167,7 +181,6 @@ body {
padding: 0.4em; padding: 0.4em;
margin-left: 0.5em; margin-left: 0.5em;
margin-right: 0; margin-right: 0;
} }
@ -187,69 +200,51 @@ body {
position: absolute; position: absolute;
z-index: 5000; z-index: 5000;
transition: all 500ms linear; transition: all 500ms linear;
overflow: hidden; overflow-x: hidden;
pointer-events: none; pointer-events: none;
/* Shadow offset */ /* Shadow offset */
padding: 0.5em 10px 0 0.5em; padding: 0.5em 10px 0 0.5em;
} }
.welcomeMessage {
.collapse-button { display: block;
position: absolute; margin-left: 4em;
background-color: #e5f5ff; max-width: calc(100vw - 5em);
width: 3.5em; width: 40em;
border-top-left-radius: 2em;
border-bottom-left-radius: 2em;
display: inline-block;
height: 100%;
box-shadow: -10px 0 10px -10px #0006;
}
.collapse-button .collapse-button-img {
background-color: #e5f5ff;
}
.open-button {
width: 2em;
border-top-left-radius: 2em;
border-bottom-left-radius: 2em;
margin-bottom: 10px;
}
.open-button .collapse-button-img {
border-radius: 50%;
box-sizing: border-box;
display: inline-block;
padding: 1em;
background-color: white;
box-shadow: 0 0 10px #0006;
}
.collapse-button-img {
border-radius: 50%;
box-sizing: border-box;
display: inline-block;
padding: 1em;
background-color: white;
box-shadow: none;
margin: 0;
}
.collapse-button-img img {
width: 1.5em;
margin: 0;
padding: 0;
}
#welcomeMessage {
display: inline-block;
margin-left: 3.5em;
border-radius: 0 2em 2em 0;
max-width: 40em;
width: 45vw;
max-height: calc(100vh - 15em); max-height: calc(100vh - 15em);
overflow-y: auto; overflow-y: auto;
border-top-right-radius: 1em;
border-bottom-right-radius: 1em;
}
.close-welcome-button {
position: absolute;
display: inline-block;
height: 100%;
background-color: #e5f5ff;
box-sizing: border-box;
width: 4em;
padding: 1em;
border-top-left-radius: 1em;
border-bottom-left-radius: 1em;
}
.close-welcome-button img {
width: 2em;
}
.open-welcome-button {
display: inline-block;
box-sizing: border-box;
background-color: white;
height: 4em;
width: 4em;
padding: 1em;
border-radius: 1em;
}
.open-welcome-button img {
width: 2em;
} }
#messagesbox { #messagesbox {
@ -257,6 +252,9 @@ body {
position: relative; position: relative;
padding: 0; padding: 0;
pointer-events: all; pointer-events: all;
box-shadow: 0 0 10px #00000066;
border-radius: 1em;
width: min-content
} }
@ -309,6 +307,13 @@ body {
} }
.attribution img {
height: 1.2em !important;
padding-right: 0.5em;
padding-left: 0.2em;
}
.attribution-author { .attribution-author {
display: inline-block; display: inline-block;
} }
@ -325,6 +330,14 @@ body {
/***************** Info box (box containing features and questions ******************/ /***************** Info box (box containing features and questions ******************/
.map-attribution img {
width: 1em;
height: 1em;
fill: black;
border-radius: 0;
}
.leaflet-popup-content { .leaflet-popup-content {
width: 40em !important; width: 40em !important;
max-height: 80vh; max-height: 80vh;

View file

@ -5,7 +5,6 @@ import {InitUiElements} from "./InitUiElements";
import {QueryParameters} from "./Logic/Web/QueryParameters"; import {QueryParameters} from "./Logic/Web/QueryParameters";
import {UIEventSource} from "./Logic/UIEventSource"; import {UIEventSource} from "./Logic/UIEventSource";
import * as $ from "jquery"; import * as $ from "jquery";
import {FromJSON} from "./Customizations/JSON/FromJSON";
import SharedLayers from "./Customizations/SharedLayers"; import SharedLayers from "./Customizations/SharedLayers";
let defaultLayout = "bookcases" let defaultLayout = "bookcases"
@ -16,6 +15,7 @@ if (location.href.startsWith("http://buurtnatuur.be")) {
window.location.replace("https://buurtnatuur.be"); window.location.replace("https://buurtnatuur.be");
} }
if (location.href.indexOf("buurtnatuur.be") >= 0) { if (location.href.indexOf("buurtnatuur.be") >= 0) {
// Reload the https version. This is important for the 'locate me' button // Reload the https version. This is important for the 'locate me' button
defaultLayout = "buurtnatuur" defaultLayout = "buurtnatuur"

View file

@ -6,7 +6,7 @@ import T from "./TestHelper";
import {FromJSON} from "../Customizations/JSON/FromJSON"; import {FromJSON} from "../Customizations/JSON/FromJSON";
import {And, Tag} from "../Logic/Tags"; import {And, Tag} from "../Logic/Tags";
import Locale from "../UI/i18n/Locale"; import Locale from "../UI/i18n/Locale";
import Translations, {Translation} from "../UI/i18n/Translations"; import Translations from "../UI/i18n/Translations";
import {UIEventSource} from "../Logic/UIEventSource"; import {UIEventSource} from "../Logic/UIEventSource";
import {OH, OpeningHour} from "../Logic/OpeningHours"; import {OH, OpeningHour} from "../Logic/OpeningHours";
import PublicHolidayInput from "../UI/Input/OpeningHours/PublicHolidayInput"; import PublicHolidayInput from "../UI/Input/OpeningHours/PublicHolidayInput";
@ -14,6 +14,7 @@ import TagRenderingConfig from "../Customizations/JSON/TagRenderingConfig";
import EditableTagRendering from "../UI/Popup/EditableTagRendering"; import EditableTagRendering from "../UI/Popup/EditableTagRendering";
import {SubstitutedTranslation} from "../UI/SpecialVisualizations"; import {SubstitutedTranslation} from "../UI/SpecialVisualizations";
import {Utils} from "../Utils"; import {Utils} from "../Utils";
import {Translation} from "../UI/i18n/Translation";