Skip to content

Commit 2d613b2

Browse files
authored
feat: improve scatter legend interactivity (#2649)
1 parent aab13d3 commit 2d613b2

3 files changed

Lines changed: 45 additions & 18 deletions

File tree

app/components/Compare/FacetScatterChart.vue

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
VueUiScatter,
66
type VueUiScatterConfig,
77
type VueUiScatterDatasetItem,
8+
type VueUiScatterSeries,
89
} from 'vue-data-ui/vue-ui-scatter'
910
import { buildCompareScatterChartDataset } from '~/utils/compare-scatter-chart'
1011
import { loadFile, copyAltTextForCompareScatterChart } from '~/utils/charts'
@@ -285,6 +286,11 @@ function toggleAxisHighlight(state: AxisHighlight) {
285286
highlightedAxis.value = state
286287
}
287288
289+
function toggleLegendItem(legendItem: VueUiScatterSeries) {
290+
legendItem.segregate()
291+
legendItem.onEnter()
292+
}
293+
288294
const readyTeleport = shallowRef(false)
289295
290296
onMounted(async () => {
@@ -389,26 +395,26 @@ onMounted(async () => {
389395
: 'text-sm leading-6'
390396
"
391397
>
392-
<li v-for="datapoint in legend" :key="datapoint.name">
398+
<li v-for="legendItem in legend" :key="legendItem.id">
393399
<button
394-
:aria-pressed="datapoint.isSegregated"
395-
:aria-label="datapoint.name"
400+
:aria-pressed="legendItem.isSegregated"
401+
:aria-label="legendItem.name"
396402
type="button"
397403
class="flex gap-1.5 place-items-center"
398-
@click="datapoint.segregate()"
404+
:class="legendItem.isSegregated ? 'line-through' : 'hover:underline'"
405+
@click="toggleLegendItem(legendItem)"
406+
@mouseenter="legendItem.onEnter()"
407+
@mouseleave="legendItem.onLeave()"
408+
@focus="legendItem.onEnter()"
409+
@blur="legendItem.onLeave()"
399410
>
400411
<div class="h-3 w-3" aria-hidden="true">
401412
<svg viewBox="0 0 2 2" class="w-full">
402-
<circle cx="1" cy="1" r="1" :fill="datapoint.color" />
413+
<circle cx="1" cy="1" r="1" :fill="legendItem.color" />
403414
</svg>
404415
</div>
405-
<span
406-
class="text-fg"
407-
:style="{
408-
textDecoration: datapoint.isSegregated ? 'line-through' : undefined,
409-
}"
410-
>
411-
{{ datapoint.name }}
416+
<span class="text-fg">
417+
{{ legendItem.name }}
412418
</span>
413419
</button>
414420
</li>
@@ -559,14 +565,35 @@ onMounted(async () => {
559565
</template>
560566

561567
<style scoped>
568+
:deep(.vue-data-ui-component) {
569+
--super-ease-out: cubic-bezier(0.15, 0.75, 0.35, 1);
570+
}
571+
562572
:deep(.vue-data-ui-component svg:focus-visible) {
563573
outline: 1px solid var(--accent) !important;
564574
border-radius: 0.1rem;
565575
outline-offset: 0;
566576
}
577+
567578
:deep(.vue-ui-user-options-button:focus-visible),
568579
:deep(.vue-ui-user-options :first-child:focus-visible) {
569580
outline: 0.1rem solid var(--accent) !important;
570581
border-radius: 0.25rem;
571582
}
583+
584+
:deep(.vue-ui-scatter-scale-group),
585+
:deep(.vue-ui-scatter-datapoint text),
586+
:deep(.vue-ui-scatter-datapoint circle),
587+
:deep(.vue-ui-scatter-datapoint-label) {
588+
transition: all 0.5s var(--super-ease-out) !important;
589+
}
590+
591+
@media (prefers-reduced-motion: reduce) {
592+
:deep(.vue-ui-scatter-scale-group),
593+
:deep(.vue-ui-scatter-datapoint text),
594+
:deep(.vue-ui-scatter-datapoint circle),
595+
:deep(.vue-ui-scatter-datapoint-label) {
596+
transition: none !important;
597+
}
598+
}
572599
</style>

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@
109109
"vite-plugin-pwa": "1.2.0",
110110
"vite-plus": "0.1.16",
111111
"vue": "3.5.33",
112-
"vue-data-ui": "3.18.0",
112+
"vue-data-ui": "3.18.2",
113113
"vue-router": "5.0.4"
114114
},
115115
"devDependencies": {

pnpm-lock.yaml

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)