mirror of
https://github.com/maputnik/editor.git
synced 2026-09-12 07:17:26 +00:00
Compare commits
5 Commits
main
..
b8267508c4
| Author | SHA1 | Date | |
|---|---|---|---|
| b8267508c4 | |||
| 3c9cf15bf0 | |||
| 2b7a092ad3 | |||
| 705233241f | |||
| 3c1c3b6a74 |
@@ -5,6 +5,7 @@
|
|||||||
- Upgrade to MapLibre GL JS 6 and Vite 8, and update the remaining dependencies
|
- 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`
|
- 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
|
- Exported HTML now loads MapLibre GL JS as an ES module, since v6 no longer ships a UMD bundle
|
||||||
|
- 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..._
|
- _...Add new stuff here..._
|
||||||
|
|
||||||
### 🐞 Bug fixes
|
### 🐞 Bug fixes
|
||||||
|
|||||||
@@ -122,6 +122,8 @@ export class Assertable<T> {
|
|||||||
// Value assertions (auto-retrying for Query targets).
|
// Value assertions (auto-retrying for Query targets).
|
||||||
shouldEqual = (value: any) => this.assertValue((actual) => expect(actual).toBe(value));
|
shouldEqual = (value: any) => this.assertValue((actual) => expect(actual).toBe(value));
|
||||||
|
|
||||||
|
shouldBeGreaterThan = (value: number) => this.assertValue((actual) => expect(actual).toBeGreaterThan(value));
|
||||||
|
|
||||||
shouldInclude = (value: any) =>
|
shouldInclude = (value: any) =>
|
||||||
this.assertValue((actual) => {
|
this.assertValue((actual) => {
|
||||||
if (typeof value === "object" && value !== null) {
|
if (typeof value === "object" && value !== null) {
|
||||||
@@ -349,6 +351,15 @@ export class PlaywrightHelper {
|
|||||||
await this.page.mouse.up();
|
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) => {
|
clickCenter: async (testId: string) => {
|
||||||
const { x, y } = await centerOf(this.testId(testId));
|
const { x, y } = await centerOf(this.testId(testId));
|
||||||
await this.page.mouse.move(x, y);
|
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()),
|
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()),
|
elementsText: (testId: string) => new Query<string>(() => this.testId(testId).first().innerText()),
|
||||||
|
|
||||||
locationHash: () => new Query<string>(async () => new URL(this.page.url()).hash),
|
locationHash: () => new Query<string>(async () => new URL(this.page.url()).hash),
|
||||||
|
|||||||
@@ -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);
|
||||||
|
});
|
||||||
|
});
|
||||||
Generated
+84
-73
@@ -42,7 +42,7 @@
|
|||||||
"lodash.get": "^4.4.2",
|
"lodash.get": "^4.4.2",
|
||||||
"lodash.isequal": "^4.5.0",
|
"lodash.isequal": "^4.5.0",
|
||||||
"lodash.throttle": "^4.1.1",
|
"lodash.throttle": "^4.1.1",
|
||||||
"maplibre-gl": "^6.8.0",
|
"maplibre-gl": "^6.7.0",
|
||||||
"maputnik-design": "github:maputnik/design#172b06c",
|
"maputnik-design": "github:maputnik/design#172b06c",
|
||||||
"ol": "^10.10.0",
|
"ol": "^10.10.0",
|
||||||
"ol-mapbox-style": "^13.4.3",
|
"ol-mapbox-style": "^13.4.3",
|
||||||
@@ -58,6 +58,7 @@
|
|||||||
"react-i18next": "^17.0.13",
|
"react-i18next": "^17.0.13",
|
||||||
"react-icons": "^5.7.0",
|
"react-icons": "^5.7.0",
|
||||||
"react-markdown": "^10.1.0",
|
"react-markdown": "^10.1.0",
|
||||||
|
"react-resizable-panels": "^4.11.0",
|
||||||
"reconnecting-websocket": "^4.4.0",
|
"reconnecting-websocket": "^4.4.0",
|
||||||
"slugify": "^1.6.9",
|
"slugify": "^1.6.9",
|
||||||
"string-hash": "^1.1.3",
|
"string-hash": "^1.1.3",
|
||||||
@@ -107,7 +108,7 @@
|
|||||||
"stylelint-config-recommended-scss": "^17.0.1",
|
"stylelint-config-recommended-scss": "^17.0.1",
|
||||||
"stylelint-scss": "^7.2.0",
|
"stylelint-scss": "^7.2.0",
|
||||||
"typescript": "^6.0.3",
|
"typescript": "^6.0.3",
|
||||||
"typescript-eslint": "^8.70.0",
|
"typescript-eslint": "^8.69.0",
|
||||||
"uuid": "^14.0.2",
|
"uuid": "^14.0.2",
|
||||||
"vite": "^8.2.2",
|
"vite": "^8.2.2",
|
||||||
"vite-plugin-istanbul": "^9.0.1",
|
"vite-plugin-istanbul": "^9.0.1",
|
||||||
@@ -1719,9 +1720,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@maplibre/mlt": {
|
"node_modules/@maplibre/mlt": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/@maplibre/mlt/-/mlt-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/@maplibre/mlt/-/mlt-1.2.0.tgz",
|
||||||
"integrity": "sha512-5n5dgolE2EYxwCKgx8vlwURCB8A+kyfJJyThlYimjlGgOcOe2Bhw9VxxnnHC91OC9PgHg+nVdgVPTYPkIo62vg==",
|
"integrity": "sha512-g45M8gEI4sMO3X9ib4K7n3ZKFf0qQOL+NMkHCnEK51lOrYFHiEssOuZncx1+miIgi1IEE2NcbRMcq8RBkL+QHA==",
|
||||||
"license": "(MIT OR Apache-2.0)",
|
"license": "(MIT OR Apache-2.0)",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@mapbox/point-geometry": "^1.1.0"
|
"@mapbox/point-geometry": "^1.1.0"
|
||||||
@@ -3078,17 +3079,17 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/eslint-plugin": {
|
"node_modules/@typescript-eslint/eslint-plugin": {
|
||||||
"version": "8.70.0",
|
"version": "8.69.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.70.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.69.0.tgz",
|
||||||
"integrity": "sha512-/v8HZt6RlyIZxB3ntehELOcUcfxKPVGWXnQdJuHRmzrqgF8nQypcC/oxGW+Ot4VGKDq81XugPKxx0n5PBtf9PA==",
|
"integrity": "sha512-t5jQTKPIgVW1PE6dR6H6Qz5gm8zjMlX5/2gRaOGd9eO6V7J+tQc6iWKukEe7dY8u9HyYasQ0yfF0/FSSTEO2gA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@eslint-community/regexpp": "^4.12.2",
|
"@eslint-community/regexpp": "^4.12.2",
|
||||||
"@typescript-eslint/scope-manager": "8.70.0",
|
"@typescript-eslint/scope-manager": "8.69.0",
|
||||||
"@typescript-eslint/type-utils": "8.70.0",
|
"@typescript-eslint/type-utils": "8.69.0",
|
||||||
"@typescript-eslint/utils": "8.70.0",
|
"@typescript-eslint/utils": "8.69.0",
|
||||||
"@typescript-eslint/visitor-keys": "8.70.0",
|
"@typescript-eslint/visitor-keys": "8.69.0",
|
||||||
"ignore": "^7.0.5",
|
"ignore": "^7.0.5",
|
||||||
"natural-compare": "^1.4.0",
|
"natural-compare": "^1.4.0",
|
||||||
"ts-api-utils": "^2.5.0"
|
"ts-api-utils": "^2.5.0"
|
||||||
@@ -3101,15 +3102,15 @@
|
|||||||
"url": "https://opencollective.com/typescript-eslint"
|
"url": "https://opencollective.com/typescript-eslint"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@typescript-eslint/parser": "^8.70.0",
|
"@typescript-eslint/parser": "^8.69.0",
|
||||||
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
|
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
|
||||||
"typescript": ">=4.8.4 <6.1.0"
|
"typescript": ">=4.8.4 <6.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
|
"node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
|
||||||
"version": "7.0.9",
|
"version": "7.0.8",
|
||||||
"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.9.tgz",
|
"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.8.tgz",
|
||||||
"integrity": "sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw==",
|
"integrity": "sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -3117,16 +3118,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/parser": {
|
"node_modules/@typescript-eslint/parser": {
|
||||||
"version": "8.70.0",
|
"version": "8.69.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.70.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.69.0.tgz",
|
||||||
"integrity": "sha512-zYvrmj9Yxd63UGaXw+kdt6A0F0s0qveJyuatIM77bYC2DE4pgmg7a50u8LR7PRtXd0x+h+Tl3eXabGm06SWd3Q==",
|
"integrity": "sha512-l4b0DhWioGg6Gt2ebGlvfkFMOjRsauxtsnDRwUSRX1qHq3HdTfQHV8wW9zEXeciai6HfeaKOedQn2Zoofx3WBw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/scope-manager": "8.70.0",
|
"@typescript-eslint/scope-manager": "8.69.0",
|
||||||
"@typescript-eslint/types": "8.70.0",
|
"@typescript-eslint/types": "8.69.0",
|
||||||
"@typescript-eslint/typescript-estree": "8.70.0",
|
"@typescript-eslint/typescript-estree": "8.69.0",
|
||||||
"@typescript-eslint/visitor-keys": "8.70.0",
|
"@typescript-eslint/visitor-keys": "8.69.0",
|
||||||
"debug": "^4.4.3"
|
"debug": "^4.4.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -3142,14 +3143,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/project-service": {
|
"node_modules/@typescript-eslint/project-service": {
|
||||||
"version": "8.70.0",
|
"version": "8.69.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.70.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.69.0.tgz",
|
||||||
"integrity": "sha512-hFHbTNqhU9G+2eKFXCBVb1tjFT/LceiJ4+HfLO4pTpDI0KHi6iajpcFFkaSQ9gXmCh7n82A0PthaayEdN6mspQ==",
|
"integrity": "sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/tsconfig-utils": "^8.70.0",
|
"@typescript-eslint/tsconfig-utils": "^8.69.0",
|
||||||
"@typescript-eslint/types": "^8.70.0",
|
"@typescript-eslint/types": "^8.69.0",
|
||||||
"debug": "^4.4.3"
|
"debug": "^4.4.3"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -3164,14 +3165,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/scope-manager": {
|
"node_modules/@typescript-eslint/scope-manager": {
|
||||||
"version": "8.70.0",
|
"version": "8.69.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.70.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.69.0.tgz",
|
||||||
"integrity": "sha512-8nP3Kwh5hlgZ4FicGvmznAmJe8UL4sdU8tLukrPaMuQmDuk4Y8xYfzu/aYZW4xT2JCgc7H/TpDI5cGlxcWJSqQ==",
|
"integrity": "sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "8.70.0",
|
"@typescript-eslint/types": "8.69.0",
|
||||||
"@typescript-eslint/visitor-keys": "8.70.0"
|
"@typescript-eslint/visitor-keys": "8.69.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||||
@@ -3182,9 +3183,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/tsconfig-utils": {
|
"node_modules/@typescript-eslint/tsconfig-utils": {
|
||||||
"version": "8.70.0",
|
"version": "8.69.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.70.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.69.0.tgz",
|
||||||
"integrity": "sha512-adnkeeNq9Sq1sUf4+FRVc0KdgYghzsgFpZSQVZVvY0LCuUuN0FnQgyGzCJeC4fW1cdXseBAjU2EOqUIjbNcZUw==",
|
"integrity": "sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -3199,15 +3200,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/type-utils": {
|
"node_modules/@typescript-eslint/type-utils": {
|
||||||
"version": "8.70.0",
|
"version": "8.69.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.70.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.69.0.tgz",
|
||||||
"integrity": "sha512-NUMKIhYVaVIVLnRL9CRt+VVcuLgSHUCpXn4/+K8wql+vdInUzvx8BjUO1oJ7cG9shjFJKtF8F8Hh2kCh3/KBVw==",
|
"integrity": "sha512-ZfoJAVg3JZndQEpEl9petVlxau3lRuElc4HRMuAlLCf8to04/iHz692RUSNmXKDjEuJmIL+KZ2/BsOcBc16dsA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "8.70.0",
|
"@typescript-eslint/types": "8.69.0",
|
||||||
"@typescript-eslint/typescript-estree": "8.70.0",
|
"@typescript-eslint/typescript-estree": "8.69.0",
|
||||||
"@typescript-eslint/utils": "8.70.0",
|
"@typescript-eslint/utils": "8.69.0",
|
||||||
"debug": "^4.4.3",
|
"debug": "^4.4.3",
|
||||||
"ts-api-utils": "^2.5.0"
|
"ts-api-utils": "^2.5.0"
|
||||||
},
|
},
|
||||||
@@ -3224,9 +3225,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/types": {
|
"node_modules/@typescript-eslint/types": {
|
||||||
"version": "8.70.0",
|
"version": "8.69.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.70.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.69.0.tgz",
|
||||||
"integrity": "sha512-asTOIYhDg4zdzOScCyaytrsV3cR6B4ecPQlXw/dJIm7J/MZTtCtfVII9JD8Geh4jTCrK/Xe6cg5UevoleMcoJQ==",
|
"integrity": "sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -3238,16 +3239,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/typescript-estree": {
|
"node_modules/@typescript-eslint/typescript-estree": {
|
||||||
"version": "8.70.0",
|
"version": "8.69.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.70.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.69.0.tgz",
|
||||||
"integrity": "sha512-d9NmHMPEKQ7QCLLm1jI3zmoQBwT5KwFYjXBJ9ymZfKCUU+5rmTRykKAFvH5Qn/ZCds3CEAFS9OC9M/jkl0X2bA==",
|
"integrity": "sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/project-service": "8.70.0",
|
"@typescript-eslint/project-service": "8.69.0",
|
||||||
"@typescript-eslint/tsconfig-utils": "8.70.0",
|
"@typescript-eslint/tsconfig-utils": "8.69.0",
|
||||||
"@typescript-eslint/types": "8.70.0",
|
"@typescript-eslint/types": "8.69.0",
|
||||||
"@typescript-eslint/visitor-keys": "8.70.0",
|
"@typescript-eslint/visitor-keys": "8.69.0",
|
||||||
"debug": "^4.4.3",
|
"debug": "^4.4.3",
|
||||||
"minimatch": "^10.2.2",
|
"minimatch": "^10.2.2",
|
||||||
"semver": "^7.7.3",
|
"semver": "^7.7.3",
|
||||||
@@ -3305,16 +3306,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/utils": {
|
"node_modules/@typescript-eslint/utils": {
|
||||||
"version": "8.70.0",
|
"version": "8.69.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.70.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.69.0.tgz",
|
||||||
"integrity": "sha512-oZmtKJz/4fufZ2p3+Cn3ijEojcdfR+1zYDH2xKYrEly0dR/Q/1xUPRCOlKGxod78nWlU2UnDe09GZ3TaknBFGA==",
|
"integrity": "sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@eslint-community/eslint-utils": "^4.9.1",
|
"@eslint-community/eslint-utils": "^4.9.1",
|
||||||
"@typescript-eslint/scope-manager": "8.70.0",
|
"@typescript-eslint/scope-manager": "8.69.0",
|
||||||
"@typescript-eslint/types": "8.70.0",
|
"@typescript-eslint/types": "8.69.0",
|
||||||
"@typescript-eslint/typescript-estree": "8.70.0"
|
"@typescript-eslint/typescript-estree": "8.69.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||||
@@ -3329,13 +3330,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/visitor-keys": {
|
"node_modules/@typescript-eslint/visitor-keys": {
|
||||||
"version": "8.70.0",
|
"version": "8.69.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.70.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.69.0.tgz",
|
||||||
"integrity": "sha512-BoC8PiO4Hkdo0TVJh9Ntxr5MxPDI7/oFsrygN5ADelFSeXG/qgNuucIGA+L5Z6JpPTE/uRfcTWtscjbUaufepQ==",
|
"integrity": "sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "8.70.0",
|
"@typescript-eslint/types": "8.69.0",
|
||||||
"eslint-visitor-keys": "^5.0.0"
|
"eslint-visitor-keys": "^5.0.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -8394,9 +8395,9 @@
|
|||||||
"license": "BSD-2-Clause"
|
"license": "BSD-2-Clause"
|
||||||
},
|
},
|
||||||
"node_modules/maplibre-gl": {
|
"node_modules/maplibre-gl": {
|
||||||
"version": "6.8.0",
|
"version": "6.7.0",
|
||||||
"resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-6.8.0.tgz",
|
"resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-6.7.0.tgz",
|
||||||
"integrity": "sha512-+ZkjKTodsVLY0ewQThvXRxXQsclcsSgOm5LlnrBM3G8AloMJKt6Haw8mY4xrOl8T0WMqH6DTYjktZ9zGQXZd4w==",
|
"integrity": "sha512-Y1Q1+UP9WXou0DUrnaFdDsoMqiMCWy6aS968IBUaQ2eZi6H1/kPCfpfZOWXFJZbeKMkX9Wo6OFzY/k48qqPf3Q==",
|
||||||
"license": "BSD-3-Clause",
|
"license": "BSD-3-Clause",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@mapbox/point-geometry": "^1.1.0",
|
"@mapbox/point-geometry": "^1.1.0",
|
||||||
@@ -8405,7 +8406,7 @@
|
|||||||
"@mapbox/vector-tile": "^3.0.0",
|
"@mapbox/vector-tile": "^3.0.0",
|
||||||
"@maplibre/geojson-vt": "^6.1.1",
|
"@maplibre/geojson-vt": "^6.1.1",
|
||||||
"@maplibre/maplibre-gl-style-spec": "^26.4.1",
|
"@maplibre/maplibre-gl-style-spec": "^26.4.1",
|
||||||
"@maplibre/mlt": "^1.2.1",
|
"@maplibre/mlt": "^1.2.0",
|
||||||
"@maplibre/vt-pbf": "^4.3.2",
|
"@maplibre/vt-pbf": "^4.3.2",
|
||||||
"@types/geojson": "^7946.0.16",
|
"@types/geojson": "^7946.0.16",
|
||||||
"earcut": "^3.2.3",
|
"earcut": "^3.2.3",
|
||||||
@@ -10732,6 +10733,16 @@
|
|||||||
"react": ">=18"
|
"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": {
|
"node_modules/reactcss": {
|
||||||
"version": "1.2.3",
|
"version": "1.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz",
|
||||||
@@ -12430,16 +12441,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/typescript-eslint": {
|
"node_modules/typescript-eslint": {
|
||||||
"version": "8.70.0",
|
"version": "8.69.0",
|
||||||
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.70.0.tgz",
|
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.69.0.tgz",
|
||||||
"integrity": "sha512-P/W5cz70/cQAuKfY3xwQMWWTV7BvJ0mAQmi+9mBcsVPaBUpd6Ohpa+fECv9rBFrQcig86jAiNBFNWUqnTjr4pw==",
|
"integrity": "sha512-B3MltX0VqjUBNEe3b3sSuiRbfa6XrfHFtBiPamjT5AsW/dfq+y+bc0wyuS9DxAS1LyzCxRp2+rxzpLUvqM2BvA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/eslint-plugin": "8.70.0",
|
"@typescript-eslint/eslint-plugin": "8.69.0",
|
||||||
"@typescript-eslint/parser": "8.70.0",
|
"@typescript-eslint/parser": "8.69.0",
|
||||||
"@typescript-eslint/typescript-estree": "8.70.0",
|
"@typescript-eslint/typescript-estree": "8.69.0",
|
||||||
"@typescript-eslint/utils": "8.70.0"
|
"@typescript-eslint/utils": "8.69.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
|
||||||
|
|||||||
+3
-2
@@ -60,7 +60,7 @@
|
|||||||
"lodash.get": "^4.4.2",
|
"lodash.get": "^4.4.2",
|
||||||
"lodash.isequal": "^4.5.0",
|
"lodash.isequal": "^4.5.0",
|
||||||
"lodash.throttle": "^4.1.1",
|
"lodash.throttle": "^4.1.1",
|
||||||
"maplibre-gl": "^6.8.0",
|
"maplibre-gl": "^6.7.0",
|
||||||
"maputnik-design": "github:maputnik/design#172b06c",
|
"maputnik-design": "github:maputnik/design#172b06c",
|
||||||
"ol": "^10.10.0",
|
"ol": "^10.10.0",
|
||||||
"ol-mapbox-style": "^13.4.3",
|
"ol-mapbox-style": "^13.4.3",
|
||||||
@@ -76,6 +76,7 @@
|
|||||||
"react-i18next": "^17.0.13",
|
"react-i18next": "^17.0.13",
|
||||||
"react-icons": "^5.7.0",
|
"react-icons": "^5.7.0",
|
||||||
"react-markdown": "^10.1.0",
|
"react-markdown": "^10.1.0",
|
||||||
|
"react-resizable-panels": "^4.11.0",
|
||||||
"reconnecting-websocket": "^4.4.0",
|
"reconnecting-websocket": "^4.4.0",
|
||||||
"slugify": "^1.6.9",
|
"slugify": "^1.6.9",
|
||||||
"string-hash": "^1.1.3",
|
"string-hash": "^1.1.3",
|
||||||
@@ -142,7 +143,7 @@
|
|||||||
"stylelint-config-recommended-scss": "^17.0.1",
|
"stylelint-config-recommended-scss": "^17.0.1",
|
||||||
"stylelint-scss": "^7.2.0",
|
"stylelint-scss": "^7.2.0",
|
||||||
"typescript": "^6.0.3",
|
"typescript": "^6.0.3",
|
||||||
"typescript-eslint": "^8.70.0",
|
"typescript-eslint": "^8.69.0",
|
||||||
"uuid": "^14.0.2",
|
"uuid": "^14.0.2",
|
||||||
"vite": "^8.2.2",
|
"vite": "^8.2.2",
|
||||||
"vite-plugin-istanbul": "^9.0.1",
|
"vite-plugin-istanbul": "^9.0.1",
|
||||||
|
|||||||
+117
-38
@@ -1,9 +1,23 @@
|
|||||||
import React from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
|
import { Group, Panel, Separator, useDefaultLayout } from "react-resizable-panels";
|
||||||
import { ScrollContainer } from "./ScrollContainer";
|
import { ScrollContainer } from "./ScrollContainer";
|
||||||
import { type WithTranslation, withTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { IconContext } from "react-icons";
|
import { IconContext } from "react-icons";
|
||||||
|
|
||||||
type AppLayoutInternalProps = {
|
// Keep these in sync with $layout-list-width/$layout-editor-width in _vars.scss
|
||||||
|
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
|
toolbar: React.ReactElement
|
||||||
layerList: React.ReactElement
|
layerList: React.ReactElement
|
||||||
layerEditor?: React.ReactElement
|
layerEditor?: React.ReactElement
|
||||||
@@ -11,43 +25,108 @@ type AppLayoutInternalProps = {
|
|||||||
map: React.ReactElement
|
map: React.ReactElement
|
||||||
bottom?: React.ReactElement
|
bottom?: React.ReactElement
|
||||||
modals?: React.ReactNode
|
modals?: React.ReactNode
|
||||||
} & WithTranslation;
|
};
|
||||||
|
|
||||||
class AppLayoutInternal extends React.Component<AppLayoutInternalProps> {
|
export const AppLayout: React.FC<AppLayoutProps> = (props) => {
|
||||||
|
const { t, i18n } = useTranslation();
|
||||||
|
|
||||||
render() {
|
const sidebarLayout = useDefaultLayout({
|
||||||
document.body.dir = this.props.i18n.dir();
|
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"}}>
|
// The bottom panel is position: fixed, so it can't be a flex sibling of the
|
||||||
<div className="maputnik-layout">
|
// map panel; it follows the sidebar through this custom property instead.
|
||||||
{this.props.toolbar}
|
const [sidebarWidth, setSidebarWidth] = useState(DEFAULT_SIDEBAR_WIDTH);
|
||||||
<div className="maputnik-layout-main">
|
|
||||||
{this.props.codeEditor && <div className="maputnik-layout-code-editor">
|
useEffect(() => {
|
||||||
<ScrollContainer>
|
document.body.dir = i18n.dir();
|
||||||
{this.props.codeEditor}
|
}, [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>
|
</ScrollContainer>
|
||||||
</div>
|
}
|
||||||
}
|
{!props.codeEditor && <Group
|
||||||
{!this.props.codeEditor && <>
|
className="maputnik-layout-sidebar-panels"
|
||||||
<div className="maputnik-layout-list">
|
orientation="horizontal"
|
||||||
{this.props.layerList}
|
id={SIDEBAR_INNER_LAYOUT_ID}
|
||||||
</div>
|
defaultLayout={innerLayout.defaultLayout}
|
||||||
<div className="maputnik-layout-drawer">
|
onLayoutChanged={innerLayout.onLayoutChanged}
|
||||||
<ScrollContainer>
|
>
|
||||||
{this.props.layerEditor}
|
<Panel
|
||||||
</ScrollContainer>
|
id={LIST_PANEL_ID}
|
||||||
</div>
|
data-wd-key="layer-list-panel"
|
||||||
</>}
|
className="maputnik-layout-list"
|
||||||
{this.props.map}
|
style={PANEL_STYLE}
|
||||||
</div>
|
defaultSize={`${DEFAULT_LIST_WIDTH}px`}
|
||||||
{this.props.bottom && <div className="maputnik-layout-bottom">
|
minSize="100px"
|
||||||
{this.props.bottom}
|
>
|
||||||
</div>
|
{props.layerList}
|
||||||
}
|
</Panel>
|
||||||
{this.props.modals}
|
<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>
|
</div>
|
||||||
</IconContext.Provider>;
|
{props.bottom && <div className="maputnik-layout-bottom">
|
||||||
}
|
{props.bottom}
|
||||||
}
|
</div>
|
||||||
|
}
|
||||||
export const AppLayout = withTranslation()(AppLayoutInternal);
|
{props.modals}
|
||||||
|
</div>
|
||||||
|
</IconContext.Provider>;
|
||||||
|
};
|
||||||
|
|||||||
@@ -54,6 +54,8 @@
|
|||||||
"Delete expression": "Ausdruck löschen",
|
"Delete expression": "Ausdruck löschen",
|
||||||
"Delete filter block": "Filterblock löschen",
|
"Delete filter block": "Filterblock löschen",
|
||||||
"Deuteranopia filter": "Deuteranopie-Filter",
|
"Deuteranopia filter": "Deuteranopie-Filter",
|
||||||
|
"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",
|
"Duplicate": "Duplizieren",
|
||||||
"Encoding": "Kodierung",
|
"Encoding": "Kodierung",
|
||||||
"Enter URL...": "URL eingeben...",
|
"Enter URL...": "URL eingeben...",
|
||||||
|
|||||||
@@ -54,6 +54,8 @@
|
|||||||
"Delete expression": "Supprimer l'expression",
|
"Delete expression": "Supprimer l'expression",
|
||||||
"Delete filter block": "Supprimer le bloc de filtre",
|
"Delete filter block": "Supprimer le bloc de filtre",
|
||||||
"Deuteranopia filter": "Filtre Deutéranopie",
|
"Deuteranopia filter": "Filtre Deutéranopie",
|
||||||
|
"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",
|
"Duplicate": "Dupliquer",
|
||||||
"Encoding": "Encodage",
|
"Encoding": "Encodage",
|
||||||
"Enter URL...": "Entrez l'URL...",
|
"Enter URL...": "Entrez l'URL...",
|
||||||
|
|||||||
@@ -54,6 +54,8 @@
|
|||||||
"Delete expression": "מחיקת ביטוי",
|
"Delete expression": "מחיקת ביטוי",
|
||||||
"Delete filter block": "מחיקת גוש מסנן",
|
"Delete filter block": "מחיקת גוש מסנן",
|
||||||
"Deuteranopia filter": "Deuteranopia filter",
|
"Deuteranopia filter": "Deuteranopia filter",
|
||||||
|
"Drag to resize the layer list": "יש לגרור כדי לשנות את גודל רשימת השכבות",
|
||||||
|
"Drag to resize the sidebar": "יש לגרור כדי לשנות את גודל סרגל הצד",
|
||||||
"Duplicate": "שכפול",
|
"Duplicate": "שכפול",
|
||||||
"Encoding": "קידוד",
|
"Encoding": "קידוד",
|
||||||
"Enter URL...": "הכנסו כתובת",
|
"Enter URL...": "הכנסו כתובת",
|
||||||
|
|||||||
@@ -54,6 +54,8 @@
|
|||||||
"Delete expression": "Elimina espressione",
|
"Delete expression": "Elimina espressione",
|
||||||
"Delete filter block": "Elimina blocco filtro",
|
"Delete filter block": "Elimina blocco filtro",
|
||||||
"Deuteranopia filter": "Filtro deuteranopia",
|
"Deuteranopia filter": "Filtro deuteranopia",
|
||||||
|
"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",
|
"Duplicate": "Duplica",
|
||||||
"Encoding": "Codifica",
|
"Encoding": "Codifica",
|
||||||
"Enter URL...": "Inserisci URL...",
|
"Enter URL...": "Inserisci URL...",
|
||||||
|
|||||||
@@ -54,6 +54,8 @@
|
|||||||
"Delete expression": "式を削除",
|
"Delete expression": "式を削除",
|
||||||
"Delete filter block": "フィルタブロックを削除",
|
"Delete filter block": "フィルタブロックを削除",
|
||||||
"Deuteranopia filter": "緑色盲フィルタ",
|
"Deuteranopia filter": "緑色盲フィルタ",
|
||||||
|
"Drag to resize the layer list": "ドラッグしてレイヤーリストのサイズを変更",
|
||||||
|
"Drag to resize the sidebar": "ドラッグしてサイドバーのサイズを変更",
|
||||||
"Duplicate": "複製",
|
"Duplicate": "複製",
|
||||||
"Encoding": "エンコーディング",
|
"Encoding": "エンコーディング",
|
||||||
"Enter URL...": "URLを入力",
|
"Enter URL...": "URLを入力",
|
||||||
|
|||||||
@@ -54,6 +54,8 @@
|
|||||||
"Delete expression": "표현식 삭제",
|
"Delete expression": "표현식 삭제",
|
||||||
"Delete filter block": "필터 블록 삭제",
|
"Delete filter block": "필터 블록 삭제",
|
||||||
"Deuteranopia filter": "녹색맹 필터",
|
"Deuteranopia filter": "녹색맹 필터",
|
||||||
|
"Drag to resize the layer list": "드래그하여 레이어 목록 크기 조정",
|
||||||
|
"Drag to resize the sidebar": "드래그하여 사이드바 크기 조정",
|
||||||
"Duplicate": "복제",
|
"Duplicate": "복제",
|
||||||
"Encoding": "인코딩",
|
"Encoding": "인코딩",
|
||||||
"Enter URL...": "URL 입력...",
|
"Enter URL...": "URL 입력...",
|
||||||
|
|||||||
@@ -55,6 +55,8 @@
|
|||||||
"Delete filter block": "Filtre bloğunu sil",
|
"Delete filter block": "Filtre bloğunu sil",
|
||||||
"Deuteranopia filter": "Döteranopi filtresi",
|
"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 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",
|
"Duplicate": "Kopyala",
|
||||||
"Encoding": "Kodlama",
|
"Encoding": "Kodlama",
|
||||||
"Enter URL...": "URL girin...",
|
"Enter URL...": "URL girin...",
|
||||||
|
|||||||
@@ -54,6 +54,8 @@
|
|||||||
"Delete expression": "删除表达式",
|
"Delete expression": "删除表达式",
|
||||||
"Delete filter block": "删除过滤器块",
|
"Delete filter block": "删除过滤器块",
|
||||||
"Deuteranopia filter": "绿色盲滤镜",
|
"Deuteranopia filter": "绿色盲滤镜",
|
||||||
|
"Drag to resize the layer list": "拖动以调整图层列表大小",
|
||||||
|
"Drag to resize the sidebar": "拖动以调整侧边栏大小",
|
||||||
"Duplicate": "复制",
|
"Duplicate": "复制",
|
||||||
"Encoding": "编码",
|
"Encoding": "编码",
|
||||||
"Enter URL...": "输入URL...",
|
"Enter URL...": "输入URL...",
|
||||||
|
|||||||
@@ -6,7 +6,8 @@
|
|||||||
.maputnik-map__container {
|
.maputnik-map__container {
|
||||||
background: white;
|
background: white;
|
||||||
display: flex;
|
display: flex;
|
||||||
width: vars.$layout-map-width;
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
&--error {
|
&--error {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|||||||
+60
-12
@@ -13,6 +13,9 @@
|
|||||||
|
|
||||||
//APP LAYOUT
|
//APP LAYOUT
|
||||||
.maputnik-layout {
|
.maputnik-layout {
|
||||||
|
// Kept up to date by AppLayout as the sidebar is resized.
|
||||||
|
--sidebar-width: #{vars.$layout-list-width + vars.$layout-editor-width};
|
||||||
|
|
||||||
font-family: vars.$font-family;
|
font-family: vars.$font-family;
|
||||||
color: vars.$color-white;
|
color: vars.$color-white;
|
||||||
|
|
||||||
@@ -28,31 +31,76 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
|
|
||||||
&-list {
|
// The resizable panel group filling the main area.
|
||||||
width: 200px;
|
&-panels {
|
||||||
background-color: vars.$color-black;
|
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 {
|
&-drawer {
|
||||||
width: 370px;
|
|
||||||
background-color: vars.$color-black;
|
background-color: vars.$color-black;
|
||||||
// scroll-container is position: absolute
|
|
||||||
position: relative;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&-code-editor {
|
&-resize-handle {
|
||||||
width: 570px;
|
width: 5px;
|
||||||
background-color: vars.$color-black;
|
background-color: transparent;
|
||||||
// scroll-container is position: absolute
|
|
||||||
position: relative;
|
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 {
|
&-bottom {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
right: 0;
|
|
||||||
z-index: 10;
|
z-index: 10;
|
||||||
width: vars.$layout-map-width;
|
inset-inline-start: var(--sidebar-width);
|
||||||
|
inset-inline-end: 0;
|
||||||
background-color: vars.$color-black;
|
background-color: vars.$color-black;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ $toolbar-offset: 0;
|
|||||||
|
|
||||||
$layout-list-width: 200px;
|
$layout-list-width: 200px;
|
||||||
$layout-editor-width: 370px;
|
$layout-editor-width: 370px;
|
||||||
$layout-map-width: calc(100% - #{$layout-list-width + $layout-editor-width});
|
|
||||||
|
|
||||||
// 'menu-down' from 'https://materialdesignicons.com/'
|
// 'menu-down' from 'https://materialdesignicons.com/'
|
||||||
// See <https://github.com/Templarian/MaterialDesign/blob/master/LICENSE>
|
// See <https://github.com/Templarian/MaterialDesign/blob/master/LICENSE>
|
||||||
|
|||||||
Reference in New Issue
Block a user