@@ -20,6 +20,7 @@ import { computed, ref, watch } from "vue";
20
20
const value = defineModel <string >({ required: true });
21
21
const props = defineProps <{
22
22
label: string ;
23
+ identifiers? : string [];
23
24
}>();
24
25
const isFocus = ref (false );
25
26
const isEmpty = computed (() => value .value === " " );
@@ -40,15 +41,18 @@ import { tokenize } from "./functionTokenize";
40
41
const labelContent = computed (() =>
41
42
isEmpty .value
42
43
? [<span >{ props .label } </span >]
43
- : tokenize (value .value ).map ((token ) => (
44
+ : tokenize (value .value , props . identifiers || [ " x " ] ).map ((token ) => (
44
45
<span
45
46
class = { [
46
47
token .type ,
48
+ token .raw ,
47
49
" function-label-item" ,
48
- token .level ? " level-" + token .level : undefined ,
50
+ token .level ? " level-" + Math .min (token .level , 5 ) : undefined ,
51
+ token .err ? " error" : undefined ,
52
+ token .sqrtLevel ? " under-sqrt" : undefined ,
49
53
]}
50
54
>
51
- { token .raw }
55
+ < span class = " inner " > { token .raw } </ span >
52
56
</span >
53
57
))
54
58
);
@@ -66,6 +70,7 @@ const labelContent = computed(() =>
66
70
padding : 0 ;
67
71
display : flex ;
68
72
font-family : var (--font-math );
73
+ position : relative ;
69
74
& .focus {
70
75
background-color : var (--s-color-surface-container-highest );
71
76
border-bottom-color : var (--s-color-primary );
@@ -80,19 +85,22 @@ const labelContent = computed(() =>
80
85
width : 0 ;
81
86
flex-grow : 1 ;
82
87
caret-color : var (--s-color-primary );
83
- line-height : 1.2 ;
84
88
z-index : 1 ;
85
89
color : transparent ;
86
90
}
87
91
label {
92
+ display : block ;
88
93
color : var (--s-color-outline );
89
94
position : absolute ;
90
- line-height : 1.2 ;
91
95
white-space : pre ;
96
+ max-width : 100% ;
97
+ box-sizing : border-box ;
92
98
}
93
99
input ,
94
100
label {
95
- padding : 0.4em 0.45em 0.3em 0.45em ;
101
+ padding : 0.2em 0.45em 0.1em 0.45em ;
102
+ line-height : 1.6 ;
103
+ overflow : hidden ;
96
104
}
97
105
& .styled label {
98
106
transform : translateY (-0.05em );
@@ -103,21 +111,21 @@ const labelContent = computed(() =>
103
111
}
104
112
105
113
.function-label {
106
- .function-label-item {
114
+ .function-label-item ,
115
+ .function-label-item .inner {
107
116
display : inline-block ;
108
117
}
109
118
.identifier {
110
119
color : var (--s-color-primary );
111
120
}
112
121
.operator {
113
122
color : var (--s-color-secondary );
114
- opacity : 0.8 ;
115
123
}
116
124
.bracket {
117
125
color : var (--s-color-secondary );
118
126
}
119
127
@for $i from 1 through 5 {
120
- .bracket.level-#{$i } {
128
+ .bracket.level-#{$i } .inner {
121
129
transform : scaleY (#{0.8 + $i * 0.2 } );
122
130
}
123
131
}
@@ -127,5 +135,26 @@ const labelContent = computed(() =>
127
135
.function {
128
136
color : var (--s-color-tertiary );
129
137
}
138
+ .error .inner {
139
+ text-decoration : underline var (--s-color-error );
140
+ text-decoration-thickness : 0.05em ;
141
+ text-underline-offset : 0.1em ;
142
+ }
143
+ .sqrt {
144
+ transform : scaleY (1.3 ) translateY (-1px );
145
+ }
146
+ .under-sqrt {
147
+ background-image : linear-gradient (
148
+ to bottom ,
149
+ transparent 0.1em ,
150
+ var (--s-color-tertiary ) 0.1em ,
151
+ var (--s-color-tertiary ) 0.14em ,
152
+ transparent 0.14em ,
153
+ transparent 100%
154
+ );
155
+ & .sqrt {
156
+ transform : none !important ;
157
+ }
158
+ }
130
159
}
131
160
</style >
0 commit comments