@@ -20,6 +20,7 @@ import { computed, ref, watch } from "vue";
2020const value = defineModel <string >({ required: true });
2121const props = defineProps <{
2222 label: string ;
23+ identifiers? : string [];
2324}>();
2425const isFocus = ref (false );
2526const isEmpty = computed (() => value .value === " " );
@@ -40,15 +41,18 @@ import { tokenize } from "./functionTokenize";
4041const labelContent = computed (() =>
4142 isEmpty .value
4243 ? [<span >{ props .label } </span >]
43- : tokenize (value .value ).map ((token ) => (
44+ : tokenize (value .value , props . identifiers || [ " x " ] ).map ((token ) => (
4445 <span
4546 class = { [
4647 token .type ,
48+ token .raw ,
4749 " 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 ,
4953 ]}
5054 >
51- { token .raw }
55+ < span class = " inner " > { token .raw } </ span >
5256 </span >
5357 ))
5458);
@@ -66,6 +70,7 @@ const labelContent = computed(() =>
6670 padding : 0 ;
6771 display : flex ;
6872 font-family : var (--font-math );
73+ position : relative ;
6974 & .focus {
7075 background-color : var (--s-color-surface-container-highest );
7176 border-bottom-color : var (--s-color-primary );
@@ -80,19 +85,22 @@ const labelContent = computed(() =>
8085 width : 0 ;
8186 flex-grow : 1 ;
8287 caret-color : var (--s-color-primary );
83- line-height : 1.2 ;
8488 z-index : 1 ;
8589 color : transparent ;
8690 }
8791 label {
92+ display : block ;
8893 color : var (--s-color-outline );
8994 position : absolute ;
90- line-height : 1.2 ;
9195 white-space : pre ;
96+ max-width : 100% ;
97+ box-sizing : border-box ;
9298 }
9399 input ,
94100 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 ;
96104 }
97105 & .styled label {
98106 transform : translateY (-0.05em );
@@ -103,21 +111,21 @@ const labelContent = computed(() =>
103111}
104112
105113.function-label {
106- .function-label-item {
114+ .function-label-item ,
115+ .function-label-item .inner {
107116 display : inline-block ;
108117 }
109118 .identifier {
110119 color : var (--s-color-primary );
111120 }
112121 .operator {
113122 color : var (--s-color-secondary );
114- opacity : 0.8 ;
115123 }
116124 .bracket {
117125 color : var (--s-color-secondary );
118126 }
119127 @for $i from 1 through 5 {
120- .bracket.level-#{$i } {
128+ .bracket.level-#{$i } .inner {
121129 transform : scaleY (#{0.8 + $i * 0.2 } );
122130 }
123131 }
@@ -127,5 +135,26 @@ const labelContent = computed(() =>
127135 .function {
128136 color : var (--s-color-tertiary );
129137 }
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+ }
130159}
131160 </style >
0 commit comments