forked from MapComplete/MapComplete
UX: floor selector: add white background pane
This commit is contained in:
parent
8c478f5e4e
commit
2c8d207866
2 changed files with 16 additions and 11 deletions
|
@ -130,8 +130,11 @@ export default class LayerState {
|
||||||
public setLevelFilter(level?: string) {
|
public setLevelFilter(level?: string) {
|
||||||
// Remove all previous
|
// Remove all previous
|
||||||
const l = this.globalFilters.data.length
|
const l = this.globalFilters.data.length
|
||||||
|
// Remove all global filters tagged 'levels
|
||||||
this.globalFilters.data = this.globalFilters.data.filter((f) => f.id !== "level")
|
this.globalFilters.data = this.globalFilters.data.filter((f) => f.id !== "level")
|
||||||
if (!level) {
|
if (!level) {
|
||||||
|
// Level is undefined - we thus only want to remove the global filter
|
||||||
|
// We've just done this above, but the listeners are not aware yet. Let's ping (if needed) and move on
|
||||||
if (l !== this.globalFilters.data.length) {
|
if (l !== this.globalFilters.data.length) {
|
||||||
this.globalFilters.ping()
|
this.globalFilters.ping()
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { twJoin } from "tailwind-merge"
|
|
||||||
import { Store, Stores, UIEventSource } from "../../../Logic/UIEventSource"
|
import { Store, Stores, UIEventSource } from "../../../Logic/UIEventSource"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -11,12 +10,12 @@
|
||||||
export let value: UIEventSource<string>
|
export let value: UIEventSource<string>
|
||||||
|
|
||||||
const HEIGHT = 40
|
const HEIGHT = 40
|
||||||
|
const WIDTH = HEIGHT
|
||||||
|
|
||||||
let initialIndex = Math.max(0, floors?.data?.findIndex((f) => f === value?.data) ?? 0)
|
let initialIndex = Math.max(0, floors?.data?.findIndex((f) => f === value?.data) ?? floors?.data?.length + 1)
|
||||||
let index: UIEventSource<number> = new UIEventSource<number>(initialIndex)
|
let index: UIEventSource<number> = new UIEventSource<number>(initialIndex)
|
||||||
let forceIndex: number | undefined = undefined
|
let forceIndex: number | undefined = undefined
|
||||||
let top = Math.max(0, initialIndex) * HEIGHT
|
let top = Math.max(0, initialIndex) * HEIGHT
|
||||||
let elevator: HTMLImageElement
|
|
||||||
|
|
||||||
let mouseDown = false
|
let mouseDown = false
|
||||||
|
|
||||||
|
@ -53,7 +52,7 @@
|
||||||
let momentum = 0
|
let momentum = 0
|
||||||
|
|
||||||
function stabilize() {
|
function stabilize() {
|
||||||
// Automatically move the elevator to the closes floor
|
// Automatically move the elevator to the closest floor
|
||||||
if (mouseDown) {
|
if (mouseDown) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -73,7 +72,7 @@
|
||||||
top = Math.max(top, 0)
|
top = Math.max(top, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
Stores.Chronic(50).addCallback((_) => stabilize())
|
Stores.Chronic(50).addCallback(() => stabilize())
|
||||||
floors.addCallback((floors) => {
|
floors.addCallback((floors) => {
|
||||||
forceIndex = floors.findIndex((s) => s === value.data)
|
forceIndex = floors.findIndex((s) => s === value.data)
|
||||||
})
|
})
|
||||||
|
@ -101,16 +100,17 @@
|
||||||
<div
|
<div
|
||||||
bind:this={container}
|
bind:this={container}
|
||||||
class="relative"
|
class="relative"
|
||||||
style={`height: calc(${HEIGHT}px * ${$floors.length}); width: 96px`}
|
style={`height: calc(${HEIGHT}px * ${$floors.length}); width: calc( 96px )`}
|
||||||
>
|
>
|
||||||
|
<div class="absolute top-0 left-0 rounded-xl"
|
||||||
|
style="margin: -0.25rem; width: calc(100% + 0.5rem); height: calc(100% + 0.5rem); background: rgba(255,255,255, 0.65); backdrop-filter: blur(2px)">
|
||||||
|
</div>
|
||||||
<div class="absolute right-0 h-full w-min">
|
<div class="absolute right-0 h-full w-min">
|
||||||
{#each $floors as floor, i}
|
{#each $floors as floor, i}
|
||||||
<button
|
<button
|
||||||
style={`height: ${HEIGHT}px; width: ${HEIGHT}px`}
|
style={`height: ${HEIGHT}px; width: ${HEIGHT}px`}
|
||||||
class={twJoin(
|
class:selected={i === (forceIndex ?? $index)}
|
||||||
"content-box m-0 flex items-center justify-center border-2 border-gray-300",
|
class={"content-box m-0 flex items-center justify-center border-2 border-gray-300"}
|
||||||
i === (forceIndex ?? $index) && "selected"
|
|
||||||
)}
|
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
forceIndex = i
|
forceIndex = i
|
||||||
}}
|
}}
|
||||||
|
@ -120,8 +120,10 @@
|
||||||
{/each}
|
{/each}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style={`width: ${HEIGHT}px`}>
|
<div style={`width: ${WIDTH}px`}>
|
||||||
<img
|
<img
|
||||||
|
alt=""
|
||||||
|
aria-hidden="true"
|
||||||
bind:this={image}
|
bind:this={image}
|
||||||
class="draggable"
|
class="draggable"
|
||||||
draggable="false"
|
draggable="false"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue