Compare commits

..
Author SHA1 Message Date
Harel MandBart Louwers 2384adf517 feat: make sidebar panels resizable (#2094)
- Replaces #1870, which replaced #1682, #1677

This mostly uses the code from there and addresses the comments I've
left. I didn't change the code much.

## Launch Checklist

Makes the sidebar panel resizable

<img width="707" height="511" alt="image"
src="https://github.com/user-attachments/assets/d010df38-faac-441c-bf7f-a4960e471c61"
/>


 - [x] Briefly describe the changes in this PR.
 - [x] Link to related issues.
- [x] Include before/after visuals or gifs if this PR includes visual
changes.
 - [x] Write tests for all new functionality.
 - [x] Add an entry to `CHANGELOG.md` under the `## main` section.

---------

Co-authored-by: Bart Louwers <bart.louwers@gmail.com>
2026-09-27 13:44:22 +00:00
21 changed files with 275 additions and 299 deletions
+1 -1
View File
@@ -5,7 +5,7 @@
- Upgrade to MapLibre GL JS 6 and Vite 8, and update the remaining dependencies
- Serve the RTL text plugin from `@mapbox/mapbox-gl-rtl-text` instead of a pinned CDN URL, so its version is tracked in `package.json`
- Exported HTML now loads MapLibre GL JS as an ES module, since v6 no longer ships a UMD bundle
- Add `font-faces`, `sky`, `roll` and `centerAltitude` to the style settings modal
- The sidebar can now be resized, both as a whole and in the split between the layer list and the layer editor
- _...Add new stuff here..._
### 🐞 Bug fixes
+2 -3
View File
@@ -182,9 +182,8 @@ export class MaputnikDriver {
await this.helper.when.typeText(text);
},
setTextInJsonEditor: async (text: string, selector?: string) => {
const scope = selector ? this.helper.get.elementByTestId(selector).locator(".cm-line") : this.helper.get.element(".cm-line");
await scope.first().click();
setTextInJsonEditor: async (text: string) => {
await this.helper.get.element(".cm-line").first().click();
await this.helper.when.typeKeys("{selectall}");
await this.helper.when.typeText(text);
},
-22
View File
@@ -338,15 +338,6 @@ describe("modals", () => {
});
});
test("font faces", async () => {
const fontFaces = { "Noto Sans Regular": [{ url: "http://example.com/font.ttf", "unicode-range": ["U+1780-17FF"] }] };
await when.setTextInJsonEditor(JSON.stringify(fontFaces), "modal:settings.font-faces");
await when.click("modal:settings.name");
await then(get.styleFromLocalStorage()).shouldDeepNestedInclude({
"font-faces": fontFaces,
});
});
test("maptiler access token", async () => {
const apiKey = "testing123";
await when.setValue("modal:settings.maputnik:openmaptiles_access_token", apiKey);
@@ -387,24 +378,11 @@ describe("modals", () => {
await when.setValue("modal:settings.zoom", "4");
await when.setValue("modal:settings.bearing", "12");
await when.setValue("modal:settings.pitch", "30");
await when.setValue("modal:settings.roll", "15");
await when.setValue("modal:settings.center-altitude", "100");
await when.click("modal:settings.name");
await then(get.styleFromLocalStorage()).shouldDeepNestedInclude({
zoom: 4,
bearing: 12,
pitch: 30,
roll: 15,
centerAltitude: 100,
});
});
test("sky and fog blends", async () => {
await when.setValue("modal:settings.sky-horizon-blend", "0.3");
await when.setValue("modal:settings.fog-ground-blend", "0.2");
await when.click("modal:settings.name");
await then(get.styleFromLocalStorage()).shouldDeepNestedInclude({
sky: { "sky-horizon-blend": 0.3, "fog-ground-blend": 0.2 },
});
});
+18
View File
@@ -122,6 +122,8 @@ export class Assertable<T> {
// Value assertions (auto-retrying for Query targets).
shouldEqual = (value: any) => this.assertValue((actual) => expect(actual).toBe(value));
shouldBeGreaterThan = (value: number) => this.assertValue((actual) => expect(actual).toBeGreaterThan(value));
shouldInclude = (value: any) =>
this.assertValue((actual) => {
if (typeof value === "object" && value !== null) {
@@ -349,6 +351,15 @@ export class PlaywrightHelper {
await this.page.mouse.up();
},
/** Presses at the centre of an element and drags it by the given offset. */
dragBy: async (testId: string, deltaX: number, deltaY = 0) => {
const { x, y } = await centerOf(this.testId(testId));
await this.page.mouse.move(x, y);
await this.page.mouse.down();
await this.page.mouse.move(x + deltaX, y + deltaY, { steps: 10 });
await this.page.mouse.up();
},
clickCenter: async (testId: string) => {
const { x, y } = await centerOf(this.testId(testId));
await this.page.mouse.move(x, y);
@@ -446,6 +457,13 @@ export class PlaywrightHelper {
inputValue: (testId: string) => new Query<string>(() => this.testId(testId).first().inputValue()),
elementWidth: (testId: string) =>
new Query<number>(async () => {
const box = await this.testId(testId).first().boundingBox();
if (!box) throw new Error(`Element "${testId}" has no bounding box`);
return box.width;
}),
elementsText: (testId: string) => new Query<string>(() => this.testId(testId).first().innerText()),
locationHash: () => new Query<string>(async () => new URL(this.page.url()).hash),
+27
View File
@@ -0,0 +1,27 @@
import { beforeEach, describe, test } from "./utils/fixtures";
import { MaputnikDriver } from "./maputnik-driver";
describe("sidebar resize", () => {
const { given, get, when, then } = new MaputnikDriver();
beforeEach(async () => {
await given.setupMockBackedResponses();
await when.setStyle("layer");
});
test("dragging the outer handle widens the sidebar", async () => {
const initialWidth = await get.elementWidth("sidebar-panel").get();
await when.dragBy("sidebar-resize-handle", 100);
await then(get.elementWidth("sidebar-panel")).shouldBeGreaterThan(initialWidth + 50);
});
test("dragging the inner handle widens the layer list", async () => {
const initialWidth = await get.elementWidth("layer-list-panel").get();
await when.dragBy("inner-resize-handle", 50);
await then(get.elementWidth("layer-list-panel")).shouldBeGreaterThan(initialWidth + 20);
});
});
+11
View File
@@ -58,6 +58,7 @@
"react-i18next": "^17.0.15",
"react-icons": "^5.7.0",
"react-markdown": "^10.1.0",
"react-resizable-panels": "^4.11.0",
"reconnecting-websocket": "^4.4.0",
"slugify": "^1.6.9",
"string-hash": "^1.1.3",
@@ -10758,6 +10759,16 @@
"react": ">=18"
}
},
"node_modules/react-resizable-panels": {
"version": "4.11.0",
"resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-4.11.0.tgz",
"integrity": "sha512-LPk/AkFDGkg7SsbOyL93ojrE6E7lhrxxDwnYNjfmnSeI6BE7Sje6dB24PXgZk8DeugdeXNk1LO+ohRqIjhxiLw==",
"license": "MIT",
"peerDependencies": {
"react": "^18.0.0 || ^19.0.0",
"react-dom": "^18.0.0 || ^19.0.0"
}
},
"node_modules/reactcss": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz",
+1
View File
@@ -76,6 +76,7 @@
"react-i18next": "^17.0.15",
"react-icons": "^5.7.0",
"react-markdown": "^10.1.0",
"react-resizable-panels": "^4.11.0",
"reconnecting-websocket": "^4.4.0",
"slugify": "^1.6.9",
"string-hash": "^1.1.3",
+116 -38
View File
@@ -1,9 +1,22 @@
import React from "react";
import React, { useEffect, useState } from "react";
import { Group, Panel, Separator, useDefaultLayout } from "react-resizable-panels";
import { ScrollContainer } from "./ScrollContainer";
import { type WithTranslation, withTranslation } from "react-i18next";
import { useTranslation } from "react-i18next";
import { IconContext } from "react-icons";
type AppLayoutInternalProps = {
const DEFAULT_LIST_WIDTH = 200;
const DEFAULT_DRAWER_WIDTH = 370;
const DEFAULT_SIDEBAR_WIDTH = DEFAULT_LIST_WIDTH + DEFAULT_DRAWER_WIDTH;
const PANEL_STYLE: React.CSSProperties = { overflow: "hidden" };
const SIDEBAR_LAYOUT_ID = "maputnik:sidebar-layout";
const SIDEBAR_INNER_LAYOUT_ID = "maputnik:sidebar-inner-layout";
const SIDEBAR_PANEL_ID = "sidebar";
const MAP_PANEL_ID = "map";
const LIST_PANEL_ID = "list";
const DRAWER_PANEL_ID = "drawer";
type AppLayoutProps = {
toolbar: React.ReactElement
layerList: React.ReactElement
layerEditor?: React.ReactElement
@@ -11,43 +24,108 @@ type AppLayoutInternalProps = {
map: React.ReactElement
bottom?: React.ReactElement
modals?: React.ReactNode
} & WithTranslation;
};
class AppLayoutInternal extends React.Component<AppLayoutInternalProps> {
export const AppLayout: React.FC<AppLayoutProps> = (props) => {
const { t, i18n } = useTranslation();
render() {
document.body.dir = this.props.i18n.dir();
const sidebarLayout = useDefaultLayout({
id: SIDEBAR_LAYOUT_ID,
panelIds: [SIDEBAR_PANEL_ID, MAP_PANEL_ID],
});
const innerLayout = useDefaultLayout({
id: SIDEBAR_INNER_LAYOUT_ID,
panelIds: [LIST_PANEL_ID, DRAWER_PANEL_ID],
});
return <IconContext.Provider value={{size: "14px"}}>
<div className="maputnik-layout">
{this.props.toolbar}
<div className="maputnik-layout-main">
{this.props.codeEditor && <div className="maputnik-layout-code-editor">
<ScrollContainer>
{this.props.codeEditor}
// The bottom panel is position: fixed, so it can't be a flex sibling of the
// map panel; it follows the sidebar through this custom property instead.
const [sidebarWidth, setSidebarWidth] = useState(DEFAULT_SIDEBAR_WIDTH);
useEffect(() => {
document.body.dir = i18n.dir();
}, [i18n, i18n.language]);
return <IconContext.Provider value={{size: "14px"}}>
<div
className="maputnik-layout"
style={{"--sidebar-width": `${sidebarWidth}px`} as React.CSSProperties}
>
{props.toolbar}
<div className="maputnik-layout-main">
<Group
className="maputnik-layout-panels"
orientation="horizontal"
id={SIDEBAR_LAYOUT_ID}
defaultLayout={sidebarLayout.defaultLayout}
onLayoutChanged={sidebarLayout.onLayoutChanged}
>
<Panel
id={SIDEBAR_PANEL_ID}
data-wd-key="sidebar-panel"
className={props.codeEditor ? "maputnik-layout-code-editor" : "maputnik-layout-sidebar"}
style={PANEL_STYLE}
defaultSize={`${DEFAULT_SIDEBAR_WIDTH}px`}
minSize="280px"
onResize={({inPixels}) => setSidebarWidth(inPixels)}
>
{props.codeEditor && <ScrollContainer>
{props.codeEditor}
</ScrollContainer>
</div>
}
{!this.props.codeEditor && <>
<div className="maputnik-layout-list">
{this.props.layerList}
</div>
<div className="maputnik-layout-drawer">
<ScrollContainer>
{this.props.layerEditor}
</ScrollContainer>
</div>
</>}
{this.props.map}
</div>
{this.props.bottom && <div className="maputnik-layout-bottom">
{this.props.bottom}
</div>
}
{this.props.modals}
}
{!props.codeEditor && <Group
className="maputnik-layout-sidebar-panels"
orientation="horizontal"
id={SIDEBAR_INNER_LAYOUT_ID}
defaultLayout={innerLayout.defaultLayout}
onLayoutChanged={innerLayout.onLayoutChanged}
>
<Panel
id={LIST_PANEL_ID}
data-wd-key="layer-list-panel"
className="maputnik-layout-list"
style={PANEL_STYLE}
defaultSize={`${DEFAULT_LIST_WIDTH}px`}
minSize="100px"
>
{props.layerList}
</Panel>
<Separator
className="maputnik-layout-resize-handle"
data-wd-key="inner-resize-handle"
title={t("Drag to resize the layer list")}
aria-label={t("Drag to resize the layer list")}
/>
<Panel
id={DRAWER_PANEL_ID}
className="maputnik-layout-drawer"
style={PANEL_STYLE}
defaultSize={`${DEFAULT_DRAWER_WIDTH}px`}
minSize="150px"
>
<ScrollContainer>
{props.layerEditor}
</ScrollContainer>
</Panel>
</Group>
}
</Panel>
<Separator
className="maputnik-layout-resize-handle"
data-wd-key="sidebar-resize-handle"
title={t("Drag to resize the sidebar")}
aria-label={t("Drag to resize the sidebar")}
/>
<Panel id={MAP_PANEL_ID} className="maputnik-layout-map" style={PANEL_STYLE} minSize="200px">
{props.map}
</Panel>
</Group>
</div>
</IconContext.Provider>;
}
}
export const AppLayout = withTranslation()(AppLayoutInternal);
{props.bottom && <div className="maputnik-layout-bottom">
{props.bottom}
</div>
}
{props.modals}
</div>
</IconContext.Provider>;
};
+1 -105
View File
@@ -1,6 +1,6 @@
import React from "react";
import latest from "@maplibre/maplibre-gl-style-spec/dist/latest.json";
import type {LightSpecification, ProjectionSpecification, SkySpecification, StyleSpecification, TerrainSpecification, TransitionSpecification} from "maplibre-gl";
import type {LightSpecification, ProjectionSpecification, StyleSpecification, TerrainSpecification, TransitionSpecification} from "maplibre-gl";
import { type WithTranslation, withTranslation } from "react-i18next";
import { FieldArray } from "../FieldArray";
@@ -81,24 +81,6 @@ class ModalSettingsInternal extends React.Component<ModalSettingsInternalProps>
});
}
changeSkyProperty(property: keyof SkySpecification, value: any) {
const sky = {
...this.props.mapStyle.sky,
};
if (value === undefined) {
delete sky[property];
}
else {
sky[property] = value;
}
this.props.onStyleChanged({
...this.props.mapStyle,
sky,
});
}
changeProjectionType(value: any) {
const projection = {
...this.props.mapStyle.projection,
@@ -142,7 +124,6 @@ class ModalSettingsInternal extends React.Component<ModalSettingsInternalProps>
const transition = this.props.mapStyle.transition || {};
const terrain = this.props.mapStyle.terrain || {} as TerrainSpecification;
const projection = this.props.mapStyle.projection || {} as ProjectionSpecification;
const sky = this.props.mapStyle.sky || {};
return <Modal
data-wd-key="modal:settings"
@@ -181,14 +162,6 @@ class ModalSettingsInternal extends React.Component<ModalSettingsInternalProps>
onChange={(value) => this.changeStyleProperty("glyphs", value)}
/>
<Block label={t("Font faces")} fieldSpec={latest.$root["font-faces"]} data-wd-key="modal:settings.font-faces">
<FieldJson
lintType="json"
value={this.props.mapStyle["font-faces"] as any}
onChange={(value) => this.changeStyleProperty("font-faces", value)}
/>
</Block>
<FieldString
label={fsa.maputnik.maptiler_access_token.label}
fieldSpec={fsa.maputnik.maptiler_access_token}
@@ -258,23 +231,6 @@ class ModalSettingsInternal extends React.Component<ModalSettingsInternalProps>
onChange={(value) => this.changeStyleProperty("pitch", value)}
/>
<FieldNumber
label={t("Roll")}
data-wd-key="modal:settings.roll"
fieldSpec={latest.$root.roll}
value={mapStyle.roll}
default={latest.$root.roll.default}
onChange={(value) => this.changeStyleProperty("roll", value)}
/>
<FieldNumber
label={t("Center altitude")}
data-wd-key="modal:settings.center-altitude"
fieldSpec={latest.$root.centerAltitude}
value={mapStyle.centerAltitude}
onChange={(value) => this.changeStyleProperty("centerAltitude", value)}
/>
<FieldEnum
label={t("Light anchor")}
fieldSpec={latest.light.anchor}
@@ -329,66 +285,6 @@ class ModalSettingsInternal extends React.Component<ModalSettingsInternalProps>
onChange={(value) => this.changeTerrainProperty("exaggeration", value)}
/>
<FieldColor
label={t("Sky color")}
fieldSpec={latest.sky["sky-color"]}
value={sky["sky-color"] as string}
default={latest.sky["sky-color"].default}
onChange={(value) => this.changeSkyProperty("sky-color", value)}
/>
<FieldColor
label={t("Horizon color")}
fieldSpec={latest.sky["horizon-color"]}
value={sky["horizon-color"] as string}
default={latest.sky["horizon-color"].default}
onChange={(value) => this.changeSkyProperty("horizon-color", value)}
/>
<FieldColor
label={t("Fog color")}
fieldSpec={latest.sky["fog-color"]}
value={sky["fog-color"] as string}
default={latest.sky["fog-color"].default}
onChange={(value) => this.changeSkyProperty("fog-color", value)}
/>
<FieldNumber
label={t("Sky horizon blend")}
data-wd-key="modal:settings.sky-horizon-blend"
fieldSpec={latest.sky["sky-horizon-blend"]}
value={sky["sky-horizon-blend"] as number}
default={latest.sky["sky-horizon-blend"].default}
onChange={(value) => this.changeSkyProperty("sky-horizon-blend", value)}
/>
<FieldNumber
label={t("Horizon fog blend")}
data-wd-key="modal:settings.horizon-fog-blend"
fieldSpec={latest.sky["horizon-fog-blend"]}
value={sky["horizon-fog-blend"] as number}
default={latest.sky["horizon-fog-blend"].default}
onChange={(value) => this.changeSkyProperty("horizon-fog-blend", value)}
/>
<FieldNumber
label={t("Fog ground blend")}
data-wd-key="modal:settings.fog-ground-blend"
fieldSpec={latest.sky["fog-ground-blend"]}
value={sky["fog-ground-blend"] as number}
default={latest.sky["fog-ground-blend"].default}
onChange={(value) => this.changeSkyProperty("fog-ground-blend", value)}
/>
<FieldNumber
label={t("Atmosphere blend")}
data-wd-key="modal:settings.atmosphere-blend"
fieldSpec={latest.sky["atmosphere-blend"]}
value={sky["atmosphere-blend"] as number}
default={latest.sky["atmosphere-blend"].default}
onChange={(value) => this.changeSkyProperty("atmosphere-blend", value)}
/>
<FieldNumber
label={t("Transition delay")}
data-wd-key="modal:settings.transition-delay"
+1 -11
View File
@@ -13,12 +13,10 @@
"Add Variable": "Dəyişən Əlavə Et",
"any filter matches": "istənilən süzgəc uyğun gəlirsə",
"API key for Stadia Maps.": "Stadia Maps üçün API açarı.",
"Atmosphere blend": "Atmosfer qarışığı",
"Base": "Baza",
"Bearing": "İstiqamət",
"Cancel": "Ləğv et",
"Center": "Mərkəz",
"Center altitude": "Mərkəzin hündürlüyü",
"Choose Public Source": "İctimai Mənbə Seç",
"Choose the default Maputnik renderer for this style.": "Bu üslub üçün defolt Maputnik renderer-ini seçin.",
"Click to close the editor": "Redaktoru bağlamaq üçün klikləyin",
@@ -65,9 +63,6 @@
"Export modal": "İxrac modalı",
"Filter": "Süzgəc",
"Focus map": "Xəritəyə fokuslan",
"Fog color": "Duman rəngi",
"Fog ground blend": "Duman-yer qarışığı",
"Font faces": "Şrift faylları",
"Function": "Funksiya",
"Gallery Styles": "Qalereya Üslubları",
"General layout properties": "Ümumi düzülüş xassələri",
@@ -80,8 +75,6 @@
"Glyphs URL": "Şriftlər URL-i",
"Help": "Kömək",
"Hide": "Gizlət",
"Horizon color": "Üfüq rəngi",
"Horizon fog blend": "Üfüq-duman qarışığı",
"Icon layout properties": "İkon düzülüş xassələri",
"Icon paint properties": "İkon boyama xassələri",
"If the Map is in focused you can use the following shortcuts": "Xəritə fokusdadırsa aşağıdakı qısayollardan istifadə edə bilərsiniz",
@@ -129,11 +122,11 @@
"No global state variables defined. Add variables to create reusable values in your style.": "Heç bir qlobal vəziyyət dəyişəni təyin edilməyib. Üslubunuzda təkrar istifadə oluna bilən dəyərlər yaratmaq üçün dəyişən əlavə edin.",
"Open": "Aç",
"Open a local JSON style from your computer.": "Kompüterinizdən yerli JSON üslubunu açın.",
"OpenLayers (experimental)": "OpenLayers (eksperimental)",
"Open local Style": "Yerli Üslubu Aç",
"Open modal": "Modalı aç",
"Open one of the publicly available styles to start from.": "Başlamaq üçün ictimai üslublardan birini açın.",
"Open Style": "Üslubu Aç",
"OpenLayers (experimental)": "OpenLayers (eksperimental)",
"Options": "Seçimlər",
"Output value": "Çıxış dəyəri",
"Owner": "Sahib",
@@ -160,7 +153,6 @@
"Remove variable": "Dəyişəni sil",
"Remove zoom level from stop": "Dayanacaqdan yaxınlaşma səviyyəsini sil",
"Revert from expression": "İfadədən geri qaytar",
"Roll": "Fırlanma",
"Save": "Yadda saxla",
"Save as": "Fərqli yadda saxla",
"Save Style": "Üslubu Yadda Saxla",
@@ -171,8 +163,6 @@
"Shortcuts": "Qısayollar",
"Shortcuts menu": "Qısayollar menyusu",
"Show": "Göstər",
"Sky color": "Səma rəngi",
"Sky horizon blend": "Səma-üfüq qarışığı",
"Source": "Mənbə",
"Source ID": "Mənbə ID",
"Source Layer": "Mənbə Qatı",
+5 -13
View File
@@ -13,12 +13,10 @@
"Add Variable": "Variable hinzufügen",
"any filter matches": "irgendein Filter passt",
"API key for Stadia Maps.": "API-Schlüssel für Stadia Maps.",
"Atmosphere blend": "Atmosphärenüberblendung",
"Base": "Basis",
"Bearing": "Ausrichtung",
"Cancel": "Abbrechen",
"Center": "Mittelpunkt",
"Center altitude": "Höhe des Mittelpunkts",
"Choose Public Source": "Öffentliche Quelle auswählen",
"Choose the default Maputnik renderer for this style.": "Wähle den Standard-Renderer für diesen Stil aus.",
"Click to close the editor": "Klicken Sie hier, um den Editor zu schließen",
@@ -56,7 +54,8 @@
"Delete expression": "Ausdruck löschen",
"Delete filter block": "Filterblock löschen",
"Deuteranopia filter": "Deuteranopie-Filter",
"Drag and drop a style JSON file here or click to browse": "Ziehen Sie eine Style-JSON-Datei hierher oder klicken Sie, um zu durchsuchen",
"Drag to resize the layer list": "Ziehen, um die Ebenenliste zu skalieren",
"Drag to resize the sidebar": "Ziehen, um die Seitenleiste zu skalieren",
"Duplicate": "Duplizieren",
"Encoding": "Kodierung",
"Enter URL...": "URL eingeben...",
@@ -65,9 +64,6 @@
"Export modal": "Modale Fenster exportieren",
"Filter": "Filter",
"Focus map": "Karte fokussieren",
"Fog color": "Nebelfarbe",
"Fog ground blend": "Nebel-Boden-Überblendung",
"Font faces": "Schriftdateien",
"Function": "Funktion",
"Gallery Styles": "Galerie-Stile",
"General layout properties": "Allgemeine Layouteigenschaften",
@@ -80,8 +76,6 @@
"Glyphs URL": "Glyphen-URL",
"Help": "Hilfe",
"Hide": "Verstecken",
"Horizon color": "Horizontfarbe",
"Horizon fog blend": "Horizont-Nebel-Überblendung",
"Icon layout properties": "Icon-Layouteigenschaften",
"Icon paint properties": "Icon-Darstellungseigenschaften",
"If the Map is in focused you can use the following shortcuts": "Wenn die Karte fokussiert ist, kannst du die folgenden Shortcuts benutzen",
@@ -129,11 +123,11 @@
"No global state variables defined. Add variables to create reusable values in your style.": "Keine globalen Zustandsvariablen definiert. Füge Variablen hinzu, um wiederverwendbare Werte in deinem Stil zu erstellen.",
"Open": "Öffnen",
"Open a local JSON style from your computer.": "Öffne einen lokalen JSON Stil von deinem Computer.",
"OpenLayers (experimental)": "OpenLayers (experimentell)",
"Open local Style": "Lokalen Stil öffnen",
"Open modal": "Modale Fenster öffnen",
"Open one of the publicly available styles to start from.": "Öffne einen der öffentlich verfügbaren Stile, um zu starten.",
"Open Style": "Stil öffnen",
"OpenLayers (experimental)": "OpenLayers (experimentell)",
"Options": "Optionen",
"Output value": "Ausgabewert",
"Owner": "Besitzer",
@@ -160,7 +154,6 @@
"Remove variable": "Variable entfernen",
"Remove zoom level from stop": "Zoom-Stufe vom Stopp entfernen",
"Revert from expression": "Vom Ausdruck zurücksetzen",
"Roll": "Rollwinkel",
"Save": "Speichern",
"Save as": "Speichern unter",
"Save Style": "Stil Speichern",
@@ -171,8 +164,6 @@
"Shortcuts": "Shortcuts",
"Shortcuts menu": "Shortcuts-Menü",
"Show": "Anzeigen",
"Sky color": "Himmelsfarbe",
"Sky horizon blend": "Himmel-Horizont-Überblendung",
"Source": "Quelle",
"Source ID": "Quellen-ID",
"Source Layer": "Quellenebene",
@@ -210,5 +201,6 @@
"Video URL": "Video-URL",
"View": "Ansicht",
"You've entered an old style filter.": "Du hast einen alten Filter-Stil eingegeben.",
"Zoom": "Zoom"
"Zoom": "Zoom",
"Drag and drop a style JSON file here or click to browse": "Ziehen Sie eine Style-JSON-Datei hierher oder klicken Sie, um zu durchsuchen"
}
+5 -13
View File
@@ -13,12 +13,10 @@
"Add Variable": "Ajouter une variable",
"any filter matches": "l'un des filtres correspond",
"API key for Stadia Maps.": "Clé d'API pour Stadia Maps.",
"Atmosphere blend": "Fondu de l'atmosphère",
"Base": "Base",
"Bearing": "Orientation",
"Cancel": "Annuler",
"Center": "Centre",
"Center altitude": "Altitude du centre",
"Choose Public Source": "Choisir une source publique",
"Choose the default Maputnik renderer for this style.": "Choisissez le moteur de rendu Maputnik par défaut pour ce style.",
"Click to close the editor": "Cliquez pour fermer l'éditeur",
@@ -56,7 +54,8 @@
"Delete expression": "Supprimer l'expression",
"Delete filter block": "Supprimer le bloc de filtre",
"Deuteranopia filter": "Filtre Deutéranopie",
"Drag and drop a style JSON file here or click to browse": "Faites glisser un fichier JSON de style ici ou cliquez pour parcourir",
"Drag to resize the layer list": "Glisser pour redimensionner la liste des calques",
"Drag to resize the sidebar": "Glisser pour redimensionner la barre latérale",
"Duplicate": "Dupliquer",
"Encoding": "Encodage",
"Enter URL...": "Entrez l'URL...",
@@ -65,9 +64,6 @@
"Export modal": "Exporter (modale)",
"Filter": "Filtre",
"Focus map": "Focus sur la carte",
"Fog color": "Couleur du brouillard",
"Fog ground blend": "Fondu brouillard-sol",
"Font faces": "Fichiers de police",
"Function": "Fonction",
"Gallery Styles": "Styles de la galerie",
"General layout properties": "Propriétés générales de mise en page",
@@ -80,8 +76,6 @@
"Glyphs URL": "URL des glyphes",
"Help": "Aide",
"Hide": "Cacher",
"Horizon color": "Couleur de l'horizon",
"Horizon fog blend": "Fondu horizon-brouillard",
"Icon layout properties": "Propriétés de mise en page de l'icône",
"Icon paint properties": "Propriétés de peinture de l'icône",
"If the Map is in focused you can use the following shortcuts": "Si la carte a le focus, vous pouvez utiliser les raccourcis suivants",
@@ -129,11 +123,11 @@
"No global state variables defined. Add variables to create reusable values in your style.": "Aucune variable d'état global définie. Ajoutez des variables pour créer des valeurs réutilisables dans votre style.",
"Open": "Ouvrir",
"Open a local JSON style from your computer.": "Ouvrir un style JSON local depuis votre ordinateur.",
"OpenLayers (experimental)": "OpenLayers (expérimental)",
"Open local Style": "Ouvrir un style local",
"Open modal": "Ouvrir (modale)",
"Open one of the publicly available styles to start from.": "Ouvrez l'un des styles publics disponibles pour commencer.",
"Open Style": "Ouvrir le style",
"OpenLayers (experimental)": "OpenLayers (expérimental)",
"Options": "Options",
"Output value": "Valeur de sortie",
"Owner": "Propriétaire",
@@ -160,7 +154,6 @@
"Remove variable": "Supprimer la variable",
"Remove zoom level from stop": "Supprimer le niveau de zoom de l'arrêt",
"Revert from expression": "Annuler l'expression",
"Roll": "Roulis",
"Save": "Enregistrer",
"Save as": "Enregistrer sous",
"Save Style": "Enregistrer le style",
@@ -171,8 +164,6 @@
"Shortcuts": "Raccourcis",
"Shortcuts menu": "Menu des raccourcis",
"Show": "Afficher",
"Sky color": "Couleur du ciel",
"Sky horizon blend": "Fondu ciel-horizon",
"Source": "Source",
"Source ID": "ID de la source",
"Source Layer": "Calque Source",
@@ -210,5 +201,6 @@
"Video URL": "URL de la vidéo",
"View": "Vue",
"You've entered an old style filter.": "Vous avez entré un ancien style de filtre.",
"Zoom": "Zoom"
"Zoom": "Zoom",
"Drag and drop a style JSON file here or click to browse": "Faites glisser un fichier JSON de style ici ou cliquez pour parcourir"
}
+5 -13
View File
@@ -13,12 +13,10 @@
"Add Variable": "הוסף משתנה",
"any filter matches": "אחד הסינוים מתאימים",
"API key for Stadia Maps.": "API key for Stadia Maps",
"Atmosphere blend": "מיזוג אטמוספרה",
"Base": "בסיס",
"Bearing": "כיוון",
"Cancel": "ביטול",
"Center": "מרכז",
"Center altitude": "גובה המרכז",
"Choose Public Source": "בחירת מקור ציבורי",
"Choose the default Maputnik renderer for this style.": "בחירת צייר ברירת המחדל של מפוטניק עבור הסטייל הזה",
"Click to close the editor": "לחץ לסגירת העורך",
@@ -56,7 +54,8 @@
"Delete expression": "מחיקת ביטוי",
"Delete filter block": "מחיקת גוש מסנן",
"Deuteranopia filter": "Deuteranopia filter",
"Drag and drop a style JSON file here or click to browse": "גרור ושחרר כאן קובץ JSON של סגנון או לחץ כדי לעיין",
"Drag to resize the layer list": "יש לגרור כדי לשנות את גודל רשימת השכבות",
"Drag to resize the sidebar": "יש לגרור כדי לשנות את גודל סרגל הצד",
"Duplicate": "שכפול",
"Encoding": "קידוד",
"Enter URL...": "הכנסו כתובת",
@@ -65,9 +64,6 @@
"Export modal": "חלונית ייצוא",
"Filter": "סינון",
"Focus map": "פיקוס המפה",
"Fog color": "צבע ערפל",
"Fog ground blend": "מיזוג ערפל עם הקרקע",
"Font faces": "קבצי גופנים",
"Function": "פונקציה",
"Gallery Styles": "גלריית סטיילים",
"General layout properties": "תכונות פריסה כלליות",
@@ -80,8 +76,6 @@
"Glyphs URL": "כתובת סמלילים",
"Help": "עזרה",
"Hide": "הסתרה",
"Horizon color": "צבע האופק",
"Horizon fog blend": "מיזוג ערפל באופק",
"Icon layout properties": "תכונות פריסה של סמליל",
"Icon paint properties": "תכונות ציור של סמליל",
"If the Map is in focused you can use the following shortcuts": "אם המפה נמצאת בפוקוס תוכלו להשתמש בקיצורי הדרך",
@@ -129,11 +123,11 @@
"No global state variables defined. Add variables to create reusable values in your style.": "לא הוגדרו משתני מצב גלובלי. הוסף משתנים כדי ליצור ערכים שניתן לעשות בהם שימוש חוזר בסטייל שלך.",
"Open": "פתיחה",
"Open a local JSON style from your computer.": "פתיחת סטייל JSON מקומי מהמחשב שלך.",
"OpenLayers (experimental)": "OpenLayers (experimental)",
"Open local Style": "פתיחת סטייל מקומי",
"Open modal": "פתיחת חלונית",
"Open one of the publicly available styles to start from.": "פתיחת אחד הסטייליםפ הציבוריים על מנת להתחיל מהם.",
"Open Style": "פתיחת סטייל",
"OpenLayers (experimental)": "OpenLayers (experimental)",
"Options": "אפשרויות",
"Output value": "ערך החזרה",
"Owner": "שייך ל",
@@ -160,7 +154,6 @@
"Remove variable": "הסר משתנה",
"Remove zoom level from stop": "הסרת רמת זום מעצירה",
"Revert from expression": "החזרה מביטוי",
"Roll": "גלגול",
"Save": "שמור",
"Save as": "שמירה בשם",
"Save Style": "שמירת הסטייל",
@@ -171,8 +164,6 @@
"Shortcuts": "קיצורי דרך",
"Shortcuts menu": "תפריט קיצורי דרך",
"Show": "הצגה",
"Sky color": "צבע השמיים",
"Sky horizon blend": "מיזוג שמיים ואופק",
"Source": "מקור",
"Source ID": "מזהה מקור",
"Source Layer": "שכבת מקור",
@@ -210,5 +201,6 @@
"Video URL": "כתובת וידאו",
"View": "תצוגה",
"You've entered an old style filter.": "הכנסתם סינון מסוג ישן,",
"Zoom": "זום"
"Zoom": "זום",
"Drag and drop a style JSON file here or click to browse": "גרור ושחרר כאן קובץ JSON של סגנון או לחץ כדי לעיין"
}
+5 -13
View File
@@ -13,12 +13,10 @@
"Add Variable": "Aggiungi variabile",
"any filter matches": "qualsiasi filtro corrisponde",
"API key for Stadia Maps.": "Chiave API per Stadia Maps.",
"Atmosphere blend": "Sfumatura dell'atmosfera",
"Base": "Base",
"Bearing": "Direzione",
"Cancel": "Annulla",
"Center": "Centro",
"Center altitude": "Altitudine del centro",
"Choose Public Source": "Scegli una sorgente pubblica",
"Choose the default Maputnik renderer for this style.": "Scegli il renderer predefinito di Maputnik per questo stile.",
"Click to close the editor": "Clicca per chiudere l'editor",
@@ -56,7 +54,8 @@
"Delete expression": "Elimina espressione",
"Delete filter block": "Elimina blocco filtro",
"Deuteranopia filter": "Filtro deuteranopia",
"Drag and drop a style JSON file here or click to browse": "Trascina e rilascia qui un file JSON dello stile o fai clic per sfogliare",
"Drag to resize the layer list": "Trascina per ridimensionare l'elenco dei livelli",
"Drag to resize the sidebar": "Trascina per ridimensionare la barra laterale",
"Duplicate": "Duplica",
"Encoding": "Codifica",
"Enter URL...": "Inserisci URL...",
@@ -65,9 +64,6 @@
"Export modal": "Esporta finestra modale",
"Filter": "Filtro",
"Focus map": "Metti a fuoco la mappa",
"Fog color": "Colore della nebbia",
"Fog ground blend": "Sfumatura nebbia-suolo",
"Font faces": "File dei font",
"Function": "Funzione",
"Gallery Styles": "Galleria degli stili",
"General layout properties": "Proprietà generali del layout",
@@ -80,8 +76,6 @@
"Glyphs URL": "URL Glyphs",
"Help": "Aiuto",
"Hide": "Nascondi",
"Horizon color": "Colore dell'orizzonte",
"Horizon fog blend": "Sfumatura orizzonte-nebbia",
"Icon layout properties": "Proprietà di layout dell'icona",
"Icon paint properties": "Proprietà di pittura dell'icona",
"If the Map is in focused you can use the following shortcuts": "Se la mappa è attiva, puoi utilizzare le seguenti scorciatoie:",
@@ -129,11 +123,11 @@
"No global state variables defined. Add variables to create reusable values in your style.": "Nessuna variabile di stato globale definita. Aggiungi variabili per creare valori riutilizzabili nel tuo stile.",
"Open": "Apri",
"Open a local JSON style from your computer.": "Apri uno stile JSON dal tuo computer.",
"OpenLayers (experimental)": "OpenLayers (sperimentale)",
"Open local Style": "Apri stile locale",
"Open modal": "Apri finestra modale",
"Open one of the publicly available styles to start from.": "Apro uno degli stili pubblici a partire da.",
"Open Style": "Apri stile",
"OpenLayers (experimental)": "OpenLayers (sperimentale)",
"Options": "Opzioni",
"Output value": "Valore di output",
"Owner": "Proprietario",
@@ -160,7 +154,6 @@
"Remove variable": "Rimuovi variabile",
"Remove zoom level from stop": "Rimuovi il livello di zoom dalla fermata",
"Revert from expression": "Ripristina dall'espressione",
"Roll": "Rollio",
"Save": "Salva",
"Save as": "Salva con nome",
"Save Style": "Opzioni stile",
@@ -171,8 +164,6 @@
"Shortcuts": "Scorciatoie",
"Shortcuts menu": "Scorciatoie del menu",
"Show": "Mostra",
"Sky color": "Colore del cielo",
"Sky horizon blend": "Sfumatura cielo-orizzonte",
"Source": "Sorgente",
"Source ID": "ID sorgente",
"Source Layer": "Livello sorgente",
@@ -210,5 +201,6 @@
"Video URL": "Indirizzo video",
"View": "Vista",
"You've entered an old style filter.": "Hai inserito uno stile filtro obsoleto.",
"Zoom": "Zoom"
"Zoom": "Zoom",
"Drag and drop a style JSON file here or click to browse": "Trascina e rilascia qui un file JSON dello stile o fai clic per sfogliare"
}
+5 -13
View File
@@ -13,12 +13,10 @@
"Add Variable": "変数を追加",
"any filter matches": "いずれかのフィルタが一致",
"API key for Stadia Maps.": "Stadia Maps の API キー",
"Atmosphere blend": "大気のブレンド",
"Base": "ベース",
"Bearing": "方位",
"Cancel": "キャンセル",
"Center": "中央",
"Center altitude": "中央の高度",
"Choose Public Source": "公開ソースから選択",
"Choose the default Maputnik renderer for this style.": "このスタイルのデフォルトの Maputnik レンダラを選択してください",
"Click to close the editor": "エディタを閉じるにはクリックしてください",
@@ -56,7 +54,8 @@
"Delete expression": "式を削除",
"Delete filter block": "フィルタブロックを削除",
"Deuteranopia filter": "緑色盲フィルタ",
"Drag and drop a style JSON file here or click to browse": "ここにスタイルのJSONファイルをドラッグ&ドロップするか、クリックして参照してください",
"Drag to resize the layer list": "ドラッグしてレイヤーリストのサイズを変更",
"Drag to resize the sidebar": "ドラッグしてサイドバーのサイズを変更",
"Duplicate": "複製",
"Encoding": "エンコーディング",
"Enter URL...": "URLを入力",
@@ -65,9 +64,6 @@
"Export modal": "書き出しのモーダル",
"Filter": "フィルタ",
"Focus map": "地図にフォーカス",
"Fog color": "霧の色",
"Fog ground blend": "霧と地面のブレンド",
"Font faces": "フォントファイル",
"Function": "関数",
"Gallery Styles": "ギャラリースタイル",
"General layout properties": "一般レイアウトプロパティ",
@@ -80,8 +76,6 @@
"Glyphs URL": "フォントグリフURL",
"Help": "ヘルプ",
"Hide": "非表示",
"Horizon color": "地平線の色",
"Horizon fog blend": "地平線と霧のブレンド",
"Icon layout properties": "アイコンレイアウトプロパティ",
"Icon paint properties": "アイコンペイントプロパティ",
"If the Map is in focused you can use the following shortcuts": "地図がフォーカスされている場合、以下のショートカットを使用できます",
@@ -129,11 +123,11 @@
"No global state variables defined. Add variables to create reusable values in your style.": "グローバルステート変数が定義されていません。スタイルで再利用可能な値を作成するには、変数を追加してください。",
"Open": "開く",
"Open a local JSON style from your computer.": "コンピュータからローカルJSONスタイルを開きます。",
"OpenLayers (experimental)": "OpenLayers (実験的)",
"Open local Style": "ローカルスタイルを開く",
"Open modal": "モーダルを開く",
"Open one of the publicly available styles to start from.": "公開スタイルを選んで開始しましょう。",
"Open Style": "スタイルを開く",
"OpenLayers (experimental)": "OpenLayers (実験的)",
"Options": "設定",
"Output value": "値",
"Owner": "所有者",
@@ -160,7 +154,6 @@
"Remove variable": "変数を削除",
"Remove zoom level from stop": "ズームレベルをストップから削除",
"Revert from expression": "式から戻す",
"Roll": "ロール",
"Save": "保存",
"Save as": "名前を付けて保存",
"Save Style": "スタイルを保存",
@@ -171,8 +164,6 @@
"Shortcuts": "ショートカット",
"Shortcuts menu": "ショートカットメニュー",
"Show": "表示",
"Sky color": "空の色",
"Sky horizon blend": "空と地平線のブレンド",
"Source": "ソース",
"Source ID": "ソースID",
"Source Layer": "ソースレイヤ",
@@ -210,5 +201,6 @@
"Video URL": "動画URL",
"View": "表示",
"You've entered an old style filter.": "旧型フィルタを使用しております。",
"Zoom": "ズーム"
"Zoom": "ズーム",
"Drag and drop a style JSON file here or click to browse": "ここにスタイルのJSONファイルをドラッグ&ドロップするか、クリックして参照してください"
}
+5 -13
View File
@@ -13,12 +13,10 @@
"Add Variable": "변수 추가",
"any filter matches": "일부 필터 일치",
"API key for Stadia Maps.": "Stadia Maps용 API 키 입니다.",
"Atmosphere blend": "대기 블렌드",
"Base": "베이스",
"Bearing": "방위각",
"Cancel": "취소",
"Center": "중심 좌표",
"Center altitude": "중심 고도",
"Choose Public Source": "공개 소스 선택",
"Choose the default Maputnik renderer for this style.": "이 스타일의 기본 Maputnik 렌더러를 선택하세요.",
"Click to close the editor": "편집기를 닫으려면 클릭하세요",
@@ -56,7 +54,8 @@
"Delete expression": "표현식 삭제",
"Delete filter block": "필터 블록 삭제",
"Deuteranopia filter": "녹색맹 필터",
"Drag and drop a style JSON file here or click to browse": "여기에 스타일 JSON 파일을 끌어다 놓거나 클릭하여 찾아보세요",
"Drag to resize the layer list": "드래그하여 레이어 목록 크기 조정",
"Drag to resize the sidebar": "드래그하여 사이드바 크기 조정",
"Duplicate": "복제",
"Encoding": "인코딩",
"Enter URL...": "URL 입력...",
@@ -65,9 +64,6 @@
"Export modal": "모달 내보내기",
"Filter": "필터",
"Focus map": "포커스 맵",
"Fog color": "안개 색상",
"Fog ground blend": "안개-지면 블렌드",
"Font faces": "폰트 파일",
"Function": "함수",
"Gallery Styles": "갤러리 스타일",
"General layout properties": "일반 레이아웃 속성",
@@ -80,8 +76,6 @@
"Glyphs URL": "글리프 URL",
"Help": "도움말",
"Hide": "숨기기",
"Horizon color": "지평선 색상",
"Horizon fog blend": "지평선-안개 블렌드",
"Icon layout properties": "아이콘 레이아웃 속성",
"Icon paint properties": "아이콘 페인트 속성",
"If the Map is in focused you can use the following shortcuts": "맵에 포커스가 맞춰진 경우 다음 단축키를 사용할 수 있습니다",
@@ -129,11 +123,11 @@
"No global state variables defined. Add variables to create reusable values in your style.": "전역 상태 변수가 정의되지 않았습니다. 스타일에서 재사용 가능한 값을 생성하려면 변수를 추가하세요.",
"Open": "열기",
"Open a local JSON style from your computer.": "컴퓨터에서 로컬 JSON 스타일을 엽니다.",
"OpenLayers (experimental)": "OpenLayers (실험적)",
"Open local Style": "로컬 스타일 열기",
"Open modal": "모달 열기",
"Open one of the publicly available styles to start from.": "공개 스타일 중 하나를 선택하여 시작하세요.",
"Open Style": "스타일 열기",
"OpenLayers (experimental)": "OpenLayers (실험적)",
"Options": "옵션",
"Output value": "값",
"Owner": "소유자",
@@ -160,7 +154,6 @@
"Remove variable": "변수 제거",
"Remove zoom level from stop": "기준점에서 줌 레벨 제거",
"Revert from expression": "표현식에서 되돌리기",
"Roll": "롤 각도",
"Save": "저장",
"Save as": "다른 이름으로 저장",
"Save Style": "스타일 저장",
@@ -171,8 +164,6 @@
"Shortcuts": "단축키",
"Shortcuts menu": "단축키 메뉴",
"Show": "표시",
"Sky color": "하늘 색상",
"Sky horizon blend": "하늘-지평선 블렌드",
"Source": "소스",
"Source ID": "소스 ID",
"Source Layer": "소스 레이어",
@@ -210,5 +201,6 @@
"Video URL": "비디오 URL",
"View": "보기",
"You've entered an old style filter.": "이전 스타일 필터를 입력했습니다.",
"Zoom": "줌"
"Zoom": "줌",
"Drag and drop a style JSON file here or click to browse": "여기에 스타일 JSON 파일을 끌어다 놓거나 클릭하여 찾아보세요"
}
+3 -11
View File
@@ -13,12 +13,10 @@
"Add Variable": "Değişken Ekle",
"any filter matches": "herhangi bir filtre eşleşirse",
"API key for Stadia Maps.": "Stadia Maps için API anahtarı.",
"Atmosphere blend": "Atmosfer karışımı",
"Base": "Temel",
"Bearing": "Yön",
"Cancel": "İptal",
"Center": "Merkez",
"Center altitude": "Merkez yüksekliği",
"Choose Public Source": "Herkese Açık Kaynak Seç",
"Choose the default Maputnik renderer for this style.": "Bu stil için varsayılan Maputnik işleyicisini seçin.",
"Click to close the editor": "Düzenleyiciyi kapatmak için tıklayın",
@@ -57,6 +55,8 @@
"Delete filter block": "Filtre bloğunu sil",
"Deuteranopia filter": "Döteranopi filtresi",
"Drag and drop a style JSON file here or click to browse": "Bir stil JSON dosyasını buraya sürükleyip bırakın veya göz atmak için tıklayın",
"Drag to resize the layer list": "Katman listesini yeniden boyutlandırmak için sürükleyin",
"Drag to resize the sidebar": "Kenar çubuğunu yeniden boyutlandırmak için sürükleyin",
"Duplicate": "Kopyala",
"Encoding": "Kodlama",
"Enter URL...": "URL girin...",
@@ -65,9 +65,6 @@
"Export modal": "Dışa aktarma modalı",
"Filter": "Filtre",
"Focus map": "Haritaya odaklan",
"Fog color": "Sis rengi",
"Fog ground blend": "Sis-zemin karışımı",
"Font faces": "Yazı tipi dosyaları",
"Function": "Fonksiyon",
"Gallery Styles": "Galeri Stilleri",
"General layout properties": "Genel yerleşim özellikleri",
@@ -80,8 +77,6 @@
"Glyphs URL": "Glif URL'si",
"Help": "Yardım",
"Hide": "Gizle",
"Horizon color": "Ufuk rengi",
"Horizon fog blend": "Ufuk-sis karışımı",
"Icon layout properties": "Simge yerleşim özellikleri",
"Icon paint properties": "Simge boyama özellikleri",
"If the Map is in focused you can use the following shortcuts": "Harita odaktaysa aşağıdaki kısayolları kullanabilirsiniz",
@@ -129,11 +124,11 @@
"No global state variables defined. Add variables to create reusable values in your style.": "Genel durum değişkeni tanımlanmadı. Stilinizde yeniden kullanılabilir değerler oluşturmak için değişken ekleyin.",
"Open": "Aç",
"Open a local JSON style from your computer.": "Bilgisayarınızdan yerel bir JSON stili açın.",
"OpenLayers (experimental)": "OpenLayers (deneysel)",
"Open local Style": "Yerel Stili Aç",
"Open modal": "Modalı aç",
"Open one of the publicly available styles to start from.": "Başlamak için herkese açık stillerden birini açın.",
"Open Style": "Stili Aç",
"OpenLayers (experimental)": "OpenLayers (deneysel)",
"Options": "Seçenekler",
"Output value": "Çıkış değeri",
"Owner": "Sahip",
@@ -160,7 +155,6 @@
"Remove variable": "Değişkeni kaldır",
"Remove zoom level from stop": "Duraktan yakınlaştırma seviyesini kaldır",
"Revert from expression": "İfadeden geri dön",
"Roll": "Yuvarlanma",
"Save": "Kaydet",
"Save as": "Farklı kaydet",
"Save Style": "Stili Kaydet",
@@ -171,8 +165,6 @@
"Shortcuts": "Kısayollar",
"Shortcuts menu": "Kısayollar menüsü",
"Show": "Göster",
"Sky color": "Gökyüzü rengi",
"Sky horizon blend": "Gökyüzü-ufuk karışımı",
"Source": "Kaynak",
"Source ID": "Kaynak Kimliği",
"Source Layer": "Kaynak Katmanı",
+5 -13
View File
@@ -13,12 +13,10 @@
"Add Variable": "添加变量",
"any filter matches": "任何过滤器匹配",
"API key for Stadia Maps.": "Stadia Maps 的 API 密钥",
"Atmosphere blend": "大气混合",
"Base": "基础",
"Bearing": "方位",
"Cancel": "取消",
"Center": "中心",
"Center altitude": "中心海拔",
"Choose Public Source": "选择公共源",
"Choose the default Maputnik renderer for this style.": "为这种样式选择默认的Maputnik渲染器。",
"Click to close the editor": "点击关闭编辑器",
@@ -56,7 +54,8 @@
"Delete expression": "删除表达式",
"Delete filter block": "删除过滤器块",
"Deuteranopia filter": "绿色盲滤镜",
"Drag and drop a style JSON file here or click to browse": "将样式 JSON 文件拖放到此处或点击以浏览",
"Drag to resize the layer list": "拖动以调整图层列表大小",
"Drag to resize the sidebar": "拖动以调整侧边栏大小",
"Duplicate": "复制",
"Encoding": "编码",
"Enter URL...": "输入URL...",
@@ -65,9 +64,6 @@
"Export modal": "导出模态框",
"Filter": "过滤器",
"Focus map": "聚焦地图",
"Fog color": "雾颜色",
"Fog ground blend": "雾与地面混合",
"Font faces": "字体文件",
"Function": "函数",
"Gallery Styles": "画廊样式",
"General layout properties": "常规布局属性",
@@ -80,8 +76,6 @@
"Glyphs URL": "字形URL",
"Help": "帮助",
"Hide": "隐藏",
"Horizon color": "地平线颜色",
"Horizon fog blend": "地平线与雾混合",
"Icon layout properties": "图标布局属性",
"Icon paint properties": "图标绘制属性",
"If the Map is in focused you can use the following shortcuts": "如果地图处于焦点状态,您可以使用以下快捷键",
@@ -129,11 +123,11 @@
"No global state variables defined. Add variables to create reusable values in your style.": "未定义全局状态变量。添加变量以在样式中创建可重用的值。",
"Open": "打开",
"Open a local JSON style from your computer.": "从您的计算机打开本地JSON样式。",
"OpenLayers (experimental)": "OpenLayers(实验性)",
"Open local Style": "打开本地样式",
"Open modal": "打开模态框",
"Open one of the publicly available styles to start from.": "打开一个公开可用的样式开始。",
"Open Style": "打开样式",
"OpenLayers (experimental)": "OpenLayers(实验性)",
"Options": "选项",
"Output value": "输出值",
"Owner": "所有者",
@@ -160,7 +154,6 @@
"Remove variable": "移除变量",
"Remove zoom level from stop": "从停靠点移除缩放级别",
"Revert from expression": "从表达式恢复",
"Roll": "翻滚角",
"Save": "保存",
"Save as": "另存为",
"Save Style": "保存样式",
@@ -171,8 +164,6 @@
"Shortcuts": "快捷键",
"Shortcuts menu": "快捷方式菜单",
"Show": "显示",
"Sky color": "天空颜色",
"Sky horizon blend": "天空与地平线混合",
"Source": "源",
"Source ID": "源ID",
"Source Layer": "源图层",
@@ -210,5 +201,6 @@
"Video URL": "视频URL",
"View": "视图",
"You've entered an old style filter.": "您输入了一个旧风格的过滤器。",
"Zoom": "缩放"
"Zoom": "缩放",
"Drag and drop a style JSON file here or click to browse": "将样式 JSON 文件拖放到此处或点击以浏览"
}
+2 -1
View File
@@ -6,7 +6,8 @@
.maputnik-map__container {
background: white;
display: flex;
width: vars.$layout-map-width;
width: 100%;
height: 100%;
&--error {
align-items: center;
+57 -12
View File
@@ -28,31 +28,76 @@
display: flex;
}
&-list {
width: 200px;
background-color: vars.$color-black;
// The resizable panel group filling the main area.
&-panels {
flex: 1;
min-width: 0;
height: 100%;
}
&-sidebar-panels,
&-sidebar,
&-code-editor,
&-list,
&-drawer,
&-map {
height: 100%;
// scroll-container is position: absolute
position: relative;
}
&-sidebar,
&-code-editor,
&-list,
&-drawer {
width: 370px;
background-color: vars.$color-black;
// scroll-container is position: absolute
position: relative;
}
&-code-editor {
width: 570px;
background-color: vars.$color-black;
// scroll-container is position: absolute
&-resize-handle {
width: 5px;
background-color: transparent;
position: relative;
z-index: 5;
transition: background-color 0.15s ease;
&:hover,
&:active,
&:focus-visible {
background-color: rgba(vars.$color-lowgray, 0.5);
}
// The separator is keyboard resizable, so it needs a visible focus ring.
&:focus-visible {
outline: #8e8e8e auto 1px;
}
&::after {
content: "";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 3px;
height: 30px;
border-radius: 2px;
background-color: vars.$color-lowgray;
opacity: 0;
transition: opacity 0.15s ease;
}
&:hover::after,
&:active::after,
&:focus-visible::after {
opacity: 0.7;
}
}
&-bottom {
position: fixed;
bottom: 0;
right: 0;
z-index: 10;
width: vars.$layout-map-width;
inset-inline-start: var(--sidebar-width);
inset-inline-end: 0;
background-color: vars.$color-black;
}
}
-4
View File
@@ -21,10 +21,6 @@ $font-family: Roboto, sans-serif;
$toolbar-height: 40px;
$toolbar-offset: 0;
$layout-list-width: 200px;
$layout-editor-width: 370px;
$layout-map-width: calc(100% - #{$layout-list-width + $layout-editor-width});
// 'menu-down' from 'https://materialdesignicons.com/'
// See <https://github.com/Templarian/MaterialDesign/blob/master/LICENSE>
$icon-down-arrow: "data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24'><path fill='white' d='M7,10L12,15L17,10H7Z' /></svg>"