11<script setup lang="ts">
2- import { ref , watch } from " vue"
2+ import { computed } from " vue"
33
44const props = withDefaults (
55 defineProps <{
@@ -18,42 +18,33 @@ const emit = defineEmits<{
1818 " bubble-click" : [id : number ]
1919}>()
2020
21- const classes5 = [
22- " assessmentBubble5_1" ,
23- " assessmentBubble5_2" ,
24- " assessmentBubble5_3" ,
25- " assessmentBubble5_4" ,
26- " assessmentBubble5_5" ,
27- ]
21+ const levelClass = computed (() => {
22+ if (props .maxValue === 5 && props .value >= 1 && props .value <= 5 ) {
23+ return ` assessmentBubble--level-${props .value } `
24+ }
25+ return " "
26+ })
2827
29- const bubbleClass = ref ( " " )
28+ const displayValue = computed (() => ( props . value >= 1 && props . value <= props . maxValue ? props . value : " ? " ) )
3029
31- watch (props , () => {
32- setBubbleAttrs ()
33- })
30+ const staticLabel = computed (() => ` Rating ${displayValue .value } of ${props .maxValue } ` )
31+ const clickableLabel = computed (() => ` ${staticLabel .value }, open details ` )
3432
3533function clickBubble() {
3634 if (props .id !== undefined ) {
3735 emit (" bubble-click" , props .id )
3836 }
3937}
40-
41- function setBubbleAttrs() {
42- if (props .maxValue === 5 && props .value <= 5 && props .value > 0 ) {
43- const index = props .value - 1
44- bubbleClass .value = classes5 [index ] ?? " "
45- }
46- }
47-
48- setBubbleAttrs ()
4938 </script >
5039<template >
51- <q-icon
52- name =" circle"
53- size =" sm"
54- :class =" 'assessmentIcon cursor-pointer ' + bubbleClass"
40+ <button
41+ v-if =" id !== undefined"
42+ type =" button"
43+ :class =" ['assessmentBubble', 'assessmentBubble--clickable', levelClass]"
44+ :aria-label =" clickableLabel"
5545 @click =" clickBubble"
5646 >
47+ <span aria-hidden =" true" >{{ displayValue }}</span >
5748 <q-tooltip
5849 style =" white-space : pre-wrap "
5950 class =" text-body2"
@@ -62,5 +53,66 @@ setBubbleAttrs()
6253 <br />
6354 {{ props.text }}
6455 </q-tooltip >
65- </q-icon >
56+ </button >
57+ <span
58+ v-else
59+ :class =" ['assessmentBubble', levelClass]"
60+ role =" img"
61+ :aria-label =" staticLabel"
62+ >
63+ <span aria-hidden =" true" >{{ displayValue }}</span >
64+ </span >
6665</template >
66+ <style scoped>
67+ .assessmentBubble {
68+ display : inline-flex ;
69+ align-items : center ;
70+ justify-content : center ;
71+ width : 1.75rem ;
72+ height : 1.75rem ;
73+ margin : 0 0.125rem ;
74+ border : 0.0625rem solid var (--ucdavis-blue-100 );
75+ border-radius : 50% ;
76+ background-color : var (--ucdavis-blue-70 );
77+ color : white ;
78+ font-weight : 700 ;
79+ font-size : 0.875rem ;
80+ line-height : 1 ;
81+ padding : 0 ;
82+ vertical-align : middle ;
83+ }
84+
85+ .assessmentBubble--clickable {
86+ cursor : pointer ;
87+ }
88+
89+ .assessmentBubble--clickable :hover ,
90+ .assessmentBubble--clickable :focus {
91+ filter : brightness (1.1 );
92+ }
93+
94+ .assessmentBubble--clickable :focus-visible {
95+ outline : 0.125rem solid var (--ucdavis-gold-90 );
96+ outline-offset : 0.125rem ;
97+ }
98+
99+ .assessmentBubble--level-1 {
100+ background-color : var (--ucdavis-blue-70 );
101+ }
102+
103+ .assessmentBubble--level-2 {
104+ background-color : var (--ucdavis-blue-80 );
105+ }
106+
107+ .assessmentBubble--level-3 {
108+ background-color : var (--ucdavis-blue-90 );
109+ }
110+
111+ .assessmentBubble--level-4 {
112+ background-color : var (--ucdavis-blue-100 );
113+ }
114+
115+ .assessmentBubble--level-5 {
116+ background-color : #011a38 ;
117+ }
118+ </style >
0 commit comments