Skip to content

Commit 0262c5d

Browse files
committed
add value label for sliders
1 parent 2a19d75 commit 0262c5d

3 files changed

Lines changed: 53 additions & 31 deletions

File tree

index.html

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,10 @@ <h3 class="widget-text">A heading widget...</h3>
6969
<template id="slider-widget-template">
7070
<div class="widget slider-widget widget-with-input">
7171
<label class="widget-text">A slider</label>
72-
<input
73-
type="range"
74-
min="1"
75-
max="100"
76-
value="50"
77-
class="widget-input widget-range-input"
78-
id="widget-input-x" />
72+
<div class="widget-value">
73+
<span class="widget-value-text">0</span>
74+
<input type="range" class="widget-input widget-range-input" id="widget-input-x" />
75+
</div>
7976
</div>
8077
</template>
8178

src/config.ts

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,15 @@ export class ConfigClass {
9090
element.default === "disabled"
9191
);
9292
} else if (type === "slider" || type === "number" || type === "value") {
93+
const widgetValue = clone.querySelector(".widget-value-text") as HTMLElement | null;
9394
if (element.value.default !== undefined) {
9495
inputElement!.valueAsNumber = element.value.default;
96+
97+
const suffix = getElementSuffix(element);
98+
if (widgetValue) {
99+
widgetValue.innerText = element.value.default.toString() + suffix;
100+
widgetValue.dataset.suffix = suffix;
101+
}
95102
}
96103
if (element.value.range) {
97104
inputElement!.min = element.value.range[0].toString();
@@ -101,15 +108,7 @@ export class ConfigClass {
101108
inputElement!.step = element.value.step.toString();
102109
}
103110

104-
let suffix = "";
105-
106-
if ("suffix" in element.value && element.value.suffix) {
107-
suffix = element.value.suffix;
108-
} else if (element.value.type === "percent") {
109-
suffix = " (%)";
110-
}
111-
112-
if (suffix && widgetText) widgetText.innerText += suffix;
111+
inputElement!.addEventListener("input", updateDisplayedValue);
113112
} else if (type === "image") {
114113
const imageFile = await zip.file(element.file)?.async("blob");
115114
if (imageFile) {
@@ -129,3 +128,32 @@ export class ConfigClass {
129128
return htmlWidgets.filter((element) => element !== undefined);
130129
}
131130
}
131+
132+
function getElementSuffix(element: NumberWidget | SliderWidget) {
133+
let suffix = "";
134+
135+
if ("suffix" in element.value && element.value.suffix) {
136+
suffix = element.value.suffix;
137+
} else if (element.value.type === "percent") {
138+
suffix = "%";
139+
}
140+
return suffix;
141+
}
142+
143+
function updateDisplayedValue(event: Event) {
144+
const target = event.target as HTMLInputElement;
145+
const valueElement = target.parentElement?.querySelector(
146+
".widget-value-text"
147+
) as HTMLElement | null;
148+
149+
let valueToDisplay: string | number = target.valueAsNumber;
150+
151+
if (Number.parseFloat(target.min) < 0 && valueToDisplay > 0) {
152+
valueToDisplay = `+${valueToDisplay}`;
153+
}
154+
155+
if (valueElement) {
156+
const suffix = valueElement.dataset.suffix ?? "";
157+
valueElement.innerText = valueToDisplay.toString() + suffix;
158+
}
159+
}

style.css

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ a:visited {
153153
display: flex;
154154
justify-content: space-between;
155155
justify-items: stretch;
156+
align-items: center;
156157

157158
padding-left: 1em;
158159
padding-right: 1em;
@@ -161,26 +162,22 @@ a:visited {
161162

162163
accent-color: #cba6f7;
163164
background-color: var(--background-above);
164-
165-
p,
166-
h1,
167-
h2,
168-
h3,
169-
h4 {
170-
min-width: 25%;
171-
}
172165
}
173166

174-
/* .widget + .widget {
175-
margin-top: 0em;
176-
} */
177-
178-
.config-screen>.widget-with-input:nth-of-type(odd) {
179-
background-color: var(--background);
167+
.config-screen > .widget-with-input:nth-of-type(odd) {
168+
background-color: var(--background);
180169
}
181170

182171
.widget-input {
183-
min-width: 25%;
172+
width: 15vw;
173+
}
174+
175+
.widget-value {
176+
display: flex;
177+
flex-direction: row;
178+
gap: 1em;
179+
align-items: center;
180+
justify-content: flex-end;
184181
}
185182

186183
.widget-number-input {

0 commit comments

Comments
 (0)