Skip to content

Commit d113435

Browse files
authored
fix: positioning of salary band min max markers on small devices (#250)
1 parent e4f0f4f commit d113435

File tree

1 file changed

+48
-56
lines changed

1 file changed

+48
-56
lines changed

components/SalaryBandLine.vue

Lines changed: 48 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,60 @@
11
<template>
2-
<div class="relative h-10 flex items-center">
3-
<!-- Salary band line -->
2+
<div class="flex gap-1 items-center">
3+
<!-- Min label -->
44
<div
5-
class="absolute h-2 bg-gray-200 dark:bg-gray-700 rounded-full"
6-
:style="{
7-
left: `${getPercentPosition(min)}%`,
8-
width: `${getPercentWidth(min, max)}%`
9-
}"
10-
/>
11-
12-
<!-- Min marker -->
13-
<div
14-
class="absolute top-1/2 text-xs text-gray-500 dark:text-gray-400 whitespace-nowrap"
15-
:style="{
16-
left: `${getPercentPosition(min)}%`,
17-
transform: 'translateX(-100%) translateY(-50%)',
18-
marginLeft: '-4px'
19-
}"
5+
class="text-xs text-gray-500 dark:text-gray-400 w-16 whitespace-nowrap"
206
>
217
{{ formatValue(min) }}
228
</div>
239

24-
<!-- Max marker -->
25-
<div
26-
class="absolute top-1/2 text-xs text-gray-500 dark:text-gray-400 whitespace-nowrap"
27-
:style="{
28-
left: `${getPercentPosition(max)}%`,
29-
transform: 'translateY(-50%)',
30-
marginLeft: '4px'
31-
}"
32-
>
33-
{{ formatValue(max) }}
34-
</div>
10+
<!-- Line with markers -->
11+
<div class="relative h-10 flex items-center w-full">
12+
<!-- Salary band line -->
13+
<div
14+
class="absolute h-2 bg-gray-200 dark:bg-gray-700 rounded-full"
15+
:style="{
16+
left: `${getPercentPosition(min)}%`,
17+
width: `${getPercentWidth(min, max)}%`
18+
}"
19+
/>
3520

36-
<!-- Median marker -->
37-
<div
38-
class="absolute w-1 h-4 bg-blue-500 rounded-full transform -translate-x-1/2"
39-
:style="{ left: `${getPercentPosition(median)}%` }"
40-
>
41-
<div class="absolute top-4 transform -translate-x-1/2 text-xs text-blue-500 whitespace-nowrap">
42-
{{ formatValue(median) }}
21+
<!-- Median marker -->
22+
<div
23+
class="absolute w-1 h-4 bg-blue-500 rounded-full transform -translate-x-1/2"
24+
:style="{ left: `${getPercentPosition(median)}%` }"
25+
>
26+
<div class="absolute top-4 transform -translate-x-1/2 text-xs text-blue-500 whitespace-nowrap">
27+
{{ formatValue(median) }}
28+
</div>
4329
</div>
44-
</div>
4530

46-
<!-- Average marker -->
47-
<div
48-
class="absolute w-1 h-4 bg-green-500 rounded-full transform -translate-x-1/2"
49-
:style="{ left: `${getPercentPosition(average)}%` }"
50-
>
51-
<div class="absolute top-[-16px] transform -translate-x-1/2 text-xs text-green-500 whitespace-nowrap">
52-
{{ formatValue(average) }}
31+
<!-- Average marker -->
32+
<div
33+
class="absolute w-1 h-4 bg-green-500 rounded-full transform -translate-x-1/2"
34+
:style="{ left: `${getPercentPosition(average)}%` }"
35+
>
36+
<div class="absolute top-[-16px] transform -translate-x-1/2 text-xs text-green-500 whitespace-nowrap">
37+
{{ formatValue(average) }}
38+
</div>
39+
</div>
40+
41+
<!-- Own salary marker (optional) -->
42+
<div
43+
v-if="ownSalary"
44+
class="absolute w-1 h-6 bg-purple-500 rounded-full transform -translate-x-1/2"
45+
:style="{ left: `${getPercentPosition(ownSalary)}%` }"
46+
>
47+
<div class="absolute top-8 transform -translate-x-1/2 text-xs text-purple-500 whitespace-nowrap">
48+
{{ formatValue(ownSalary) }}
49+
</div>
5350
</div>
5451
</div>
5552

56-
<!-- Own salary marker (optional) -->
53+
<!-- Max label -->
5754
<div
58-
v-if="ownSalary"
59-
class="absolute w-1 h-6 bg-purple-500 rounded-full transform -translate-x-1/2"
60-
:style="{ left: `${getPercentPosition(ownSalary)}%` }"
55+
class="text-xs text-gray-500 dark:text-gray-400 w-18 whitespace-nowrap"
6156
>
62-
<div class="absolute top-8 transform -translate-x-1/2 text-xs text-purple-500 whitespace-nowrap">
63-
{{ formatValue(ownSalary) }}
64-
</div>
57+
{{ formatValue(max) }}
6558
</div>
6659
</div>
6760
</template>
@@ -82,22 +75,21 @@ const props = defineProps<{
8275
function getPercentPosition (value: number | string) {
8376
const numValue = Number(value);
8477
const range = props.globalMax - props.globalMin;
85-
if (range === 0) {
78+
if (range <= 0) {
8679
return 50;
8780
}
88-
// Add padding of 10% on each side
89-
return 10 + ((numValue - props.globalMin) / range) * 80;
81+
return ((numValue - props.globalMin) / range) * 100;
9082
}
9183
9284
// Calculate width percentage for the salary band
9385
function getPercentWidth (min: number, max: number) {
9486
const minValue = min;
9587
const maxValue = max;
9688
const range = props.globalMax - props.globalMin;
97-
if (range === 0) {
98-
return 80;
89+
if (range <= 0) {
90+
return 100;
9991
}
100-
return ((maxValue - minValue) / range) * 80;
92+
return ((maxValue - minValue) / range) * 100;
10193
}
10294
10395
// Format the value for display

0 commit comments

Comments
 (0)