-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
CustomLayer component #41
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,89 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<script lang="ts"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { MapLibre, CustomLayer } from 'svelte-maplibre-gl'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import maplibregl from 'maplibre-gl'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
class CustomLayerImpl implements Omit<maplibregl.CustomLayerInterface, 'id' | 'type'> { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
program: WebGLProgram | null = null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
aPos: number = 0; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
buffer: WebGLBuffer | null = null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onAdd(_map: maplibregl.Map, gl: WebGL2RenderingContext) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//create GLSL source for vertex shader | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const vertexSource = `#version 300 es | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uniform mat4 u_matrix; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
in vec2 a_pos; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
void main() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}`; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// create GLSL source for fragment shader | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const fragmentSource = `#version 300 es | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
out highp vec4 fragColor; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
void main() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fragColor = vec4(1.0, 0.0, 0.0, 0.5); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}`; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// create a vertex shader | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const vertexShader = gl.createShader(gl.VERTEX_SHADER)!; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl.shaderSource(vertexShader, vertexSource); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl.compileShader(vertexShader); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// create a fragment shader | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER)!; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl.shaderSource(fragmentShader, fragmentSource); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl.compileShader(fragmentShader); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// link the two shaders into a WebGL program | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.program = gl.createProgram()!; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl.attachShader(this.program, vertexShader); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl.attachShader(this.program, fragmentShader); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl.linkProgram(this.program); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+27
to
+40
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add error handling for shader compilation and program linking To ensure the robustness of the application, it's important to check if the shaders compile successfully and if the program links correctly. Without these checks, shader compilation or linking failures may go unnoticed, making debugging difficult. Apply this diff to add error handling: gl.compileShader(vertexShader);
+if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
+ console.error('Vertex shader compilation failed:', gl.getShaderInfoLog(vertexShader));
+}
gl.compileShader(fragmentShader);
+if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
+ console.error('Fragment shader compilation failed:', gl.getShaderInfoLog(fragmentShader));
+}
gl.linkProgram(this.program);
+if (!gl.getProgramParameter(this.program, gl.LINK_STATUS)) {
+ console.error('Program linking failed:', gl.getProgramInfoLog(this.program));
+} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.aPos = gl.getAttribLocation(this.program, 'a_pos'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// define vertices of the triangle to be rendered in the custom style layer | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const helsinki = maplibregl.MercatorCoordinate.fromLngLat({ lng: 25.004, lat: 60.239 }); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const berlin = maplibregl.MercatorCoordinate.fromLngLat({ lng: 13.403, lat: 52.562 }); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const kyiv = maplibregl.MercatorCoordinate.fromLngLat({ lng: 30.498, lat: 50.541 }); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
console.log(helsinki, berlin, kyiv); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// create and initialize a WebGLBuffer to store vertex and color data | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.buffer = gl.createBuffer(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl.bufferData( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl.ARRAY_BUFFER, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
new Float32Array([helsinki.x, helsinki.y, berlin.x, berlin.y, kyiv.x, kyiv.y]), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl.STATIC_DRAW | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// method fired on each animation frame | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
render(gl: WebGL2RenderingContext | WebGLRenderingContext, options: maplibregl.CustomRenderMethodInput) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl.useProgram(this.program); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl.uniformMatrix4fv( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl.getUniformLocation(this.program!, 'u_matrix'), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
false, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
options.defaultProjectionData.mainMatrix | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl.enableVertexAttribArray(this.aPos); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl.vertexAttribPointer(this.aPos, 2, gl.FLOAT, false, 0, 0); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl.enable(gl.BLEND); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 3); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+60
to
+73
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ensure compatibility with WebGL1 contexts The Consider updating the code to check if |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const customLayerImpl = new CustomLayerImpl(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</script> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<MapLibre | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
class="h-[60vh] min-h-[300px]" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
style="https://basemaps.cartocdn.com/gl/voyager-gl-style/style.json" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
zoom={3} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
center={[20, 58]} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
antialias | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<CustomLayer implementation={customLayerImpl} /> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</MapLibre> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
--- | ||
title: Custom style layer | ||
description: Use a custom style layer to render custom WebGL content. | ||
--- | ||
|
||
<script lang="ts"> | ||
import Demo from "./CustomLayer.svelte"; | ||
import demoRaw from "./CustomLayer.svelte?raw"; | ||
import CodeBlock from "../../CodeBlock.svelte"; | ||
let { shiki } = $props(); | ||
</script> | ||
|
||
<Demo /> | ||
|
||
<CodeBlock content={demoRaw} shiki={shiki} /> |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,84 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<script lang="ts"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// https://maplibre.org/maplibre-gl-js/docs/API/interfaces/CustomLayerInterface/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { onDestroy, type Snippet } from 'svelte'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import maplibregl from 'maplibre-gl'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { getMapContext } from '../contexts.svelte.js'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { generateLayerID, resetLayerEventListener } from '../utils.js'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import type { MapLayerEventProps } from './common.js'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interface Props extends MapLayerEventProps { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id?: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
beforeId?: string; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
implementation: Omit<maplibregl.CustomLayerInterface, 'id' | 'type'>; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
children?: Snippet; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id: _id, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
beforeId, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
implementation, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
children, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Events | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// https://maplibre.org/maplibre-gl-js/docs/API/type-aliases/MapLayerEventType/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onclick, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ondblclick, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onmousedown, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onmouseup, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onmousemove, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onmouseenter, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onmouseleave, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onmouseover, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onmouseout, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
oncontextmenu, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ontouchstart, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ontouchend, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ontouchcancel | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}: Props = $props(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+10
to
+38
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix props declaration to align with Svelte's syntax The current props declaration using Apply this diff to correct the props declaration: -interface Props extends MapLayerEventProps {
- id?: string;
- beforeId?: string;
- implementation: Omit<maplibregl.CustomLayerInterface, 'id' | 'type'>;
- children?: Snippet;
-}
-
-let {
- id: _id,
- beforeId,
- implementation,
- children,
-
- // Events
- // https://maplibre.org/maplibre-gl-js/docs/API/type-aliases/MapLayerEventType/
- onclick,
- ondblclick,
- onmousedown,
- onmouseup,
- onmousemove,
- onmouseenter,
- onmouseleave,
- onmouseover,
- onmouseout,
- oncontextmenu,
- ontouchstart,
- ontouchend,
- ontouchcancel
-}: Props = $props();
+export let id: string | undefined;
+const _id = id;
+export let beforeId: string | undefined;
+export let implementation: Omit<maplibregl.CustomLayerInterface, 'id' | 'type'>;
+export let children: Snippet | undefined;
+
+// Events
+// https://maplibre.org/maplibre-gl-js/docs/API/type-aliases/MapLayerEventType/
+export let onclick;
+export let ondblclick;
+export let onmousedown;
+export let onmouseup;
+export let onmousemove;
+export let onmouseenter;
+export let onmouseleave;
+export let onmouseover;
+export let onmouseout;
+export let oncontextmenu;
+export let ontouchstart;
+export let ontouchend;
+export let ontouchcancel; 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const mapCtx = getMapContext(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!mapCtx.map) throw new Error('Map instance is not initialized.'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const id = _id ?? generateLayerID(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(implementation as maplibregl.CustomLayerInterface).id ??= id; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(implementation as maplibregl.CustomLayerInterface).type = 'custom'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+45
to
+46
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Avoid mutating the implementation object directly Mutating the Apply this diff to create a new implementation object: -(implementation as maplibregl.CustomLayerInterface).id ??= id;
-(implementation as maplibregl.CustomLayerInterface).type = 'custom';
+
+const layerImplementation: maplibregl.CustomLayerInterface = {
+ ...implementation,
+ id: implementation.id ?? id,
+ type: 'custom',
+}; And update the -mapCtx.addLayer(implementation as maplibregl.CustomLayerInterface, beforeId);
+mapCtx.addLayer(layerImplementation, beforeId);
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let firstRun = true; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mapCtx.waitForStyleLoaded(() => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mapCtx.addLayer(implementation as maplibregl.CustomLayerInterface, beforeId); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$effect(() => resetLayerEventListener(mapCtx.map, 'click', id, onclick)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$effect(() => resetLayerEventListener(mapCtx.map, 'dblclick', id, ondblclick)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$effect(() => resetLayerEventListener(mapCtx.map, 'mousedown', id, onmousedown)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$effect(() => resetLayerEventListener(mapCtx.map, 'mouseup', id, onmouseup)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$effect(() => resetLayerEventListener(mapCtx.map, 'mousemove', id, onmousemove)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$effect(() => resetLayerEventListener(mapCtx.map, 'mouseenter', id, onmouseenter)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$effect(() => resetLayerEventListener(mapCtx.map, 'mouseleave', id, onmouseleave)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$effect(() => resetLayerEventListener(mapCtx.map, 'mouseover', id, onmouseover)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$effect(() => resetLayerEventListener(mapCtx.map, 'mouseout', id, onmouseout)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$effect(() => resetLayerEventListener(mapCtx.map, 'contextmenu', id, oncontextmenu)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$effect(() => resetLayerEventListener(mapCtx.map, 'touchstart', id, ontouchstart)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$effect(() => resetLayerEventListener(mapCtx.map, 'touchend', id, ontouchend)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$effect(() => resetLayerEventListener(mapCtx.map, 'touchcancel', id, ontouchcancel)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$effect(() => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (beforeId && !firstRun) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mapCtx.waitForStyleLoaded((map) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
map.moveLayer(id, beforeId); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$effect(() => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
firstRun = false; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onDestroy(() => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mapCtx.removeLayer(id); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</script> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{@render children?.()} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Correct the rendering of child content The syntax Apply this diff to fix the rendering: -{@render children?.()}
+{#if children}
+ {children()}
+{/if} Alternatively, if you intend to use slots, consider replacing -{@render children?.()}
+<slot /> 📝 Committable suggestion
Suggested change
Suggested change
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,11 +4,11 @@ | |
let { children } = $props(); | ||
</script> | ||
|
||
<div class="mx-auto grid grid-cols-[220px_minmax(0,1fr)] gap-10 px-8 2xl:container"> | ||
<div class="mx-auto grid grid-cols-[200px_minmax(0,1fr)] gap-10 px-8 2xl:container"> | ||
<aside class="sticky bottom-0 top-16 h-[calc(100vh-4rem)] overflow-scroll py-8"> | ||
<Index /> | ||
</aside> | ||
<main class="grid-cols-[1fr_220px]"> | ||
<main class="grid-cols-[1fr_200px]"> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Codebase verification The grid-cols class on the main element is missing the The
Either:
🔗 Analysis chainVerify the grid configuration in the main element The grid columns defined on the main element (
🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Search for any grid items or content that might justify the grid columns in main
rg -l 'col-span-|col-start-' src/routes/components/
Length of output: 53 Script: #!/bin/bash
# Let's check the content of the layout file and its surrounding context
cat src/routes/components/+layout.svelte
# Also search for any grid-related classes in the components directory
rg "grid-" src/routes/components/ -A 2 -B 2
Length of output: 1466 |
||
{@render children()} | ||
</main> | ||
</div> |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -4,11 +4,11 @@ | |||||
let { children } = $props(); | ||||||
</script> | ||||||
|
||||||
<div class="mx-auto grid grid-cols-[220px_minmax(0,1fr)] gap-10 px-8 2xl:container"> | ||||||
<div class="mx-auto grid grid-cols-[200px_minmax(0,1fr)] gap-10 px-8 2xl:container"> | ||||||
<aside class="sticky bottom-0 top-16 h-[calc(100vh-4rem)] overflow-scroll py-8"> | ||||||
<Index /> | ||||||
</aside> | ||||||
<main class="grid-cols-[1fr_220px]"> | ||||||
<main class="grid-cols-[1fr_200px]"> | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Remove unnecessary grid-cols from main element The - <main class="grid-cols-[1fr_200px]">
+ <main> 📝 Committable suggestion
Suggested change
|
||||||
{@render children()} | ||||||
</main> | ||||||
</div> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Codebase verification
Component renaming is correct, but
shiki
prop syntax needs standardizationThe verification shows:
CustomControl
component is correctly used within its own example directory (src/content/examples/custom-control/
)shiki
prop is used consistently across all example files, but with two different syntaxes:shiki={shiki}
custom-protocol
andcustom-control
use the shorthand{shiki}
🔗 Analysis chain
Verify consistent component naming across examples
The component renaming and
shiki
prop addition appear correct. Let's verify this pattern is consistently applied across other example files.🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
Length of output: 3227