mirror of
				https://github.com/gpxstudio/gpx.studio.git
				synced 2025-11-04 05:21:09 +00:00 
			
		
		
		
	animation for layer control
This commit is contained in:
		@@ -26,54 +26,62 @@
 | 
			
		||||
	}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<CustomControl {map} class="group">
 | 
			
		||||
	<div class="flex flex-row justify-center items-center w-[29px] h-[29px] group-hover:hidden">
 | 
			
		||||
<CustomControl {map} class="group min-w-[29px] min-h-[29px]">
 | 
			
		||||
	<div
 | 
			
		||||
		class="flex flex-row justify-center items-center w-[29px] h-[29px] delay-100 transition-[opacity height] duration-0 group-hover:opacity-0 group-hover:h-0 group-hover:delay-0"
 | 
			
		||||
	>
 | 
			
		||||
		<Fa icon={faLayerGroup} size="1.4x" />
 | 
			
		||||
	</div>
 | 
			
		||||
	<div class="hidden group-hover:block">
 | 
			
		||||
		<div class="p-2">
 | 
			
		||||
			<Label>Basemaps</Label>
 | 
			
		||||
			<LayerTree
 | 
			
		||||
				layerTree={basemapTree}
 | 
			
		||||
				name="basemaps"
 | 
			
		||||
				onValueChange={(id) => {
 | 
			
		||||
					if (map) {
 | 
			
		||||
						map.setStyle(basemaps[id]);
 | 
			
		||||
					}
 | 
			
		||||
				}}
 | 
			
		||||
			/>
 | 
			
		||||
		</div>
 | 
			
		||||
		<Separator class="w-full" />
 | 
			
		||||
		<div class="p-2">
 | 
			
		||||
			<Label>Overlays</Label>
 | 
			
		||||
			<LayerTree
 | 
			
		||||
				layerTree={overlayTree}
 | 
			
		||||
				name="overlays"
 | 
			
		||||
				multiple={true}
 | 
			
		||||
				onValueChange={(id, checked) => {
 | 
			
		||||
					if (map) {
 | 
			
		||||
						if (checked) {
 | 
			
		||||
							if (!map.getSource(id)) {
 | 
			
		||||
								map.addSource(id, overlays[id]);
 | 
			
		||||
							}
 | 
			
		||||
							map.addLayer({
 | 
			
		||||
								id,
 | 
			
		||||
								type: overlays[id].type === 'raster' ? 'raster' : 'line',
 | 
			
		||||
								source: id,
 | 
			
		||||
								paint: {
 | 
			
		||||
									...(id in opacities
 | 
			
		||||
										? overlays[id].type === 'raster'
 | 
			
		||||
											? { 'raster-opacity': opacities[id] }
 | 
			
		||||
											: { 'line-opacity': opacities[id] }
 | 
			
		||||
										: {})
 | 
			
		||||
								}
 | 
			
		||||
							});
 | 
			
		||||
						} else {
 | 
			
		||||
							map.removeLayer(id);
 | 
			
		||||
	<div
 | 
			
		||||
		class="transition-[grid-template-rows grid-template-cols] grid grid-rows-[0fr] grid-cols-[0fr] duration-150 group-hover:grid-rows-[1fr] group-hover:grid-cols-[1fr]"
 | 
			
		||||
	>
 | 
			
		||||
		<div class="overflow-hidden">
 | 
			
		||||
			<div class="p-2">
 | 
			
		||||
				<Label>Basemaps</Label>
 | 
			
		||||
				<LayerTree
 | 
			
		||||
					layerTree={basemapTree}
 | 
			
		||||
					name="basemaps"
 | 
			
		||||
					onValueChange={(id) => {
 | 
			
		||||
						if (map) {
 | 
			
		||||
							map.setStyle(basemaps[id]);
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}}
 | 
			
		||||
			/>
 | 
			
		||||
					}}
 | 
			
		||||
				/>
 | 
			
		||||
			</div>
 | 
			
		||||
			<Separator class="w-full" />
 | 
			
		||||
			<div class="p-2">
 | 
			
		||||
				<Label>Overlays</Label>
 | 
			
		||||
				<LayerTree
 | 
			
		||||
					layerTree={overlayTree}
 | 
			
		||||
					name="overlays"
 | 
			
		||||
					multiple={true}
 | 
			
		||||
					onValueChange={(id, checked) => {
 | 
			
		||||
						if (map) {
 | 
			
		||||
							if (checked) {
 | 
			
		||||
								if (!map.getSource(id)) {
 | 
			
		||||
									map.addSource(id, overlays[id]);
 | 
			
		||||
								}
 | 
			
		||||
								map.addLayer({
 | 
			
		||||
									id,
 | 
			
		||||
									type: overlays[id].type === 'raster' ? 'raster' : 'line',
 | 
			
		||||
									source: id,
 | 
			
		||||
									paint: {
 | 
			
		||||
										...(id in opacities
 | 
			
		||||
											? overlays[id].type === 'raster'
 | 
			
		||||
												? { 'raster-opacity': opacities[id] }
 | 
			
		||||
												: { 'line-opacity': opacities[id] }
 | 
			
		||||
											: {})
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
							} else {
 | 
			
		||||
								map.removeLayer(id);
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					}}
 | 
			
		||||
				/>
 | 
			
		||||
			</div>
 | 
			
		||||
			<Separator class="w-full" />
 | 
			
		||||
			<div class="p-2">TODO: Add layer settings</div>
 | 
			
		||||
		</div>
 | 
			
		||||
	</div>
 | 
			
		||||
</CustomControl>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,6 @@
 | 
			
		||||
	export let onValueChange: (id: string, checked: boolean) => void;
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<fieldset class="min-w-52">
 | 
			
		||||
<fieldset class="min-w-64">
 | 
			
		||||
	<LayerTreeNode {name} node={layerTree} {multiple} {onValueChange} />
 | 
			
		||||
</fieldset>
 | 
			
		||||
 
 | 
			
		||||
@@ -30,8 +30,8 @@
 | 
			
		||||
	}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<div class="flex flex-col gap-1">
 | 
			
		||||
	{#if Array.isArray(node)}
 | 
			
		||||
{#if Array.isArray(node)}
 | 
			
		||||
	<div class="flex flex-col gap-1 mt-1">
 | 
			
		||||
		{#each node as id}
 | 
			
		||||
			<div class="flex flex-row items-center gap-2">
 | 
			
		||||
				{#if multiple}
 | 
			
		||||
@@ -59,7 +59,9 @@
 | 
			
		||||
				<Label for={id}>{id}</Label>
 | 
			
		||||
			</div>
 | 
			
		||||
		{/each}
 | 
			
		||||
	{:else}
 | 
			
		||||
	</div>
 | 
			
		||||
{:else}
 | 
			
		||||
	<div class="flex flex-col gap-1">
 | 
			
		||||
		{#each Object.keys(node) as id}
 | 
			
		||||
			<Collapsible.Root bind:open={open[id]} class="ml-1">
 | 
			
		||||
				<Collapsible.Trigger class="w-full"
 | 
			
		||||
@@ -75,13 +77,13 @@
 | 
			
		||||
						{/if}
 | 
			
		||||
					</Button></Collapsible.Trigger
 | 
			
		||||
				>
 | 
			
		||||
				<Collapsible.Content class="mt-1 ml-1">
 | 
			
		||||
				<Collapsible.Content class="ml-1">
 | 
			
		||||
					<svelte:self node={node[id]} {name} {multiple} {onValueChange} />
 | 
			
		||||
				</Collapsible.Content>
 | 
			
		||||
			</Collapsible.Root>
 | 
			
		||||
		{/each}
 | 
			
		||||
	{/if}
 | 
			
		||||
</div>
 | 
			
		||||
	</div>
 | 
			
		||||
{/if}
 | 
			
		||||
 | 
			
		||||
<style lang="postcss">
 | 
			
		||||
	div :global(input[type='radio']) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user