From 6324efbf3b225a37bb5eb7192b5d17f5757fd46e Mon Sep 17 00:00:00 2001 From: Lemon Date: Fri, 3 Apr 2026 19:02:04 +0800 Subject: [PATCH] fix(textarea): fix the issue of textarea placeholder (#9621) Signed-off-by: liujp --- src/widgets/textarea/lv_textarea.c | 42 +- src/widgets/textarea/lv_textarea_private.h | 1 + tests/ref_imgs/textarea_align_center.png | Bin 0 -> 2330 bytes tests/ref_imgs/textarea_align_left.png | Bin 0 -> 2329 bytes tests/ref_imgs/textarea_align_right.png | Bin 0 -> 2331 bytes tests/ref_imgs/textarea_cursor_pos_bottom.png | Bin 0 -> 3272 bytes tests/ref_imgs/textarea_cursor_pos_left.png | Bin 0 -> 2329 bytes tests/ref_imgs/textarea_cursor_pos_right.png | Bin 0 -> 2329 bytes tests/ref_imgs/textarea_cursor_pos_top.png | Bin 0 -> 3272 bytes tests/ref_imgs/textarea_cursor_show.png | Bin 0 -> 774 bytes tests/ref_imgs/textarea_normal_mode.png | Bin 0 -> 2329 bytes tests/ref_imgs/textarea_password_mode.png | Bin 0 -> 1696 bytes .../textarea_password_mode_add_char.png | Bin 0 -> 1699 bytes .../textarea_password_mode_add_text.png | Bin 0 -> 1699 bytes .../textarea_password_mode_delete_char.png | Bin 0 -> 1699 bytes .../textarea_password_mode_hide_char_one.png | Bin 0 -> 1668 bytes .../textarea_password_mode_hide_char_two.png | Bin 0 -> 1694 bytes .../textarea_password_mode_to_normal_mode.png | Bin 0 -> 1903 bytes .../textarea_password_mode_update.png | Bin 0 -> 1696 bytes .../ref_imgs/textarea_placeholder_center.png | Bin 0 -> 2078 bytes .../textarea_placeholder_left_mid.png | Bin 0 -> 2120 bytes .../textarea_placeholder_pad_left_top_50.png | Bin 0 -> 2121 bytes tests/ref_imgs/textarea_placeholder_show.png | Bin 0 -> 2275 bytes tests/ref_imgs/textarea_placeholder_top.png | Bin 0 -> 2120 bytes .../textarea_align_center.png | Bin 0 -> 2317 bytes .../ref_imgs_vg_lite/textarea_align_left.png | Bin 0 -> 2319 bytes .../ref_imgs_vg_lite/textarea_align_right.png | Bin 0 -> 2320 bytes .../textarea_cursor_pos_bottom.png | Bin 0 -> 3221 bytes .../textarea_cursor_pos_left.png | Bin 0 -> 2316 bytes .../textarea_cursor_pos_right.png | Bin 0 -> 2316 bytes .../textarea_cursor_pos_top.png | Bin 0 -> 3221 bytes .../ref_imgs_vg_lite/textarea_cursor_show.png | Bin 0 -> 1674 bytes .../ref_imgs_vg_lite/textarea_normal_mode.png | Bin 0 -> 2319 bytes .../textarea_password_mode.png | Bin 0 -> 1721 bytes .../textarea_password_mode_add_char.png | Bin 0 -> 1723 bytes .../textarea_password_mode_add_text.png | Bin 0 -> 1723 bytes .../textarea_password_mode_delete_char.png | Bin 0 -> 1723 bytes .../textarea_password_mode_hide_char_one.png | Bin 0 -> 1694 bytes .../textarea_password_mode_hide_char_two.png | Bin 0 -> 1721 bytes .../textarea_password_mode_to_normal_mode.png | Bin 0 -> 1915 bytes .../textarea_password_mode_update.png | Bin 0 -> 1722 bytes .../textarea_placeholder_center.png | Bin 0 -> 2077 bytes .../textarea_placeholder_left_mid.png | Bin 0 -> 2115 bytes .../textarea_placeholder_pad_left_top_50.png | Bin 0 -> 2118 bytes .../textarea_placeholder_show.png | Bin 0 -> 2256 bytes .../textarea_placeholder_top.png | Bin 0 -> 2115 bytes tests/src/test_cases/widgets/test_textarea.c | 377 ++++++++++++++++++ 47 files changed, 409 insertions(+), 11 deletions(-) create mode 100644 tests/ref_imgs/textarea_align_center.png create mode 100644 tests/ref_imgs/textarea_align_left.png create mode 100644 tests/ref_imgs/textarea_align_right.png create mode 100644 tests/ref_imgs/textarea_cursor_pos_bottom.png create mode 100644 tests/ref_imgs/textarea_cursor_pos_left.png create mode 100644 tests/ref_imgs/textarea_cursor_pos_right.png create mode 100644 tests/ref_imgs/textarea_cursor_pos_top.png create mode 100644 tests/ref_imgs/textarea_cursor_show.png create mode 100644 tests/ref_imgs/textarea_normal_mode.png create mode 100644 tests/ref_imgs/textarea_password_mode.png create mode 100644 tests/ref_imgs/textarea_password_mode_add_char.png create mode 100644 tests/ref_imgs/textarea_password_mode_add_text.png create mode 100644 tests/ref_imgs/textarea_password_mode_delete_char.png create mode 100644 tests/ref_imgs/textarea_password_mode_hide_char_one.png create mode 100644 tests/ref_imgs/textarea_password_mode_hide_char_two.png create mode 100644 tests/ref_imgs/textarea_password_mode_to_normal_mode.png create mode 100644 tests/ref_imgs/textarea_password_mode_update.png create mode 100644 tests/ref_imgs/textarea_placeholder_center.png create mode 100644 tests/ref_imgs/textarea_placeholder_left_mid.png create mode 100644 tests/ref_imgs/textarea_placeholder_pad_left_top_50.png create mode 100644 tests/ref_imgs/textarea_placeholder_show.png create mode 100644 tests/ref_imgs/textarea_placeholder_top.png create mode 100644 tests/ref_imgs_vg_lite/textarea_align_center.png create mode 100644 tests/ref_imgs_vg_lite/textarea_align_left.png create mode 100644 tests/ref_imgs_vg_lite/textarea_align_right.png create mode 100644 tests/ref_imgs_vg_lite/textarea_cursor_pos_bottom.png create mode 100644 tests/ref_imgs_vg_lite/textarea_cursor_pos_left.png create mode 100644 tests/ref_imgs_vg_lite/textarea_cursor_pos_right.png create mode 100644 tests/ref_imgs_vg_lite/textarea_cursor_pos_top.png create mode 100644 tests/ref_imgs_vg_lite/textarea_cursor_show.png create mode 100644 tests/ref_imgs_vg_lite/textarea_normal_mode.png create mode 100644 tests/ref_imgs_vg_lite/textarea_password_mode.png create mode 100644 tests/ref_imgs_vg_lite/textarea_password_mode_add_char.png create mode 100644 tests/ref_imgs_vg_lite/textarea_password_mode_add_text.png create mode 100644 tests/ref_imgs_vg_lite/textarea_password_mode_delete_char.png create mode 100644 tests/ref_imgs_vg_lite/textarea_password_mode_hide_char_one.png create mode 100644 tests/ref_imgs_vg_lite/textarea_password_mode_hide_char_two.png create mode 100644 tests/ref_imgs_vg_lite/textarea_password_mode_to_normal_mode.png create mode 100644 tests/ref_imgs_vg_lite/textarea_password_mode_update.png create mode 100644 tests/ref_imgs_vg_lite/textarea_placeholder_center.png create mode 100644 tests/ref_imgs_vg_lite/textarea_placeholder_left_mid.png create mode 100644 tests/ref_imgs_vg_lite/textarea_placeholder_pad_left_top_50.png create mode 100644 tests/ref_imgs_vg_lite/textarea_placeholder_show.png create mode 100644 tests/ref_imgs_vg_lite/textarea_placeholder_top.png diff --git a/src/widgets/textarea/lv_textarea.c b/src/widgets/textarea/lv_textarea.c index 86f3a7804e..6ee8aaeb8c 100644 --- a/src/widgets/textarea/lv_textarea.c +++ b/src/widgets/textarea/lv_textarea.c @@ -68,6 +68,8 @@ static void lv_textarea_scroll_to_cusor_pos(lv_obj_t * obj, int32_t pos); static lv_result_t add_char(lv_obj_t * obj, uint32_t c); static void add_text(lv_obj_t * obj, const char * txt); static void set_cursor_pos_internal(lv_obj_t * obj, int32_t pos); +static void calc_placeholder_text_size(lv_obj_t * obj); + /********************** * STATIC VARIABLES **********************/ @@ -360,6 +362,8 @@ void lv_textarea_set_placeholder_text(lv_obj_t * obj, const char * txt) lv_strcpy(ta->placeholder_txt, txt); ta->placeholder_txt[txt_len] = '\0'; + + calc_placeholder_text_size(obj); } lv_obj_invalidate(obj); @@ -418,7 +422,6 @@ void lv_textarea_set_password_mode(lv_obj_t * obj, bool en) void lv_textarea_set_password_bullet(lv_obj_t * obj, const char * bullet) { LV_ASSERT_OBJ(obj, MY_CLASS); - LV_ASSERT_NULL(bullet); lv_textarea_t * ta = (lv_textarea_t *)obj; @@ -467,6 +470,9 @@ void lv_textarea_set_one_line(lv_obj_t * obj, bool en) } lv_obj_scroll_to(obj, 0, 0, LV_ANIM_OFF); + + /* update placeholder text size */ + calc_placeholder_text_size(obj); } void lv_textarea_set_accepted_chars(lv_obj_t * obj, const char * list) @@ -1310,18 +1316,15 @@ static void draw_placeholder(lv_event_t * e) if(ta->one_line) ph_dsc.flag |= LV_TEXT_FLAG_EXPAND; - int32_t left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); - int32_t right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); - int32_t top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); - int32_t bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); - int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_obj_t * label = ta->label; + int32_t left = lv_obj_get_style_pad_left(label, LV_PART_TEXTAREA_PLACEHOLDER); + int32_t top = lv_obj_get_style_pad_top(label, LV_PART_TEXTAREA_PLACEHOLDER); lv_area_t ph_coords; - lv_area_copy(&ph_coords, &obj->coords); - ph_coords.x1 += left + border_width; - ph_coords.x2 -= right + border_width; - ph_coords.y1 += top + border_width; - ph_coords.y2 -= bottom + border_width; + + lv_area_copy(&ph_coords, &label->coords); + lv_area_move(&ph_coords, left, top); ph_dsc.text = ta->placeholder_txt; + ph_dsc.text_size = ta->placeholder_txt_size; lv_draw_label(layer, &ph_dsc, &ph_coords); } } @@ -1564,4 +1567,21 @@ static lv_result_t add_char(lv_obj_t * obj, uint32_t c) return LV_RESULT_OK; } +static void calc_placeholder_text_size(lv_obj_t * obj) +{ + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(!ta->placeholder_txt) return; + + lv_draw_label_dsc_t ph_dsc; + lv_draw_label_dsc_init(&ph_dsc); + lv_obj_init_draw_label_dsc(obj, LV_PART_TEXTAREA_PLACEHOLDER, &ph_dsc); + ph_dsc.text = ta->placeholder_txt; + ph_dsc.font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + if(ta->one_line) ph_dsc.flag |= LV_TEXT_FLAG_EXPAND; + + lv_text_get_size(&ta->placeholder_txt_size, ph_dsc.text, ph_dsc.font, ph_dsc.letter_space, ph_dsc.line_space, + LV_COORD_MAX, + ph_dsc.flag); +} + #endif diff --git a/src/widgets/textarea/lv_textarea_private.h b/src/widgets/textarea/lv_textarea_private.h index 40a50cddaa..31d7aa7394 100644 --- a/src/widgets/textarea/lv_textarea_private.h +++ b/src/widgets/textarea/lv_textarea_private.h @@ -32,6 +32,7 @@ struct _lv_textarea_t { lv_obj_t obj; lv_obj_t * label; /**< Label of the text area */ char * placeholder_txt; /**< Place holder label. only visible if text is an empty string */ + lv_point_t placeholder_txt_size; /**Size of the placeholder text */ char * pwd_tmp; /**< Used to store the original text in password mode */ char * pwd_bullet; /**< Replacement characters displayed in password mode */ char * accepted_chars; /**< Only these characters will be accepted. NULL: accept all */ diff --git a/tests/ref_imgs/textarea_align_center.png b/tests/ref_imgs/textarea_align_center.png new file mode 100644 index 0000000000000000000000000000000000000000..b011f627c59a6aa3b0aca95dd48e5c9cd035ede1 GIT binary patch literal 2330 zcmdUweKgYx9L9fUSW4!l=mqmuIYgIxx7gK2X(+Dily0r$-Ejyl^0MY-Zd8(8ON`~U z+9_=oHdbatsJwR5Y@^NLB8}x`M)Pu={<^2X?>+bU>wC`gJ)b|G^E~G~H+{S@TAI5x z0RYhQa6je?0IDzmP?1131RycW&k6t_BOb?GP9>^H2T+lF!uK}MUc94^?E7eSwAO=I zyu;ky6Eyk*yv_JwK;3hfSwl6O+&iXollpE|5Z3WvCK8@OHIPiHEyUTC<-OD0dUSZg zI~pmkx9V*nph(DJ6D05F$>NERrMjGw;UQ1qkTNVnu(-{=;V?-su`qC1(Yqe~dJ*DY zcYuUyx-n`?lNH;)C|R@AZelsB=XHUDzQ&peOIq{9G<{Hxd9B^t0Xm_x6*CtahKE=b znwP#J1mHFC#tmUAY3rls#ZHfhQD)lrMUf&07>7z}V23l`=2ND1NauTUY(yn3j8M)q zXHec-PQIncVUT4}&&Hr}j%*De?=~7xO9wPTD*9m10SMT~#+Fnei^-1jTMY`fF+#yp zYlMfgxT(?LoC;oYO2TyYo5bo#14X;p8PPZIRuzOMIY#ZwoE|yLl-KQ-Ay8or2)jIV*oW(ZI;;gRdBKX2}7AR9>QC{9M!B z0#_7CQUTMettyPNwS-i1!&as4gGTt$PumFd zNePO$S5){)cFlYL?2vj!mwahL^^bXGLBX|=*URnM2I&P6V_j=H7ixRox`I zy;z{#Z{@&ynqN8kp$a!Mv;1aw`v?VfK@pvxLuu=11V5r&TjUCU>!E%AhDbIL@_4fp zN@o`Bk=O2^WaVL#@V?e3zxtBLo9^zPcCEuu-**L8o{kA?Wxp^r>fLko#3KqqJ}qZr zyG8!i5Bi9zj$1*xRfu;>&^ z2fS{H(E8W=X(01m?*!|+@j*ViHaf9uorgGmm1oMX_{CaIRTbr;VNeJdl>Q%|cHeMC zrhoXsVZB0r!$3c`od0Y6%$Bamr>umSNfuw|oSu|(DarXcCN8=09v!bbzgzC7ti`*P zPON>_XkNd4P9{$gAjW3>6)Zeh58HH_K=`oKctJ*`cC0;7(q?vbNfTi4Da-xb%Fpv+ zMuOcJom9|crydzUGK53ND%AHW5Kzg*;|idV^6y*41)>DBqaXkV-u z!nT&J(ZvB%x=w)hW;bWh<^htLm?^v literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/textarea_align_left.png b/tests/ref_imgs/textarea_align_left.png new file mode 100644 index 0000000000000000000000000000000000000000..7f2ef66e075fbb58f8be287a9c15eba9938580be GIT binary patch literal 2329 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 IehlFL3Eg}Rr~m)} literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/textarea_cursor_pos_bottom.png b/tests/ref_imgs/textarea_cursor_pos_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..aac46df98e37e404aa7de2092fa5f5604ee60aea GIT binary patch literal 3272 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/textarea_cursor_pos_left.png b/tests/ref_imgs/textarea_cursor_pos_left.png new file mode 100644 index 0000000000000000000000000000000000000000..6aa556e088ed090e94bd97ae8e004d971d6d4463 GIT binary patch literal 2329 zcmdUxeKgYx7{`CuW$C(xn;kTEZ}L)<$V=12ZBBU!nZ}xGcStT*rMwRFu5z2V-qx5B zN}*$Ambax+8zHZgytNUAX)8mT-Bst@&OP_<`-eZD@AJ>|J>Spwoaelk$38VxT~z=8 z)LizXya7N74gd;cV7UOqgkekp06gY`a`K5$nC)wJ(+e?pEIO9qdWn$_o_~YO3+gCO z(~q-I5c#DGc4%|@%=-h-UfGxvy9Zm|>9z_Ef`<7L2yv>b-Qbm7Egf%(afe(_IL;Fi zsylzro4xg3>KJU<`IptQQ&SJ9eoTWQ%T_@-a&AJO%l1kG6x96d& z_bErqG;m0OSy_R3p*yhh)b@|a!)2MEC-gyrx?~;W;Q{q^X+cNW@9{+zX3(z-geGiO ztGIgy(hzbb=+k<@Rwo(I1u33@fNwa#la%FyuM)?uqk-L@mX8f%U(uSPQT%+U6D+78 zODC8h6Aw^wo<}_AnAxJp@A``RrF-r;L|WpSVF$9oY0;CdT{zS84X!cc?dR1X;&LxTYY26iyK{ZPMLy%hFEg1w>-nL=jC%bc z4Q6GPa$f#iS;OITSk**jSgkxdm}0F{zRhy`WAbJ zz~riFWn1eKG54eQ(c!L-=Nx1DtwTj5MqAAVS#_PrX2feHz}^mhe?vXAYNfD2&(kID z_O^x8hdcXl&Ov8PBDo~4`Fs=%U^>GTEyUbvnynM$rI9SLR!Dl;l)=KI)=vxER6j3N)AJsXCQ!&o#GEr9ZMPnKKB% zhwg6SwZQ}SDp(3}bKW(i_lt|8{V2(>tE>0)zLlQNB5r`Fr6i8TG>sIAw0b@$ARleZ zdG5|@WMxIGPtsSTBtbT@v5B){H4U_^RWk9$xkM)n?d{uMqB-B26*Nk<{BmxnV#v## zS%(%f{7!%1@C#8MbvF%PjD&TTQtd5`TMlt-+(KlqYUFL3o~`MGC+4qv=o_;7TKRV= z-1KGB+5%4sO?`@Eog7wAFNs>NEroGAnpPK|ZQW(kwiND9YjF)C-o0}raY6gDl>r9R zFxEYI^J>hpf93d=(nI!3pdmtTr{$DvVn$5rK`Z`(En@+v@-_ZpQ4Z$Nw9tWssIN<0 z6nU1hbn&zexs1Vt(aeGb0at5K^DD^KhLz0@H#hJ7N_a7^e3)N9S~;39bl*5e(^^hC zW_-4jj6^(EDTv9HQS>#zZFwuaLUrNlBrOg&g~MvXabLjV8|2QNn-QL(j+egAk*iX#M+0*8Q-;b4#x9IWUB0k177aG=^V z69fPjkhD*=M^mZ9A7Ep~Yt+m4B#x645GINMkPPo-)u>74)y^hmuicEk`LfU(AGp0& zZVJe7lHyp+y_?Sh`fJ_PDOI{;+EM;CBqist7Jk&n`~K8yyf%uY+$JzfJDK<(K%NNT M;_QK{`VF7*H_ARLN&o-= literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/textarea_cursor_pos_right.png b/tests/ref_imgs/textarea_cursor_pos_right.png new file mode 100644 index 0000000000000000000000000000000000000000..6aa556e088ed090e94bd97ae8e004d971d6d4463 GIT binary patch literal 2329 zcmdUxeKgYx7{`CuW$C(xn;kTEZ}L)<$V=12ZBBU!nZ}xGcStT*rMwRFu5z2V-qx5B zN}*$Ambax+8zHZgytNUAX)8mT-Bst@&OP_<`-eZD@AJ>|J>Spwoaelk$38VxT~z=8 z)LizXya7N74gd;cV7UOqgkekp06gY`a`K5$nC)wJ(+e?pEIO9qdWn$_o_~YO3+gCO z(~q-I5c#DGc4%|@%=-h-UfGxvy9Zm|>9z_Ef`<7L2yv>b-Qbm7Egf%(afe(_IL;Fi zsylzro4xg3>KJU<`IptQQ&SJ9eoTWQ%T_@-a&AJO%l1kG6x96d& z_bErqG;m0OSy_R3p*yhh)b@|a!)2MEC-gyrx?~;W;Q{q^X+cNW@9{+zX3(z-geGiO ztGIgy(hzbb=+k<@Rwo(I1u33@fNwa#la%FyuM)?uqk-L@mX8f%U(uSPQT%+U6D+78 zODC8h6Aw^wo<}_AnAxJp@A``RrF-r;L|WpSVF$9oY0;CdT{zS84X!cc?dR1X;&LxTYY26iyK{ZPMLy%hFEg1w>-nL=jC%bc z4Q6GPa$f#iS;OITSk**jSgkxdm}0F{zRhy`WAbJ zz~riFWn1eKG54eQ(c!L-=Nx1DtwTj5MqAAVS#_PrX2feHz}^mhe?vXAYNfD2&(kID z_O^x8hdcXl&Ov8PBDo~4`Fs=%U^>GTEyUbvnynM$rI9SLR!Dl;l)=KI)=vxER6j3N)AJsXCQ!&o#GEr9ZMPnKKB% zhwg6SwZQ}SDp(3}bKW(i_lt|8{V2(>tE>0)zLlQNB5r`Fr6i8TG>sIAw0b@$ARleZ zdG5|@WMxIGPtsSTBtbT@v5B){H4U_^RWk9$xkM)n?d{uMqB-B26*Nk<{BmxnV#v## zS%(%f{7!%1@C#8MbvF%PjD&TTQtd5`TMlt-+(KlqYUFL3o~`MGC+4qv=o_;7TKRV= z-1KGB+5%4sO?`@Eog7wAFNs>NEroGAnpPK|ZQW(kwiND9YjF)C-o0}raY6gDl>r9R zFxEYI^J>hpf93d=(nI!3pdmtTr{$DvVn$5rK`Z`(En@+v@-_ZpQ4Z$Nw9tWssIN<0 z6nU1hbn&zexs1Vt(aeGb0at5K^DD^KhLz0@H#hJ7N_a7^e3)N9S~;39bl*5e(^^hC zW_-4jj6^(EDTv9HQS>#zZFwuaLUrNlBrOg&g~MvXabLjV8|2QNn-QL(j+egAk*iX#M+0*8Q-;b4#x9IWUB0k177aG=^V z69fPjkhD*=M^mZ9A7Ep~Yt+m4B#x645GINMkPPo-)u>74)y^hmuicEk`LfU(AGp0& zZVJe7lHyp+y_?Sh`fJ_PDOI{;+EM;CBqist7Jk&n`~K8yyf%uY+$JzfJDK<(K%NNT M;_QK{`VF7*H_ARLN&o-= literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/textarea_cursor_pos_top.png b/tests/ref_imgs/textarea_cursor_pos_top.png new file mode 100644 index 0000000000000000000000000000000000000000..aac46df98e37e404aa7de2092fa5f5604ee60aea GIT binary patch literal 3272 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/textarea_cursor_show.png b/tests/ref_imgs/textarea_cursor_show.png new file mode 100644 index 0000000000000000000000000000000000000000..4ba43a7b2d4e425ab37870de23983806c4ff1f7c GIT binary patch literal 774 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^&B3=~ozb>=({Yi!R*LhWq zGY(&5|5-V)`z33VUwm5go_JqSLk|KO9#DcfxO?KUvD&fQOIu8Hvn z2G=hm=_h})Kw&xirUJkCW$q)O@Rb9H@2uq)#VdEr-Dm&2!uI{LqBrr^AAk94`#t-@ z(=T6L)n~7ixxM-2ZAM^9fdi#~$^3jNATHa_==$#~;1c9961K9l8-cVo|5>}gI)pq! bz`8ate6OE$_LEOlH;C)$>gTe~DWM4fwRH`K literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/textarea_normal_mode.png b/tests/ref_imgs/textarea_normal_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..7f2ef66e075fbb58f8be287a9c15eba9938580be GIT binary patch literal 2329 zcmdUwdow6Wi|S`)@2m&g9|sg2^pm|uzLCn?B!95=^#qA#@r>VV%mUCCPsAJ zxY1;StG~Zb7wz1owCAGUud>%TuC*0Kb-0&8#rObgQ7`A0Sj1pX zKHcaw*~HJ37uvQID2?RXc%mjUU+oX++c%Bq8z!xurjSE!6-CqSr7|PAVOQnDMWY<- zom5>pbJ0w~o-OzQOhn$Rjtmc#XLqH|Zgk5u-L1lp)h_Bu;&2f}2$HepPmk`$3RtNP zXb_Fhrkji%AE`$Q8r(2(4h>L%b{hkzrUU9A6VNU~BG&sh&e9N^m7b$oPMJkCVCbr#MBE`zj1RSZ$u4ac; zCN;~>g>ijvg}iE6?u`vnT0P?kzq99-plBrA5|c5lD9+V?x~H;zW~!DeN-m<2YMKlW zUxzjbpgm$fraSIyI%CXiA0B_VHzP_s8L}$-b8}9Y-n|-5WDkzYne1h+264x>FOScZ z1`T?%|8mT^xO(3`rjpj!g25i{v+VaF8(xNr=2+zSM^D(!mgu*t?a3Ow0rf`VGyQq% zAho`D+pjnoyqQx}o7a)UB8{;H@XTbYm{9qXHUnLE;W;c~6GuomYU?1~LZzwUxZ=%q zQ@yo!S3KTcYMQUpz7u8{l}#1d*cFwRG4j(F*Hz*bXAxdpaD30@#(w*-^F(EWOgddo zMAl=<6_1H_BR7lc2XMIo6`Q{HzIpF5JKUrVP1bP-l76T4q8$UtGK&?T_1mM)&mSq0-;c;PC~V<@ zu1m&SR*nxYHV*kD2vfbgh1~ve37n}A#Nv|<=EkP>oW&OKD#i=4#8Iq^#I&}c7`3pc zU&cs#wO?wQ=Z9MVNcT6*S1wFN#0c}M>}2J3G2&A6WK)FpLT`YvL4z>yXX2Y;U%Osz zRdmg@`)7y$-Kx_SYkG3#JYjJDTFl==&ep-*1h)*78DYNOaVenV>y1#BK?`9#%5%~S zdN5C#89w8|9(x@>Wj^67>9c0dk;P!eungvI(J2Ekw0*E*1RUdnpip-i68=#&T&PN3 zu&BIA%hmhyv|~0jqx)NRPf&YI+I3WBvo-TH&?%~p;i`V6&#DwK2q+zcfd9`0Ymu0Q zpGzDbK&KP30u4m^DF%rP%r@?e0HXYQFtJAT*{^~Tx}c2cTG<&n+H7xA=Z&v-=J-ho zORXe8+5g*m@G>Lq^x@^i5RRM86LH{>AUvyoY`u?1kkmDk=b7z2B&g3U!%%dx+3CY# ziX3FPipr^)Qj%KE(8rn+@z^*rSY;cRu$Pjr_TLj9l;x#4A_0Jsj(F9&en==Zp97p- z5HOGn97e^!Ayfn$l8%5uJ}t>MUNY#iZzqHxCEGR8kIDFAa4PasgV^x3Daa?U`zLOaSW+od~?;YOW0B7 z=tHkg7028&hi-PNe_*QO;D2;1xKc~JimBAib5?_)pt#YI?b82P|JDX{-`kt_%YAL# zw(i3Tr~@8D;L->%DHZ9Opjk3-?s8zK=$RntHKiD_FGH8wne=zTQ%>%j;gN= z5;GkX1UOij8quj8;wO%OzrRi{Vwt=Atj9wyOgTy0%yP$=NU8 zUNxph)#j~VWiImjQe23CLd4!Gh8`d6Mq;&xZh|~d%&SW$KQa?=P5iR*fJa-&xBbWF zNlan!W|?De1Tg~)Y zD*NqS>8iI|%ls4KlB47L-wDo@Tc7&+-hn-Cd$0a`6L<0X&i}s{KiDt6R=qd=8*k;F z>$Pv?4j!479~wX3)Gq(Jwfggo`(OQASp00i_>zopr0Ap;>P5=M^ literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/textarea_password_mode_add_char.png b/tests/ref_imgs/textarea_password_mode_add_char.png new file mode 100644 index 0000000000000000000000000000000000000000..c1efc55c07e37971f0d1a0502689340c556c44d3 GIT binary patch literal 1699 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#<6kw>x3Daa?V9WA!aSW+od~?;YOW0TD z*h8<{8WqRfGly<=s()ar;^2RDEVxojyo#yR&2v_Rp`f_Y1MY)I_s^)4Tj5%k-}*0b z_4~Jv4CMWDGsFI`H@_+^ac8~5v)xaxe*FE*|JqeyiCd}@@_%1je)iM8DL)H-FV2+@ zKcA5D+~HiU&+b>Uu6FmeT9$0Dyq`Dimiz6yTmHt_HZ^`NyS^;>-oKBZ&$d6;UvGOg{6~2F?ZvM+d0yY+ z{*+Z!`?aw>`|HNNEA9on39b&aZA|?7iqXIb(>$z}&{fc2!u&T^eYE?f_>ZAZ69l?TsCk%F8SRB5fIIKYR)#_RO7@-^{cUb7$g-xKxz zYu!!rCm-X!Z>?q#j@}nqTYK%tp4j(u<{baG>i6<@l4stOE0os#ytsGq>(BSsmFs^H ztY=zjb?*K3?3A5rqrbDMeK!|)5byS#Va81A`?x64{^oLLCI$ux4yV7->kppY+r;-l zn59WUfTdA^gT+ySgUL~Vqsc*FXbBk~x04lNWN2^@cy<34+wbpeRtMaNoF~wtU|eYpxVdN)z4*}Q$iB}*1*?Y literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/textarea_password_mode_add_text.png b/tests/ref_imgs/textarea_password_mode_add_text.png new file mode 100644 index 0000000000000000000000000000000000000000..4cb7bdaca447f8bfc9db9bcc5394eab99e460d41 GIT binary patch literal 1699 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#<6kw>x3Daa?V9WA!aSW+od~?;YOW0TD z*h8<{8WqRfGly<=s()ar;^2RDEVxojyo#yR&2v_Rp`f_Y18&BL@jmwaR~D7$oBv%L zcK`O#M7w#nF0J_&pTEl7U`Kr8nex-CAAf&s9~thSkTKn1-`nWxbb`B}4CVA8#3wYwv;paj>T|Qu{1v8KcUCbyesz4?%6kFXm;0^?ON85RE&bXS^}1};yaPL` zzA{M6bWjlBU}0)Rr*?>+_`N-Toz;g8f4{G@{rmXi+4kr9>n*Q-{@=R(ZQxgyw$k@( zm8N_5y*hAs+pimOA^95LR@$zfcVGiPL$TUKFF}bD{@-4y9nDqfI`ksAaU##lH}$=? zh8mpHI4tT@X2iU>sC~gwdxy~1(6jE?gM``+OzGd6gse6CbKD+Fid+W;m&L!7h{Tuw9C+(Z{1grgjUfjF*^=JO|-Qqtw>>ER5 zpMQUCy6Mifwbjg%e@k%OmPQ2*7Dok+Atf|nX7YT#E(Qh%1&*)zxy^s8nPnd+4>eDqN5L63%Wp3y z086@t#DM?T@(oHkWgFOsx~Jwet*NyVU}9iMPx3Daa?V9WA!aSW+od~?;YOW0TD z*h8<{8WqRfGly<=s()ar;^2RDEVxojyo#yR&2v_Rp`f_Y18&BL@jmwaR~D7$oBv%L zcK`O#M7w#nF0J_&pTEl7U`Kr8nex-CAAf&s9~thSkTKn1-`nWxbb`B}4CVA8#3wYwv;paj>T|Qu{1v8KcUCbyesz4?%6kFXm;0^?ON85RE&bXS^}1};yaPL` zzA{M6bWjlBU}0)Rr*?>+_`N-Toz;g8f4{G@{rmXi+4kr9>n*Q-{@=R(ZQxgyw$k@( zm8N_5y*hAs+pimOA^95LR@$zfcVGiPL$TUKFF}bD{@-4y9nDqfI`ksAaU##lH}$=? zh8mpHI4tT@X2iU>sC~gwdxy~1(6jE?gM``+OzGd6gse6CbKD+Fid+W;m&L!7h{Tuw9C+(Z{1grgjUfjF*^=JO|-Qqtw>>ER5 zpMQUCy6Mifwbjg%e@k%OmPQ2*7Dok+Atf|nX7YT#E(Qh%1&*)zxy^s8nPnd+4>eDqN5L63%Wp3y z086@t#DM?T@(oHkWgFOsx~Jwet*NyVU}9iMPx3Daa?VDt8LaSW+od~?-tm9V2k z>&2?pNqia3YWaq{RJK1TI->ew(-d*lyDT}vg-Hjj|8oDD6L~&Q{A-}U{q4J(;BB~`tKbBRoDeq=2dYx<+ z`d;JHTUSMuy=$j`+jHIS*2|r-*Io(otl3^XyZ@^8E1BoF84vvblKOggt^GT{+UQm0 z2J7~1+gatjcIVow!V=;8x2*)SSH`YZ2a0cX{@NDRzAe;0A!ctCLywPw00#?GqXRl+ z!}96p;qR|p4JNcZ*wy_F+RMTAN#MlppS53=Bu=cZx3>>{-?;G0D@Fq&OubkQq^qF8 zg!^x<`gYxR5NW-*oJm>o(#`);)ky(DI)VlNP8jUGusD1{aae)stJSmmF?>!FhaL+` z|K1jtu6tK_#`PUnFYaA-^{cUb7$g-xKxzYu!!rCm-X!Z>?q#j@}nqTYK%tp4j(u<{baG>i6<@l4stO zE0os#ytsGq>(BSsmFs^HtY=zjb?*K3?3A5rqrbDMeK!|)5byS#Va81A`?x64{^oLL zCI$ux4yV7->kppY+r;-ln59WUfTdA^gT+ySgUL~Vqsc*FXbBk~x04lNWN2^@cy<34 z+wbpeRtMaNoF~wtUiV8`Q1#;J>gTe~DWM4fH(I^e literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/textarea_password_mode_hide_char_two.png b/tests/ref_imgs/textarea_password_mode_hide_char_two.png new file mode 100644 index 0000000000000000000000000000000000000000..17c1e397e979de552236771d2ca807bc64a5ccb5 GIT binary patch literal 1694 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#<6kw>x3Daa?U`zFMaSW+od~?;YOW0B7 z=)+k;o=vxAv~Cvmf57@hK<-HI@=qapUszuCOfq3iw%Rd)@&2WH$9nlIi^|u}{ugL& zfBTWe{Byavd2;#Nu1ZVXF`e+UuD0|~<=^z#uQ+*fIiDO~_%(C)KKoR=dw;WbFTZLm zaZ`1IxBTUORqhklmvbq;%(dHcd+WE0-?qOs2=7lw*n4+-X87Jk=kj*dF#MQaXY>8) zJ^Aihd->Jo2J7s$udH%jyYlQ+VTo}2t+`*@qHdS1ns;EwubsK8%&*+qQv8+W*wxkS z2TrgsH99B=aG+BMn;q=-{V%gU@aSUuw?FHTm(P#e7w7kN&HtCx)j_t6iMBf&@A>4f zXOFm3led1AxybKJaUuQ*5qql`dVH`Lht&>x3i3QLuP&YZ$V|XB@yp5s9&IJx_8*%k zF@?pOWsbd(kKUITqA%u%#&rH#^-LKvFlgY=rj1u_?p=62()&BhGt<1%lKdB?SJqZD zeU{38dsn*Z?bb5?gt+ABxc+y7bLG~jzP@*0kK5j>|K7x1e7^JlFUAk{i?3DhjsM15 zx#xQATe*Wrrsapm&o{NpzizGmeB=IC|5jGB8UL2`m>XYL^8UrIKigm5<*qq0-(gkX z=igtYBJ*Bf+uL~ZFE7iF=@)Go($uK$sKCME zsKCMGD8SL=Ai&b3ATYFqPMq23&+f{=pdirlYx}l?|MoWWeV91ZJb@ksY0WafOFV#4 zb--Xn{cH0XyIS}TG!J!8`8i&*ljUG!U@#E)w0+(|<~OGlf2g4Qd{8F7Lk#x3Daa?U^nx0aSW+od~?;%UpP_b z_{aMB8Bs#EsSUjPiE3?g8x0n5S_xg=V6-6LK_=C~&Gf}7g>`&W1KU3HPB_6?>%(hC+H8u0h2@nuBm(Ny*4MBe7M(8(RxSdJ?}oD(?Emc5;K6- z?UOS5G7l&|@#c@!V7mJndh1B=YyP`MoubMNJ} z<$s?Z?cMyTV8^ZtgW-&=6ajYmreVf4YRmjZu8yl*0as}nV;{?eSGiI>EB0JAMO|DzU{vUZoL}Q zN+qU)B?qe+1dN#&Sq3$7bosX-+*~t{IZ(uHK37kQNBaNlH=T~28(a?jR6hK~sXwmq zT;##2E7oV(F*O1sl7ofDl!W)(yV6y2x0d)P#61pk|K1koes`C;!TOEY?(JQ8Judq@ z%QMq$Prts9yZG{B)V6oLXR@zEzdip>w07R__3{k=jkES%|DAe&!tv_6*WU^H?1%o{2Q1b*@6eOCR*y!I5^b`Y6^RMl7%`3fM zFxU*am_hT@Ly?rXmm39uo?=$4e=TWqV4X~p|IkQ$JQ2(KV%;}x+z50$gQu&X%Q~lo FCIHx3Daa?U`zLOaSW+od~?;YOW0B7 z=tHkg7028&hi-PNe_*QO;D2;1xKc~JimBAib5?_)pt#Y4(`gUlFWhI}`r_{EW%XBH zrSG;lb38bD*44*fmsK%0{}w(`vwe@%zkUBUmwshwE8~1}eBam1&3o)q?e6@`y1o3W zvBXWw3B~f4*HyVsT)&-5@n!D4?X#DDyI5wPYaia9kg)ge*39U=i_Vo<)ieBTnr2o%; z)9L8B!R5eD<-<>$`r{hUMIM~GVttk!eViuYJ@>A3)!eNm{t0o9!`#2O#kt?zrEai( z9)MP(lhSdcW9`Wyvv-BMtvWjX#JZqpO2G)AwhxTYyMs~^Y2_%2mA#%nj8dJ zniK?B8WlKL92Gd29EXx3Daa?V1MfA;uuoF_~vTAw{*J1 zfsg9T4X01&z8bJ}-Rz*m;xi8?M%vRQh|(Dp|iIYP%e>U2)?MJE`Jp#S)e;gE&kYmu%GW$&xqPu27g|%VHzu;V%{X zTJuea^gD3|8x@bXgGct+8xWSYy_i@?Rm;jIt@v}5lgu|GBlc$e z-=|ssW`9@T|5aw&tFj+DW*@eF-~M&$!TbCF>MUN`J@wD?ZG3kUR?IZ?ze4ZNxbRHllt#|8%577|DUG1PSo3b?&UYV!EO@Z3zq@*2y=&2iN1Jy3_0pKecjxw#Yo29aF8V#tl;U4fafN&0o3(TD zy066T>0SKzZtt`1a|w2N>&^4G^-PNsRX_h<#zo!w=hOZ&CjX0DHkobSc$ag!l~R28 z_emd4r+wRNy|v`|O8seZV(RzzWyfE;9)0xb$GHcDL#p&oUo)1tJ@NT94HDJ;eU^-Yi1)L5xsa!L@;k6{kmg$dZ$dYW^=C$iWz!DouN|S6` zmQG$B1WcrVL_JjQ-l*cTF1-GisiB=EXyqwjGIRFhTLMfDOmf<_0+!vX87-5)&spO6 z-D_3pYr_Ydbp$-ConKq7$+MreXFvB3{Z9@qlS&LKd#9Y53QUI;c_JJQzgey^GuSD^ zT*lhSz=fO);ZCN7ME{@DcCwcl7!EiHe0sl&FE8)YgT{K6Mgts_X`G_p_}j^o_Z*f^7eA00MJv+iuJE0Z4RuH fY4RT$8Hs1(*3YwN|2*#jbUcHntDnm{r-UW|5F(bP literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/textarea_placeholder_left_mid.png b/tests/ref_imgs/textarea_placeholder_left_mid.png new file mode 100644 index 0000000000000000000000000000000000000000..1ccbaf553bec0bfbbb72c229ff6f5399334fccf7 GIT binary patch literal 2120 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#<6kw>x3Daa?;NbUkaSW+od~@|Y0py&X zI`OR_P$q;6B%=@vl99R1%n<3O(9q<-z}m>b#l$GW!lc2$5+J~_KtaI4aUdl=UUZ0? ztFb?7V@3VTcTcCjoz3)5|7ZL1{Bvj9qgUUS<37>0)IsI?l#jX3f8F>N*nA7o#g%`xBNlfw>x_hc1^yt@a9Ar+sq21_(?afUV8ZF#G9JXGv%`z z-|l9S)7<|m$(7AhA^qy%!r#}Ef4+UxTL0JG(1KI?UFz!-Ht+WaC4YIYZ+|K$GseHJ z{F1Ty+9xmSp0`#%xV_Kw!NxE)p|g7O$EBk#?f;P#-{ili?mfGI+0tCO-*>(%{X1W) zAA9SaO5>O6m!35y_kX_adt1#Sm+Puf{&1zVihKCm6E)wQZ<@!?Yxy+!=e#4@)z8ka zbBWs(^7_t^{5fBiWHCkFczK!q+KnQG$aPzqg{Ven5pVMw$>i+WN<$LA-cO#2_HqSj^bxJ$i z+I_j~_G^MaH{FokF`xb8_sVtO9<21AK5w~t{QgXTud`uQm6hrn+P2+01x$Q8){~b5 zlXRNpHg<+hJ$MtAg7d%B^?5;e*cNH@*ojJYosoymoK3^ZLEl-f^DE z&N==1qV1x~kGJOBm7Z~Z#r9kC?`r?D`5tf2@Gt#J)%x$J_bK*&-?jd(@{Ajw*1meZ z`PlQfRnMQ;d<(y8UwS?vZ9ntM&!_v}$;QtAU$(cpvHyp#$JN5R{c*~tbMNjlH`uwq zk>S75F7^XwsPEMY+`muS$qF$r9B>eLb-#)?@11B#!+Zq+mPQ2*7DojRCPx8|CI`ghH^q9N9jW&Y4ed=hKqKhK`Juv-i0cm_{bKbLh*2~7Zv CMzl)+ literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/textarea_placeholder_pad_left_top_50.png b/tests/ref_imgs/textarea_placeholder_pad_left_top_50.png new file mode 100644 index 0000000000000000000000000000000000000000..fc864abe531d77d144ce879e4a93a45fa5bdcdbb GIT binary patch literal 2121 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#<6kw>x3Daa?;1KY1aSW+od~>xwTPj`R zz(@7;x;gFXvt)cTuIVmp)J^W|+0eVue&7EC5i?U#Pj_9?Nr+Iwa2L{$g1}-K>5f&y54we9cK_$``OvfulkH~2mUmA zsBDU^t=v6RF5dj!v~Bw%#4GQ<`ZeFSlz+yx4Mi`?Qr!Fdm}cso{Bilz!!IY^)&$1o zUR8Sinkhw0z$43hSERyo>-Oej>(xKqe!BU?v;LwIDfyq_Uz5xCZ`XGJYhV8}@R)aV z^PBf`x83!$wVw56&zJAcuTL{Q5fkw+`nPEE7wy-VcK*oV9>b9y86nDS3&VEBT*8+xfev7cYMEW8c5bT+?;u*VKJ~XKzsP zzBaAxMt>Av;rH9w{9y!zF?|I+vFOZTkHYxjLIvH$riG&y4B)zAI+?{m(GuGIZ~ z%~-;E`tfVZ3pUuiW^7PWMx?d{4*ycu=LOwiTcpurCn|Ar!nuFfZwNO}O6Y9(?A~^= zRc*sSeP0e6a+YEOc_kG+HL;DD*NTU1AC6G?R&?&w{KUee?naH+P&4z z>-S!J$9X0@=k)7~wu>%5-kNh)ddBq?+i%UktNqL7d%Qivzw|3r>%X7gr`Z2}*ZRB4 zGj4oZ`|9=PW6$4KJ%3{JE&Q&1>G_1T{md&rpYDGr8$17h+1~2L{vW~~R}1U*$0?uA zy}QfYVCViuhW|#p*bkhczE>x3|2}CaE5yKXz(L^E{VLwPccLW?^A!YG8WlKL92Gd2 z90fR<90XXJhL+Gw%Wp3i01I!Hrhxy~%x>&AzrbiGG}JtS76pfLCM3`2;{;Yn5^P`d z|FQ*7zra{Ax3Daa?;8^A9;uuoF_~vT8w{)b) zv5)G;YBM=KP1uBaT0PpeHtFf0;RLy5Tdo{eeW{&a+{nH^Bg=B2Og6j{v{o9c2)IiM<%+2WS*iz0&y za*dZx?{bU-N>tv-=y!OTn#u1lC5@-Wv+ra!p5{G-$P|5inNe!VrG^LAgo)u!w?zUlv3_r4H4^Jr#$s(JX9?d~RX-!tEA z;IGLrKjoNRzB-Jl?f2=E-R8y1_<6)D1dU*GzzJnPi=#*mA04;+otukrt8Ef(0Lr&j;yc>Me$+ZP1+?)$cH zhv~n}&oyRQkCML1JuB?kpL03z>&*Rq-=C>CRqi)jzt?e5W`yvyqW>}XOY1xB=gHo$cwdx7#=2@l);t|3tU?AMZ`nHqkuT8^0^| z?O#FPr+p6pW<;A`|9SSo#MJs){mi#|eDRIAOdw;K2&E1{xg~#7N ze|x+7+Mn#3k1w-Is9k5OS~j!kvJv~~=Yq@&hhfUhH&#-Qx`?JZ0hTFWNEvtN)u>>C^tnm_9c5zbD@_X?@xLzB#|O)0XafDSzvv z`Xc#=XA-_|C8uoNumqU)r!BQ*2%Kdopv1_mC}aSq8mBrgv29+*A^BENWA7Rrr?-+N zttYZT3HRy6i}M`A*(*U3I_kx>>ug(=eSY1u*p_+e^j0CO#&053O?^LE1@0box_9*D znR$xOmlu4#U#CS8#~*gugEoD(&1wX{O(rGxAyJywDlp7oU+gTVG3eS7Hu rYydPgPT2pIM=l|p@1Xk7$VhAw+M0Y#xt@8z7-8^q^>bP0l+XkK;i?5> literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/textarea_placeholder_top.png b/tests/ref_imgs/textarea_placeholder_top.png new file mode 100644 index 0000000000000000000000000000000000000000..65c7aae98e47c3c301b091ad6c7552d709e00edd GIT binary patch literal 2120 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#<6kw>x3Daa?;NbUkaSW+od~@|Y0py&X zI`OR_P$q;6B%=@vl99R1%n<3O(9q<-z}m>b#l$Eg&->(R=cm=8-QTCbi;KItPxHb5 zN%a-Kp53Y0v31wmjSV>wTrNevlK0Ej_2-^vO*vGgAk^_@di?!2$Bu`;{l0UrewoX? zGWK`r=g)F4v(}WIC42JX1(&-b)V-Rl2+T6|{Ov9C|c)oqI}dG)<3kK4h%@9k_B zx$IPhi*G&^?pdh%w|o6J)gMP*f3N$H5`OF1#`CrMkN)5Jerf4jKOv9()8`#=|2+5p zyBqu5A6yJ$DH5Nz%dx2BYTuc3`zf`bpL%N8&wTH>XH)vWH(pPcdT%}F`{$Ua|0=Z! zt#j>a6MA*ojVd$k=9x@-y!+bnvo$xOBL2R6`0eAR?}zSJ>@U9kO_u5Z!6Jp7`7T|X z|9^3|^ysVkd3ul3uX*~@ODCUwq^%gc%Ornt>*OCVn&%#{isDnLy%M~yw5_=0R$;d6ME&l&jlU}e z>gPYt;-B}cvJ#!lW^{Bov(grLNBly2G|eqsLBE;^c&L|E}Kj(2b0u2TPmxa75atDV>Hz4ngt zOm@!c*B5OUU4FbZ=dSdO>npb3ntxaOm(BNhdxn4MSE|;3KfO<}|NE}>ca>+{__X%b z>&?fWzpZ-y#O7Q0UHj7W32FP8SAIU-|4ue`{{OPQ)s6i>ggven*6oi|KAn4am$|{t z{f!L&jdrmgI75A}PT>B1(oR;0f#HCIz^nUJym{|LOB&`Y2(UCNaIiQka4KZ-7HN3|F4*m84&_Wpp3lb#tdAtvzUKdB3!Z*~ zv0})@47#T@PuyD0tO)cJo72B*#uW{*mMrs!M&gs;s{B0LsMls1(D4kOu6{1-oD!M< DXfL(n literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/textarea_align_center.png b/tests/ref_imgs_vg_lite/textarea_align_center.png new file mode 100644 index 0000000000000000000000000000000000000000..5d5d7f0e96769bdabb0e631cd517dd8d387fd310 GIT binary patch literal 2317 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/textarea_align_right.png b/tests/ref_imgs_vg_lite/textarea_align_right.png new file mode 100644 index 0000000000000000000000000000000000000000..74438f826ecd63a992acf6717a3924d4a947c1c2 GIT binary patch literal 2320 zcmdUxTU62q9LN6>DiJ8w(iKYN4Xsq>Dl?@puha~!r8`~_%P`BlG&99{!AfhUcuPVj zYg0yGi3U{D>4Ka9)7JOxWZ3B7AAkN?5HOor}T3RJ$@QPihsQluEc0%(o?x90^ zi$V)amW%x8R+&muj*U_`IW2KZ4TJV-XW5-7kelNg>3wCs%+*{yW4M-P3zz;;Dc|Hi zwzZQrm6^P#)=G#9d6&%f)<7)!4&98d+?uK}yNEwrYCJ1t_-gXaKW@v+Ou&JYzX{|_ z^{x{g?)|kdYDl#y z*uQ8#GT;=(*~nRP_5K}P(kEV|xP2laBh$is|I;S@_BhMdSTVbN!7$G!0LjhRB>jaY z(?dmBdlm_{amo`vIM-i_6=R<7lOUf@+J1E4hM*X3Ec?r)nztc#?~m8DZftaXl(_vW zVKN_+H+(BT=k*IEax+F@;ulWBJdH`UBstBe7g2095Bl<4-u7Qm%3DZNXEb-Co6Rc9 z!j#8u?k7@gB!Rr0yBMUU{ng@v22R9kbwCoX$7SxGIro5uDKW^ga%zdb9sWhb?f2)W zV=yJZF&++HVg_6Hqvkjd8i#qdTf)0C%%ol{5Fwu^k5r4166|0M-_dE>vLX_(-SlYG zFf2Q{{7U%UR{JZ1feCHqgf+wXpx)_5@VLyq+$yYX>e z=d}WU_;jI;Pt?{5hjN_gK^Pm+q}4f9nDLxLacvkSQ)uHJ()di) zqZ=#BtH*f@+)F#H4(%a{Wl`g1%;pI7tKf*oRY3zOBnjyfp#!n5D`Wj%2XE9hEJ#l~ zO=58<_C=kRs?5ms6ZO?B4Ggtb`QP6;$-pEZW5z?k#wAtwVxP56a>n?VE%B78?rLN% zk7Gnh+`%Mlt7KiM@UVeX%2Xy-%PSSsfbXN^sRM))vr1w`5%Y&7PK1GLQ5BwYDn>Hg ze*zoIc&Ghjy4#uUm-3PzhuhZNDA~h}so5G&9rIVcIoV>*uIYF;9NAo|)py6gG**u& zVFgRq*YX`NrXX6Xs9s$VD1Ec^(U zp0oU2#1367i)QaJ>N~s$v0ZdROl0~j0@s-TKD*-Qj22=p7yz({3x9Nw&R3-ATTEae zU=K6|;}PI&Gy+URuPlpFkiOdv1OPO&klzkh&BBwi=qnE59~EGc($PB4WhfxW zLmSE$2yK!8)Jlg+fVQgM;+MaLELtI72}6;CjRcsLF+KxWx&4t5X=~eZBLKnspciK! GIr~qPL=&6< literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/textarea_cursor_pos_bottom.png b/tests/ref_imgs_vg_lite/textarea_cursor_pos_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..ea9fa56c13fcebb606c572b6dd35a61d0cccb06a GIT binary patch literal 3221 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 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/textarea_normal_mode.png b/tests/ref_imgs_vg_lite/textarea_normal_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..6ad7cd84091938f27cf4782952e682a07a38658a GIT binary patch literal 2319 zcmdUveLT|%9LIm=SC)sikYuvaUL8e5R42FTrlF&dhoVw>2&+|VHYzi^Tu($olzJsE zNytN5TQkmioU8{nL!QFnH&1hIv5j;0*S)%b?_PKP^?iLm-@o3k&-?Ygvd@#KqiLiG z0Dz90E5RE8)G+{{)(>9_06NLf0s!DbH-htix|*beM;;tO*UTUmHuQ0PtOLdiBi95q z+qw3T9)-y8LOLdDZB`;^ml_-ve;dWJUz>GacTTGxaRM!KA4!K)p6DFNH#JSLt0T#$ zx3o4{WjOY+iR|=aRP(Egi!-w~c3LhYFD|A8A(-njHKddCx1b%ybA2={%)_AR6H1Ju zzw$rr#AirGK6Z=HL(M)SN^qtaPeKb!#{H%92u)_gEgE^KKtplESZU6vrZ|DoS>K4H zl2pi|Cq~ItX#nz>-ncHtGX-%Zcu_A9J~_V>@+9&bK9+15`MY}v#o?!Gbs&101{i6nm!0KhlBf&@CU4QuJ+m}v%I=z zUGAa!BMzIAtj>=rFV>BUeBWCfYm|)HktLT`sm<%b|z* z7-r{9pV*R4w|Dmle_o!_IYGn*u;XySo8+LkTrg2)8__nN<}esSkq;iTP4_uY%aDe! z9{(y|o}cZyK1=!S3L|ev)K1*NT>V45)zj8u4iwgPldnw4CJ<+bBUg9v0?&Gt6>Puj zl2+;B-l%o{UR$hLMaMOKLd)!d9+FWXS**21Y;f$DXi9@LT!McWJ8kATm&3=lBsYe8 zO^0%&p-D|bV*L;#kmh;RIq0P~L?6FXyaMd2a)h}-5wIL?AtVNoD)$t{ZOKTTvTjJ_iX2b=5_UnC^#>pgv_0g;&-J{l8ha7| zsVd%NhyxyK9nt0CHaAR2#8kV$n2w33v&76<>X;?RH%FUYue9z*`F-|?i*`yp&f_DN z6l?ptVi+Xe855s?2bM7b&A+<$-yb?n8D;+R?U4j${oU7+)SkC4$hS9RZD5?TZrs_? zm!_YvZ3k+L`+Z&$F-SNFW8(kKVaVxXZ~Lt)Qsl&px#5*Eslzp?HouQbV$;Z@)S~a@ z;D~)Pb*%Rdbg*%9MQhYu8MJ53*#q)|NuAcHc2O*kRys;ylv3o&H#m$}ws-RvZt?@I z8Yfr%K$3e=xg7(qE{Lh*nDU7;oRa5s49I{LlF>LeZL9dc3X#TRDm{l3^AxC8DtX^H zKp!`$9a>lhQwl~+06V>Zp8asAwQTI>(yLycuy0Wqb(&K8KwSwkF>ufs1BW>y;R$#o zn1DfkT~SkO*hg literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/textarea_password_mode.png b/tests/ref_imgs_vg_lite/textarea_password_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..27a09ca7e141ca7aeec75e463ada4b67b070add2 GIT binary patch literal 1721 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#<6kw>x3Daa?U~BMnaSW+od~?+|OTw!(B^;YrmxUqU}!v(KRw2C#vbdx;$J>H=vIBdbfsTP z?CpcZt@qyD+QRer&C$rO99G}eCp=9G-n;n3$)zqHe2qHqZs*k1S%u{PJYV*@efROQ z!qC0V^WHMw{9b5#HM;0~u%b$G^u6unllLlr-v0LbrYaU$>D!B9=ZCIeQT(s!Kl202 z$A{C*Zhn89V0XL1sp8s>tk17_x30Ujs*35a)b+P}s+`w$e~Ykftn0m97PWWbwanXL z{tMzCuj9QcoyD6Q4wAUayda&a(Lq6gg9VlHXZrc;=eHM)nN~k9#r^&I^X2W|{m1>j zo~eJiEf#1>w13=$+0)J4`F$>b*ju~eUcejo>R{W(JlqDN8c%oLLgoE8S69oJE>hrH zeDrWbRNDXQIVnOCjdyRnmACwIXF`?G^ED5`KCFDEj1d&ncWX~*~U4rq5Exca`M7C|#TUo#mOS-|w$Wxp%Jl9sHf`ndz(S zz4v#Af7!YJ`p#-*Vd>JSS8r46Pdr^aE%`f#+P2>-cHMhb5V!BmuI)BAzwL;<9%UoY zWZ!sYd%yf$>sfEk|6@OS-=R+ZQ|;fKrTLZLUOq0cDeX@v`p?ApFTI4nVJ0V9GN6Lr z_1}p9F7W{7DrUzO^{-8L>qIp50j9ti-?| zz~S^a`gX$qdk*YBJcgPl(4%0pV_&V63NWe?B(CiLD(w^N#QtE&#SFTqmMdh>=W79a sN`m8O^!W#jWlsfagwPcY%EXr_Xq>mti*f5?pyL@lUHx3vIVCg!0AtkMGynhq literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/textarea_password_mode_add_char.png b/tests/ref_imgs_vg_lite/textarea_password_mode_add_char.png new file mode 100644 index 0000000000000000000000000000000000000000..ae1caa3c0f4fdd19f6f5e9efedb086fd5550a573 GIT binary patch literal 1723 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#<6kw>x3Daa?U~BSpaSW+od~?+|D>zW* z*u&y{>D!mwjwo4O65Y|Hcc|B*AYAWMXP$$Gs;TGa#77=nwTc}7_|JYmAer**SyA1b z#B1N4oxYlOyYIAtU)-F~{sqPLOp#}vuF{gNYoVqO31YVlJ?!W8a_^N07bNEY5&yCu<@LFhenE!(K$E)Us=dUQeD7Q-e!urC?eyh!|Smn-s z#rY-s&bEbB&TALut_DhMtYY}$qaeV+!qn)1LOlpnh_}BlSM%Vf)z3?Df4_ddy#2d8 zzwOofhw*o}oqokx^7v@m{jZ*rA|%mx_r_a!%P)5(R0%y_^C0ZQ%4f=0f`i&l?upI4 zD_xbl_4T|1dycJe|K1kIA3x=Muk+pA=3jPQU0BWZS?c(%lKdB?Ym>jTJTvwC{dFn# z&NaV-zq36veU-iU{_gNEJNIATS&^Lp>?iL#)Tw`}{kyX?zw+D5#|1W}{Ru_?nHc}2 zm+&{th4~AUK zpnGb$LiT*V7NDmjIDST-f52GwRG>x(UD2RSe2D=&x>nk*V4VkaJcFmJpUXO@geCw- CxZd#q literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/textarea_password_mode_add_text.png b/tests/ref_imgs_vg_lite/textarea_password_mode_add_text.png new file mode 100644 index 0000000000000000000000000000000000000000..87a2653f1eeccaf131f2c25af4daf335ca3187d5 GIT binary patch literal 1723 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#<6kw>x3Daa?U~BSpaSW+od~?+|D>zW* z*u&y{>D!mwjwo4O65Y|Hcc|B*AYAWMXP$$Gs;TGa#77=nwTcS=_|JYmAbIEJ>8F1z z4zGE8cKYhG+hnIF&e>zJTF&wLKbB21)~+rWvD`U@lZimCdA5LKVIeiu1>2ZC8zuMw|5!uPkhP!y>*40>}A1nr<8b1KM zk|*ZXrTvTDL|hWLR7eDzepBB+*@sDagY@pd%I)){gZv-O5xv7@ceMsRC}`l;rj4uD zRy(g>TXt7?#&wCWFYaA<{jmGf&cYSd-`nE0Tb1}H#66Cf{*HI=y3#lE4(vIWxqn}Y z;`Gw`SN9I=ajRYXz508X-S_WS<@pIoi~YR!?tR0*bI;YHH*yD$l*xx)kCr`mdV1{l zY3jG-w!e<*W_S9aKH=B5kBh6_C;z?qU*V_piT5u1*4uA?r+eP6R;F+HJ3*g!@d^k2 z_q<~?Fs8n5pS1o>n$O3{z>uK8@il)hoB4Mxs{{T598C@aEKLdmER6~rERG5sOpZfK z=#0$ok^mM41}4W9_1V&I?n}R5kmnp~o7|C2bC@lWFoF8i|jmys>S~=9$$AK*uw9y85}Sb4q9e0D%kM AzyJUM literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/textarea_password_mode_delete_char.png b/tests/ref_imgs_vg_lite/textarea_password_mode_delete_char.png new file mode 100644 index 0000000000000000000000000000000000000000..87a2653f1eeccaf131f2c25af4daf335ca3187d5 GIT binary patch literal 1723 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#<6kw>x3Daa?U~BSpaSW+od~?+|D>zW* z*u&y{>D!mwjwo4O65Y|Hcc|B*AYAWMXP$$Gs;TGa#77=nwTcS=_|JYmAbIEJ>8F1z z4zGE8cKYhG+hnIF&e>zJTF&wLKbB21)~+rWvD`U@lZimCdA5LKVIeiu1>2ZC8zuMw|5!uPkhP!y>*40>}A1nr<8b1KM zk|*ZXrTvTDL|hWLR7eDzepBB+*@sDagY@pd%I)){gZv-O5xv7@ceMsRC}`l;rj4uD zRy(g>TXt7?#&wCWFYaA<{jmGf&cYSd-`nE0Tb1}H#66Cf{*HI=y3#lE4(vIWxqn}Y z;`Gw`SN9I=ajRYXz508X-S_WS<@pIoi~YR!?tR0*bI;YHH*yD$l*xx)kCr`mdV1{l zY3jG-w!e<*W_S9aKH=B5kBh6_C;z?qU*V_piT5u1*4uA?r+eP6R;F+HJ3*g!@d^k2 z_q<~?Fs8n5pS1o>n$O3{z>uK8@il)hoB4Mxs{{T598C@aEKLdmER6~rERG5sOpZfK z=#0$ok^mM41}4W9_1V&I?n}R5kmnp~o7|C2bC@lWFoF8i|jmys>S~=9$$AK*uw9y85}Sb4q9e0D%kM AzyJUM literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/textarea_password_mode_hide_char_one.png b/tests/ref_imgs_vg_lite/textarea_password_mode_hide_char_one.png new file mode 100644 index 0000000000000000000000000000000000000000..589a8c2f757857ccdf3690c4eab4e15e48143b46 GIT binary patch literal 1694 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#<6kw>x3Daa?U`zFMaSW+od~?-4FW6D! z=)=lpUm3yR2~6K6>2746=6sNEla7jr<&D1o36~R3E`QSZZ+EF1tT%jhaqq(GhsB>3KMwf*j(2Zf>5F*> z_8i-&cUQV9_Vo?h#>(Eyb+s>@^j`nFvKPqt74`o6JJH&A?@Qm^J8;Bp?zF1voAO1K ztDoMmZR&h$w`$#Xt2xv4cfZs1-)5V4eXAIM%L9LfuWui_fA3TKz4^c6C-VvSJ8RA#5%=(Kf(R`sGY131H%Cafmipdc=O(gmNd*) z5MXIk;9zl7;9znT;AnCXU}+j!LNhJDy<7k+5m=f6{$De@vETdxqn*%D^8{KH9LkxH zJfDvfSjtJTea-*N7Cij|W5tk*8FWu+p18G~SrOx3Daa?U~BMnaSW+od~?-5D>zo> z*vI1h+1qt<ovZGH25veEopTg5#YG21J@wndre#@aU4_0BGf+`I5vX!WXj4*QSATCcws@OsbN zRq7Yk7v67s#k;j_+j@}1E5-}PjSdO|94t&IR8x9m&Ht);n*&eYL|1=4|9rZYNesOKH_>*`4cRyxSJAD4z$|~oL@o!_lvg|Sq<8PS9iDne4!2`o<>HCwq z{$1gfjwX#BF@EN(nSb9GPV!7(DNEj7|Kvik^DECeo13B!E}zwpB`m1zWP`G;rTH(m zUR_ts^jT`L++FD^+nPW-bH38|_b$8+Yk$XiCR^t9rM(NUZ|%D)Jmb2>+w0Tyo@{#O ze^+|O^%d*C*1eCr`21ho^LM;HIae}QZlC^Far*YCzPrjZZoFIks%rJ&%AcEF-}{tu z`*B%p_D2Vfe=I@w?dnS2XKb?nEw56~{B!P!?_Zx^+xzt9^8Ujguh=%7{L9VqWBx^3 zhBP&dbU?A+_iTuNb6Js*fq{o*;lH)lA3Te5WdFg*;vVY<_YvDIKyW7?d1eu`PYyb@c&xAK`Ezf1N%_- z)SRX@wN?U53=9bhPx5V>*>6mB{@{u3^Ff*TS{QpT#+?#-l~M$%lRRDhT-G@yGywn? CW#tk8 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/textarea_password_mode_to_normal_mode.png b/tests/ref_imgs_vg_lite/textarea_password_mode_to_normal_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..f8787ec8ed6368a0a5d6ab3d25411f56a69b1dc9 GIT binary patch literal 1915 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#<6kw>x3Daa?V0ZF#aSW+od~?;_J33I} z_{Zn>)IwJ(223n7Y}(vZ%{te3$!fk`+nnPX&xxLSlW<+<+}nckhx?i>#C^XzO}U}+ z%>R9@_SjoxV?&k z8kGun)wQQho&R+EO@4+m!r$GFw$|DgEq&CX&Qg4oS-Ud-!`3Y3_naKzHd|8P z^X?0KbF-T1kZAwf2YU~OA3SzXSYTa6(!}p<@e_Ubs4K*5{LY||!otJ>LB&j#>#F&g zoepq=MT{GlY+ZY|O5Hy8P2Sb0pAWO@v;W_!R(p`FHevnMXO*kx$xeE*C-UD6(V|-x zSz+gc-p_65esRt${omAie>Ob6=6iEZ*v=gJn6R_AMBmS?zqog8wZFp#uFKcAT--KY z?%O82HC3tGr+rQQUo77s;D6UjU4GyFn5ulHCPP_|({|yXmMd3#S>2qUa(#H@1ZMe@7QGL$e3=rocQxg;_usiH!Gk1 zdVXxWE!0(e%`J9sF9iln*c)304#`Fara_Gq6zXrRu9h)fq`}A>eLe5Mo?|QAzqiHl$4@!m z>wI^&`IlW+7gjTUmO8$xB>zR}+T`yn&rJP(e_hJGbItGI?`+RZUuEyTzdQWP&i&VS zRx=ArmqxvMn_7S3>Dp<@-#OH_{a&%_-m8MReQ$Pcx4HRkN9^?|8-XVK#w*+Vx3Daa?U~BYraSW+od~?+|OTw!(B^;YrmxUqU}!v(KRw1%;eF1LdPjTyD~rnYegCdV zyvQdP_WJEQ-_r)?;^u_*FDR~Oiqtc^YTY#_#;fItz==ou&OUp--1+OY|2f<1c2wtx zhhMdRano)>t^D=iy{hH*qE1HJp4L{I-?TQWzg?%h+Wo@Djk>qKMt<$GdcOX zyPUMiwf20^HutKxr1!2iTYoR$^{Tb2)Gw?rynAl7`ITK6{a1xwT;Gwq{Hk=;+-(myA`l^;k658Ac+WDhAK4y4i=_H2L%-BgUW>U^Yi=VX7o+ge|t54{``G=|5v;T z@&9){?{?}}mR(<;u$aE!4ZMcaKvd)D&$Ie8d+)B}fy!Kq z45Dm!R-}I0f80~8QSe6Z-G39E&-1QSFFePU$2vdD4kIY2@79Aiu3p=_@Os$pcbsRk zd#XzEUwr-G`ty#(mA%!@>!W3NsT-^>T;u({E$+HinSVmu<1O*=yC$68WnY?~5Vv^W zwcmTIUFZLh)T_=TA?st3EwBxBqtO+M~>h zKZHGMfB(3+ck#)8Z|W!f;eArBbpQJN=X;KhiX;c_mLTP=qRvJtU z42=p`_HX6=_MW$-p?}DE0xb#*q@Uba?hN!4L!0B@==}$;sFpCu4RucyaBceb(g9em pH#APz|CL8BA)N1^`p`&xY&|MfTZ3a?P5{OTgQu&X%Q~loCIFkA))fE% literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/textarea_placeholder_center.png b/tests/ref_imgs_vg_lite/textarea_placeholder_center.png new file mode 100644 index 0000000000000000000000000000000000000000..d983fc75e0b31994a6deab736223b16333111bb8 GIT binary patch literal 2077 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#<6kw>x3Daa?V1MH2;uuoF_~xpk|6@0i z10ThcCr5NoG+Vt))Z?sT`_l=`GT$!L{rJnY)`ib9fYX~bQ#qG!Wy?vc1ZS&l${d<| zm{(OafBG*gblZ4MT-d+tsN$76d8dCb&6yr1@OInU_J-%L9P*x(Un`cl`O`t^LP+D8 zdXFh3ho*hi$z(SBc?ZKZzF$*55PvWz3Mi3v@=_Jc5A6+d3?C#L8Mv4jMOc_L;&`5vtod`* zxSPMfYrXMndDcJihn8=DKKN7g@wO%ubFnL?r-_ymAfUchVxsi z&#g=PtK4|K%4|Z-*B?u68BD4%dgJ-s;N0^4M>pxOtbTh~U+Luh$~!u)nX(>sxp}Kr zZ=E~wYd%Zd+nEksZ`NF1yFM-Ro!w`js(0GceEt>OPu&`{_Pw{9xi|aE(9%aH=C*_b<&sD24~!|SI5uG(>LFD{om2{xnCN;=NM1;aAU6M>giUK z>uRT-xFXA2`DWj5z1d&G_eIXybvfnjvVFJiaPD!R-DtADN_nE^|5s;Niw)#dHlKd{ z&M~UwbIFa`JDZ}UOw9LgR{HsTQQe>Ua}QLDXk}mg7b!RU(tO+Ijod#^Rb@3yuwG%p zr7E^))#Vy-VlJCD0Ha@T;#ZCj;TyDPe&yM=F7-Mn`ZL~(M8|rBz1gxhyX;KhiX;k1~aa7=7 zavWMhJl5Y{P5>5MY)t|GuVoh$uV29YXQ=uG9up_dZ1iV$WnfScX!*5$+rfW(8~Hv= z9J+A?@mE^2%x3Daa?;NbFfaSW+od~?+?`>~tI zfsg5-ue?gs1$0Zjd9EI8|9Y_f$%giChu@25DBAsa;KWjzQ2XH^YqyKv5*1lbwZf3+ zvQ95g{P=HuL-}kC)*$A3*p(dKGAHhFjS&z~9d1wT)IQogR; zp}n$5dA{9_d57j2Z2Ql6AbQVP=YlQo`@1;hDq0`--rFm2-FU~>z<06z4evgAamJp1 z5T?@lTJS>by~RJ)r5Bu@?tWc)!R|fkFL%y6xOSe+PC3TAPj|{Oyf9*76k%b~;9v<5 z;8>s_;NYmx(B#0t+Q`5)U=l}XH^%r)-G6KI&zjXgb`||y-0;8a|F2K4Zq>CkANd;L zV7`S(uwLh>Rc!2zdE75r$`pjUzxXeEJvnQym$CgnnT|92a}T8?#2a*9;(6OyRch7s zB-MLc`PmPtss3?p|B_^O|C@Ti`seSwd8d}~rQDOB7Jiv~rfyr>*K`s8>x&C4Ew`Wl zeW|DG=hOU6ceN(}dcVxO+Hhs~d3Eu`q?rF65B7dzo0Oj)AHuFSN&i@FCwt(&KcMq3uNO3|e-gM^bV;eg&rLg5gjuUIU*9iSvE8;&#JI4-=@#=ykF-!>E!!w zyVsPh`YU{LaoTI0*zo*0&lcq~-?Yqp!OXr!*5l{Zx;cHXN)3OezDb`v_pbi>{^@Jq z&#nLXQ>FI7gssdU&%fQB^gAGZ(iLrG@84M`lz-2?ky9rBGc7ywzM8f8*HyJb7A|ic zX1VW8OqsYQ-E79@mlxKoJO6m|mX6OQGW%t2=JC$%{l;Ur4pG(iQ z@NjjzxZU@M<+^?A|85TVuib2#p?54iGxONwXJx-t3L2{FJs(xE9e?&|F)&?4&U?++ zpr?#C!MvDIe`9sEjOii;uEj?WH$H##?#IFLx$X2|Zu)Ane1+XUYN` zEKH3K3bdqpVsr0GSLJSfJ@3GtV=LUhx5e?tPdVS~e0R6`mt9vERx^E;I=-tU|3&HA zm<>Yr-=?kvr({Pyy3 zflXjJv*U{T*QPsmhF@T;YjO}^X;KhiX;k1~ zaa7=7aunbgT0$w$ZY*zBVqg&9aQYj4JK_I52lgKxL(LQDQLx#uuhvQh7*z=pSN4CE z_K9_3e=y`?2HjK36|(2^wE#UO!SOTt`~$|arvf!X=!ynq;!Eri{JDogP3{8F@eH1> KelF{r5}E)WUaorp literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/textarea_placeholder_pad_left_top_50.png b/tests/ref_imgs_vg_lite/textarea_placeholder_pad_left_top_50.png new file mode 100644 index 0000000000000000000000000000000000000000..ad825c79636e7a245ad993abe983f5c3338feba8 GIT binary patch literal 2118 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#<6kw>x3Daa?;NbOiaSW+od~?+?`*xbd zfse;$?eSWZub}nWjpy^h_FoU2i(VxD{_vMc`UtzcO-BOX6(F_2Q41nc1}F?Y+X&ol*gAicirE=QI1JBoV}>JIN!E?;`=%U!HiW7 zd3N5{T@#O2P0N3?@lHzXk^HsK9cKS@sF8o)_f_*`mCUeiVPB z821ymdwVy|JLEUzhcrWt?}nZ4<=*~Y{AkzrJx(7&56-oCEt#`-s`YEZ3vrH`6Tk9o zOVV89?oiFjFBEk?L3;{2NaEn)k~QfYu1<6ZaT>oeILsF0SfC)_;Hc2hZfdz*mZS&p;2uAqNh*p*uVES*LpU6 z|H-nIGFSfR?fN1<`PZAw=Sor*uWvJ%@QHZr`@69FmAd*Q{bRPCzY6#LF`Xvt`8Qd< zPN1;ziceMyH)&;pZq-S?WGMnU!3Lo{(aBCU-3Y->>MfX-)pA1{S8SG zslVm&e)6jd*?F}eub6xPeU?-+by}WH=Dxa}!UorWdb3?KmY99I|C;iGtxT^O8_bju z32K4szr^+L3a@lDY4nKkGiS~G`@V3JX97!E^7i^C7mA%|xA;}n z>cf>kH@&|1DdqO#ve@j84jlhjg6`YZmAuc`WdB=UrJnic+!NowKEJm2>CNT+hd*Ai zZ94gvo8`y+i?$4DYSj1po(=JDE-NxJFz~P}{I~Y{gJ*G$>_0e}90fR<90XXJ6a-ir z6*yQN6*z{J(1e-E^ZB|M7#tKhzUJpP|E*@0eV{zlJb@ksXV@&iy_^87j2aRH{$I;C zDCLxGU?1w9n$xtV)=GehfgwTRNxp3}`;Dp2A3V{0J}47k3uDXNpL=dIx)}nagu&C* K&t;ucLK6T(3A8o< literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/textarea_placeholder_show.png b/tests/ref_imgs_vg_lite/textarea_placeholder_show.png new file mode 100644 index 0000000000000000000000000000000000000000..8fcddfe1d95bcec771f2210bb53949dfef23d794 GIT binary patch literal 2256 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#<6kw>x3Daa?;F#{|;uuoF_~z=y?8hD= z$3LdKcBz^fMVx-gx3pkkL+p+dhn9Jq`h9r&jn> z8vI>&sd=mHm$@b@um4-KzP_~0CA@n&>(rE6ww&hQpTtc$8FV}G&4t*aZ1#=mVw+XA zSKGdP%lPJ5se-dn;2H5i_ob6JUr@hvc}1N;sgL}U-LuXAy}Q&aoBHpHY{+@0S|E<9zPoCtu4w%7kD=_7)r1By)wy3}Hrr|277O(J{Uz$Z`SUC1(&k_3 z#{Y9ZS0BHVzRP|4-{e;pdh&8E2YxV>yfD?WbA@rQ)g@_`8?9SY&;I;gHFbVi{N|Jw zQ=SFq&Rbz~?@vKM>7+8-PvTuyE~&?UPfK6Y^=b|0+vt~n8Q&bKOSbJj^EB__vS${7 zlj|Jrw<*3rw`uOm zorf7UgwSDu>-d$I}8ojI1KX0vHA7bnOcKYR3kL%%++cJ+82N!S9 zF=c9uzdg<2)I_^;XJ*$e?XxX?%vQ?rY@czw%iJPI!K21pU+%1LigbAopUDo9%&#c?e_~%em{pEf8k81u^vt=@wrfSRJFj-N6fsKhV zK>pdT4~|X5XkDpzgqpJWs8i=!#@muvK^jJHrB*>pZ|0(di$Ki+kpBC^cxut zm`(e_z~I~Fz#zfF($F}Nl++XXZ!c%CF)*+-O{l+KT2MTho&S$A2aBTu2a}@!N0Wm9 zOOt{COQXWj5^9tEUE%>OY?&Qb)W0^}u`~PvW8F~o3p^%Lp50j9ti-?|z~S^a`gX$q zdk*YBJce!@LHxDZv9H!j1sGKc5?A(rmG+5sVt+7%6CT7<%N4Tc^R)myCBgAC`uqdN hvZn$yLPH`WCGr>Q>vLWIm;-b?gQu&X%Q~loCICcc;Yt7i literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/textarea_placeholder_top.png b/tests/ref_imgs_vg_lite/textarea_placeholder_top.png new file mode 100644 index 0000000000000000000000000000000000000000..355c1600117c6adf61b9efebe0473575acacc7df GIT binary patch literal 2115 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#<6kw>x3Daa?;NbFfaSW+od~?+?`>~tI zfsg5-ue?gs1$0Zjd9EI8|9Y_f$%giChu@25DBAsa;KWjzQ2XH^YqyKv5*1lbwZf3+ zvQ95g{P=HuL-}kC)*$A3*p(dKGAHhFjS&z~9d1wT)IQogR; zp}n$5dA{9_d57j2Z2Ql6AbQVP=YlQo`@1;hDq0`--rFm2-FU~>z<06z4evgAamJp1 z5T?@lTJS>by~RJ)r5Bu@?tWc)!R|fkFL%y6xOSe+PC3TAPj|{Oyf9*76k%b~;9v>Z zBYEO!$j{Zbv(InuTCaWGp6kc@AM5qkuY2om;Stl%TH>rN@bP%iy31EvU+--2%V1a9 z=gm)**1t4%&XKHqra&uujywr{MPHO^j`w<3J`Vvo3ODb?3`;={f@NqwS!Y~$;A z&OMX&zkjwe=as{=zloKmdnepX$_T4>`&eSjHGOjN?>+iwSImh2r*?a-(aQgMyS9i= zuKHS2B&c@mYd_1q?0kiv-@dt)CMf+(x--2(;OXgjWy^_I?7saI7yRrlXBzDo#Xd=Y zc6Zj+Vxxk;(v9V}g*_&oJ+vck?WH?)&t`sk8?G|*Pu~91S<7$PPqfL}cJ5N?*JGJ_ zzsx4go!n+uaNt(sl=!#DU#^G~pB#Uz&g|yRzn^|p-28R#r}%vTOYD4+)&l?U?9<-H zU#jN0*J#t0^=&qr?suL|`#v#$+q7@Fn~DS1-%@XMzQVVp@`|*Z*vYE2X3N=pXJ7rY zvGeY>@IU_X^u)KeN5g{@q!cU-|9j;{uz~ z{)D3cOpO21OZXdRa#G*#`ftR4mv{inH)h8b^{-8L>qIp50j9ti-?|z~S^a`gX$qdk*YBJcgPl(4%0pV_&V63NWe?B(CiLD(w^N z#QtE&#SFTqmMdh>=W79aN`m8O^!W#jWlsfagwPcY%EXr#`rzlDm}9=3K*uw9y85}S Ib4q9e07#6o)&Kwi literal 0 HcmV?d00001 diff --git a/tests/src/test_cases/widgets/test_textarea.c b/tests/src/test_cases/widgets/test_textarea.c index e486a04de1..a0c3f56b34 100644 --- a/tests/src/test_cases/widgets/test_textarea.c +++ b/tests/src/test_cases/widgets/test_textarea.c @@ -8,6 +8,52 @@ static lv_obj_t * active_screen = NULL; static lv_obj_t * textarea = NULL; static const char * textarea_default_text = ""; +static char insert_replace_text[10] = "123"; + +static void event_handler(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + if(code == LV_EVENT_INSERT) { + const char * txt = lv_event_get_param(e); + if(txt && txt[0] >= '0' && txt[0] <= '9') { + /* insert */ + } + else { + lv_obj_t * obj = lv_event_get_target(e); + lv_textarea_set_insert_replace(obj, insert_replace_text); + } + } +} + +static bool test_font_get_glyph_dsc(const lv_font_t * font, + lv_font_glyph_dsc_t * dsc_out, + uint32_t unicode_letter, + uint32_t unicode_letter_next) +{ + LV_UNUSED(font); + LV_UNUSED(unicode_letter_next); + if(unicode_letter >= 0x20 && unicode_letter <= 0x7E) { + dsc_out->adv_w = 10; + dsc_out->box_w = 8; + dsc_out->box_h = 12; + return true; + } + return false; +} + +const void * test_font_get_glyph_bitmap(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf) +{ + LV_UNUSED(g_dsc); + LV_UNUSED(draw_buf); + return NULL; +} + +static lv_font_t test_font_no_bullet = { + .get_glyph_dsc = test_font_get_glyph_dsc, + .get_glyph_bitmap = test_font_get_glyph_bitmap, + .line_height = 14, + .base_line = 12, +}; void setUp(void) { @@ -40,6 +86,8 @@ void test_textarea_should_return_actual_text_when_password_mode_is_enabled(void) TEST_ASSERT_TRUE(lv_textarea_get_password_mode(textarea)); TEST_ASSERT_EQUAL_STRING(text, lv_textarea_get_text(textarea)); + + lv_textarea_set_password_mode(textarea, false); } void test_textarea_should_update_label_style_with_one_line_enabled(void) @@ -314,4 +362,333 @@ void test_textarea_set_text_should_emit_value_changed_event_only_once(void) TEST_ASSERT_EQUAL_UINT32(0U, event_count); } +void test_textarea_set_max_length(void) +{ + lv_textarea_set_max_length(textarea, 8); + lv_textarea_add_text(textarea, "1234567890"); + TEST_ASSERT_EQUAL_STRING("12345678", lv_textarea_get_text(textarea)); +} + +void test_textarea_set_insert_replace(void) +{ + lv_textarea_set_text(textarea, "1234567890"); + lv_obj_add_event_cb(textarea, event_handler, LV_EVENT_INSERT, NULL); + + lv_textarea_add_text(textarea, "abc"); + TEST_ASSERT_EQUAL_STRING("1234567890123", lv_textarea_get_text(textarea)); + + lv_memset(insert_replace_text, 0, sizeof(insert_replace_text)); + lv_textarea_add_text(textarea, "abc"); + TEST_ASSERT_EQUAL_STRING("1234567890123", lv_textarea_get_text(textarea)); +} + +void test_textarea_placeholder_text_show_one_line(void) +{ + lv_textarea_set_one_line(textarea, true); + lv_textarea_set_placeholder_text(textarea, "1234567890"); + + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_placeholder_show.png"); +} + +void test_textarea_password_mode(void) +{ + lv_textarea_set_one_line(textarea, false); + + lv_textarea_set_text(textarea, "123456"); + lv_textarea_set_password_mode(textarea, true); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_password_mode.png"); + + lv_textarea_set_password_mode(textarea, false); + + lv_textarea_set_text(textarea, "123456789"); + lv_textarea_set_password_mode(textarea, true); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_password_mode_update.png"); + + lv_textarea_set_password_mode(textarea, false); + + lv_textarea_add_text(textarea, "abc"); + lv_textarea_set_password_mode(textarea, true); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_password_mode_add_text.png"); + + lv_textarea_set_password_mode(textarea, false); + + lv_textarea_add_char(textarea, 'a'); + lv_textarea_set_password_mode(textarea, true); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_password_mode_add_char.png"); + + lv_textarea_set_password_mode(textarea, false); + + lv_textarea_delete_char(textarea); + lv_textarea_set_password_mode(textarea, true); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_password_mode_delete_char.png"); + + lv_textarea_set_password_mode(textarea, false); + + lv_textarea_set_text(textarea, "1234567890"); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_normal_mode.png"); +} + +void test_textarea_password_mode_hide_char(void) +{ + lv_textarea_set_one_line(textarea, false); + lv_textarea_set_password_mode(textarea, true); + + lv_textarea_set_password_show_time(textarea, 0); + lv_textarea_add_char(textarea, 'a'); + + lv_test_wait(50); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_password_mode_hide_char_one.png"); + + lv_textarea_set_password_show_time(textarea, 500); + lv_textarea_add_char(textarea, 'b'); + + lv_test_wait(550); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_password_mode_hide_char_two.png"); + + lv_textarea_add_char(textarea, 'c'); + lv_textarea_set_password_mode(textarea, false); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_password_mode_to_normal_mode.png"); + + lv_textarea_set_text(textarea, ""); +} + +void test_textarea_set_password_bullet(void) +{ + lv_textarea_set_one_line(textarea, false); + lv_textarea_set_text(textarea, "1234567890"); + lv_textarea_set_password_mode(textarea, true); + + lv_obj_set_style_text_font(textarea, &test_font_no_bullet, 0); + TEST_ASSERT_EQUAL_STRING("*", lv_textarea_get_password_bullet(textarea)); + + lv_textarea_set_password_bullet(textarea, "*"); + TEST_ASSERT_EQUAL_STRING("*", lv_textarea_get_password_bullet(textarea)); + + lv_textarea_set_password_bullet(textarea, NULL); + TEST_ASSERT_EQUAL_STRING("*", lv_textarea_get_password_bullet(textarea)); + + lv_textarea_set_password_mode(textarea, false); + lv_textarea_set_text(textarea, ""); +} + +void test_textarea_delete_char(void) +{ + lv_textarea_set_one_line(textarea, false); + lv_textarea_set_text(textarea, "1234567890"); + lv_textarea_delete_char(textarea); +} + +void test_textarea_delete_char_forward(void) +{ + lv_textarea_set_one_line(textarea, false); + lv_textarea_set_text(textarea, "1234567890"); + lv_textarea_delete_char_forward(textarea); +} + +void test_textarea_set_text_selection(void) +{ + lv_textarea_set_one_line(textarea, false); + lv_textarea_set_text(textarea, "1234567890"); + + lv_textarea_set_text_selection(textarea, true); + TEST_ASSERT_EQUAL(1U, lv_textarea_get_text_selection(textarea)); + + lv_obj_t * label = lv_textarea_get_label(textarea); + lv_label_set_text_selection_start(label, 0); + lv_label_set_text_selection_end(label, 10); + TEST_ASSERT_EQUAL(1U, lv_textarea_text_is_selected(textarea)); + + lv_textarea_clear_selection(textarea); + TEST_ASSERT_EQUAL(0U, lv_textarea_text_is_selected(textarea)); +} + +void test_textarea_set_password_show_time(void) +{ + lv_textarea_set_password_show_time(textarea, 1000); + + TEST_ASSERT_EQUAL_UINT32(1000, lv_textarea_get_password_show_time(textarea)); +} + +void test_textarea_set_align(void) +{ + lv_textarea_set_align(textarea, LV_TEXT_ALIGN_CENTER); + lv_textarea_set_text(textarea, "1234567890"); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_align_center.png"); + + lv_textarea_set_align(textarea, LV_TEXT_ALIGN_LEFT); + lv_textarea_set_text(textarea, "1234567890"); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_align_left.png"); + + lv_textarea_set_align(textarea, LV_TEXT_ALIGN_RIGHT); + lv_textarea_set_text(textarea, "1234567890"); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_align_right.png"); +} + +void test_textarea_cursor_show(void) +{ + lv_textarea_set_password_show_time(textarea, 1000); + lv_obj_send_event(textarea, LV_EVENT_FOCUSED, NULL); + + lv_test_wait(1000); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_cursor_show.png"); +} + +void test_textarea_set_cursor_pos(void) +{ + lv_obj_set_size(textarea, 100, 60); + + lv_textarea_set_one_line(textarea, false); + lv_textarea_set_text(textarea, "123456789012345678901234567890123456789012345678901"); + + lv_textarea_set_cursor_pos(textarea, 0); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_cursor_pos_top.png"); + + lv_textarea_set_cursor_pos(textarea, 50); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_cursor_pos_bottom.png"); + + lv_textarea_set_one_line(textarea, true); + lv_textarea_set_text(textarea, "123456789012345678901234567890123456789012345678901"); + + lv_textarea_set_cursor_pos(textarea, 0); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_cursor_pos_left.png"); + + lv_textarea_set_cursor_pos(textarea, 50); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_cursor_pos_right.png"); + + lv_textarea_set_one_line(textarea, false); + lv_textarea_set_text(textarea, "123456789012345678901234567890123456789012345678901"); + lv_obj_set_size(lv_textarea_get_label(textarea), 100, 200); + + lv_obj_scroll_to_y(textarea, 300, LV_ANIM_OFF); + lv_textarea_set_cursor_pos(textarea, 4); + lv_test_wait(500); + TEST_ASSERT_EQUAL_UINT32(0, lv_obj_get_scroll_y(textarea)); + + lv_textarea_set_one_line(textarea, true); + lv_textarea_set_cursor_pos(textarea, 50); + lv_test_wait(100); + lv_textarea_set_cursor_pos(textarea, 10); + lv_test_wait(100); + TEST_ASSERT_EQUAL_UINT32(10, lv_textarea_get_cursor_pos(textarea)); +} + +void test_textarea_get_current_char(void) +{ + lv_textarea_set_one_line(textarea, false); + lv_textarea_set_text(textarea, "1234567890"); + + lv_textarea_set_cursor_pos(textarea, 2); + TEST_ASSERT_EQUAL_INT('2', lv_textarea_get_current_char(textarea)); + + lv_textarea_set_cursor_pos(textarea, 0); + TEST_ASSERT_EQUAL_INT(0, lv_textarea_get_current_char(textarea)); +} + +void test_textarea_cursor_position_on_click(void) +{ + lv_textarea_set_one_line(textarea, true); + lv_textarea_set_text(textarea, "Hello World"); + lv_obj_set_size(textarea, 200, 100); + + lv_textarea_set_cursor_click_pos(textarea, true); + + lv_test_mouse_click_at(5, 15); + TEST_ASSERT_EQUAL_UINT32(0, lv_textarea_get_cursor_pos(textarea)); + + lv_test_mouse_click_at(180, 15); + TEST_ASSERT_EQUAL_UINT32(11, lv_textarea_get_cursor_pos(textarea)); + + int32_t label_width = lv_obj_get_width(lv_textarea_get_label(textarea)); + lv_test_mouse_click_at(label_width + 20, 15); + TEST_ASSERT_EQUAL_UINT32(11, lv_textarea_get_cursor_pos(textarea)); + + lv_textarea_set_text_selection(textarea, true); + lv_test_mouse_click_at(40, 15); + lv_test_mouse_press(); + lv_test_wait(100); + lv_test_mouse_move_to(100, 15); + lv_test_wait(100); + lv_test_mouse_release(); + TEST_ASSERT_EQUAL_UINT32(11, lv_textarea_get_cursor_pos(textarea)); + + lv_test_mouse_click_at(40, 15); + lv_test_mouse_press(); + lv_test_wait(100); + lv_test_mouse_move_to(5, 15); + lv_test_wait(100); + lv_test_mouse_release(); + TEST_ASSERT_EQUAL_UINT32(0, lv_textarea_get_cursor_pos(textarea)); + + lv_textarea_set_text_selection(textarea, false); + lv_test_mouse_click_at(5, 15); + TEST_ASSERT_EQUAL_UINT32(0, lv_textarea_get_cursor_pos(textarea)); + + lv_textarea_set_cursor_click_pos(textarea, false); + uint32_t pos_before = lv_textarea_get_cursor_pos(textarea); + lv_test_mouse_click_at(50, 15); + TEST_ASSERT_EQUAL_UINT32(pos_before, lv_textarea_get_cursor_pos(textarea)); +} + +void test_textarea_key_event(void) +{ + lv_textarea_set_text(textarea, "Hello World"); + lv_textarea_set_cursor_pos(textarea, 11); + + uint32_t key = LV_KEY_BACKSPACE; + lv_obj_send_event(textarea, LV_EVENT_KEY, (void *) &key); + TEST_ASSERT_EQUAL_STRING("Hello Worl", lv_textarea_get_text(textarea)); + + lv_textarea_set_text(textarea, "Hello World"); + lv_textarea_set_cursor_pos(textarea, 0); + + key = LV_KEY_DEL; + lv_obj_send_event(textarea, LV_EVENT_KEY, (void *) &key); + TEST_ASSERT_EQUAL_STRING("ello World", lv_textarea_get_text(textarea)); + + key = LV_KEY_HOME; + lv_textarea_set_cursor_pos(textarea, 10); + lv_obj_send_event(textarea, LV_EVENT_KEY, (void *) &key); + TEST_ASSERT_EQUAL_UINT32(0, lv_textarea_get_cursor_pos(textarea)); + + key = LV_KEY_END; + lv_textarea_set_cursor_pos(textarea, 0); + lv_obj_send_event(textarea, LV_EVENT_KEY, (void *) &key); + TEST_ASSERT_EQUAL_UINT32(10, lv_textarea_get_cursor_pos(textarea)); + + lv_obj_set_size(textarea, 100, 40); + lv_textarea_set_one_line(textarea, false); + lv_textarea_set_text(textarea, "Hello World, this is a test for the key event"); + lv_textarea_set_cursor_pos(textarea, 0); + + key = LV_KEY_DOWN; + lv_obj_send_event(textarea, LV_EVENT_KEY, (void *) &key); + lv_test_wait(100); + TEST_ASSERT_EQUAL_UINT32(6, lv_textarea_get_cursor_pos(textarea)); + + lv_textarea_set_text(textarea, "Hello World"); + lv_textarea_set_cursor_pos(textarea, 11); + + key = 49; + lv_obj_send_event(textarea, LV_EVENT_KEY, (void *) &key); + TEST_ASSERT_EQUAL_STRING("Hello World1", lv_textarea_get_text(textarea)); +} + +void test_textarea_check_placeholder_text_position(void) +{ + lv_textarea_set_placeholder_text(textarea, "Placeholder"); + lv_textarea_set_one_line(textarea, true); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_placeholder_center.png"); + + lv_textarea_set_one_line(textarea, false); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_placeholder_top.png"); + + lv_obj_set_style_align(lv_textarea_get_label(textarea), LV_ALIGN_LEFT_MID, LV_PART_MAIN); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_placeholder_left_mid.png"); + + lv_obj_set_style_align(lv_textarea_get_label(textarea), LV_ALIGN_TOP_LEFT, LV_PART_MAIN); + lv_obj_set_style_pad_top(lv_textarea_get_label(textarea), 50, LV_PART_TEXTAREA_PLACEHOLDER); + lv_obj_set_style_pad_left(lv_textarea_get_label(textarea), 50, LV_PART_TEXTAREA_PLACEHOLDER); + TEST_ASSERT_EQUAL_SCREENSHOT("textarea_placeholder_pad_left_top_50.png"); +} + #endif