You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.5 KiB
65 lines
1.5 KiB
<script>
|
|
/** @type {{value: string, text: string}[]} */
|
|
export let options = []
|
|
export let value = "";
|
|
export let label = "Select";
|
|
export let prefer = null;
|
|
export let color = "#ffffff";
|
|
export let bgcolor = "#444444";
|
|
|
|
$: {
|
|
if (options.length > 0 && !options.find(o => o.value === value)) {
|
|
if (prefer != null) {
|
|
const preferred = options.find(o => o.value.includes(prefer));
|
|
if (preferred != null) {
|
|
value = preferred.value;
|
|
} else {
|
|
value = options[0].value;
|
|
}
|
|
} else {
|
|
value = options[0].value;
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<div class="selector" style="--color: {color || "#ffcc11"}; --bgcolor: {bgcolor || "#776655"}">
|
|
<h2>{label}</h2>
|
|
{#each options as option (option.value)}
|
|
<div on:click={() => value = option.value} class="option" class:selected={option.value === value}>{option.text}</div>
|
|
{/each}
|
|
</div>
|
|
|
|
<style>
|
|
.selector {
|
|
margin: auto;
|
|
}
|
|
|
|
h2 {
|
|
font-size: 1.25em;
|
|
margin-top: 1em;
|
|
}
|
|
|
|
.option {
|
|
display: inline-block;
|
|
margin: 0;
|
|
padding: 0.5em 1.5ch;
|
|
line-height: 1.1em;
|
|
background: #333;
|
|
border: 1px solid #000;
|
|
cursor: pointer;
|
|
}
|
|
.option.selected {
|
|
color: var(--color);
|
|
background-color: var(--bgcolor);
|
|
}
|
|
.option:first-of-type {
|
|
border-top-left-radius: 0.5em;
|
|
border-bottom-left-radius: 0.5em;
|
|
}
|
|
.option:last-of-type {
|
|
border-top-right-radius: 0.5em;
|
|
border-bottom-right-radius: 0.5em;
|
|
}
|
|
|
|
</style>
|