From c4bbf39e585517c9f2b4d89a3729edf478fff2e7 Mon Sep 17 00:00:00 2001 From: wangweiyuan Date: Tue, 24 Jun 2025 13:44:16 +0800 Subject: [PATCH] modify TextComponent Signed-off-by: wangweiyuan --- .../ArkUISample/TextComponent/README_zh.md | 71 +- .../TextComponent/build-profile.json5 | 6 +- .../TextComponent/entry/build-profile.json5 | 16 + .../TextComponent/entry/oh-package.json5 | 7 +- .../entry/src/main/cpp/CMakeLists.txt | 15 + .../entry/src/main/cpp/napi_init.cpp | 194 +++ .../src/main/cpp/types/libentry/index.d.ts | 17 + .../main/cpp/types/libentry/oh-package.json5 | 21 + .../entry/src/main/ets/common/Card.ets | 8 +- .../main/ets/entryability/EntryAbility.ets | 7 +- .../entry/src/main/ets/pages/Index.ets | 30 +- .../ets/pages/ndk/ListenTextBoxEvents.ets | 42 + .../main/ets/pages/ndk/TextDrawingDisplay.ets | 42 + .../entry/src/main/ets/pages/ndk/index.ets | 75 + .../ets/pages/propertyString/CreateApply.ets | 43 + .../StyledStringGestureStyle.ets | 148 ++ .../pages/propertyString/StyledStringHtml.ets | 98 ++ .../StyledStringImageAttachment.ets | 184 +++ .../StyledStringParagraphStyle.ets | 106 ++ .../StyledStringSceneExample.ets | 175 +++ .../propertyString/StyledStringStyle.ets | 155 ++ .../main/ets/pages/propertyString/index.ets | 105 ++ .../richEditor/AddBuilderDecoratorContent.ets | 74 + .../main/ets/pages/richEditor/AddEvent.ets | 385 +++++ .../ets/pages/richEditor/AddImageContent.ets | 60 + .../pages/richEditor/AddSymbolSpanContent.ets | 60 + .../ets/pages/richEditor/AddTextContent.ets | 60 + .../richEditor/BackplaneHighlighting.ets | 56 + .../ets/pages/richEditor/CreateRichEditor.ets | 76 + .../richEditor/GetGraphicInfoInComponent.ets | 71 + .../ets/pages/richEditor/SetAttributes.ets | 288 ++++ .../richEditor/SetUserPresetTextStyles.ets | 65 + .../src/main/ets/pages/richEditor/index.ets | 139 ++ .../ets/pages/symbol/CreatSymbolGlyph.ets | 40 + .../main/ets/pages/symbol/SymbolAddEvent.ets | 45 + .../main/ets/pages/symbol/SymbolAddToText.ets | 221 +++ .../symbol/SymbolCustomIconAnimation.ets | 64 + .../ets/pages/symbol/SymbolSceneExample.ets | 244 +++ .../entry/src/main/ets/pages/symbol/index.ets | 100 ++ .../entry/src/main/ets/pages/text/AIMenu.ets | 47 + .../src/main/ets/pages/text/CreateText.ets | 2 +- .../main/ets/pages/text/CustomTextStyle.ets | 24 +- .../src/main/ets/pages/text/SelectMenu.ets | 123 ++ .../src/main/ets/pages/text/TextSpan.ets | 2 +- .../entry/src/main/ets/pages/text/index.ets | 18 +- .../src/main/ets/pages/textInput/AutoFill.ets | 41 + .../ets/pages/textInput/CursorAvoidance.ets | 69 + .../ets/pages/textInput/LoginRegisterPage.ets | 2 +- .../main/ets/pages/textInput/SelectMenu.ets | 42 + .../pages/textInput/SetOmissionProperty.ets | 42 + .../ets/pages/textInput/SetTextInputType.ets | 86 +- .../ets/pages/textInput/TextInputAddEvent.ets | 44 +- .../src/main/ets/pages/textInput/index.ets | 68 +- .../main/resources/base/element/float.json | 8 + .../main/resources/base/element/string.json | 920 +++++++++++- .../resources/base/profile/main_pages.json | 11 +- .../src/ohosTest/ets/test/index.test.ets | 1335 ++++++++++++++++- .../screenshots/device/image1.png | Bin 26463 -> 174814 bytes .../screenshots/device/image2.jpeg | Bin 0 -> 76241 bytes .../screenshots/device/image3.jpeg | Bin 0 -> 37086 bytes 60 files changed, 6365 insertions(+), 132 deletions(-) create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/cpp/CMakeLists.txt create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/cpp/napi_init.cpp create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/cpp/types/libentry/index.d.ts create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/cpp/types/libentry/oh-package.json5 create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/ndk/ListenTextBoxEvents.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/ndk/TextDrawingDisplay.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/ndk/index.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/CreateApply.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringGestureStyle.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringHtml.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringImageAttachment.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringParagraphStyle.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringSceneExample.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringStyle.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/index.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/AddBuilderDecoratorContent.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/AddEvent.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/AddImageContent.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/AddSymbolSpanContent.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/AddTextContent.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/BackplaneHighlighting.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/CreateRichEditor.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/GetGraphicInfoInComponent.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/SetAttributes.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/SetUserPresetTextStyles.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/index.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/CreatSymbolGlyph.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/SymbolAddEvent.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/SymbolAddToText.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/SymbolCustomIconAnimation.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/SymbolSceneExample.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/index.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/AIMenu.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/SelectMenu.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/AutoFill.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/CursorAvoidance.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/SelectMenu.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/SetOmissionProperty.ets create mode 100644 code/DocsSample/ArkUISample/TextComponent/entry/src/main/resources/base/element/float.json create mode 100644 code/DocsSample/ArkUISample/TextComponent/screenshots/device/image2.jpeg create mode 100644 code/DocsSample/ArkUISample/TextComponent/screenshots/device/image3.jpeg diff --git a/code/DocsSample/ArkUISample/TextComponent/README_zh.md b/code/DocsSample/ArkUISample/TextComponent/README_zh.md index 6a4f33d9d0..0952c25ee9 100644 --- a/code/DocsSample/ArkUISample/TextComponent/README_zh.md +++ b/code/DocsSample/ArkUISample/TextComponent/README_zh.md @@ -4,13 +4,19 @@ 本示例通过使用[ArkUI指南文档](https://gitee.com/openharmony/docs/tree/master/zh-cn/application-dev/ui)中各场景的开发示例,展示在工程中,帮助开发者更好地理解ArkUI提供的组件及组件属性并合理使用。该工程中展示的代码详细描述可查如下链接: -1. [文本显示 (Text/Span)](https://gitee.com/openharmony/docs/blob/OpenHarmony-5.0.1-Release/zh-cn/application-dev/ui/arkts-common-components-text-display.md)。 -2. [文本输入 (TextInput/TextArea)](https://gitee.com/openharmony/docs/blob/OpenHarmony-5.0.1-Release/zh-cn/application-dev/ui/arkts-common-components-text-input.md)。 +1. [文本显示 (Text/Span)](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ui/arkts-common-components-text-display.md)。 +2. [文本输入 (TextInput/TextArea)](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ui/arkts-common-components-text-input.md)。 +3. [富文本 (RichEditor)](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ui/arkts-common-components-richeditor.md)。 +4. [图标小符号 (SymbolGlyph/SymbolSpan)](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ui/arkts-common-components-symbol.md)。 +5. [属性字符串 (StyledString/MutableStyledString)](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ui/arkts-styled-string.md)。 +6. [Text组件的文本绘制与显示](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ui/ndk-styled-string.md)。 +7. [监听输入框事件](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ui/ndk-textarea-event.md)。 + ### 效果预览 -| 首页 | 文本显示组件目录 | 创建文本示例 | -|------------------------------------|------------------------------------|------------------------------------| -| ![](screenshots/device/image1.png) | ![](screenshots/device/image2.png) | ![](screenshots/device/image3.png) | +| 首页 | 文本显示组件目录 | 创建文本示例 | +|-------------------------------------| ----------------------------------- | ----------------------------------- | +| ![](screenshots/device/image1.jpeg) | ![](screenshots/device/image2.jpeg) | ![](screenshots/device/image3.jpeg) | ### 使用说明 @@ -23,30 +29,69 @@ 4. 通过自动测试框架可进行测试及维护。 ### 工程目录 + ``` entry/src/main/ets/ |---entryability |---pages -| |---text //文本显示 +| |---ndk // ndk接口使用文本 +| | |---index.ets +| | |---TextDrawingDisplay.ets +| | |---ListenTextBoxEvents.ets +| |---propertyString // 属性字符串 +| | |---CreateApply.ets +| | |---index.ets +| | |---StyledStringGestureStyle.ets +| | |---StyledStringHtml.ets +| | |---StyledStringImageAttachment.ets +| | |---StyledStringParagraphStyle.ets +| | |---StyledStringSceneExample.ets +| | |---StyledStringStyle.ets +| |---richEditor // 富文本 +| | |---AddBuilderDecoratorContent.ets +| | |---AddEvent.ets +| | |---AddImageContent.ets +| | |---AddSymbolSpanContent.ets +| | |---AddTextContent.ets +| | |---BackplaneHighlighting.ets +| | |---CreateRichEditor.ets +| | |---GetGraphicInfoInComponent.ets +| | |---index.ets +| | |---SetAttributes.ets +| | |---SetUserPresetTextStyles.ets +| |---symbol // 图标小符号 +| | |---CreatSymbolGlyph.ets +| | |---index.ets +| | |---SymbolAddEvent.ets +| | |---SymbolAddToText.ets +| | |---SymbolCustomIconAnimation.ets +| | |---SymbolSceneExample.ets +| |---text // 文本显示 +| | |---AIMenu.ets | | |---CreatText.ets | | |---CustomTextStyle.ets | | |---index.ets +| | |---SelectMenu.ets | | |---TextAddEvent.ets | | |---TextHotSearch.ets | | |---TextSpan.ets -| |---testInput //文本输入 +| |---testInput // 文本输入 +| | |---AutoFill.ets | | |---CreatTextInput.ets +| | |---CursorAvoidance.ets | | |---CustomTextInputStyle.ets | | |---index.ets | | |---KeyboardAvoidance.ets | | |---LoginRegisterPage.ets -| | |---SetTextInputType.ets -| | |---TextInputAddEvent.ets +| | |---SelectMenu.ets +| | |---SetOmissionProperty.ets +| | |---SetTextInputType.ets +| | |---TextInputAddEvent.ets |---pages -| |---Index.ets // 应用主页面 +| |---Index.ets // 应用主页面 entry/src/ohosTest/ |---ets -| |---index.test.ets // 示例代码测试代码 +| |---index.test.ets // 示例代码测试代码 ``` ### 相关权限 @@ -61,9 +106,9 @@ entry/src/ohosTest/ 1.本示例仅支持标准系统上运行, 支持设备:RK3568。 -2.本示例为Stage模型,支持API14版本SDK,版本号:5.0.2.57,镜像版本号:OpenHarmony_5.0.2.57。 +2.本示例为Stage模型,支持API20版本SDK,版本号:6.0.0.34,镜像版本号:OpenHarmony_6.0.0.34。 -3.本示例需要使用DevEco Studio NEXT Developer Preview2 (Build Version: 5.0.5.306, built on December 12, 2024)及以上版本才可编译运行。 +3.本示例需要使用DevEco Studio 6.0.0及以上版本才可编译运行。 ### 下载 diff --git a/code/DocsSample/ArkUISample/TextComponent/build-profile.json5 b/code/DocsSample/ArkUISample/TextComponent/build-profile.json5 index 9a067264a4..a515b0108c 100644 --- a/code/DocsSample/ArkUISample/TextComponent/build-profile.json5 +++ b/code/DocsSample/ArkUISample/TextComponent/build-profile.json5 @@ -20,9 +20,9 @@ { "name": "default", "signingConfig": "default", - "compileSdkVersion": 14, - "compatibleSdkVersion": 14, - "targetSdkVersion": 14, + "compileSdkVersion": 20, + "compatibleSdkVersion": 20, + "targetSdkVersion": 20, "runtimeOS": "OpenHarmony", "buildOption": { "strictMode": { diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/build-profile.json5 b/code/DocsSample/ArkUISample/TextComponent/entry/build-profile.json5 index e7569e3056..8bbe548ca7 100644 --- a/code/DocsSample/ArkUISample/TextComponent/entry/build-profile.json5 +++ b/code/DocsSample/ArkUISample/TextComponent/entry/build-profile.json5 @@ -16,6 +16,16 @@ { "apiType": "stageMode", "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "", + "abiFilters": [ + "x86_64", + "armeabi-v7a", + "arm64-v8a" + ] + } }, "buildOptionSet": [ { @@ -29,6 +39,12 @@ ] } } + }, + "nativeLib": { + "debugSymbol": { + "strip": true, + "exclude": [] + } } }, ], diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/oh-package.json5 b/code/DocsSample/ArkUISample/TextComponent/entry/oh-package.json5 index c9cb6c8174..118bdd4fe7 100644 --- a/code/DocsSample/ArkUISample/TextComponent/entry/oh-package.json5 +++ b/code/DocsSample/ArkUISample/TextComponent/entry/oh-package.json5 @@ -20,6 +20,7 @@ "main": "", "author": "", "license": "", - "dependencies": {} -} - + "dependencies": { + "libentry.so": "file:./src/main/cpp/types/libentry" + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/cpp/CMakeLists.txt b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000000..b5320e1e17 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/cpp/CMakeLists.txt @@ -0,0 +1,15 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.5.0) +project(TextComponent) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +if(DEFINED PACKAGE_FIND_FILE) + include(${PACKAGE_FIND_FILE}) +endif() + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include) + +add_library(entry SHARED napi_init.cpp) +target_link_libraries(entry PUBLIC libace_napi.z.so libnative_drawing.so libace_ndk.z.so) \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/cpp/napi_init.cpp b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/cpp/napi_init.cpp new file mode 100644 index 0000000000..03b8bc38c7 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/cpp/napi_init.cpp @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "napi/native_api.h" +#include "arkui/styled_string.h" +#include "arkui/native_node.h" +#include +#include +#include +#include +#include +#include + +static napi_value CreateNativeNode(napi_env env, napi_callback_info info) +{ + const int fontSize = 28; + const int textSize = 400; + const int maxLines = 10; + size_t argc = 1; + napi_value args[1]; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + + ArkUI_NodeContentHandle rootSlot = nullptr; + OH_ArkUI_GetNodeContentFromNapiValue(env, args[0], &rootSlot); + + ArkUI_NativeNodeAPI_1 *nodeApi = reinterpret_cast( + OH_ArkUI_QueryModuleInterfaceByName(ARKUI_NATIVE_NODE, "ArkUI_NativeNodeAPI_1")); + if (nodeApi == nullptr) { + return nullptr; + } + // 创建一个Column容器组件 + ArkUI_NodeHandle column = nodeApi->createNode(ARKUI_NODE_COLUMN); + ArkUI_NumberValue colWidth[] = {{.f32 = 300}}; + ArkUI_AttributeItem widthItem = {.value = colWidth, .size = 1}; + nodeApi->setAttribute(column, NODE_WIDTH, &widthItem); + // 创建Text组件 + ArkUI_NodeHandle text = nodeApi->createNode(ARKUI_NODE_TEXT); + ArkUI_NumberValue textWidth[] = {{.f32 = 300}}; + ArkUI_AttributeItem textWidthItem = {.value = textWidth, .size = 1}; + nodeApi->setAttribute(text, NODE_WIDTH, &textWidthItem); + + ArkUI_NumberValue textHeight[] = {{.f32 = 100}}; + ArkUI_AttributeItem textHeightItem = {.value = textHeight, .size = 1}; + nodeApi->setAttribute(text, NODE_HEIGHT, &textHeightItem); + + ArkUI_NumberValue borderWidth[] = {{.f32 = 1}}; + ArkUI_AttributeItem borderWidthItem = {.value = borderWidth, .size = 1}; + nodeApi->setAttribute(text, NODE_BORDER_WIDTH, &borderWidthItem); + + // typographyStyle表示段落样式。 + OH_Drawing_TypographyStyle *typographyStyle = OH_Drawing_CreateTypographyStyle(); + // 文字居中显示 + OH_Drawing_SetTypographyTextAlign(typographyStyle, OH_Drawing_TextAlign::TEXT_ALIGN_CENTER); + OH_Drawing_SetTypographyTextMaxLines(typographyStyle, maxLines); + ArkUI_StyledString *styledString = OH_ArkUI_StyledString_Create(typographyStyle, OH_Drawing_CreateFontCollection()); + // 创建文本样式,设置字体和颜色。 + OH_Drawing_TextStyle *textStyle = OH_Drawing_CreateTextStyle(); + OH_Drawing_SetTextStyleFontSize(textStyle, fontSize); + OH_Drawing_SetTextStyleColor(textStyle, OH_Drawing_ColorSetArgb(0xFF, 0x70, 0x70, 0x70)); + // 文本样式的设置有顺序。 + OH_ArkUI_StyledString_PushTextStyle(styledString, textStyle); + OH_ArkUI_StyledString_AddText(styledString, "Hello"); + OH_ArkUI_StyledString_PopTextStyle(styledString); + // 在Hello和World中间插入100x100的占位。 + OH_Drawing_PlaceholderSpan placeHolder{ + .width = 100, + .height = 100, + }; + OH_ArkUI_StyledString_AddPlaceholder(styledString, &placeHolder); + OH_Drawing_TextStyle *worldTextStyle = OH_Drawing_CreateTextStyle(); + OH_Drawing_SetTextStyleFontSize(worldTextStyle, fontSize); + OH_Drawing_SetTextStyleColor(worldTextStyle, OH_Drawing_ColorSetArgb(0xFF, 0x27, 0x87, 0xD9)); + OH_ArkUI_StyledString_PushTextStyle(styledString, worldTextStyle); + OH_ArkUI_StyledString_AddText(styledString, "World!"); + OH_ArkUI_StyledString_PopTextStyle(styledString); + OH_Drawing_Typography *typography = OH_ArkUI_StyledString_CreateTypography(styledString); + OH_Drawing_TypographyLayout(typography, textSize); + ArkUI_AttributeItem styledStringItem = {.object = styledString}; + nodeApi->setAttribute(text, NODE_TEXT_CONTENT_WITH_STYLED_STRING, &styledStringItem); + + OH_ArkUI_StyledString_Destroy(styledString); + // Text作为Column子组件 + nodeApi->addChild(column, text); + OH_ArkUI_NodeContent_AddNode(rootSlot, column); + return nullptr; +} +static napi_value CreateTextAreaNode(napi_env env, napi_callback_info info) +{ + size_t argc = 1; + napi_value args[1]; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + + ArkUI_NodeContentHandle rootSlot = nullptr; + OH_ArkUI_GetNodeContentFromNapiValue(env, args[0], &rootSlot); + + ArkUI_NativeNodeAPI_1 *nodeApi = reinterpret_cast( + OH_ArkUI_QueryModuleInterfaceByName(ARKUI_NATIVE_NODE, "ArkUI_NativeNodeAPI_1")); + if (nodeApi == nullptr) { + return nullptr; + } + ArkUI_NodeHandle column = nodeApi->createNode(ARKUI_NODE_COLUMN); + ArkUI_NumberValue colWidth[] = {{.f32 = 300}}; + ArkUI_AttributeItem widthItem = {.value = colWidth, .size = 1}; + nodeApi->setAttribute(column, NODE_WIDTH, &widthItem); + + ArkUI_NodeHandle text = nodeApi->createNode(ARKUI_NODE_TEXT); + ArkUI_NumberValue textWidth[] = {{.f32 = 300}}; + ArkUI_AttributeItem textWidthItem = {.value = textWidth, .size = 1}; + nodeApi->setAttribute(text, NODE_WIDTH, &textWidthItem); + nodeApi->addChild(column, text); + + ArkUI_NodeHandle selectionText = nodeApi->createNode(ARKUI_NODE_TEXT); + ArkUI_NumberValue selectionTextWidth[] = {{.f32 = 300}}; + ArkUI_AttributeItem selectionTextWidthItem = {.value = selectionTextWidth, .size = 1}; + nodeApi->setAttribute(selectionText, NODE_WIDTH, &selectionTextWidthItem); + nodeApi->addChild(column, selectionText); + + ArkUI_NodeHandle textArea = nodeApi->createNode(ARKUI_NODE_TEXT_AREA); + ArkUI_NumberValue textAreaWidth[] = {{.f32 = 300}}; + ArkUI_AttributeItem textAreaWidthItem = {.value = textAreaWidth, .size = 1}; + nodeApi->setAttribute(textArea, NODE_WIDTH, &textAreaWidthItem); + + ArkUI_NumberValue borderWidth[] = {{.f32 = 1}}; + ArkUI_AttributeItem borderWidthItem = {.value = borderWidth, .size = 1}; + nodeApi->setAttribute(textArea, NODE_BORDER_WIDTH, &borderWidthItem); + + const ArkUI_AttributeItem *attributeItem = nodeApi->getAttribute(textArea, NODE_UNIQUE_ID); + auto id = attributeItem->value[0].i32; + nodeApi->registerNodeEvent(textArea, NODE_TEXT_AREA_ON_CHANGE, id, text); + nodeApi->registerNodeEvent(textArea, NODE_TEXT_AREA_ON_PASTE, id, text); + nodeApi->registerNodeEvent(textArea, NODE_TEXT_AREA_ON_TEXT_SELECTION_CHANGE, id, selectionText); + nodeApi->registerNodeEventReceiver([](ArkUI_NodeEvent *event) { + ArkUI_NodeEventType eventType = OH_ArkUI_NodeEvent_GetEventType(event); + ArkUI_AttributeItem content; + if (eventType == NODE_TEXT_AREA_ON_CHANGE || eventType == NODE_TEXT_AREA_ON_PASTE) { + ArkUI_StringAsyncEvent *stringEvent = OH_ArkUI_NodeEvent_GetStringAsyncEvent(event); + content = {.string = stringEvent->pStr }; + } else if (eventType == NODE_TEXT_AREA_ON_TEXT_SELECTION_CHANGE) { + ArkUI_NodeComponentEvent *componentEvent = OH_ArkUI_NodeEvent_GetNodeComponentEvent(event); + std::stringstream selectContent; + selectContent << "start: " << componentEvent->data[0].i32 << " , end: " << componentEvent->data[1].i32; + content = {.string = selectContent.str().c_str() }; + } else { + return; + } + ArkUI_NodeHandle textNode = reinterpret_cast(OH_ArkUI_NodeEvent_GetUserData(event)); + if (textNode) { + ArkUI_NativeNodeAPI_1 *nodeApi = reinterpret_cast( + OH_ArkUI_QueryModuleInterfaceByName(ARKUI_NATIVE_NODE, "ArkUI_NativeNodeAPI_1")); + nodeApi->setAttribute(textNode, NODE_TEXT_CONTENT, &content); + } + }); + nodeApi->addChild(column, textArea); + OH_ArkUI_NodeContent_AddNode(rootSlot, column); + return nullptr; +} + +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + napi_property_descriptor desc[] = { + { "createNativeNode", nullptr, CreateNativeNode, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "createTextAreaNode", nullptr, CreateTextAreaNode, nullptr, nullptr, nullptr, napi_default, nullptr } + }; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "entry", + .nm_priv = ((void*)0), + .reserved = { 0 }, +}; + +extern "C" __attribute__((constructor)) void RegisterEntryModule(void) +{ + napi_module_register(&demoModule); +} diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/cpp/types/libentry/index.d.ts b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/cpp/types/libentry/index.d.ts new file mode 100644 index 0000000000..d0214ce4ff --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/cpp/types/libentry/index.d.ts @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const createNativeNode: (content: Object) => void; +export const createTextAreaNode: (content: Object) => void; \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/cpp/types/libentry/oh-package.json5 b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/cpp/types/libentry/oh-package.json5 new file mode 100644 index 0000000000..2826cc7d6b --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/cpp/types/libentry/oh-package.json5 @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "libentry.so", + "types": "./index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/common/Card.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/common/Card.ets index 0cb4a246cf..8a5d71ab79 100644 --- a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/common/Card.ets +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/common/Card.ets @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - + @Component export struct CompletedRoutableCard { @Prop @@ -104,8 +104,7 @@ export struct RoutableCard { @Component export struct ComponentCard { @Prop - @Require - title: ResourceStr; + title?: ResourceStr; @BuilderParam content: () => void; @Prop description?: ResourceStr; @@ -115,9 +114,10 @@ export struct ComponentCard { Text(this.title) .fontSize(14) .fontColor('#666') - Row({ space: 12}) { + Row({ space: 12 }) { this.content(); } + if (this.description) { Text(this.description) .backgroundColor('#eee') diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/entryability/EntryAbility.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/entryability/EntryAbility.ets index a3cf7a1471..f85e945903 100644 --- a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/entryability/EntryAbility.ets +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/entryability/EntryAbility.ets @@ -16,6 +16,7 @@ import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit'; import { hilog } from '@kit.PerformanceAnalysisKit'; import { window } from '@kit.ArkUI'; +import { KeyboardAvoidMode } from '@kit.ArkUI'; export default class EntryAbility extends UIAbility { onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { @@ -31,12 +32,14 @@ export default class EntryAbility extends UIAbility { // Main window is created, set main page for this ability hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); - windowStage.loadContent('pages/Index', (err) => { + windowStage.loadContent('pages/Index', (err, data) => { + let keyboardAvoidMode = windowStage.getMainWindowSync().getUIContext().getKeyboardAvoidMode(); + windowStage.getMainWindowSync().getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.OFFSET_WITH_CARET); if (err.code) { hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); return; } - hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? ''); }); } diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/Index.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/Index.ets index f340215e6e..0b620e6fb5 100644 --- a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/Index.ets +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/Index.ets @@ -18,6 +18,10 @@ import { RoutableCard } from '../common/Card'; import { Route } from '../common/Route'; import { TextDestination, TEXT_ROUTE_PREFIX } from './text'; import { TextInputDestination, INPUT_ROUTE_PREFIX } from './textInput'; +import { RichEditorDestination, RICH_EDITOR_ROUTE_PREFIX } from './richEditor'; +import { SymbolGlyphSpanDestination, SYMBOL_GLYPH_SPAN } from './symbol'; +import { PropertyStringDestination, PROPERTY_STRING_ROUTE_PREFIX } from './propertyString'; +import { NDKDestination, NDK_ROUTE_PREFIX } from './ndk'; import resource from '../common/resource'; const routes: Route[] = [ @@ -28,6 +32,22 @@ const routes: Route[] = [ { title: resource.resourceToString($r('app.string.pageIndex_TextInput')), name: INPUT_ROUTE_PREFIX + }, + { + title: resource.resourceToString($r('app.string.pageIndex_RichEditor')), + name: RICH_EDITOR_ROUTE_PREFIX + }, + { + title: resource.resourceToString($r('app.string.pageIndex_symbolGlyphSpan')), + name: SYMBOL_GLYPH_SPAN + }, + { + title: resource.resourceToString($r('app.string.pageIndex_PropertyString')), + name: PROPERTY_STRING_ROUTE_PREFIX + }, + { + title: resource.resourceToString($r('app.string.pageIndex_TextNDKUI')), + name: NDK_ROUTE_PREFIX } ]; @@ -37,6 +57,14 @@ function Destination(name: string) { TextDestination(name); } else if (name.startsWith(INPUT_ROUTE_PREFIX)) { TextInputDestination(name); + } else if (name.startsWith(RICH_EDITOR_ROUTE_PREFIX)) { + RichEditorDestination(name); + } else if (name.startsWith(SYMBOL_GLYPH_SPAN)) { + SymbolGlyphSpanDestination(name); + } else if (name.startsWith(PROPERTY_STRING_ROUTE_PREFIX)) { + PropertyStringDestination(name); + }else if (name.startsWith(NDK_ROUTE_PREFIX)) { + NDKDestination(name); } } @@ -93,4 +121,4 @@ struct Index { }) .navDestination(Destination) } -} +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/ndk/ListenTextBoxEvents.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/ndk/ListenTextBoxEvents.ets new file mode 100644 index 0000000000..ce81dd4ab6 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/ndk/ListenTextBoxEvents.ets @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import nativeNode from 'libentry.so'; +import { NodeContent } from '@kit.ArkUI'; + +@Entry +@Component +export struct ListenTextBoxEvents { + // 初始化NodeContent对象。 + private rootSlot = new NodeContent(); + + aboutToAppear(): void { + // 通过C-API创建节点,并添加到管理器nodeContent上 + nativeNode.createTextAreaNode(this.rootSlot); + } + + build() { + NavDestination() { + Column() { + Row() { + // 将NodeContent和ContentSlot占位组件绑定。 + ContentSlot(this.rootSlot) + }.layoutWeight(1) + } + .width('100%') + .height('100%') + }.title($r('app.string.ListenTextBoxEvents_NDK_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/ndk/TextDrawingDisplay.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/ndk/TextDrawingDisplay.ets new file mode 100644 index 0000000000..93eeefd62d --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/ndk/TextDrawingDisplay.ets @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import nativeNode from 'libentry.so'; +import { NodeContent } from '@kit.ArkUI'; + +@Entry +@Component +export struct TextDrawingDisplay { + // 初始化NodeContent对象。 + private rootSlot = new NodeContent(); + + aboutToAppear(): void { + // 通过C-API创建节点,并添加到管理器nodeContent上 + nativeNode.createNativeNode(this.rootSlot); + } + + build() { + NavDestination() { + Column() { + Row() { + // 将NodeContent和ContentSlot占位组件绑定。 + ContentSlot(this.rootSlot) + }.layoutWeight(1) + } + .width('100%') + .height('100%') + }.title($r('app.string.TextDrawingDisplay_NDK_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/ndk/index.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/ndk/index.ets new file mode 100644 index 0000000000..d23cff77df --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/ndk/index.ets @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { CompletedRoutableCard } from '../../common/Card'; +import resource from '../../common/resource'; +import { Route } from '../../common/Route'; +import { ListenTextBoxEvents } from './ListenTextBoxEvents'; +import { TextDrawingDisplay } from './TextDrawingDisplay'; + +export const NDK_ROUTE_PREFIX: string = 'ndk'; + +const routes: Route[] = [ + { + name: `${NDK_ROUTE_PREFIX}/TextDrawingDisplay`, + title: resource.resourceToString($r('app.string.TextDrawingDisplay_NDK_title')), + description: $r('app.string.TextDrawingDisplay_NDK_desc') + }, + { + name: `${NDK_ROUTE_PREFIX}/ListenTextBoxEvents`, + title: resource.resourceToString($r('app.string.ListenTextBoxEvents_NDK_title')), + description: $r('app.string.ListenTextBoxEvents_NDK_desc') + } +]; + +@Builder +export function NDKDestination(name: string) { + if (name === NDK_ROUTE_PREFIX) { + NDKExample(); + } else if (name === routes[0].name) { + TextDrawingDisplay(); + } else if (name === routes[1].name) { + ListenTextBoxEvents(); + } +} + +@Entry +@Component +struct NDKExample { + @Consume pathStack: NavPathStack; + + build() { + NavDestination() { + List({ space: 12 }) { + ForEach(routes, (route: Route) => { + ListItem() { + CompletedRoutableCard({ title: route.title, description: route.description }) + } + .width('100%') + .onClick(() => { + this.pathStack.pushPath({ name: route.name }); + }) + }) + } + .contentStartOffset(56) + .padding({ left: 16, right: 16 }) + } + .backgroundColor('#f1f3f5') + .title($r('app.string.pageIndex_TextNDKUI'), { + backgroundBlurStyle: BlurStyle.COMPONENT_THICK, + barStyle: BarStyle.STACK + }) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/CreateApply.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/CreateApply.ets new file mode 100644 index 0000000000..6edcb48111 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/CreateApply.ets @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import resource from '../../common/resource'; + +@Entry +@Component +struct styled_string_demo1 { + styledString1: StyledString = new StyledString(resource.resourceToString($r('app.string.CreateApply_Text_1'))); + mutableStyledString1: MutableStyledString = new MutableStyledString(resource.resourceToString($r('app.string.CreateApply_Text_2'))); + controller1: TextController = new TextController(); + controller2: TextController = new TextController(); + + async onPageShow() { + // 在生命周期onPageShow回调中绑定属性字符串 + this.controller1.setStyledString(this.styledString1); + } + + build() { + Column() { + // 显示属性字符串 + Text(undefined, { controller: this.controller1 }) + Text(undefined, { controller: this.controller2 }) + .onAppear(() => { + // 在组件onAppear回调中绑定属性字符串 + this.controller2.setStyledString(this.mutableStyledString1); + }) + } + .width('100%') + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringGestureStyle.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringGestureStyle.ets new file mode 100644 index 0000000000..1197854346 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringGestureStyle.ets @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; +import { drawing } from '@kit.ArkGraphics2D'; + +let gUIContext: UIContext; + +class MyCustomSpan extends CustomSpan { + constructor(word: string, width: number, height: number, fontSize: number) { + super(); + this.word = word; + this.width = width; + this.height = height; + this.fontSize = fontSize; + } + + onMeasure(measureInfo: CustomSpanMeasureInfo): CustomSpanMetrics { + return { width: this.width, height: this.height }; + } + + onDraw(context: DrawContext, options: CustomSpanDrawInfo) { + let canvas = context.canvas; + + const brush = new drawing.Brush(); + brush.setColor({ + alpha: 255, + red: 0, + green: 0, + blue: 0 + }); + const font = new drawing.Font(); + font.setSize(gUIContext.vp2px(this.fontSize)); + const textBlob = + drawing.TextBlob.makeFromString(this.word.substring(0, 5), font, drawing.TextEncoding.TEXT_ENCODING_UTF8); + canvas.attachBrush(brush); + + this.onDrawRectByRadius(context, options.x, options.x + gUIContext.vp2px(this.width), options.lineTop, + options.lineBottom, 20); + brush.setColor({ + alpha: 255, + red: 255, + green: 255, + blue: 255 + }); + canvas.attachBrush(brush); + canvas.drawTextBlob(textBlob, options.x, options.lineBottom - 30); + brush.setColor({ + alpha: 255, + red: 255, + green: 228, + blue: 196 + }); + canvas.attachBrush(brush); + const textBlob1 = + drawing.TextBlob.makeFromString(this.word.substring(5), font, drawing.TextEncoding.TEXT_ENCODING_UTF8); + canvas.drawTextBlob(textBlob1, options.x + gUIContext.vp2px(100), options.lineBottom - 30); + + canvas.detachBrush(); + } + + onDrawRectByRadius(context: DrawContext, left: number, right: number, top: number, bottom: number, radius: number) { + let canvas = context.canvas; + let path = new drawing.Path(); + + // 画带radius的rect + path.moveTo(left + radius, top); + path.lineTo(right - radius, top); + path.arcTo(right - 2 * radius, top, right, top + 2 * radius, 270, 90); + path.lineTo(right, bottom - radius); + path.arcTo(right - 2 * radius, bottom - 2 * radius, right, bottom, 0, 90); + + path.lineTo(left + 2 * radius, bottom); + path.arcTo(left, bottom - 2 * radius, left + 2 * radius, bottom, 90, 90); + path.lineTo(left, top + 2 * radius); + path.arcTo(left, top, left + 2 * radius, top + 2 * radius, 180, 90); + + canvas.drawPath(path); + } + + setWord(word: string) { + this.word = word; + } + + public width: number = 160; + public word: string = 'drawing'; + public height: number = 10; + public fontSize: number = 16; +} + +@Entry +@Component +export struct StyledStringGestureStyle { + customSpan3: MyCustomSpan = new MyCustomSpan('99VIP88%off', 200, 40, 30); + textStyle: MutableStyledString = new MutableStyledString('123'); + textController: TextController = new TextController(); + isPageShow: boolean = true; + + aboutToAppear() { + gUIContext = this.getUIContext(); + } + + async onPageShow() { + if (!this.isPageShow) { + return; + } + this.isPageShow = false; + this.textController.setStyledString(new StyledString(this.customSpan3)); + } + + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard({ title: $r('app.string.TStyledStringGestureStyle_title') }) { + // [Start styled_string_gesture_style] + Row() { + Column() { + Text(undefined, { controller: this.textController }) + .id('text1') + .copyOption(CopyOptions.InApp) + .fontSize(30) + } + .width('100%') + } + .height('100%') + // [End styled_string_gesture_style] + } + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.TStyledStringGestureStyle_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringHtml.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringHtml.ets new file mode 100644 index 0000000000..4d5eb81cf9 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringHtml.ets @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; +import { image } from '@kit.ImageKit'; +import { LengthMetrics } from '@kit.ArkUI'; +import resource from '../../common/resource'; + +@Entry +@Component +export struct StyledStringHtml { + imagePixelMap: image.PixelMap | undefined = undefined; + @State html: string | undefined = undefined; + @State styledString: StyledString | undefined = undefined; + controller1: TextController = new TextController; + controller2: TextController = new TextController; + private uiContext: UIContext = this.getUIContext(); + + async aboutToAppear() { + console.info('aboutToAppear initial imagePixelMap'); + this.imagePixelMap = await this.getPixmapFromMedia($r('app.media.startIcon')); + } + + private async getPixmapFromMedia(resource: Resource) { + let unit8Array = await this.uiContext.getHostContext()?.resourceManager?.getMediaContent({ + bundleName: resource.bundleName, + moduleName: resource.moduleName, + id: resource.id + }); + let imageSource = image.createImageSource(unit8Array?.buffer.slice(0, unit8Array.buffer.byteLength)); + let createPixelMap: image.PixelMap = await imageSource.createPixelMap({ + desiredPixelFormat: image.PixelMapFormat.RGBA_8888 + }); + await imageSource.release(); + return createPixelMap; + } + + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard({ title: $r('app.string.StyledStringHtml_title') }) { + // [Start styled_string_html] + Column() { + Text(undefined, { controller: this.controller1 }).height(100).id('text1') + Row() { + Button($r('app.string.StyledStringHtml_Button_1')).onClick(() => { + let mutableStyledString1: MutableStyledString = + new MutableStyledString(resource.resourceToString($r('app.string.StyledStringHtml_Text_1')), [{ + start: 0, + length: 6, + styledKey: StyledStringKey.FONT, + styledValue: new TextStyle({ fontColor: Color.Green, fontSize: LengthMetrics.px(50) }) + }]); + if (this.imagePixelMap !== undefined) { + let mutableStyledString2 = new MutableStyledString(new ImageAttachment({ + value: this.imagePixelMap, + size: { width: 50, height: 50 }, + })); + mutableStyledString1.appendStyledString(mutableStyledString2); + } + this.styledString = mutableStyledString1; + this.controller1.setStyledString(mutableStyledString1); + }).margin(5) + Button($r('app.string.StyledStringHtml_Button_2')).onClick(() => { + this.html = StyledString.toHtml(this.styledString); + }).margin(5) + Button($r('app.string.StyledStringHtml_Button_3')).onClick(async () => { + let styledString = await StyledString.fromHtml(this.html); + this.controller2.setStyledString(styledString); + }).margin(5) + } + + Text(undefined, { controller: this.controller2 }).height(100).id('text2') + Text(this.html).id('text3') + }.width('100%') + // [End styled_string_html] + } + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.StyledStringHtml_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringImageAttachment.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringImageAttachment.ets new file mode 100644 index 0000000000..c07afa4b0a --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringImageAttachment.ets @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; +import { image } from '@kit.ImageKit'; +import { LengthMetrics } from '@kit.ArkUI'; +import resource from '../../common/resource'; + +@Entry +@Component +export struct StyledStringImageAttachment { + @State abled: boolean = true; + @State message: string = 'Hello World'; + imagePixelMap: image.PixelMap | undefined = undefined; + @State imagePixelMap3: image.PixelMap | undefined = undefined; + mutableStr: MutableStyledString = new MutableStyledString('123'); + controller: TextController = new TextController(); + mutableStr2: MutableStyledString = new MutableStyledString('This is set decoration line style to the mutableStr2', [{ + start: 0, + length: 15, + styledKey: StyledStringKey.DECORATION, + styledValue: new DecorationStyle({ + type: TextDecorationType.Overline, + color: Color.Orange, + style: TextDecorationStyle.DOUBLE + }) + }]); + + async aboutToAppear() { + console.info('aboutToAppear initial imagePixelMap'); + this.imagePixelMap = await this.getPixmapFromMedia($r('app.media.startIcon')); + } + + private async getPixmapFromMedia(resource: Resource) { + let unit8Array = await this.getUIContext().getHostContext()?.resourceManager?.getMediaContent({ + bundleName: resource.bundleName, + moduleName: resource.moduleName, + id: resource.id + }); + let imageSource = image.createImageSource(unit8Array?.buffer?.slice(0, unit8Array?.buffer?.byteLength)); + let createPixelMap: image.PixelMap = await imageSource.createPixelMap({ + desiredPixelFormat: image.PixelMapFormat.RGBA_8888 + }); + await imageSource.release(); + return createPixelMap; + } + + leadingMarginValue: ParagraphStyle = new ParagraphStyle({ leadingMargin: LengthMetrics.vp(5)}); + //行高样式对象 + lineHeightStyle1: LineHeightStyle= new LineHeightStyle(new LengthMetrics(24)); + //Bold样式 + boldTextStyle: TextStyle = new TextStyle({ fontWeight: FontWeight.Bold }); + //创建含段落样式的对象paragraphStyledString1 + paragraphStyledString1: MutableStyledString = + new MutableStyledString(resource.resourceToString($r('app.string.StyledStringImageAttachment_Text_1')), [ + { + start: 0, + length: 28, + styledKey: StyledStringKey.PARAGRAPH_STYLE, + styledValue: this.leadingMarginValue + }, + { + start: 14, + length: 9, + styledKey: StyledStringKey.FONT, + styledValue: new TextStyle({ fontSize: LengthMetrics.vp(14), fontColor: '#B22222' }) + }, + { + start: 24, + length: 4, + styledKey: StyledStringKey.FONT, + styledValue: new TextStyle({ fontSize: LengthMetrics.vp(14), fontWeight: FontWeight.Lighter }) + }, + { + start: 11, + length: 4, + styledKey: StyledStringKey.LINE_HEIGHT, + styledValue: this.lineHeightStyle1 + } + ]); + paragraphStyledString2: MutableStyledString = + new MutableStyledString(resource.resourceToString($r('app.string.StyledStringImageAttachment_Text_2')), [ + { + start: 0, + length: 5, + styledKey: StyledStringKey.PARAGRAPH_STYLE, + styledValue: this.leadingMarginValue + }, + { + start: 0, + length: 4, + styledKey: StyledStringKey.LINE_HEIGHT, + styledValue: new LineHeightStyle(new LengthMetrics(60)) + }, + { + start: 0, + length: 7, + styledKey: StyledStringKey.FONT, + styledValue: this.boldTextStyle + }, + { + start: 1, + length: 1, + styledKey: StyledStringKey.FONT, + styledValue: new TextStyle({ fontSize: LengthMetrics.vp(18) }) + }, + { + start: 2, + length: 2, + styledKey: StyledStringKey.FONT, + styledValue: new TextStyle({ fontSize: LengthMetrics.vp(36) }) + }, + { + start: 4, + length: 3, + styledKey: StyledStringKey.FONT, + styledValue: new TextStyle({ fontSize: LengthMetrics.vp(20) }) + }, + { + start: 7, + length: 9, + styledKey: StyledStringKey.FONT, + styledValue: new TextStyle({ fontColor: Color.Grey, fontSize: LengthMetrics.vp(14)}) + } + ]); + + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard({ title: $r('app.string.StyledStringImageAttachment_title') }) { + // [Start styled_string_image_attachment] + Row() { + Column({ space: 10 }) { + Text(undefined, { controller: this.controller }) + .id('text1') + .copyOption(CopyOptions.InApp) + .draggable(true) + .backgroundColor('#FFFFFF') + .borderRadius(5) + + Button($r('app.string.StyledStringImageAttachment_Button_1')) + .enabled(this.abled) + .onClick(() => { + if (this.imagePixelMap !== undefined) { + this.mutableStr = new MutableStyledString(new ImageAttachment({ + value: this.imagePixelMap, + size: { width: 180, height: 160 }, + verticalAlign: ImageSpanAlignment.BASELINE, + objectFit: ImageFit.Fill + })); + this.paragraphStyledString1.appendStyledString(this.paragraphStyledString2); + this.mutableStr.appendStyledString(this.paragraphStyledString1); + this.controller.setStyledString(this.mutableStr); + } + this.abled = false; + }) + } + .width('100%') + } + .height('100%') + .backgroundColor('#F8F8FF') + // [End styled_string_image_attachment] + } + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.StyledStringImageAttachment_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringParagraphStyle.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringParagraphStyle.ets new file mode 100644 index 0000000000..f4fd880165 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringParagraphStyle.ets @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; +import { LengthMetrics } from '@kit.ArkUI'; +import resource from '../../common/resource'; + +@Entry +@Component +export struct StyledStringParagraphStyle { + titleParagraphStyleAttr: ParagraphStyle = new ParagraphStyle({ textAlign: TextAlign.Center }); + //段落首行缩进15vp + paragraphStyleAttr1: ParagraphStyle = new ParagraphStyle({ textIndent: LengthMetrics.vp(15) }); + //行高样式对象 + lineHeightStyle1: LineHeightStyle= new LineHeightStyle(new LengthMetrics(24)); + //创建含段落样式的对象paragraphStyledString1 + paragraphStyledString1: MutableStyledString = + new MutableStyledString(resource.resourceToString($r('app.string.StyledStringParagraphStyle_Text_1')), [ + { + start: 0, + length: 4, + styledKey: StyledStringKey.PARAGRAPH_STYLE, + styledValue: this.titleParagraphStyleAttr + }, + { + start: 0, + length: 4, + styledKey: StyledStringKey.LINE_HEIGHT, + styledValue: new LineHeightStyle(new LengthMetrics(50)) + }, + { + start: 0, + length: 4, + styledKey: StyledStringKey.FONT, + styledValue: new TextStyle({ fontSize: LengthMetrics.vp(24), fontWeight: FontWeight.Bolder }) + }, + { + start: 5, + length: 3, + styledKey: StyledStringKey.PARAGRAPH_STYLE, + styledValue: this.paragraphStyleAttr1 + }, + { + start: 5, + length: 20, + styledKey: StyledStringKey.LINE_HEIGHT, + styledValue: this.lineHeightStyle1 + } + ]); + + //段落不设置缩进配置最大行数及超长显示方式 + paragraphStyleAttr3: ParagraphStyle = new ParagraphStyle({ + textAlign: TextAlign.End, + maxLines: 1, + wordBreak: WordBreak.BREAK_ALL, + overflow: TextOverflow.Ellipsis + }); + + controller: TextController = new TextController(); + + async onPageShow() { + this.controller.setStyledString(this.paragraphStyledString1); + } + + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard({ title: $r('app.string.StyledStringParagraphStyle_title') }) { + // [Start styled_string_paragraph_style] + Column() { + Button($r('app.string.StyledStringParagraphStyle_Button_1')) + .onClick(() => { + this.paragraphStyledString1.replaceStyle({ + start: 5, + length: 3, + styledKey: StyledStringKey.PARAGRAPH_STYLE, + styledValue: this.paragraphStyleAttr3 + }); + this.controller.setStyledString(this.paragraphStyledString1); + }) + Text(undefined, { controller: this.controller }) + } + // [End styled_string_paragraph_style] + } + + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.StyledStringParagraphStyle_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringSceneExample.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringSceneExample.ets new file mode 100644 index 0000000000..60a3431b1b --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringSceneExample.ets @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; +import { LengthMetrics } from '@kit.ArkUI'; +import resource from '../../common/resource'; + +@Entry +@Component +export struct StyledStringSceneExample { + alignCenterParagraphStyleAttr: ParagraphStyle = new ParagraphStyle({ textAlign: TextAlign.Center }); + //行高样式对象 + lineHeightStyle1: LineHeightStyle = new LineHeightStyle(LengthMetrics.vp(24)); + //Bold样式 + boldTextStyle: TextStyle = new TextStyle({ fontWeight: FontWeight.Bold }); + //创建含段落样式的对象paragraphStyledString1 + paragraphStyledString1: MutableStyledString = + new MutableStyledString(resource.resourceToString($r('app.string.StyledStringSceneExample_Text_1')), [ + { + start: 0, + length: 4, + styledKey: StyledStringKey.PARAGRAPH_STYLE, + styledValue: this.alignCenterParagraphStyleAttr + }, + { + start: 0, + length: 4, + styledKey: StyledStringKey.LINE_HEIGHT, + styledValue: new LineHeightStyle(LengthMetrics.vp(40)) + }, + { + start: 11, + length: 14, + styledKey: StyledStringKey.FONT, + styledValue: new TextStyle({ fontSize: LengthMetrics.vp(14), fontColor: Color.Grey }) + }, + { + start: 11, + length: 4, + styledKey: StyledStringKey.PARAGRAPH_STYLE, + styledValue: this.alignCenterParagraphStyleAttr + }, + { + start: 11, + length: 4, + styledKey: StyledStringKey.LINE_HEIGHT, + styledValue: this.lineHeightStyle1 + } + ]); + paragraphStyledString2: MutableStyledString = + new MutableStyledString(resource.resourceToString($r('app.string.StyledStringSceneExample_Text_2')), [ + { + start: 0, + length: 4, + styledKey: StyledStringKey.PARAGRAPH_STYLE, + styledValue: this.alignCenterParagraphStyleAttr + }, + { + start: 0, + length: 4, + styledKey: StyledStringKey.LINE_HEIGHT, + styledValue: new LineHeightStyle(LengthMetrics.vp(60)) + }, + { + start: 0, + length: 6, + styledKey: StyledStringKey.FONT, + styledValue: this.boldTextStyle + }, + { + start: 1, + length: 1, + styledKey: StyledStringKey.FONT, + styledValue: new TextStyle({ fontSize: LengthMetrics.vp(18) }) + }, + { + start: 2, + length: 4, + styledKey: StyledStringKey.FONT, + styledValue: new TextStyle({ fontSize: LengthMetrics.vp(40) }) + }, + { + start: 6, + length: 3, + styledKey: StyledStringKey.FONT, + styledValue: new TextStyle({ fontColor: Color.Grey, fontSize: LengthMetrics.vp(14) }) + }, + { + start: 6, + length: 3, + styledKey: StyledStringKey.DECORATION, + styledValue: new DecorationStyle({ type: TextDecorationType.LineThrough, color: Color.Grey }) + } + ]); + paragraphStyledString3: MutableStyledString = + new MutableStyledString(resource.resourceToString($r('app.string.StyledStringSceneExample_Text_3')), [ + { + start: 0, + length: 4, + styledKey: StyledStringKey.PARAGRAPH_STYLE, + styledValue: this.alignCenterParagraphStyleAttr + }, + { + start: 0, + length: 4, + styledKey: StyledStringKey.LINE_HEIGHT, + styledValue: new LineHeightStyle(LengthMetrics.vp(30)) + }, + { + start: 1, + length: 2, + styledKey: StyledStringKey.FONT, + styledValue: new TextStyle({ fontColor: '#FFD700', fontWeight: FontWeight.Bold }) + }, + { + start: 4, + length: 2, + styledKey: StyledStringKey.FONT, + styledValue: new TextStyle({ fontColor: '#FFD700', fontWeight: FontWeight.Bold }) + } + ]); + controller: TextController = new TextController(); + + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard({ title: $r('app.string.StyledStringSceneExample_title') }) { + // [Start styled_string_scene_example] + Row() { + Column({ space: 5 }) { + Text(undefined, { controller: this.controller }) + .id('text1') + .width(240) + .copyOption(CopyOptions.InApp) + .draggable(true) + .onAppear(() => { + this.paragraphStyledString2.appendStyledString(this.paragraphStyledString3); + this.paragraphStyledString1.appendStyledString(this.paragraphStyledString2); + this.controller.setStyledString(this.paragraphStyledString1); + }) + + Button($r('app.string.StyledStringSceneExample_Button_1')) + .width(200) + .fontColor(Color.White) + .fontSize(18) + .backgroundColor('#3CB371') + .margin({ bottom: 10 }) + } + .borderWidth(1).borderColor('#FFDEAD') + .margin({ left: 10 }) + } + .height('60%') + // [End styled_string_scene_example] + } + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.StyledStringSceneExample_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringStyle.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringStyle.ets new file mode 100644 index 0000000000..683fbda11d --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/StyledStringStyle.ets @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; +import { LengthMetrics, LengthUnit } from '@kit.ArkUI'; +import resource from '../../common/resource'; + +@Entry +@Component +export struct StyledStringStyle { + textStyleAttrs: TextStyle = new TextStyle({ + fontWeight: FontWeight.Bolder, + fontSize: LengthMetrics.vp(24), + fontStyle: FontStyle.Italic + }); + + mutableStyledString1: MutableStyledString = + new MutableStyledString(resource.resourceToString($r('app.string.StyledStringStyle_Text_1')), [ + { + start: 2, + length: 2, + styledKey: StyledStringKey.FONT, + styledValue: this.textStyleAttrs + }, + { + start: 7, + length: 4, + styledKey: StyledStringKey.FONT, + styledValue: new TextStyle({ fontColor: Color.Orange, fontSize: LengthMetrics.vp(12) }) + } + ]); + mutableStyledString2: MutableStyledString = + new MutableStyledString(resource.resourceToString($r('app.string.StyledStringStyle_Text_2')), [ + { + start: 0, + length: 3, + styledKey: StyledStringKey.TEXT_SHADOW, + styledValue: new TextShadowStyle({ + radius: 5, + type: ShadowType.COLOR, + color: Color.Red, + offsetX: 10, + offsetY: 10 + }) + } + ]); + mutableStyledString3: MutableStyledString = + new MutableStyledString(resource.resourceToString($r('app.string.StyledStringStyle_Text_3')), [ + { + start: 0, + length: 3, + styledKey: StyledStringKey.DECORATION, + styledValue: new DecorationStyle({ type: TextDecorationType.LineThrough, color: Color.Red }) + } + ]); + mutableStyledString4: MutableStyledString = + new MutableStyledString(resource.resourceToString($r('app.string.StyledStringStyle_Text_4')), [ + { + start: 0, + length: 3, + styledKey: StyledStringKey.BASELINE_OFFSET, + styledValue: new BaselineOffsetStyle(LengthMetrics.px(20)) + } + ]); + mutableStyledString5: MutableStyledString = + new MutableStyledString(resource.resourceToString($r('app.string.StyledStringStyle_Text_5')), [ + { + start: 8, + length: 3, + styledKey: StyledStringKey.LINE_HEIGHT, + styledValue: new LineHeightStyle(LengthMetrics.vp(50)) + } + ]); + mutableStyledString6: MutableStyledString = + new MutableStyledString(resource.resourceToString($r('app.string.StyledStringStyle_Text_6')), [ + { + start: 0, + length: 2, + styledKey: StyledStringKey.LETTER_SPACING, + styledValue: new LetterSpacingStyle(new LengthMetrics(20, LengthUnit.VP)) + } + ]); + + controller1: TextController = new TextController(); + controller2: TextController = new TextController(); + controller3: TextController = new TextController(); + controller4: TextController = new TextController(); + controller5: TextController = new TextController(); + controller6: TextController = new TextController(); + + async onPageShow() { + this.controller1.setStyledString(this.mutableStyledString1); + this.controller2.setStyledString(this.mutableStyledString2); + this.controller3.setStyledString(this.mutableStyledString3); + this.controller4.setStyledString(this.mutableStyledString4); + this.controller5.setStyledString(this.mutableStyledString5); + this.controller6.setStyledString(this.mutableStyledString6); + } + + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard({ title: $r('app.string.StyledStringStyle_title_1') }) { + // [Start styled_string_text_style] + Text(undefined, { controller: this.controller1 }) + .id('1') + .margin({ top: 10 }) + // [End styled_string_text_style] + } + ComponentCard({ title: $r('app.string.StyledStringStyle_title_2') }) { + // [Start styled_string_text_shadow_style] + Text(undefined, { controller: this.controller2 }).id('2') + // [End styled_string_text_shadow_style] + } + ComponentCard({ title: $r('app.string.StyledStringStyle_title_3') }) { + // [Start styled_string_decoration_style] + Text(undefined, { controller: this.controller3 }).id('3') + // [End styled_string_decoration_style] + } + ComponentCard({ title: $r('app.string.StyledStringStyle_title_4') }) { + // [Start styled_string_baseline_offset_style] + Text(undefined, { controller: this.controller4 }).id('4') + // [End styled_string_baseline_offset_style] + } + ComponentCard({ title: $r('app.string.StyledStringStyle_title_5') }) { + // [Start styled_string_line_height_style] + Text(undefined, { controller: this.controller5 }).id('5') + // [End styled_string_line_height_style] + } + ComponentCard({ title: $r('app.string.StyledStringStyle_title_6') }) { + // [Start styled_string_letter_spacing_style] + Text(undefined, { controller: this.controller6 }).id('6') + // [End styled_string_letter_spacing_style] + } + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.StyledStringStyle_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/index.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/index.ets new file mode 100644 index 0000000000..69a07844fb --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/propertyString/index.ets @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { CompletedRoutableCard } from '../../common/Card'; +import { Route } from '../../common/Route'; +import resource from '../../common/resource'; +import { router } from '@kit.ArkUI'; + +export const PROPERTY_STRING_ROUTE_PREFIX: string = 'propertyString'; + +const routes: Route[] = [ + { + name: `${PROPERTY_STRING_ROUTE_PREFIX}/CreateApply`, + title: resource.resourceToString($r('app.string.Create_Apply_StyledString_MutableStyledString_title')), + description: $r('app.string.Create_Apply_StyledString_MutableStyledString_desc') + }, + { + name: `${PROPERTY_STRING_ROUTE_PREFIX}/StyledStringStyle`, + title: resource.resourceToString($r('app.string.StyledStringStyle_title')), + description: $r('app.string.StyledStringStyle_description') + }, + { + name: `${PROPERTY_STRING_ROUTE_PREFIX}/StyledStringParagraphStyle`, + title: resource.resourceToString($r('app.string.StyledStringParagraphStyle_title')), + description: $r('app.string.StyledStringParagraphStyle_description') + }, + { + name: `${PROPERTY_STRING_ROUTE_PREFIX}/StyledStringImageAttachment`, + title: resource.resourceToString($r('app.string.StyledStringImageAttachment_title')), + description: $r('app.string.StyledStringImageAttachment_description') + }, + { + name: `${PROPERTY_STRING_ROUTE_PREFIX}/StyledStringGestureStyle`, + title: resource.resourceToString($r('app.string.TStyledStringGestureStyle_title')), + description: $r('app.string.StyledStringGestureStyle_description') + }, + { + name: `${PROPERTY_STRING_ROUTE_PREFIX}/StyledStringHtml`, + title: resource.resourceToString($r('app.string.StyledStringHtml_title')), + description: $r('app.string.StyledStringHtml_description') + }, + { + name: `${PROPERTY_STRING_ROUTE_PREFIX}/StyledStringSceneExample`, + title: resource.resourceToString($r('app.string.StyledStringSceneExample_title')), + description: $r('app.string.StyledStringSceneExample_description') + } +]; + +@Builder +export function PropertyStringDestination(name: string) { + if (name === PROPERTY_STRING_ROUTE_PREFIX) { + PropertyStringExample(); + } +} + +@Entry +@Component +struct PropertyStringExample { + goToSample(url: string): void { + router.pushUrl({ + url: url, + }, router.RouterMode.Single, (err) => { + if (err) { + console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`); + return; + } + console.info('pushUrl success'); + }) + } + + build() { + NavDestination() { + List({ space: 12 }) { + ForEach(routes, (route: Route) => { + ListItem() { + CompletedRoutableCard({ title: route.title, description: route.description }) + } + .width('100%') + .onClick(() => { + this.goToSample('pages/' + route.name); + }) + }) + } + .contentStartOffset(56) + .padding({ left: 16, right: 16 }) + } + .backgroundColor('#f1f3f5') + .title('propertyString', { + backgroundBlurStyle: BlurStyle.COMPONENT_THICK, + barStyle: BarStyle.STACK + }) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/AddBuilderDecoratorContent.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/AddBuilderDecoratorContent.ets new file mode 100644 index 0000000000..c14e3958ff --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/AddBuilderDecoratorContent.ets @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; +import resource from '../../common/resource'; + +@Entry +@Component +export struct AddBuilderDecoratorContent { + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + private myBuilder: CustomBuilder = undefined + + @Builder + TextBuilder() { + Row() { + Image($r('app.media.startIcon')).width(50).height(50).margin(16) + Column() { + Text($r('app.string.AddBuilderDecoratorContent_Text_1')).fontWeight(FontWeight.Bold).fontSize(16) + Text($r('app.string.AddBuilderDecoratorContent_Text_2')).fontColor('#8a8a8a').fontSize(12) + }.alignItems(HorizontalAlign.Start) + }.backgroundColor('#f4f4f4') + .borderRadius('20') + .width(220) + } + + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard() { + Column({ space: 3 }) { + RichEditor(this.options) + .onReady(() => { + this.controller.addTextSpan( + resource.resourceToString($r('app.string.AddBuilderDecoratorContent_Text_3')), { + style: { + fontColor: Color.Black, + fontSize: 15 + } + }) + }) + Button($r('app.string.AddBuilderDecoratorContent_Button_1'), { + buttonStyle: ButtonStyleMode.NORMAL + }) + .height(30) + .fontSize(13) + .onClick(() => { + this.myBuilder = () => { + this.TextBuilder() + } + this.controller.addBuilderSpan(this.myBuilder) + }) + } + } + } + .width('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.Add_Builder_DecoratorContent_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/AddEvent.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/AddEvent.ets new file mode 100644 index 0000000000..78d87d697e --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/AddEvent.ets @@ -0,0 +1,385 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; +import { pasteboard } from '@kit.BasicServicesKit'; +import resource from '../../common/resource'; + +@Component +struct event1 { + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + controller1: RichEditorController = new RichEditorController(); + options1: RichEditorOptions = { controller: this.controller1 }; + + build() { + Column() { + ComponentCard({ + title: $r('app.string.Add_Event_title_1'), + description: $r('app.string.Add_Event_title_1_desc') + }) { + RichEditor(this.options) + .onReady(() => { + this.controller.addTextSpan(resource.resourceToString($r('app.string.AddEvent_Text_1')), { + style: { + fontColor: Color.Black, + fontSize: 15 + } + }) + }) + } + } + } +} + +@Component +struct event2 { + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + controller1: RichEditorController = new RichEditorController(); + options1: RichEditorOptions = { controller: this.controller1 }; + + build() { + Column() { + ComponentCard({ + title: $r('app.string.Add_Event_title_2'), + description: $r('app.string.Add_Event_title_2_desc'), + }) { + Column({ space: 3 }) { + RichEditor(this.options) + .onReady(() => { + this.controller.addTextSpan(resource.resourceToString($r('app.string.AddEvent_Text_2')), { + style: { + fontColor: Color.Black, + fontSize: 15 + } + }) + }) + .onSelectionChange((value: RichEditorRange) => { + this.controller1.addTextSpan('\n' + resource.resourceToString($r('app.string.AddEvent_Text_3')) + + value.start + ',' + value.end + ')', { + style: { + fontColor: Color.Gray, + fontSize: 10 + } + }) + }) + .width(300) + .height(50) + Text(resource.resourceToString($r('app.string.AddEvent_Text_4'))).fontSize(10).fontColor(Color.Gray).width(300) + RichEditor(this.options1) + .width(300) + .height(70) + } + } + } + } +} + +@Component +struct event3 { + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + controller1: RichEditorController = new RichEditorController(); + options1: RichEditorOptions = { controller: this.controller1 }; + + build() { + Column() { + ComponentCard({ + title: $r('app.string.Add_Event_title_3'), + description: $r('app.string.Add_Event_title_3_desc') + }) { + Column({ space: 3 }) { + RichEditor(this.options) + .onReady(() => { + this.controller.addTextSpan(resource.resourceToString($r('app.string.AddEvent_Text_5')), { + style: { + fontColor: Color.Black, + fontSize: 15 + } + }) + }) + .onWillChange((value: RichEditorChangeValue) => { + this.controller1.addTextSpan(resource.resourceToString($r('app.string.AddEvent_Text_6')) + + JSON.stringify(value), { + style: { + fontColor: Color.Gray, + fontSize: 10 + } + }) + return true; + }) + .onDidChange((rangeBefore: TextRange, rangeAfter: TextRange) => { + this.controller1.addTextSpan(resource.resourceToString($r('app.string.AddEvent_Text_7')) + + JSON.stringify(rangeBefore) + '\nrangeAfter:' + JSON.stringify(rangeBefore), { + style: { + fontColor: Color.Gray, + fontSize: 10 + } + }) + }) + .width(300) + .height(50) + Text(resource.resourceToString($r('app.string.AddEvent_Text_4'))).fontSize(10).fontColor(Color.Gray).width(300) + RichEditor(this.options1) + .width(300) + .height(70) + } + } + } + } +} + +@Component +struct event4 { + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + controller1: RichEditorController = new RichEditorController(); + options1: RichEditorOptions = { controller: this.controller1 }; + + build() { + Column() { + ComponentCard({ + title: $r('app.string.Add_Event_title_4'), + description: $r('app.string.Add_Event_title_4_desc'), + }) { + Column({ space: 3 }) { + RichEditor(this.options) + .onReady(() => { + this.controller.addTextSpan(resource.resourceToString($r('app.string.AddEvent_Text_8')), { + style: { + fontColor: Color.Black, + fontSize: 15 + } + }) + }) + .aboutToIMEInput((value: RichEditorInsertValue) => { + this.controller1.addTextSpan(resource.resourceToString($r('app.string.AddEvent_Text_9')) + + JSON.stringify(value), { + style: { + fontColor: Color.Gray, + fontSize: 10 + } + }) + return true; + }) + .onDidIMEInput((value: TextRange) => { + this.controller1.addTextSpan(resource.resourceToString($r('app.string.AddEvent_Text_10')) + + JSON.stringify(value), { + style: { + fontColor: Color.Gray, + fontSize: 10 + } + }) + }) + .width(300) + .height(50) + Text(resource.resourceToString($r('app.string.AddEvent_Text_4'))).fontSize(10).fontColor(Color.Gray).width(300) + RichEditor(this.options1) + .width(300) + .height(70) + } + } + } + } +} + +@Component +struct event5 { + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + controller1: RichEditorController = new RichEditorController(); + options1: RichEditorOptions = { controller: this.controller1 }; + + PopDataFromPasteboard() { + let selection = this.controller.getSelection(); + let start = selection.selection[0]; + let end = selection.selection[1]; + if (start == end) { + start = this.controller.getCaretOffset(); + end = this.controller.getCaretOffset(); + } + let moveOffset = 0; + let sysBoard = pasteboard.getSystemPasteboard(); + sysBoard.getData((err, data) => { + if (err) { + return; + } + if (start != end) { + this.controller.deleteSpans({ start: start, end: end }) + } + let count = data.getRecordCount(); + for (let i = 0; i < count; i++) { + const element = data.getRecord(i); + if (element && element.plainText && element.mimeType === pasteboard.MIMETYPE_TEXT_PLAIN) { + this.controller.addTextSpan(element.plainText, + { + style: { fontSize: 26, fontColor: Color.Red }, + offset: start + moveOffset + } + ) + moveOffset += element.plainText.length; + } + } + this.controller.setCaretOffset(start + moveOffset) + }) + } + + build() { + Column() { + ComponentCard({ + title: $r('app.string.Add_Event_title_5'), + description: $r('app.string.Add_Event_title_5_desc') + }) { + Column({ space: 3 }) { + RichEditor(this.options) + .onReady(() => { + this.controller.addTextSpan(resource.resourceToString($r('app.string.AddEvent_Text_11')), + { style: { fontColor: Color.Black, fontSize: 15 } }) + }) + .onPaste((event) => { + this.controller1.addTextSpan(resource.resourceToString($r('app.string.AddEvent_Text_12')), + { style: { fontColor: Color.Gray, fontSize: 10 } }) + if (event != undefined && event.preventDefault) { + event.preventDefault(); + } + console.info('RichEditor onPaste') + this.PopDataFromPasteboard() + }) + .width(300) + .height(50) + Text(resource.resourceToString($r('app.string.AddEvent_Text_4'))).fontSize(10).fontColor(Color.Gray).width(300) + RichEditor(this.options1) + .width(300) + .height(70) + }.width('100%').alignItems(HorizontalAlign.Start) + } + } + } +} + +@Component +struct event6 { + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + controller1: RichEditorController = new RichEditorController(); + options1: RichEditorOptions = { controller: this.controller1 }; + + build() { + Column() { + ComponentCard({ + title: $r('app.string.Add_Event_title_6'), + description: $r('app.string.Add_Event_title_6_desc') + }) { + Column({ space: 3 }) { + RichEditor(this.options) + .onReady(() => { + this.controller.addTextSpan(resource.resourceToString($r('app.string.AddEvent_Text_13')), { + style: { + fontColor: Color.Black, + fontSize: 15 + } + }) + }) + .onCut(() => { + this.controller1.addTextSpan(resource.resourceToString($r('app.string.AddEvent_Text_14')), { + style: { + fontColor: Color.Gray, + fontSize: 10 + } + }) + }) + .width(300) + .height(50) + Text(resource.resourceToString($r('app.string.AddEvent_Text_4'))).fontSize(10).fontColor(Color.Gray).width(300) + RichEditor(this.options1) + .width(300) + .height(70) + } + } + } + } +} + +@Component +struct event7 { + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + controller1: RichEditorController = new RichEditorController(); + options1: RichEditorOptions = { controller: this.controller1 }; + + build() { + Column() { + ComponentCard({ + title: $r('app.string.Add_Event_title_7'), + description: $r('app.string.Add_Event_title_7') + }) { + Column({ space: 3 }) { + RichEditor(this.options) + .onReady(() => { + this.controller.addTextSpan(resource.resourceToString($r('app.string.AddEvent_Text_15')), { + style: { + fontColor: Color.Black, + fontSize: 15 + } + }) + }) + .onCopy(() => { + this.controller1.addTextSpan(resource.resourceToString($r('app.string.AddEvent_Text_16')), { + style: { + fontColor: Color.Gray, + fontSize: 10 + } + }) + }) + .width(300) + .height(50) + Text(resource.resourceToString($r('app.string.AddEvent_Text_4'))).fontSize(10).fontColor(Color.Gray).width(300) + RichEditor(this.options1) + .width(300) + .height(70) + } + } + } + } +} + +@Entry +@Component +export struct AddEvent { + scroller: Scroller = new Scroller(); + + build() { + NavDestination() { + Scroll(this.scroller) { + Column({ space: 12 }) { + event1(); + event2(); + event3(); + event4(); + event5(); + event6(); + event7(); + // tmp(); + + } + .width('100%') + .padding({ left: 12, right: 12 }) + }.id('scroll_') + } + .backgroundColor('#f1f2f3') + .title($r('app.string.Add_Event_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/AddImageContent.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/AddImageContent.ets new file mode 100644 index 0000000000..125a03d960 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/AddImageContent.ets @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; +import resource from '../../common/resource'; + +@Entry +@Component +export struct AddImageContent { + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard() { + RichEditor(this.options) + .onReady(() => { + this.controller.addTextSpan(resource.resourceToString($r('app.string.AddImageContent_Text_1')), { + style: { + fontColor: Color.Black, + fontSize: 15 + } + }) + }) + .width(300) + .height(100) + Button($r('app.string.AddImageContent_Button_1'), { + buttonStyle: ButtonStyleMode.NORMAL + }) + .height(30) + .fontSize(13) + .onClick(() => { + this.controller.addImageSpan($r('app.media.startIcon'), { + imageStyle: { + size: ['57px', '57px'] + } + }) + }) + } + } + .width('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.Add_ImageContent_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/AddSymbolSpanContent.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/AddSymbolSpanContent.ets new file mode 100644 index 0000000000..e86404b644 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/AddSymbolSpanContent.ets @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; +import resource from '../../common/resource'; + +@Entry +@Component +export struct AddSymbolSpanContent { + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard() { + RichEditor(this.options) + .onReady(() => { + this.controller.addTextSpan(resource.resourceToString($r('app.string.AddSymbolSpanContent_Text_1')), { + style: { + fontColor: Color.Black, + fontSize: 15 + } + }) + }) + .width(300) + .height(100) + Button($r('app.string.AddSymbolSpanContent_Button_1'), { + buttonStyle: ButtonStyleMode.NORMAL + }) + .height(30) + .fontSize(13) + .onClick(() => { + this.controller.addSymbolSpan($r('sys.symbol.basketball_fill'), { + style: { + fontSize: 30 + } + }) + }) + } + } + .width('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.Add_SymbolSpanContent_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/AddTextContent.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/AddTextContent.ets new file mode 100644 index 0000000000..9e8c0663c0 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/AddTextContent.ets @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; +import resource from '../../common/resource'; + +@Entry +@Component +export struct AddTextContent { + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard() { + RichEditor(this.options) + .onReady(() => { + this.controller.addTextSpan(resource.resourceToString($r('app.string.AddTextContent_Text_1')), { + style: { + fontColor: Color.Black, + fontSize: 15 + } + }) + }) + .border({ width: 1, color: Color.Gray }) + .constraintSize({ + maxHeight: 100 + }) + .width(300) + .margin(10) + Button($r('app.string.AddTextContent_Button_1'), { + buttonStyle: ButtonStyleMode.NORMAL + }) + .height(30) + .fontSize(13) + .onClick(() => { + this.controller.addTextSpan(resource.resourceToString($r('app.string.AddTextContent_Text_2'))) + }) + } + } + .width('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.Add_TextContent_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/BackplaneHighlighting.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/BackplaneHighlighting.ets new file mode 100644 index 0000000000..56b4e3e79b --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/BackplaneHighlighting.ets @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; +import resource from '../../common/resource'; + +@Entry +@Component +export struct BackplaneHighlighting { + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard() { + RichEditor(this.options) + .onReady(() => { + this.controller.addTextSpan(resource.resourceToString($r('app.string.BackplaneHighlighting_Text_1')), { + style: { + fontColor: Color.Black, + fontSize: 15 + } + }) + }) + .width(300) + .height(60) + Button($r('app.string.BackplaneHighlighting_Button_1'), { + buttonStyle: ButtonStyleMode.NORMAL + }) + .height(30) + .fontSize(13) + .onClick(() => { + this.controller.setSelection(0, 2) + }) + } + } + .width('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.Backplane_Highlighting_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/CreateRichEditor.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/CreateRichEditor.ets new file mode 100644 index 0000000000..ba5d5cace3 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/CreateRichEditor.ets @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; +import resource from '../../common/resource'; + +@Entry +@Component +export struct CreateRichEditor { + controllerNoStyledString: RichEditorController = new RichEditorController(); + optionsNoStyledString: RichEditorOptions = { controller: this.controllerNoStyledString }; + fontStyle: TextStyle = new TextStyle({ + fontColor: Color.Pink + }); + // 定义字体样式对象 + + mutableStyledString: MutableStyledString = + new MutableStyledString(resource.resourceToString($r('app.string.CreateRichEditor_Text_1')), + [{ + start: 0, + length: 5, + styledKey: StyledStringKey.FONT, + styledValue: this.fontStyle + }]); + // 创建属性字符串 + + controller: RichEditorStyledStringController = new RichEditorStyledStringController(); + options: RichEditorStyledStringOptions = { controller: this.controller }; + + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard({ + title: $r('app.string.Create_RichEditor_Component_title_1') + }) { + RichEditor(this.options) + .onReady(() => { + this.controller.setStyledString(this.mutableStyledString); + }) + } + + ComponentCard({ + title: $r('app.string.Create_RichEditor_Component_title_2'), + }) { + RichEditor(this.optionsNoStyledString) + .onReady(() => { + this.controllerNoStyledString.addTextSpan( + resource.resourceToString($r('app.string.CreateRichEditor_Text_2')), { + style: { + fontColor: Color.Black, + fontSize: 15 + } + }) + }) + } + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.Create_RichEditor_Component_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/GetGraphicInfoInComponent.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/GetGraphicInfoInComponent.ets new file mode 100644 index 0000000000..e7068bb172 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/GetGraphicInfoInComponent.ets @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; +import resource from '../../common/resource'; + +@Entry +@Component +export struct GetGraphicInfoInComponent { + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + controller1: RichEditorController = new RichEditorController(); + options1: RichEditorOptions = { controller: this.controller1 } + + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard() { + Column({ space: 3 }) { + // 创建两个富文本组件 + RichEditor(this.options) + .onReady(() => { + this.controller.addTextSpan( + resource.resourceToString($r('app.string.GetGraphicInfoInComponent_Text_1')), { + style: { + fontColor: Color.Black, + fontSize: 15 + } + }) + }) + .width(300) + .height(50) + Text($r('app.string.GetGraphicInfoInComponent_Text_1')).fontSize(10).fontColor(Color.Gray).width(300) + RichEditor(this.options1) + .width(300) + .height(50) + Button($r('app.string.GetGraphicInfoInComponent_Button_1'), { + buttonStyle: ButtonStyleMode.NORMAL + }) + .height(30) + .fontSize(13) + .onClick(() => { + this.controller1.addTextSpan(JSON.stringify(this.controller.getSpans()), { + style: { + fontColor: Color.Gray, + fontSize: 10 + } + }) + }) + } + } + } + .width('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.Get_GraphicInfo_In_Component_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/SetAttributes.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/SetAttributes.ets new file mode 100644 index 0000000000..0a6fd09c61 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/SetAttributes.ets @@ -0,0 +1,288 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; +import resource from '../../common/resource'; + +// 自定义SelectionMenuTheme接口 +export interface SelectionMenuTheme { + imageSize: number; + buttonSize: number; + menuSpacing: number; + editorOptionMargin: number; + expandedOptionPadding: number; + defaultMenuWidth: number; + imageFillColor: Resource; + backGroundColor: Resource; + iconBorderRadius: Resource; + containerBorderRadius: Resource; + cutIcon: Resource; + copyIcon: Resource; + pasteIcon: Resource; + selectAllIcon: Resource; + shareIcon: Resource; + translateIcon: Resource; + searchIcon: Resource; + arrowDownIcon: Resource; + iconPanelShadowStyle: ShadowStyle; + iconFocusBorderColor: Resource; +} + +// 定义defaultTheme变量 +export const defaultTheme: SelectionMenuTheme = { + imageSize: 24, + buttonSize: 48, + menuSpacing: 8, + editorOptionMargin: 1, + expandedOptionPadding: 3, + defaultMenuWidth: 256, + imageFillColor: $r('sys.color.ohos_id_color_primary'), + backGroundColor: $r('sys.color.ohos_id_color_dialog_bg'), + iconBorderRadius: $r('sys.float.ohos_id_corner_radius_default_m'), + containerBorderRadius: $r('sys.float.ohos_id_corner_radius_card'), + cutIcon: $r('sys.media.ohos_ic_public_cut'), + copyIcon: $r('sys.media.ohos_ic_public_copy'), + pasteIcon: $r('sys.media.ohos_ic_public_paste'), + selectAllIcon: $r('sys.media.ohos_ic_public_select_all'), + shareIcon: $r('sys.media.ohos_ic_public_share'), + translateIcon: $r('sys.media.ohos_ic_public_translate_c2e'), + searchIcon: $r('sys.media.ohos_ic_public_search_filled'), + arrowDownIcon: $r('sys.media.ohos_ic_public_arrow_down'), + iconPanelShadowStyle: ShadowStyle.OUTER_DEFAULT_MD, + iconFocusBorderColor: $r('sys.color.ohos_id_color_focused_outline'), +} + +@Component +struct attr1 { + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + sliderShow: boolean = false; + private theme: SelectionMenuTheme = defaultTheme; + + @Builder + SystemMenu() { + Column() { + Menu() { + if (this.controller) { + MenuItemGroup() { + MenuItem({ + startIcon: this.theme.cutIcon, + content: resource.resourceToString($r('app.string.SetAttributes_Text_1')), + labelInfo: 'Ctrl+X' + }) + MenuItem({ + startIcon: this.theme.copyIcon, + content: resource.resourceToString($r('app.string.SetAttributes_Text_2')), + labelInfo: 'Ctrl+C' + }) + MenuItem({ + startIcon: this.theme.pasteIcon, + content: resource.resourceToString($r('app.string.SetAttributes_Text_3')), + labelInfo: 'Ctrl+V' + }) + } + } + } + .radius(this.theme.containerBorderRadius) + .clip(true) + .backgroundColor(Color.White) + .width(this.theme.defaultMenuWidth) + } + .width(this.theme.defaultMenuWidth) + } + + build() { + Column() { + ComponentCard({ + title: $r('app.string.Set_Attributes_title_1'), + description: $r('app.string.Set_Attributes_title_1_desc'), + }) { + RichEditor(this.options) + .onReady(() => { + this.controller.addTextSpan(resource.resourceToString($r('app.string.SetAttributes_Text_4')), { + style: { + fontColor: Color.Black, + fontSize: 18 + } + }) + }) + .bindSelectionMenu(RichEditorSpanType.TEXT, this.SystemMenu, ResponseType.LongPress, { + onDisappear: () => { + this.sliderShow = false + } + }) + // 绑定自定义菜单 + .width(300) + .height(300) + } + } + } +} + +@Component +struct attr2 { + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + + build() { + Column() { + ComponentCard({ + title: $r('app.string.Set_Attributes_title_2'), + description: $r('app.string.Set_Attributes_title_2_desc') + }) { + RichEditor(this.options) + .onReady(() => { + this.controller.addTextSpan(resource.resourceToString($r('app.string.SetAttributes_Text_5')), { + style: { + fontColor: Color.Black, + fontSize: 15 + } + }) + }) + .caretColor(Color.Orange) + .width(300) + .height(300) + } + } + } +} + +@Component +struct attr3 { + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + + build() { + Column() { + ComponentCard({ + title: $r('app.string.Set_Attributes_title_3'), + description: $r('app.string.Set_Attributes_title_3_desc') + }) { + RichEditor(this.options) + .placeholder(resource.resourceToString($r('app.string.SetAttributes_Text_6')), { + fontColor: Color.Gray, + font: { + size: 15, + weight: FontWeight.Normal, + family: 'HarmonyOS Sans', + style: FontStyle.Normal + } + }) + .width(300) + .height(50) + } + } + } +} + +@Component +struct attr4 { + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + + build() { + Column() { + ComponentCard({ + title: $r('app.string.Set_Attributes_title_4'), + description: $r('app.string.Set_Attributes_title_4_desc') + }) { + RichEditor(this.options) + .onReady(() => { + this.controller.addTextSpan(resource.resourceToString($r('app.string.SetAttributes_Text_7')), + { + style: { + fontColor: Color.Black, + fontSize: 15 + } + }) + }) + .maxLines(2) + } + } + } +} + +@Component +struct attr5 { + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + + build() { + Column() { + ComponentCard({ + title: $r('app.string.Set_Attributes_title_5'), + description: $r('app.string.Set_Attributes_title_5_desc') + }) { + RichEditor(this.options) + .placeholder(resource.resourceToString($r('app.string.SetAttributes_Text_8'))) + .onReady(() => { + }) + .maxLength(7) + } + } + } +} + +@Component +struct attr6 { + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + + build() { + Column() { + ComponentCard({ + title: $r('app.string.Set_Attributes_title_6'), + description: $r('app.string.Set_Attributes_title_6_desc') + }) { + RichEditor(this.options) + .onReady(() => { + this.controller.addTextSpan(resource.resourceToString($r('app.string.SetAttributes_Text_9')), { + style: { + fontColor: Color.Black, + fontSize: 15 + } + }) + }) + } + } + } +} + +@Entry +@Component +export struct SetAttributes { + scroller: Scroller = new Scroller(); + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + + build() { + NavDestination() { + Scroll(this.scroller) { + Column({ space: 12 }) { + attr1(); + attr2(); + attr3(); + attr4(); + attr5(); + attr6(); + } + .width('100%') + .padding({ left: 12, right: 12 }) + }.id('scroll_') + } + .backgroundColor('#f1f2f3') + .title($r('app.string.Set_Attributes_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/SetUserPresetTextStyles.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/SetUserPresetTextStyles.ets new file mode 100644 index 0000000000..46fea9e75b --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/SetUserPresetTextStyles.ets @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; +import resource from '../../common/resource'; + +@Entry +@Component +export struct SetUserPresetTextStyles { + controller: RichEditorController = new RichEditorController(); + options: RichEditorOptions = { controller: this.controller }; + + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard() { + RichEditor(this.options) + .onReady(() => { + this.controller.addTextSpan(resource.resourceToString($r('app.string.SetUserPresetTextStyles_Text_1')), { + style: { + fontColor: Color.Black, + fontSize: 15 + } + }) + }) + .width(300) + .height(60) + Button($r('app.string.SetUserPresetTextStyles_Button_1'), { + buttonStyle: ButtonStyleMode.NORMAL + }) + .height(30) + .fontSize(13) + .onClick(() => { + this.controller.setTypingStyle({ + fontWeight: 'medium', + fontColor: Color.Pink, + fontSize: 15, + fontStyle: FontStyle.Italic, + decoration: { + type: TextDecorationType.Underline, + color: Color.Gray + } + }) + }) + } + } + .width('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.Set_User_PresetText_Styles_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/index.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/index.ets new file mode 100644 index 0000000000..9ebb6185c7 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/richEditor/index.ets @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { CompletedRoutableCard } from '../../common/Card'; +import { Route } from '../../common/Route'; +import resource from '../../common/resource'; +import { CreateRichEditor } from './CreateRichEditor'; +import { SetAttributes } from './SetAttributes'; +import { AddEvent } from './AddEvent'; +import { SetUserPresetTextStyles } from './SetUserPresetTextStyles'; +import { BackplaneHighlighting } from './BackplaneHighlighting'; +import { AddTextContent } from './AddTextContent'; +import { AddImageContent } from './AddImageContent'; +import { AddBuilderDecoratorContent } from './AddBuilderDecoratorContent'; +import { AddSymbolSpanContent } from './AddSymbolSpanContent'; +import { GetGraphicInfoInComponent } from './GetGraphicInfoInComponent'; + +export const RICH_EDITOR_ROUTE_PREFIX: string = 'RichEditor'; + +const routes: Route[] = [ + { + name: `${RICH_EDITOR_ROUTE_PREFIX}/CreateRichEditor`, + title: resource.resourceToString($r('app.string.Create_RichEditor_Component_title')), + description: $r('app.string.Create_RichEditor_Component_description') + }, + { + name: `${RICH_EDITOR_ROUTE_PREFIX}/SetAttributes`, + title: resource.resourceToString($r('app.string.Set_Attributes_title')), + }, + { + name: `${RICH_EDITOR_ROUTE_PREFIX}/AddEvent`, + title: resource.resourceToString($r('app.string.Add_Event_title')), + }, + { + name: `${RICH_EDITOR_ROUTE_PREFIX}/SetUserPresetTextStyles`, + title: resource.resourceToString($r('app.string.Set_User_PresetText_Styles_title')), + description: $r('app.string.Set_User_PresetText_Styles_desc') + }, + { + name: `${RICH_EDITOR_ROUTE_PREFIX}/BackplaneHighlighting`, + title: resource.resourceToString($r('app.string.Backplane_Highlighting_title')), + description: $r('app.string.Backplane_Highlighting_desc') + }, + { + name: `${RICH_EDITOR_ROUTE_PREFIX}/AddTextContent`, + title: resource.resourceToString($r('app.string.Add_TextContent_title')), + description: $r('app.string.Add_TextContent_desc') + }, + { + name: `${RICH_EDITOR_ROUTE_PREFIX}/AddImageContent`, + title: resource.resourceToString($r('app.string.Add_ImageContent_title')), + description: $r('app.string.Add_ImageContent_desc') + }, + { + name: `${RICH_EDITOR_ROUTE_PREFIX}/AddBuilderDecoratorContent`, + title: resource.resourceToString($r('app.string.Add_Builder_DecoratorContent_title')), + description: $r('app.string.Add_Builder_DecoratorContent_desc') + }, + { + name: `${RICH_EDITOR_ROUTE_PREFIX}/AddSymbolSpanContent`, + title: resource.resourceToString($r('app.string.Add_SymbolSpanContent_title')), + description: $r('app.string.Add_SymbolSpanContent_desc') + }, + { + name: `${RICH_EDITOR_ROUTE_PREFIX}/GetGraphicInfoInComponent`, + title: resource.resourceToString($r('app.string.Get_GraphicInfo_In_Component_title')), + description: $r('app.string.Get_GraphicInfo_In_Component_desc') + } +]; + +@Builder +export function RichEditorDestination(name: string) { + if (name === RICH_EDITOR_ROUTE_PREFIX) { + RichEditorExample(); + } else if (name === routes[0].name) { + CreateRichEditor(); + } else if (name === routes[1].name) { + SetAttributes(); + } else if (name === routes[2].name) { + AddEvent(); + } else if (name === routes[3].name) { + SetUserPresetTextStyles(); + } else if (name === routes[4].name) { + BackplaneHighlighting(); + } else if (name === routes[5].name) { + AddTextContent(); + } else if (name === routes[6].name) { + AddImageContent(); + } else if (name === routes[7].name) { + AddBuilderDecoratorContent(); + } else if (name === routes[8].name) { + AddSymbolSpanContent(); + } else if (name === routes[9].name) { + GetGraphicInfoInComponent(); + } +} + +@Entry +@Component +struct RichEditorExample { + @Consume pathStack: NavPathStack; + + build() { + NavDestination() { + Scroll() { + List({ space: 12 }) { + ForEach(routes, (route: Route) => { + ListItem() { + CompletedRoutableCard({ title: route.title, description: route.description }) + } + .width('100%') + .onClick(() => { + this.pathStack.pushPath({ name: route.name }); + }) + }) + } + .contentStartOffset(56) + .padding({ left: 16, right: 16 }) + }.id('scroll_') + } + .backgroundColor('#f1f3f5') + .title('RichEditor', { + backgroundBlurStyle: BlurStyle.COMPONENT_THICK, + barStyle: BarStyle.STACK + }) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/CreatSymbolGlyph.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/CreatSymbolGlyph.ets new file mode 100644 index 0000000000..f8ebd2ab28 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/CreatSymbolGlyph.ets @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; + +@Entry +@Component +export struct CreatSymbolGlyph { + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard({ title: $r('app.string.CreatSymbolGlyph_title') }) { + // [Start creat_symbol_glyph] + SymbolGlyph($r('sys.symbol.ohos_folder_badge_plus')) + .fontSize(96) + .renderingStrategy(SymbolRenderingStrategy.SINGLE) + .fontColor([Color.Black, Color.Green, Color.White]) + // [End creat_symbol_glyph] + } + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.CreatSymbolGlyph_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/SymbolAddEvent.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/SymbolAddEvent.ets new file mode 100644 index 0000000000..87d8cdc917 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/SymbolAddEvent.ets @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; + +@Entry +@Component +export struct SymbolGlyphSpanAddEvent { + @State wifiColor: ResourceColor = Color.Black; + + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard({ title: $r('app.string.SymbolGlyphSpanAddEvent_title') }) { + // [Start symbol_glyph_span_add_event] + SymbolGlyph($r('sys.symbol.ohos_wifi')) + .id('symbolGlyph1') + .fontSize(96) + .fontColor([this.wifiColor]) + .onClick(() => { + this.wifiColor = Color.Gray; + }) + // [End symbol_glyph_span_add_event] + } + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.SymbolGlyphSpanAddEvent_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/SymbolAddToText.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/SymbolAddToText.ets new file mode 100644 index 0000000000..8faacdae9e --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/SymbolAddToText.ets @@ -0,0 +1,221 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; + +@Entry +@Component +export struct SymbolGlyphSpanAddToText { + scroller: Scroller = new Scroller(); + + build() { + NavDestination() { + Scroll(this.scroller) { + Column({ space: 12 }) { + ComponentCard({ title: $r('app.string.SymbolGlyphSpanAddToText_title_1') }) { + // [Start creat_symbol_span] + Text() { + SymbolSpan($r('sys.symbol.ohos_trash')) + .fontWeight(FontWeight.Normal) + .fontSize(96) + }.id('1') + + // [End creat_symbol_span] + } + + ComponentCard({ title: $r('app.string.SymbolGlyphSpanAddToText_title_2') }) { + // [Start symbol_span_font_size] + Row() { + Column() { + Text('48') + Text() { + SymbolSpan($r('sys.symbol.ohos_folder_badge_plus')) + .fontSize(48) + .renderingStrategy(SymbolRenderingStrategy.SINGLE) + .fontColor([Color.Black, Color.Green, Color.White]) + }.id('2') + } + + Column() { + Text('72') + Text() { + SymbolSpan($r('sys.symbol.ohos_folder_badge_plus')) + .fontSize(72) + .renderingStrategy(SymbolRenderingStrategy.SINGLE) + .fontColor([Color.Black, Color.Green, Color.White]) + }.id('3') + } + + Column() { + Text('96') + Text() { + SymbolSpan($r('sys.symbol.ohos_folder_badge_plus')) + .fontSize(96) + .renderingStrategy(SymbolRenderingStrategy.SINGLE) + .fontColor([Color.Black, Color.Green, Color.White]) + }.id('4') + } + } + + // [End symbol_span_font_size] + } + + ComponentCard({ title: $r('app.string.SymbolGlyphSpanAddToText_title_3') }) { + // [Start symbol_span_font_weight] + Row() { + Column() { + Text('Light') + Text() { + SymbolSpan($r('sys.symbol.ohos_trash')) + .fontWeight(FontWeight.Lighter) + .fontSize(96) + }.id('5') + } + + Column() { + Text('Normal') + Text() { + SymbolSpan($r('sys.symbol.ohos_trash')) + .fontWeight(FontWeight.Normal) + .fontSize(96) + }.id('6') + } + + Column() { + Text('Bold') + Text() { + SymbolSpan($r('sys.symbol.ohos_trash')) + .fontWeight(FontWeight.Bold) + .fontSize(96) + }.id('7') + } + } + + // [End symbol_span_font_weight] + } + + ComponentCard({ title: $r('app.string.SymbolGlyphSpanAddToText_title_4') }) { + // [Start symbol_span_font_color] + Row() { + Column() { + Text('Black') + Text() { + SymbolSpan($r('sys.symbol.ohos_folder_badge_plus')) + .fontSize(96) + .fontColor([Color.Black]) + }.id('8') + } + + Column() { + Text('Green') + Text() { + SymbolSpan($r('sys.symbol.ohos_folder_badge_plus')) + .fontSize(96) + .fontColor([Color.Green]) + }.id('9') + } + + Column() { + Text('Pink') + Text() { + SymbolSpan($r('sys.symbol.ohos_folder_badge_plus')) + .fontSize(96) + .fontColor([Color.Pink]) + }.id('10') + } + } + + // [End symbol_span_font_color] + } + + ComponentCard({ title: $r('app.string.SymbolGlyphSpanAddToText_title_5') }) { + // [Start symbol_span_rendering_strategy] + Row() { + Column() { + Text($r('app.string.SymbolAddToText_Text_1')) + Text() { + SymbolSpan($r('sys.symbol.ohos_folder_badge_plus')) + .fontSize(96) + .renderingStrategy(SymbolRenderingStrategy.SINGLE) + .fontColor([Color.Black, Color.Green, Color.White]) + }.id('11') + } + + Column() { + Text($r('app.string.SymbolAddToText_Text_2')) + Text() { + SymbolSpan($r('sys.symbol.ohos_folder_badge_plus')) + .fontSize(96) + .renderingStrategy(SymbolRenderingStrategy.MULTIPLE_COLOR) + .fontColor([Color.Black, Color.Green, Color.White]) + }.id('12') + } + + Column() { + Text($r('app.string.SymbolAddToText_Text_3')) + Text() { + SymbolSpan($r('sys.symbol.ohos_folder_badge_plus')) + .fontSize(96) + .renderingStrategy(SymbolRenderingStrategy.MULTIPLE_OPACITY) + .fontColor([Color.Black, Color.Green, Color.White]) + }.id('13') + } + } + + // [End symbol_span_rendering_strategy] + } + + ComponentCard({ title: $r('app.string.SymbolGlyphSpanAddToText_title_6') }) { + // [Start symbol_span_effect_strategy] + Row() { + Column() { + Text($r('app.string.SymbolAddToText_Text_4')) + Text() { + SymbolSpan($r('sys.symbol.ohos_wifi')) + .fontSize(96) + .effectStrategy(SymbolEffectStrategy.NONE) + }.id('14') + } + + Column() { + Text($r('app.string.SymbolAddToText_Text_5')) + Text() { + SymbolSpan($r('sys.symbol.ohos_wifi')) + .fontSize(96) + .effectStrategy(SymbolEffectStrategy.SCALE) + }.id('15') + } + + Column() { + Text($r('app.string.SymbolAddToText_Text_6')) + Text() { + SymbolSpan($r('sys.symbol.ohos_wifi')) + .fontSize(96) + .effectStrategy(SymbolEffectStrategy.HIERARCHICAL) + }.id('16') + } + } + + // [End symbol_span_effect_strategy] + } + } + .width('100%') + .padding({ left: 12, right: 12 }) + }.id('scroll_') + } + .backgroundColor('#f1f2f3') + .title($r('app.string.SymbolGlyphSpanAddToText_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/SymbolCustomIconAnimation.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/SymbolCustomIconAnimation.ets new file mode 100644 index 0000000000..e74e5bda67 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/SymbolCustomIconAnimation.ets @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; + +@Entry +@Component +export struct SymbolGlyphSpanCustomIconAnimation { + @State isActive: boolean = true; + @State triggerValueReplace: number = 0; + + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard({ title: $r('app.string.SymbolGlyphSpanCustomIconAnimation_title_1') }) { + // [Start symbol_effect_1] + Column() { + Text($r('app.string.SymbolCustomIconAnimation_Text_1')) + SymbolGlyph($r('sys.symbol.ohos_wifi')) + .id('1') + .fontSize(96) + .symbolEffect(new HierarchicalSymbolEffect(EffectFillStyle.ITERATIVE), this.isActive) + Button(this.isActive ? $r('app.string.SymbolGlyphSpanCustomIconAnimation_Button_1') : $r('app.string.SymbolGlyphSpanCustomIconAnimation_Button_2')).onClick(() => { + this.isActive = !this.isActive; + }) + } + // [End symbol_effect_1] + } + ComponentCard({ title: $r('app.string.SymbolGlyphSpanCustomIconAnimation_title_2') }) { + // [Start symbol_effect_2] + Column() { + Text($r('app.string.SymbolCustomIconAnimation_Text_2')) + SymbolGlyph($r('sys.symbol.ellipsis_message_1')) + .id('2') + .fontSize(96) + .fontColor([Color.Gray]) + .symbolEffect(new BounceSymbolEffect(EffectScope.WHOLE, EffectDirection.UP), this.triggerValueReplace) + Button($r('app.string.SymbolGlyphSpanCustomIconAnimation_Button_3')).onClick(() => { + this.triggerValueReplace = this.triggerValueReplace + 1; + }) + } + // [End symbol_effect_2] + } + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.SymbolGlyphSpanCustomIconAnimation_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/SymbolSceneExample.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/SymbolSceneExample.ets new file mode 100644 index 0000000000..618a85afc4 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/SymbolSceneExample.ets @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; +import resource from '../../common/resource'; + +@Entry +@Component +export struct SymbolGlyphSpanSceneExample { + @State triggerValueReplace: number = 0; + @State symbolSources: Resource[] = + [$r('sys.symbol.repeat'), $r('sys.symbol.repeat_1'), $r('sys.symbol.arrow_left_arrow_right')]; + @State symbolSourcesIndex: number = 0; + @State symbolText: string[] = [resource.resourceToString($r('app.string.SymbolSceneExample_Text_1')), + resource.resourceToString($r('app.string.SymbolSceneExample_Text_2')), + resource.resourceToString($r('app.string.SymbolSceneExample_Text_3'))]; + @State symbolTextIndex: number = 0; + @State fontColorValue: ResourceColor = Color.Grey; + @State fontColorValue1: ResourceColor = '#E8E8E8'; + + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard({ title: $r('app.string.SymbolGlyphSpanSceneExample_title') }) { + // [Start symbol_glyph_span_scene_example] + Column({ space: 10 }) { + Row() { + Text() { + Span(resource.resourceToString($r('app.string.SymbolSceneExample_Text_4'))) + .fontSize(20) + .fontWeight(FontWeight.Bolder) + Span('(101)') + }.id('text1') + } + + Row() { + Row({ space: 5 }) { + SymbolGlyph(this.symbolSources[this.symbolSourcesIndex]) + .id('symbolGlyph1') + .symbolEffect(new ReplaceSymbolEffect(EffectScope.WHOLE), this.triggerValueReplace) + .fontSize(20) + .fontColor([this.fontColorValue]) + Text(this.symbolText[this.symbolTextIndex]) + .fontColor(this.fontColorValue) + } + .onClick(() => { + this.symbolTextIndex++; + this.symbolSourcesIndex++; + this.triggerValueReplace++; + if (this.symbolSourcesIndex > (this.symbolSources.length - 1)) { + this.symbolSourcesIndex = 0; + this.triggerValueReplace = 0; + } + if (this.symbolTextIndex > (this.symbolText.length - 1)) { + this.symbolTextIndex = 0; + } + }) + .width('75%') + + Row({ space: 5 }) { + Text() { + SymbolSpan($r('sys.symbol.arrow_down_circle_badge_vip_circle_filled')) + .fontColor([this.fontColorValue]) + .fontSize(20) + }.id('text2') + + Text() { + SymbolSpan($r('sys.symbol.heart_badge_plus')) + .fontColor([this.fontColorValue]) + .fontSize(20) + }.id('text3') + + Text() { + SymbolSpan($r('sys.symbol.ohos_trash')) + .fontColor([this.fontColorValue]) + .fontSize(20) + }.id('text4') + } + .width('25%') + } + + Divider().width(5).color(this.fontColorValue1).width('98%') + Row() { + Row() { + Text($r('app.string.SymbolSceneExample_Text_5')) + }.width('82%') + + Row({ space: 5 }) { + SymbolGlyph($r('sys.symbol.play_arrow_triangle_2_circlepath')) + .id('symbolGlyph2') + .fontColor([this.fontColorValue]) + .fontSize(20) + SymbolGlyph($r('sys.symbol.trash')) + .id('symbolGlyph3') + .fontColor([this.fontColorValue]) + .fontSize(20) + } + } + + Divider().width(5).color(this.fontColorValue1).width('98%') + Row() { + Row() { + Text($r('app.string.SymbolSceneExample_Text_6')) + }.width('82%') + + Row({ space: 5 }) { + SymbolGlyph($r('sys.symbol.play_arrow_triangle_2_circlepath')) + .id('symbolGlyph4') + .fontColor([this.fontColorValue]) + .fontSize(20) + SymbolGlyph($r('sys.symbol.trash')) + .id('symbolGlyph5') + .fontColor([this.fontColorValue]) + .fontSize(20) + } + } + + Divider().width(5).color(this.fontColorValue1).width('98%') + Row() { + Row() { + Text($r('app.string.SymbolSceneExample_Text_7')) + }.width('82%') + + Row({ space: 5 }) { + SymbolGlyph($r('sys.symbol.play_arrow_triangle_2_circlepath')) + .id('symbolGlyph6') + .fontColor([this.fontColorValue]) + .fontSize(20) + SymbolGlyph($r('sys.symbol.trash')) + .id('symbolGlyph7') + .fontColor([this.fontColorValue]) + .fontSize(20) + } + } + + Divider().width(5).color(this.fontColorValue1).width('98%') + Row() { + Row() { + Text($r('app.string.SymbolSceneExample_Text_8')) + }.width('82%') + + Row({ space: 5 }) { + SymbolGlyph($r('sys.symbol.play_arrow_triangle_2_circlepath')) + .id('symbolGlyph8') + .fontColor([this.fontColorValue]) + .fontSize(20) + SymbolGlyph($r('sys.symbol.trash')) + .id('symbolGlyph9') + .fontColor([this.fontColorValue]) + .fontSize(20) + } + } + + Divider().width(5).color(this.fontColorValue1).width('98%') + Row() { + Row() { + Text($r('app.string.SymbolSceneExample_Text_9')) + }.width('82%') + + Row({ space: 5 }) { + SymbolGlyph($r('sys.symbol.play_arrow_triangle_2_circlepath')) + .id('symbolGlyph10') + .fontColor([this.fontColorValue]) + .fontSize(20) + SymbolGlyph($r('sys.symbol.trash')) + .id('symbolGlyph11') + .fontColor([this.fontColorValue]) + .fontSize(20) + } + } + + Divider().width(5).color(this.fontColorValue1).width('98%') + Row() { + Row() { + Text($r('app.string.SymbolSceneExample_Text_10')) + }.width('82%') + + Row({ space: 5 }) { + SymbolGlyph($r('sys.symbol.play_arrow_triangle_2_circlepath')) + .id('symbolGlyph12') + .fontColor([this.fontColorValue]) + .fontSize(20) + SymbolGlyph($r('sys.symbol.trash')) + .id('symbolGlyph13') + .fontColor([this.fontColorValue]) + .fontSize(20) + } + } + + Divider().width(5).color(this.fontColorValue1).width('98%') + Row() { + Row() { + Text($r('app.string.SymbolSceneExample_Text_11')) + }.width('82%') + + Row({ space: 5 }) { + SymbolGlyph($r('sys.symbol.play_arrow_triangle_2_circlepath')) + .id('symbolGlyph14') + .fontColor([this.fontColorValue]) + .fontSize(20) + SymbolGlyph($r('sys.symbol.trash')) + .id('symbolGlyph15') + .fontColor([this.fontColorValue]) + .fontSize(20) + } + } + + Divider().width(5).color(this.fontColorValue1).width('98%') + Column() { + Text($r('app.string.SymbolSceneExample_Text_12')) + } + .alignItems(HorizontalAlign.Center) + .width('98%') + } + .alignItems(HorizontalAlign.Start) + .width('100%') + .height(400) + .padding({ + left: 10, + top: 10 + }) + // [End symbol_glyph_span_scene_example] + } + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.SymbolGlyphSpanSceneExample_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/index.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/index.ets new file mode 100644 index 0000000000..245b218ccd --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/symbol/index.ets @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { CompletedRoutableCard } from '../../common/Card'; +import { CreatSymbolGlyph } from './CreatSymbolGlyph'; +import { SymbolGlyphSpanAddToText } from './SymbolAddToText'; +import { SymbolGlyphSpanCustomIconAnimation } from './SymbolCustomIconAnimation'; +import { SymbolGlyphSpanAddEvent } from './SymbolAddEvent'; +import { SymbolGlyphSpanSceneExample } from './SymbolSceneExample'; + +import { Route } from '../../common/Route'; +import resource from '../../common/resource'; + +export const SYMBOL_GLYPH_SPAN: string = 'symbol'; + +const routes: Route[] = [ + { + name: `${SYMBOL_GLYPH_SPAN}/CreatSymbolGlyph`, + title: resource.resourceToString($r('app.string.CreatSymbolGlyph_title')), + description: $r('app.string.CreatSymbolGlyph_description') + }, + { + name: `${SYMBOL_GLYPH_SPAN}/SymbolGlyphSpanAddToText`, + title: resource.resourceToString($r('app.string.SymbolGlyphSpanAddToText_title')), + description: $r('app.string.SymbolGlyphSpanAddToText_description') + }, + { + name: `${SYMBOL_GLYPH_SPAN}/SymbolGlyphSpanCustomIconAnimation`, + title: resource.resourceToString($r('app.string.SymbolGlyphSpanCustomIconAnimation_title')), + description: $r('app.string.SymbolGlyphSpanCustomIconAnimation_description') + }, + { + name: `${SYMBOL_GLYPH_SPAN}/SymbolGlyphSpanAddEvent`, + title: resource.resourceToString($r('app.string.SymbolGlyphSpanAddEvent_title')), + description: $r('app.string.SymbolGlyphSpanAddEvent_description') + }, + { + name: `${SYMBOL_GLYPH_SPAN}/SymbolGlyphSpanSceneExample`, + title: resource.resourceToString($r('app.string.SymbolGlyphSpanSceneExample_title')), + description: $r('app.string.SymbolGlyphSpanSceneExample_description') + } +]; + +@Builder +export function SymbolGlyphSpanDestination(name: string) { + if (name === SYMBOL_GLYPH_SPAN) { + SymbolGlyphSpanExample(); + } else if (name === routes[0].name) { + CreatSymbolGlyph(); + } else if (name === routes[1].name) { + SymbolGlyphSpanAddToText(); + } else if (name === routes[2].name) { + SymbolGlyphSpanCustomIconAnimation(); + } else if (name === routes[3].name) { + SymbolGlyphSpanAddEvent(); + } else if (name === routes[4].name) { + SymbolGlyphSpanSceneExample(); + } +} + +@Entry +@Component +struct SymbolGlyphSpanExample { + @Consume pathStack: NavPathStack; + + build() { + NavDestination() { + List({ space: 12 }) { + ForEach(routes, (route: Route) => { + ListItem() { + CompletedRoutableCard({ title: route.title, description: route.description }) + } + .width('100%') + .onClick(() => { + this.pathStack.pushPath({ name: route.name }); + }) + }) + } + .contentStartOffset(56) + .padding({ left: 16, right: 16 }) + } + .backgroundColor('#f1f3f5') + .title('symbol', { + backgroundBlurStyle: BlurStyle.COMPONENT_THICK, + barStyle: BarStyle.STACK + }) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/AIMenu.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/AIMenu.ets new file mode 100644 index 0000000000..23ea683807 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/AIMenu.ets @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; + +@Entry +@Component +export struct AIMenu { + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard({ title: $r('app.string.SetUpAIMenu_title') }) { + // [Start set_ai_menu] + Text($r('app.string.AIMenu_Text_1')) + .fontSize(16) + .copyOption(CopyOptions.LocalDevice) + .enableDataDetector(true)// 使能实体识别 + .dataDetectorConfig({ + // 配置识别样式 + // types可支持PHONE_NUMBER电话号码、URL链接、EMAIL邮箱、ADDRESS地址、DATE_TIME时间 + // types设置为null或者[]时,识别所有类型的实体 + types: [], onDetectResultUpdate: (result: string) => { + } + }) + // [End set_ai_menu] + } + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.SetUpAIMenu_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/CreateText.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/CreateText.ets index 274e166c97..db42357480 100644 --- a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/CreateText.ets +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/CreateText.ets @@ -23,7 +23,7 @@ export struct CreateText { Column({ space: 12 }) { ComponentCard({ title: $r('app.string.CreatText_title_1') }) { // [Start create_a_text_in_one_way] - Text('This is a text string') + Text($r('app.string.CreateText_Text_1')) // [End create_a_text_in_one_way] } diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/CustomTextStyle.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/CustomTextStyle.ets index a6544964ae..d451b7f6ed 100644 --- a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/CustomTextStyle.ets +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/CustomTextStyle.ets @@ -61,22 +61,36 @@ export struct CustomTextStyle { .fontSize(12) .border({ width: 1 }) .padding(10) - Text($r('app.string.CustomTextStyle_textContent_1') + - 'I am an extra long text, with ellipses displayed for any excess。') + Text($r('app.string.CustomTextStyle_textContent_1')) .width(250) .textOverflow({ overflow: TextOverflow.Ellipsis }) .maxLines(1) .fontSize(12) .border({ width: 1 }) .padding(10) - Text($r('app.string.CustomTextStyle_textContent_2') + - 'When the text overflows its dimensions,the text will scroll for displaying.') + Text($r('app.string.CustomTextStyle_textContent_2')) .width(250) .textOverflow({ overflow: TextOverflow.MARQUEE }) .maxLines(1) .fontSize(12) .border({ width: 1 }) .padding(10) + Text($r('app.string.CustomTextStyle_textContent_8')) + .width(250) + .textOverflow({ overflow: TextOverflow.MARQUEE }) + .maxLines(1) + .fontSize(12) + .border({ width: 1 }) + .padding(10) + .marqueeOptions({ + start: true, + fromStart: true, + step: 6, + loop: -1, + delay: 0, + fadeout: false, + marqueeStartPolicy: MarqueeStartPolicy.DEFAULT + }) // [End custom_text_overflow] } } @@ -243,7 +257,7 @@ export struct CustomTextStyle { } .width('100%') .padding({ left: 12, right: 12 }) - } + }.id('scroll_') } .backgroundColor('#f1f2f3') .title($r('app.string.CustomTextStyle_title')) diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/SelectMenu.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/SelectMenu.ets new file mode 100644 index 0000000000..252cdf3e94 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/SelectMenu.ets @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; +import resource from '../../common/resource'; + +@Entry +@Component +export struct SelectMenu { + controller: TextController = new TextController(); + options: TextOptions = { controller: this.controller }; + + // 定义菜单项 + @Builder + RightClickTextCustomMenu() { + Column() { + Menu() { + MenuItemGroup() { + MenuItem({ startIcon: $r('app.media.app_icon'), content: 'CustomMenu One', labelInfo: '' }) + .onClick(() => { + // 使用closeSelectionMenu接口关闭菜单 + this.controller.closeSelectionMenu(); + }) + MenuItem({ startIcon: $r('app.media.app_icon'), content: 'CustomMenu Two', labelInfo: '' }) + MenuItem({ startIcon: $r('app.media.app_icon'), content: 'CustomMenu Three', labelInfo: '' }) + } + }.backgroundColor('#F0F0F0') + } + } + + // 定义onCreateMenu,onMenuItemClick + onCreateMenu = (menuItems: Array) => { + let item1: TextMenuItem = { + content: 'customMenu1', + icon: $r('app.media.app_icon'), + id: TextMenuItemId.of('customMenu1'), + }; + let item2: TextMenuItem = { + content: 'customMenu2', + id: TextMenuItemId.of('customMenu2'), + icon: $r('app.media.app_icon'), + }; + menuItems.push(item1); + menuItems.unshift(item2); + return menuItems; + } + onMenuItemClick = (menuItem: TextMenuItem, textRange: TextRange) => { + if (menuItem.id.equals(TextMenuItemId.of('customMenu2'))) { + console.log(resource.resourceToString($r('app.string.SelectMenu_Text_1')) + + textRange.start + '; end:' + textRange.end); + return true; + } + if (menuItem.id.equals(TextMenuItemId.COPY)) { + console.log(resource.resourceToString($r('app.string.SelectMenu_Text_2')) + + textRange.start + '; end:' + textRange.end); + return true; + } + if (menuItem.id.equals(TextMenuItemId.SELECT_ALL)) { + console.log(resource.resourceToString($r('app.string.SelectMenu_Text_3')) + + textRange.start + '; end:' + textRange.end); + return false; + } + return false; + }; + + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard({ title: $r('app.string.SetSelectionMenu_textContent_1') }) { + // [Start set_selection_menu_with_copyoption] + Text($r('app.string.SelectMenu_textContent_1')) + .fontSize(30) + .copyOption(CopyOptions.InApp) + // [End set_selection_menu_with_copyoption] + } + + ComponentCard({ title: $r('app.string.SetSelectionMenu_textContent_2') }) { + // [Start set_selection_menu_with_bindselectionmenu] + Text($r('app.string.SelectMenu_textContent_1'), this.options) + .fontSize(30) + .copyOption(CopyOptions.InApp) + .bindSelectionMenu(TextSpanType.TEXT, this.RightClickTextCustomMenu, TextResponseType.RIGHT_CLICK, { + onAppear: () => { + console.info(resource.resourceToString($r('app.string.SelectMenu_Text_4'))); + }, + onDisappear: () => { + console.info(resource.resourceToString($r('app.string.SelectMenu_Text_5'))); + } + }) + // [Start set_selection_menu_with_bindselectionmenu] + } + + ComponentCard({ title: $r('app.string.SetSelectionMenu_textContent_3') }) { + // [Start set_selection_menu_with_editmenuoptions] + Text($r('app.string.SelectMenu_textContent_1')) + .fontSize(20) + .copyOption(CopyOptions.LocalDevice) + .editMenuOptions({ + onCreateMenu: this.onCreateMenu, onMenuItemClick: this.onMenuItemClick + }) + // [End set_selection_menu_with_editmenuoptions] + } + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.SetSelectionMenu_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/TextSpan.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/TextSpan.ets index ead16c2241..4d0abc8135 100644 --- a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/TextSpan.ets +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/TextSpan.ets @@ -18,7 +18,7 @@ import { ComponentCard } from '../../common/Card'; @Entry @Component export struct TextSpan { - @State onClickText: ResourceStr = 'I am Upper-span'; + @State onClickText: ResourceStr = 'I am Upper-span2'; build() { NavDestination() { diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/index.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/index.ets index f266ed800d..266e20052a 100644 --- a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/index.ets +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/text/index.ets @@ -21,6 +21,8 @@ import { TextAddEvent } from './TextAddEvent'; import { TextHotSearch } from './TextHotSearch'; import { TextSpan } from './TextSpan'; import resource from '../../common/resource'; +import { SelectMenu } from './SelectMenu'; +import { AIMenu } from './AIMenu'; export const TEXT_ROUTE_PREFIX: string = 'text'; @@ -45,6 +47,16 @@ const routes: Route[] = [ title: resource.resourceToString($r('app.string.TextAddEvent_title')), description: $r('app.string.TextAddEvent_description') }, + { + name: `${TEXT_ROUTE_PREFIX}/SelectMenu`, + title: resource.resourceToString($r('app.string.SetSelectionMenu_title')), + description: $r('app.string.SetSelectionMenu_description') + }, + { + name: `${TEXT_ROUTE_PREFIX}/AIMenu`, + title: resource.resourceToString($r('app.string.SetUpAIMenu_title')), + description: $r('app.string.SetUpAIMenu_description') + }, { name: `${TEXT_ROUTE_PREFIX}/TextHotSearch`, title: resource.resourceToString($r('app.string.TextHotSearch_title')), @@ -65,6 +77,10 @@ export function TextDestination(name: string) { } else if (name === routes[3].name) { TextAddEvent(); } else if (name === routes[4].name) { + SelectMenu(); + } else if (name === routes[5].name) { + AIMenu(); + } else if (name === routes[6].name) { TextHotSearch(); } } @@ -91,7 +107,7 @@ struct TextExample { .padding({ left: 16, right: 16 }) } .backgroundColor('#f1f3f5') - .title('Text', { + .title('Text/Span', { backgroundBlurStyle: BlurStyle.COMPONENT_THICK, barStyle: BarStyle.STACK }) diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/AutoFill.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/AutoFill.ets new file mode 100644 index 0000000000..5cdcceb7cd --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/AutoFill.ets @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; + +@Entry +@Component +export struct AutoFill { + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard({ description: $r('app.string.Auto_Fill_description') }) { + // [Start auto_fill] + TextInput({ placeholder: $r('app.string.Auto_Fill_PlaceHolder') }) + .width('95%') + .height(40) + .margin(20) + .contentType(ContentType.EMAIL_ADDRESS) + // [End auto_fill] + } + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.Auto_Fill')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/CursorAvoidance.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/CursorAvoidance.ets new file mode 100644 index 0000000000..57201b815e --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/CursorAvoidance.ets @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; + +// [Start cursor_avoid] +@Entry +@Component +export struct CursorAvoidance { + @State caretPosition: number = 600; + areaController: TextAreaController = new TextAreaController(); + text = 'Most of us compare ourselves with anyone we think is happier — a relative, someone we know a lot,' + + ' or someone we hardly know. As a result, what we do remember is anything that makes others happy, ' + + 'anything that makes ourselves unhappy,' + + ' totally forgetting that there is something happy in our own life.\ + So the best way to destroy happiness is to look at something and focus on even the smallest flaw. ' + + 'It is the smallest flaw that would make us complain. And it is the complaint that leads to us becoming unhappy.\ + If one chooses to be happy, he will be blessed; if he chooses to be unhappy, he will be cursed. ' + + 'Happiness is just what you think will make you happy.' + + 'Most of us compare ourselves with anyone we think is happier — a relative, someone we know a lot, ' + + 'or someone we hardly know. As a result, what we do remember is anything that makes others happy, ' + + 'anything that makes ourselves unhappy, totally forgetting that there is something happy in our own life.\ + '; + // : string = getResourceString($r('app.string.CursorAvoidance_Button_1')); + @State str1 : string = getContext(this).resourceManager.getStringSync($r('app.string.CursorAvoidance_Button_1')); + @State str2 : string = getContext(this).resourceManager.getStringSync($r('app.string.CursorAvoidance_Button_2')); + + build() { + NavDestination() { + ComponentCard({ title: $r('app.string.CursorAvoidance_title') }) { + Scroll() { + Column() { + Row() { + + Button(this.str1 + this.caretPosition).onClick(() => { + this.caretPosition += 1; + }).fontSize(10) + Button(this.str2 + this.caretPosition).onClick(() => { + this.caretPosition -= 1; + }).fontSize(10) + Button($r('app.string.CursorAvoidance_Button_3')).onClick(() => { + this.areaController.caretPosition(this.caretPosition); + }).fontSize(10) + } + + TextArea({ text: this.text, controller: this.areaController }) + .width('100%') + .fontSize('20fp') + } + }.width('100%').height('100%') + } + } + .backgroundColor('#f1f2f3') + .title($r('app.string.CursorAvoidance_title')) + } +} +// [End cursor_avoid] \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/LoginRegisterPage.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/LoginRegisterPage.ets index 16b8826b8a..3998f3dcea 100644 --- a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/LoginRegisterPage.ets +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/LoginRegisterPage.ets @@ -38,7 +38,7 @@ export struct LoginRegisterPage { .onSubmit((enterKeyType) => { console.info(enterKeyType + resource.resourceToString($r('app.string.LoginRegisterPage_textContent'))); }) - Button('Sign in') + Button($r('app.string.LoginRegisterPage_Button_3')) .width('100%') } } diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/SelectMenu.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/SelectMenu.ets new file mode 100644 index 0000000000..1f782392a6 --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/SelectMenu.ets @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; + +@Entry +@Component +export struct SelectMenu { + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard({ description: $r('app.string.SelectionMenu_description') }) { + Column({ space: 8 }) { + // [Start select_textinput] + TextInput({ text: $r('app.string.SelectMenu_textContent_1') }) + // [End select_textinput] + // [Start select_textarea] + TextArea({ text: $r('app.string.SelectMenu_textContent_1') }) + // [End select_textarea] + } + } + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.SelectionMenu_title')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/SetOmissionProperty.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/SetOmissionProperty.ets new file mode 100644 index 0000000000..cdf8397bfc --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/SetOmissionProperty.ets @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentCard } from '../../common/Card'; + +@Entry +@Component +export struct SetOmissionProperty { + build() { + NavDestination() { + Column({ space: 12 }) { + ComponentCard({ description: $r('app.string.Set_Omission_Property_description') }) { + // [Start set_omission_property] + TextInput({ text: $r('app.string.Set_Omission_Property_textContent') }) + .textOverflow(TextOverflow.Ellipsis) + .ellipsisMode(EllipsisMode.END) + .style(TextInputStyle.Inline) + .fontSize(30) + .margin(30) + // [End set_omission_property] + } + } + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + } + .backgroundColor('#f1f2f3') + .title($r('app.string.Set_Omission_Property')) + } +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/SetTextInputType.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/SetTextInputType.ets index c96b89a703..566fd00c21 100644 --- a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/SetTextInputType.ets +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/SetTextInputType.ets @@ -20,26 +20,74 @@ import { ComponentCard } from '../../common/Card'; export struct SetTextInputType { build() { NavDestination() { - Column({ space: 12 }) { - ComponentCard({ title: $r('app.string.SetTextInputType_title_1') }) { - // [Start set_normal_input_type] - TextInput() - .id('Normal') - .type(InputType.Normal) - // [End set_normal_input_type] + Scroll() { + Grid() { + GridItem() { + ComponentCard({ title: $r('app.string.SetTextInputType_title_1') }) { + TextInput() + .id('Normal') + .type(InputType.Normal) + } + }.width('33%') + GridItem() { + ComponentCard({ title: $r('app.string.SetTextInputType_title_2') }) { + // [Start set_password_input_type] + TextInput() + .id('Password') + .type(InputType.Password) + // [End set_password_input_type] + } + }.width('33%') + GridItem() { + ComponentCard({ title: $r('app.string.SetTextInputType_title_3') }) { + // [Start set_email_input_type] + TextInput() + .id('Email') + .type(InputType.Email) + // [End set_email_input_type] + } + }.width('33%') + GridItem() { + ComponentCard({ title: $r('app.string.SetTextInputType_title_4') }) { + // [Start set_number_input_type] + TextInput() + .id('Number') + .type(InputType.Number) + // [End set_number_input_type] + } + }.width('33%') + GridItem() { + ComponentCard({ title: $r('app.string.SetTextInputType_title_5') }) { + // [Start set_phonenumber_input_type] + TextInput() + .id('PhoneNumber') + .type(InputType.PhoneNumber) + // [End set_phonenumber_input_type] + } + }.width('33%') + GridItem() { + ComponentCard({ title: $r('app.string.SetTextInputType_title_6') }) { + // [Start set_number_decimal_input_type] + TextInput() + .id('NUMBER_DECIMAL') + .type(InputType.NUMBER_DECIMAL) + // [End set_number_decimal_input_type] + } + }.width('33%') + GridItem() { + ComponentCard({ title: $r('app.string.SetTextInputType_title_7') }) { + // [Start set_url_input_type] + TextInput() + .id('URL') + .type(InputType.URL) + // [End set_url_input_type] + } + }.width('33%') } - - ComponentCard({ title: $r('app.string.SetTextInputType_title_2') }) { - // [Start set_password_input_type] - TextInput() - .id('Password') - .type(InputType.Password) - // [End set_password_input_type] - } - } - .width('100%') - .height('100%') - .padding({ left: 12, right: 12 }) + .width('100%') + .height('100%') + .padding({ left: 12, right: 12 }) + }.id('scroll_') } .backgroundColor('#f1f2f3') .title($r('app.string.SetTextInputType_title')) diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/TextInputAddEvent.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/TextInputAddEvent.ets index 74ed0cfe42..18a68f2938 100644 --- a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/TextInputAddEvent.ets +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/TextInputAddEvent.ets @@ -20,6 +20,8 @@ import { ComponentCard } from '../../common/Card'; export struct TextInputAddEvent { @State eventText: ResourceStr = $r('app.string.TextInputAddEvent_textContent_1'); @State inputValue: ResourceStr = $r('app.string.TextInputAddEvent_textContent_2'); + controller: TextInputController = new TextInputController(); + passwordState: boolean = false; build() { NavDestination() { @@ -29,9 +31,47 @@ export struct TextInputAddEvent { Text(this.eventText) Text(this.inputValue) // [Start add_text_input_event] - TextInput() + TextInput({ + text: $r('app.string.TextInputAddEvent_textContent_2'), + placeholder: 'input your word...', + controller: this.controller + }) + .type(InputType.Password) + .showPassword(this.passwordState) .onChange((value: string) => { - this.inputValue = value; + // 文本内容发生变化时触发该回调 + this.inputValue = 'onChange is triggering: ' + value; + }) + .onSubmit((enterKey: EnterKeyType, event: SubmitEvent) => { + // 按下输入法回车键时触发该回调 + this.eventText = 'onSubmit is triggering: ' + enterKey + ' ' + event.text; + }) + .onTextSelectionChange((selectionStart: number, selectionEnd: number) => { + // 文本选择的位置发生变化或编辑状态下光标位置发生变化时,触发该回调 + this.eventText = 'onTextSelectionChange is triggering: ' + selectionStart + ' ' + selectionEnd; + }) + .onSecurityStateChange((isShowPassword: boolean) => { + // 密码显隐状态切换时,触发该回调 + this.eventText = 'onSecurityStateChange is triggering: ' + isShowPassword + this.passwordState = isShowPassword; + }) + .onWillInsert((info: InsertValue) => { + // 在将要输入时,触发该回调 + this.eventText = 'onWillInsert is triggering: ' + info.insertValue + ' ' + info.insertOffset; + return true; + }) + .onDidInsert((info: InsertValue) => { + // 在输入完成时,触发该回调 + this.eventText = 'onDidInsert is triggering: ' + info.insertValue + ' ' + info.insertOffset + }) + .onWillDelete((info: DeleteValue) => { + // 在将要删除时,触发该回调 + this.eventText = 'onWillDelete is triggering: ' + info.deleteValue + ' ' + info.deleteOffset + return true; + }) + .onDidDelete((info: DeleteValue) => { + // 在删除完成时,触发该回调 + this.eventText = 'onDidDelete is triggering: ' + info.deleteValue + ' ' + info.deleteOffset }) .onFocus(() => { this.eventText = $r('app.string.TextInputAddEvent_textContent_3'); diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/index.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/index.ets index 6c295e9a32..91475ab188 100644 --- a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/index.ets +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/ets/pages/textInput/index.ets @@ -23,6 +23,10 @@ import { LoginRegisterPage } from './LoginRegisterPage'; import { SetTextInputType } from './SetTextInputType'; import { TextInputAddEvent } from './TextInputAddEvent'; import resource from '../../common/resource'; +import { SelectMenu } from './SelectMenu'; +import { AutoFill } from './AutoFill'; +import { SetOmissionProperty } from './SetOmissionProperty'; +import { CursorAvoidance } from './CursorAvoidance'; export const INPUT_ROUTE_PREFIX: string = 'TextInput'; @@ -48,14 +52,34 @@ const routes: Route[] = [ description: $r('app.string.TextInputAddEvent_description') }, { - name: `${INPUT_ROUTE_PREFIX}/LoginRegisterPage`, - title: resource.resourceToString($r('app.string.LoginRegisterPage_title')), - description: $r('app.string.LoginRegisterPage_description') + name: `${INPUT_ROUTE_PREFIX}/SelectMenu`, + title: resource.resourceToString($r('app.string.SelectionMenu_title')), + description: $r('app.string.SelectionMenu_description') + }, + { + name: `${INPUT_ROUTE_PREFIX}/AutoFill`, + title: resource.resourceToString($r('app.string.Auto_Fill')), + description: $r('app.string.Auto_Fill_description') + }, + { + name: `${INPUT_ROUTE_PREFIX}/SetOmissionProperty`, + title: resource.resourceToString($r('app.string.Set_Omission_Property')), + description: $r('app.string.Set_Omission_Property_description') }, { name: `${INPUT_ROUTE_PREFIX}/KeyboardAvoidance`, title: resource.resourceToString($r('app.string.KeyboardAvoidance_title')), description: $r('app.string.KeyboardAvoidance_description') + }, + { + name: `${INPUT_ROUTE_PREFIX}/CursorAvoidance`, + title: resource.resourceToString($r('app.string.CursorAvoidance_title')), + description: $r('app.string.CursorAvoidance_description') + }, + { + name: `${INPUT_ROUTE_PREFIX}/LoginRegisterPage`, + title: resource.resourceToString($r('app.string.LoginRegisterPage_title')), + description: $r('app.string.LoginRegisterPage_description') } ]; @@ -72,9 +96,17 @@ export function TextInputDestination(name: string) { } else if (name === routes[3].name) { TextInputAddEvent(); } else if (name === routes[4].name) { - LoginRegisterPage(); + SelectMenu(); } else if (name === routes[5].name) { + AutoFill(); + } else if (name === routes[6].name) { + SetOmissionProperty(); + } else if (name === routes[7].name) { KeyboardAvoidance(); + } else if (name === routes[8].name) { + CursorAvoidance(); + } else if (name === routes[9].name) { + LoginRegisterPage(); } } @@ -85,22 +117,24 @@ struct TextInputExample { build() { NavDestination() { - List({ space: 12 }) { - ForEach(routes, (route: Route) => { - ListItem() { - CompletedRoutableCard({ title: route.title, description: route.description }) - } - .width('100%') - .onClick(() => { - this.pathStack.pushPath({ name: route.name }); + Scroll() { + List({ space: 12 }) { + ForEach(routes, (route: Route) => { + ListItem() { + CompletedRoutableCard({ title: route.title, description: route.description }) + } + .width('100%') + .onClick(() => { + this.pathStack.pushPath({ name: route.name }); + }) }) - }) - } - .contentStartOffset(56) - .padding({ left: 16, right: 16 }) + } + .contentStartOffset(56) + .padding({ left: 16, right: 16 }) + }.id('scroll_') } .backgroundColor('#f1f3f5') - .title('TextInput', { + .title('TextInput/TextArea', { backgroundBlurStyle: BlurStyle.COMPONENT_THICK, barStyle: BarStyle.STACK }) diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/resources/base/element/float.json b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/resources/base/element/float.json new file mode 100644 index 0000000000..a0a93dd91f --- /dev/null +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/resources/base/element/float.json @@ -0,0 +1,8 @@ +{ + "float": [ + { + "name": "page_text_font_size", + "value": "50fp" + } + ] +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/resources/base/element/string.json b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/resources/base/element/string.json index 40eb1db393..84c70d2981 100644 --- a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/resources/base/element/string.json +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/resources/base/element/string.json @@ -2,7 +2,7 @@ "string": [ { "name": "module_desc", - "value": "module description" + "value": "模块描述" }, { "name": "EntryAbility_desc", @@ -14,11 +14,23 @@ }, { "name": "pageIndex_Text", - "value": "文本显示/Text" + "value": "文本显示(Text/Span)" }, { "name": "pageIndex_TextInput", - "value": "文本输入/TextInput" + "value": "文本输入(TextInput/TextArea)" + }, + { + "name": "pageIndex_RichEditor", + "value": "富文本(RichEditor)" + }, + { + "name": "pageIndex_PropertyString", + "value": "属性字符串(StyledString/MutableStyledString)" + }, + { + "name": "pageIndex_TextNDKUI", + "value": "使用文本(NDK)" }, { "name": "CreatText_title", @@ -54,7 +66,7 @@ }, { "name": "TextSpan_description", - "value": "Span只能作为Text和RichEditor组件的子组件显示文本内容,可以在一个Text内添加多个Span来显示一段信息。" + "value": "Span只能作为Text和RichEditor组件的子组件显示文本内容,可以在一个Text内添加多个Span来显示一段信息" }, { "name": "TextSpan_textContent_1", @@ -82,11 +94,11 @@ }, { "name": "CreatText_description", - "value": "示例使用string字符串和引用Resource资源两种方式来创建文本。" + "value": "示例使用string字符串和引用Resource资源两种方式来创建文本" }, { "name": "CreatText_description_1", - "value": "资源引用类型可以通过$r创建Resource类型对象,文件位置为/resources/base/element/string.json。" + "value": "资源引用类型可以通过$r创建Resource类型对象,文件位置为/resources/base/element/string.json" }, { "name": "CustomTextStyle_title", @@ -130,19 +142,19 @@ }, { "name": "CustomTextStyle_description", - "value": "示例中展示对文本的对齐、文本超长处理、文本行高、装饰线等属性进行设置的自定义文本样式。" + "value": "示例中展示对文本的对齐、文本超长处理、文本行高、装饰线等属性进行设置的自定义文本样式" }, { "name": "CustomTextStyle_description_1", - "value": "textOverflow需配合maxLines一起使用(默认情况下文本自动折行)。" + "value": "textOverflow需配合maxLines一起使用(默认情况下文本自动折行)。从API version 18开始,文本超长时设置跑马灯的方式展示时,支持设置跑马灯的配置项,比如开关、步长、循环次数、方向等" }, { "name": "CustomTextStyle_textContent_1", - "value": "我是超长文本,超出的部分显示省略号。" + "value": "我是超长文本,超出的部分显示省略号 I am an extra long text, with ellipses displayed for any excess。" }, { "name": "CustomTextStyle_textContent_2", - "value": "当文本溢出其尺寸时,文本将滚动显示。" + "value": "当文本溢出其尺寸时,文本将滚动显示 When the text overflows its dimensions,the text will scroll for displaying." }, { "name": "CustomTextStyle_textContent_3", @@ -164,6 +176,10 @@ "name": "CustomTextStyle_textContent_7", "value": "这是一段可复制文本。" }, + { + "name": "CustomTextStyle_textContent_8", + "value": "当文本溢出其尺寸时,文本将滚动显示,支持设置跑马灯配置项 When the text overflows its dimensions, the text will scroll for displaying." + }, { "name": "TextAlign_Start", "value": "左对齐" @@ -180,9 +196,37 @@ "name": "TextAddEvent_title", "value": "添加事件" }, + { + "name": "SetSelectionMenu_title", + "value": "设置选中菜单" + }, + { + "name": "SelectionMenu_title", + "value": "选中菜单" + }, + { + "name": "SelectionMenu_description", + "value": "输入框中的文字被选中时会弹出包含剪切、复制、翻译、搜索的菜单" + }, + { + "name": "SetSelectionMenu_description", + "value": "设置Text被选中时,会弹出包含复制、翻译、搜索以及自定义的菜单" + }, + { + "name": "SetSelectionMenu_textContent_1", + "value": "Text组件需要设置copyOption属性才可以被选中" + }, + { + "name": "SetSelectionMenu_textContent_2", + "value": "Text组件通过设置bindSelectionMenu属性绑定自定义选择菜单" + }, + { + "name": "SetSelectionMenu_textContent_3", + "value": "Text组件通过设置editMenuOptions属性扩展自定义选择菜单,可以设置扩展项的文本内容、图标以及回调方法" + }, { "name": "TextAddEvent_description", - "value": "Text组件可以添加通用事件,可以绑定onClick、onTouch等事件来响应操作。" + "value": "Text组件可以添加通用事件,可以绑定onClick、onTouch等事件来响应操作" }, { "name": "TextAddEvent_textContent_1", @@ -202,7 +246,7 @@ }, { "name": "TextHotSearch_description", - "value": "示例通过maxLines、textOverflow、textAlign、constraintSize属性展示了热搜榜的效果。" + "value": "示例通过maxLines、textOverflow、textAlign、constraintSize属性展示了热搜榜的效果" }, { "name": "TextHotSearch_textContent_1", @@ -242,7 +286,7 @@ }, { "name": "CreatTextInput_description", - "value": "示例通过接口创建文本输入框,其中TextInput为单行输入框、TextArea为多行输入框。" + "value": "示例通过接口创建文本输入框,其中TextInput为单行输入框、TextArea为多行输入框" }, { "name": "CreatTextInput_description_1", @@ -264,6 +308,26 @@ "name": "SetTextInputType_title_2", "value": "密码输入模式" }, + { + "name": "SetTextInputType_title_3", + "value": "邮箱地址输入模式" + }, + { + "name": "SetTextInputType_title_4", + "value": "纯数字输入模式" + }, + { + "name": "SetTextInputType_title_5", + "value": "电话号码输入模式" + }, + { + "name": "SetTextInputType_title_6", + "value": "带小数点的数字输入模式" + }, + { + "name": "SetTextInputType_title_7", + "value": "带URL的输入模式" + }, { "name": "SetTextInputType_description", "value": "TextInput有9种可选类型,示例中展示Normal基本输入模式和Password密码输入模式两种类型" @@ -286,7 +350,7 @@ }, { "name": "CustomTextInputStyle_description", - "value": "示例对输入框的提示文本、文本内容和背景颜色进行展示,更丰富的样式可以结合通用属性实现。" + "value": "示例对输入框的提示文本、文本内容和背景颜色进行展示,更丰富的样式可以结合通用属性实现" }, { "name": "CustomTextInputStyle_textContent_1", @@ -306,7 +370,7 @@ }, { "name": "TextInputAddEvent_description", - "value": "文本框主要用于获取用户输入的信息,把信息处理成数据进行上传,绑定onChange事件可以获取输入框内改变的内容。用户也可以使用通用事件来进行相应的交互操作。" + "value": "文本框主要用于获取用户输入的信息,把信息处理成数据进行上传,绑定onChange事件可以获取输入框内改变的内容。用户也可以使用通用事件来进行相应的交互操作" }, { "name": "TextInputAddEvent_textContent_1", @@ -326,7 +390,7 @@ }, { "name": "LoginRegisterPage_description", - "value": "示例模仿用户在登录/注册页面,进行登录或注册。" + "value": "示例模仿用户在登录/注册页面,进行登录或注册" }, { "name": "LoginRegisterPage_textContent", @@ -334,11 +398,831 @@ }, { "name": "KeyboardAvoidance_title", - "value": "键盘避让示例" + "value": "键盘避让" + }, + { + "name": "CursorAvoidance_title", + "value": "光标避让" + }, + { + "name": "CursorAvoidance_description", + "value": "keyBoardAvoidMode枚举中的OFFSET和RESIZE在键盘抬起后,不支持二次避让。如果想要支持光标位置在点击或者通过接口设置变化后发生二次避让,可以考虑使用OFFSET_WITH_CARET和RESIZE_CARET替换原有的OFFSET和RESIZE模式。\n对于滚动容器更推荐使用RESIZE_WITH_CARET,非滚动容器应该使用OFFSET_WITH_CARET。" }, { "name": "KeyboardAvoidance_description", - "value": "示例中键盘抬起后,具有滚动能力的容器组件在横竖屏切换时,才会生效键盘避让。" + "value": "示例中键盘抬起后,具有滚动能力的容器组件在横竖屏切换时,才会生效键盘避让" + }, + { + "name": "SelectMenu_textContent_1", + "value": "这是一段文本,用来展示选中菜单" + }, + { + "name": "SelectMenu_textContent_2", + "value": "自定义选择菜单弹出时触发该回调" + }, + { + "name": "SelectMenu_textContent_3", + "value": "自定义选择菜单关闭时触发该回调" + }, + { + "name": "SetUpAIMenu_title", + "value": "设置AI菜单" + }, + { + "name": "SetUpAIMenu_description", + "value": "Text组件通过enableDataDetector和dataDetectorConfig属性实现AI菜单的显示" + }, + { + "name": "Auto_Fill", + "value": "自动填充" + }, + { + "name": "Auto_Fill_description", + "value": "输入框可以通过contentType属性设置自动填充类型" + }, + { + "name": "Auto_Fill_PlaceHolder", + "value": "输入你的邮箱..." + }, + { + "name": "Set_Omission_Property", + "value": "设置省略属性" + }, + { + "name": "Set_Omission_Property_description", + "value": "输入框可以通过ellipsisMode属性设置省略位置" + }, + { + "name": "Set_Omission_Property_textContent", + "value": "这是一段文本,用来展示省略模式" + }, + { + "name": "Create_RichEditor_Component_title", + "value": "创建RichEditor组件" + }, + { + "name": "Create_RichEditor_Component_title_1", + "value": "创建使用属性字符串构建的RichEditor组件" + }, + { + "name": "Create_RichEditor_Component_title_2", + "value": "创建不使用属性字符串构建的RichEditor组件" + }, + { + "name": "Create_RichEditor_Component_description", + "value": "开发者可以创建使用属性字符串和不使用属性字符串构建的RichEditor组件" + }, + { + "name": "Set_Attributes_title", + "value": "设置属性" + }, + { + "name": "Set_Attributes_title_1", + "value": "设置自定义选择菜单" + }, + { + "name": "Set_Attributes_title_1_desc", + "value": "通过bindSelectionMenu设置自定义选择菜单" + }, + { + "name": "Set_Attributes_title_2", + "value": "设置输入框光标、手柄颜色" + }, + { + "name": "Set_Attributes_title_2_desc", + "value": "通过caretColor设置输入框光标、手柄颜色" + }, + { + "name": "Set_Attributes_title_3", + "value": "设置无输入时的提示文本" + }, + { + "name": "Set_Attributes_title_3_desc", + "value": "通过placeholder设置无输入时的提示文本" + }, + { + "name": "Set_Attributes_title_4", + "value": "设置最大行数" + }, + { + "name": "Set_Attributes_title_4_desc", + "value": "通过maxLines设置富文本可显示的最大行数" + }, + { + "name": "Set_Attributes_title_5", + "value": "设置最大长度" + }, + { + "name": "Set_Attributes_title_5_desc", + "value": "通过maxLength设置富文本的最大输入字符数" + }, + { + "name": "Set_Attributes_title_6", + "value": "默认选中菜单" + }, + { + "name": "Set_Attributes_title_6_desc", + "value": "富文本中的文字被选中时会弹出包含剪切、复制、翻译、分享的菜单" + }, + { + "name": "Add_Event_title", + "value": "添加事件" + }, + { + "name": "Add_Event_title_1", + "value": "添加组件初始化完成后可触发的回调" + }, + { + "name": "Add_Event_title_1_desc", + "value": "通过onReady来添加组件初始化完成后可触发的回调" + }, + { + "name": "Add_Event_title_2", + "value": "添加组件内容选择区域或编辑状态下光标位置改变时可触发的回调" + }, + { + "name": "Add_Event_title_2_desc", + "value": "通过onSelectionChange来添加组件内容选择区域或编辑状态下光标位置改变时可触发的回调" + }, + { + "name": "Add_Event_title_3", + "value": "添加组件内容选择区域或编辑状态下光标位置改变时可触发的回调" + }, + { + "name": "Add_Event_title_3_desc", + "value": "通过onWillChange添加图文变化前可触发的回调,通过onDidChange添加图文变化后可触发的回调" + }, + { + "name": "Add_Event_title_4", + "value": "添加输入法输入内容前和完成输入后可触发的回调" + }, + { + "name": "Add_Event_title_4_desc", + "value": "在添加输入法输入内容前,可以通过aboutToIMEInput触发回调。在输入法完成输入后,可以通过onDidIMEInput触发回调" + }, + { + "name": "Add_Event_title_5", + "value": "添加完成粘贴前可触发的回调" + }, + { + "name": "Add_Event_title_5_desc", + "value": "通过onPaste回调,来添加粘贴前要处理的流程" + }, + { + "name": "Add_Event_title_6", + "value": "添加完成剪切前可触发的回调" + }, + { + "name": "Add_Event_title_6_desc", + "value": "通过onCut回调,来添加剪切前要处理的流程" + }, + { + "name": "Add_Event_title_7", + "value": "添加完成复制前可触发的回调" + }, + { + "name": "Add_Event_title_7_desc", + "value": "通过onCopy回调,来添加复制前要处理的流程" + }, + { + "name": "Set_User_PresetText_Styles_title", + "value": "设置用户预设的文本样式" + }, + { + "name": "Set_User_PresetText_Styles_desc", + "value": "通过setTypingStyle设置用户预设的文本样式" + }, + { + "name": "Backplane_Highlighting_title", + "value": "设置组件内的内容选中时部分背板高亮" + }, + { + "name": "Backplane_Highlighting_desc", + "value": "通过setSelection设置组件内的内容选中时部分背板高亮" + }, + { + "name": "Add_TextContent_title", + "value": "添加文本内容" + }, + { + "name": "Add_TextContent_desc", + "value": "除了直接在组件内输入内容,也可以通过addTextSpan添加文本内容" + }, + { + "name": "Add_ImageContent_title", + "value": "添加图片内容" + }, + { + "name": "Add_ImageContent_desc", + "value": "通过addImageSpan添加图片内容" + }, + { + "name": "Add_Builder_DecoratorContent_title", + "value": "添加@Builder装饰器修饰的内容" + }, + { + "name": "Add_Builder_DecoratorContent_desc", + "value": "通过addBuilderSpan添加@Builder装饰器修饰的内容" + }, + { + "name": "Add_SymbolSpanContent_title", + "value": "添加SymbolSpan内容" + }, + { + "name": "Add_SymbolSpanContent_desc", + "value": "可通过addSymbolSpan添加Symbol内容。此接口可用于特殊符号添加与展示,例如在编辑学术论文时,此接口可用于添加各种数学符号" + }, + { + "name": "Get_GraphicInfo_In_Component_title", + "value": "获取组件内图文信息" + }, + { + "name": "Get_GraphicInfo_In_Component_desc", + "value": "可通过getSpans获取组件内所有图文内容的信息,包括图文的内容、id、样式、位置等信息。获取内容位置信息后,可对指定范围内容进行样式的更新" + }, + { + "name": "Create_Apply_StyledString_MutableStyledString_title", + "value": "创建并应用StyledString和MutableStyledString" + }, + { + "name": "Create_Apply_StyledString_MutableStyledString_desc", + "value": "可以通过TextController提供的setStyledString方法,将属性字符串附加到文本组件,并推荐在onPageShow或者文本组件的onAppear回调中触发绑定" + }, + { + "name": "pageIndex_StyledString", + "value": "属性字符串 StyledString/MutableStyledString" + }, + { + "name": "CreatStyledString_title", + "value": "创建并应用StyledString和MutableStyledString" + }, + { + "name": "CreatStyledString_description", + "value": "可以通过TextController提供的setStyledString方法,将属性字符串附加到文本组件,并推荐在onPageShow或者文本组件的onAppear回调中触发绑定。" + }, + { + "name": "StyledStringStyle_title", + "value": "设置文本样式" + }, + { + "name": "StyledStringStyle_description", + "value": "属性字符串目前提供了多种Style对象,包括TextStyle、TextShadowStyle、DecorationStyle、BaselineOffsetStyle、LineHeightStyle、LetterSpacingStyle,用于设置文本的各类样式。" + }, + { + "name": "StyledStringStyle_title_1", + "value": "创建及应用文本字体样式对象(TextStyle)" + }, + { + "name": "StyledStringStyle_title_2", + "value": "创建及应用文本阴影对象(TextShadowStyle)" + }, + { + "name": "StyledStringStyle_title_3", + "value": "创建及应用文本装饰线对象(DecorationStyle)" + }, + { + "name": "StyledStringStyle_title_4", + "value": "创建及应用文本基线偏移量对象(BaselineOffsetStyle)" + }, + { + "name": "StyledStringStyle_title_5", + "value": "创建及应用文本行高对象(LineHeightStyle)" + }, + { + "name": "StyledStringStyle_title_6", + "value": "创建及应用文本字符间距对象(LetterSpacingStyle)" + }, + { + "name": "StyledStringParagraphStyle_title", + "value": "设置段落样式" + }, + { + "name": "StyledStringParagraphStyle_description", + "value": "可通过ParagraphStyle设置段落样式布局。" + }, + { + "name": "StyledStringImageAttachment_title", + "value": "通过ImageAttachment来添加图片" + }, + { + "name": "StyledStringImageAttachment_description", + "value": "将图片和文本附加到同一个MutableStyledString对象上,并实现图文混排。" + }, + { + "name": "TStyledStringGestureStyle_title", + "value": "设置事件" + }, + { + "name": "StyledStringGestureStyle_description", + "value": "除了初始化属性字符串对象即初始样式对象,亦可通过setStyle接口再叠加新样式或更新已有样式,同时需要在附加的文本组件controller上主动触发更新绑定的属性字符串。" + }, + { + "name": "StyledStringHtml_title", + "value": "格式转换" + }, + { + "name": "StyledStringHtml_description", + "value": "可以通过toHtml、fromHtml接口实现属性字符串与HTML格式字符串的相关转换,当前支持转换的HTML标签范围:

。" + }, + { + "name": "StyledStringSceneExample_title", + "value": "场景示例" + }, + { + "name": "StyledStringSceneExample_description", + "value": "通过ParagraphStyle、LineHeightStyle、TextStyle对象展示了会员过期提示的效果。" + }, + { + "name": "pageIndex_symbolGlyphSpan", + "value": "图标小符号(SymbolGlyph/SymbolSpan)" + }, + { + "name": "CreatSymbolGlyph_title", + "value": "创建图标" + }, + { + "name": "CreatSymbolGlyph_description", + "value": "SymbolGlyph通过$r引用Resource资源来创建,目前仅支持系统预置的Symbol资源名。" + }, + { + "name": "SymbolGlyphSpanAddToText_title", + "value": "添加到文本中" + }, + { + "name": "SymbolGlyphSpanAddToText_description", + "value": "SymbolSpan可作为Text的子组件用于显示图标小符号。可以在一个Text组件内添加多个SymbolSpan,从而展示一串连续的图标。" + }, + { + "name": "SymbolGlyphSpanCustomIconAnimation_title", + "value": "自定义图标动效" + }, + { + "name": "SymbolGlyphSpanCustomIconAnimation_description", + "value": "相较于effectStrategy属性在启动时即触发动效,可以通过以下两种方式来控制动效的播放状态,以及选择更多样化的动效策略。" + }, + { + "name": "SymbolGlyphSpanAddEvent_title", + "value": "添加事件" + }, + { + "name": "SymbolGlyphSpanAddEvent_description", + "value": "SymbolGlyph组件可以添加通用事件,例如绑定onClick、onTouch等事件来响应操作。" + }, + { + "name": "SymbolGlyphSpanSceneExample_title", + "value": "场景示例" + }, + { + "name": "SymbolGlyphSpanSceneExample_description", + "value": "该示例通过symbolEffect、fontSize、fontColor属性展示了播放列表的效果。" + }, + { + "name": "SymbolGlyphSpanAddToText_title_1", + "value": "创建SymbolSpan" + }, + { + "name": "SymbolGlyphSpanAddToText_title_2", + "value": "通过fontSize属性设置SymbolSpan的大小" + }, + { + "name": "SymbolGlyphSpanAddToText_title_3", + "value": "通过fontWeight属性设置SymbolSpan组件的粗细" + }, + { + "name": "SymbolGlyphSpanAddToText_title_4", + "value": "通过fontColor属性设置SymbolSpan的颜色" + }, + { + "name": "SymbolGlyphSpanAddToText_title_5", + "value": "通过renderingStrategy属性设置SymbolSpan的渲染策略" + }, + { + "name": "SymbolGlyphSpanAddToText_title_6", + "value": "通过effectStrategy属性设置SymbolSpan的动效策略" + }, + { + "name": "SymbolGlyphSpanCustomIconAnimation_title_1", + "value": "通过设置SymbolEffect属性,可以同时配置SymbolGlyph的动效策略和播放状态" + }, + { + "name": "SymbolGlyphSpanCustomIconAnimation_title_2", + "value": "通过设置SymbolEffect属性,可以同时指定SymbolGlyph的动画效果策略及其播放触发条件" + }, + { + "name": "ListenTextBoxEvents_NDK_title", + "value": "输入框文本事件监听" + }, + { + "name": "ListenTextBoxEvents_NDK_desc", + "value": "输入框包含多种交互行为,开发者可注册事件监听并获取状态" + }, + { + "name": "TextDrawingDisplay_NDK_title", + "value": "Text组件的文本绘制与显示" + }, + { + "name": "TextDrawingDisplay_NDK_desc", + "value": "Text组件提供了接口NODE_TEXT_CONTENT_WITH_STYLED_STRING,可以直接渲染方舟文本引擎生成的文本" + }, + { + "name": "StyledStringHtml_Button_1", + "value": "添加属性字符串" + }, + { + "name": "StyledStringHtml_Button_2", + "value": "toHtml" + }, + { + "name": "StyledStringHtml_Button_3", + "value": "fromHtml" + }, + { + "name": "StyledStringImageAttachment_Button_1", + "value": "点击查看商品卡片" + }, + { + "name": "StyledStringParagraphStyle_Button_1", + "value": "change" + }, + { + "name": "StyledStringSceneExample_Button_1", + "value": "限时4.88元 立即续费" + }, + { + "name": "AddBuilderDecoratorContent_Button_1", + "value": "addBuilderSpan" + }, + { + "name": "AddImageContent_Button_1", + "value": "addImageSpan" + }, + { + "name": "AddSymbolSpanContent_Button_1", + "value": "addSymbolSpan" + }, + { + "name": "AddTextContent_Button_1", + "value": "addTextSpan" + }, + { + "name": "BackplaneHighlighting_Button_1", + "value": "setSelection(0,2)" + }, + { + "name": "GetGraphicInfoInComponent_Button_1", + "value": "getSpans" + }, + { + "name": "SetUserPresetTextStyles_Button_1", + "value": "setTypingStyle" + }, + { + "name": "SymbolGlyphSpanCustomIconAnimation_Button_1", + "value": "关闭" + }, + { + "name": "SymbolGlyphSpanCustomIconAnimation_Button_2", + "value": "播放" + }, + { + "name": "SymbolGlyphSpanCustomIconAnimation_Button_3", + "value": "trigger" + }, + { + "name": "CursorAvoidance_Button_1", + "value": "CaretPosition++: " + }, + { + "name": "CursorAvoidance_Button_2", + "value": "CaretPosition--: " + }, + { + "name": "CursorAvoidance_Button_3", + "value": "SetCaretPosition: " + }, + { + "name": "LoginRegisterPage_Button_3", + "value": "Sign in" + }, + { + "name": "CreateApply_Text_1", + "value": "运动45分钟" + }, + { + "name": "CreateApply_Text_2", + "value": "运动35分钟" + }, + { + "name": "StyledStringHtml_Text_1", + "value": "属性字符串" + }, + { + "name": "StyledStringImageAttachment_Text_1", + "value": "\n品牌相纸 高清冲印30张\n限时直降5.15元 限量增送" + }, + { + "name": "StyledStringImageAttachment_Text_2", + "value": "\n¥16.21 3000+人好评" + }, + { + "name": "StyledStringParagraphStyle_Text_1", + "value": "段落标题\n正文第一段落开始0123456789正文第一段落结束。" + }, + { + "name": "StyledStringSceneExample_Text_1", + "value": "您的豪华钻石已过期1天\n续费可继续享受会员专属权益" + }, + { + "name": "StyledStringSceneExample_Text_2", + "value": "\n¥4.88¥15" + }, + { + "name": "StyledStringSceneExample_Text_3", + "value": "\n02时06分后将失去该优惠" + }, + { + "name": "StyledStringStyle_Text_1", + "value": "运动35分钟 目标达成" + }, + { + "name": "StyledStringStyle_Text_2", + "value": "运动35分钟" + }, + { + "name": "StyledStringStyle_Text_3", + "value": "运动35分钟" + }, + { + "name": "StyledStringStyle_Text_4", + "value": "运动35分钟" + }, + { + "name": "StyledStringStyle_Text_5", + "value": "运动35分钟\n顶顶顶\n得到" + }, + { + "name": "StyledStringStyle_Text_6", + "value": "运动35分钟" + }, + { + "name": "AddBuilderDecoratorContent_Text_1", + "value": "文本文档.txt" + }, + { + "name": "AddBuilderDecoratorContent_Text_2", + "value": "123.45KB" + }, + { + "name": "AddBuilderDecoratorContent_Text_3", + "value": "点击按钮在此处添加builderspan。" + }, + { + "name": "AddEvent_Text_1", + "value": "onReady回调内容是组件内预置文本。" + }, + { + "name": "AddEvent_Text_2", + "value": "改变内容选择区域或编辑状态下的光标位置,触发onSelectionChange回调。" + }, + { + "name": "AddEvent_Text_3", + "value": "触发了onSelectionChange回调,起始范围信息为:(" + }, + { + "name": "AddEvent_Text_4", + "value": "查看回调内容:" + }, + { + "name": "AddEvent_Text_5", + "value": "组件内图文变化前,触发回调。\n图文变化后,触发回调。" + }, + { + "name": "AddEvent_Text_6", + "value": "组件内图文变化前,触发回调:\n" + }, + { + "name": "AddEvent_Text_7", + "value": "\n图文变化后,触发回调:\nrangeBefore:" + }, + { + "name": "AddEvent_Text_8", + "value": "输入法输入内容前,触发回调。\n输入法完成输入后,触发回调。" + }, + { + "name": "AddEvent_Text_9", + "value": "输入法输入内容前,触发aboutToIMEInput回调:\n" + }, + { + "name": "AddEvent_Text_10", + "value": "输入法完成输入后,触发onDidIMEInput回调:\n" + }, + { + "name": "AddEvent_Text_11", + "value": "对此处文本进行复制粘贴操作可触发对应回调。" + }, + { + "name": "AddEvent_Text_12", + "value": "触发onPaste回调\n" + }, + { + "name": "AddEvent_Text_13", + "value": "对此处文本进行复制粘贴操作可触发对应回调。" + }, + { + "name": "AddEvent_Text_14", + "value": "触发onCut回调\n" + }, + { + "name": "AddEvent_Text_15", + "value": "对此处文本进行复制粘贴操作可触发对应回调。" + }, + { + "name": "AddEvent_Text_16", + "value": "触发onCopy回调\n" + }, + { + "name": "AddImageContent_Text_1", + "value": "点击按钮在此处添加image。" + }, + { + "name": "AddSymbolSpanContent_Text_1", + "value": "点击按钮在此处添加symbol。" + }, + { + "name": "AddTextContent_Text_1", + "value": "点击按钮在此处添加text。" + }, + { + "name": "AddTextContent_Text_2", + "value": "新添加一段文字。" + }, + { + "name": "BackplaneHighlighting_Text_1", + "value": "点击按钮在此处选中0-2位置的文本。" + }, + { + "name": "CreateRichEditor_Text_1", + "value": "创建使用属性字符串构建的RichEditor组件。" + }, + { + "name": "CreateRichEditor_Text_2", + "value": "创建不使用属性字符串构建的RichEditor组件。" + }, + { + "name": "GetGraphicInfoInComponent_Text_1", + "value": "点击按钮获取此处span信息。" + }, + { + "name": "GetGraphicInfoInComponent_Text_2", + "value": "查看getSpans返回值:" + }, + { + "name": "SetAttributes_Text_1", + "value": "剪切" + }, + { + "name": "SetAttributes_Text_2", + "value": "复制" + }, + { + "name": "SetAttributes_Text_3", + "value": "粘贴" + }, + { + "name": "SetAttributes_Text_4", + "value": "组件设置了自定义菜单,长按可触发。" + }, + { + "name": "SetAttributes_Text_5", + "value": "组件设置了光标手柄颜色。" + }, + { + "name": "SetAttributes_Text_6", + "value": "此处为提示文本..." + }, + { + "name": "SetAttributes_Text_7", + "value": "组件设置了最大行数\n超出内容将会以滚动显示\n超出1行\n超出2行\n超出3行\n超出4行" + }, + { + "name": "SetAttributes_Text_8", + "value": "组件设置了最大字符数:7" + }, + { + "name": "SetAttributes_Text_9", + "value": "这是一段文本,用来展示选中菜单" + }, + { + "name": "SetUserPresetTextStyles_Text_1", + "value": "点击按钮,改变预设文本样式。" + }, + { + "name": "SymbolAddToText_Text_1", + "value": "单色" + }, + { + "name": "SymbolAddToText_Text_2", + "value": "多色" + }, + { + "name": "SymbolAddToText_Text_3", + "value": "分层" + }, + { + "name": "SymbolAddToText_Text_4", + "value": "无动效" + }, + { + "name": "SymbolAddToText_Text_5", + "value": "整体缩放动效" + }, + { + "name": "SymbolAddToText_Text_6", + "value": "层级动效" + }, + { + "name": "SymbolCustomIconAnimation_Text_1", + "value": "可变颜色动效" + }, + { + "name": "SymbolCustomIconAnimation_Text_2", + "value": "弹跳动效" + }, + { + "name": "SymbolSceneExample_Text_1", + "value": "顺序播放" + }, + { + "name": "SymbolSceneExample_Text_2", + "value": "单曲循环" + }, + { + "name": "SymbolSceneExample_Text_3", + "value": "随机播放" + }, + { + "name": "SymbolSceneExample_Text_4", + "value": "当前播放列表" + }, + { + "name": "SymbolSceneExample_Text_5", + "value": "歌曲一" + }, + { + "name": "SymbolSceneExample_Text_6", + "value": "歌曲二" + }, + { + "name": "SymbolSceneExample_Text_7", + "value": "歌曲三" + }, + { + "name": "SymbolSceneExample_Text_8", + "value": "歌曲四" + }, + { + "name": "SymbolSceneExample_Text_9", + "value": "歌曲五" + }, + { + "name": "SymbolSceneExample_Text_10", + "value": "歌曲六" + }, + { + "name": "SymbolSceneExample_Text_11", + "value": "歌曲七" + }, + { + "name": "SymbolSceneExample_Text_12", + "value": "关闭" + }, + { + "name": "AIMenu_Text_1", + "value": "电话号码:(86) (755) ******** \n \n 链接:www.********.com \n \n 邮箱:***@example.com\n \n 地址:XX省XX市XX区XXXX \n \n 时间:XX年XX月XX日XXXX" + }, + { + "name": "CreateText_Text_1", + "value": "我是一段文本" + }, + { + "name": "SelectMenu_Text_1", + "value": "拦截 id: customMenu2 start:" + }, + { + "name": "SelectMenu_Text_2", + "value": "拦截 COPY start:" + }, + { + "name": "SelectMenu_Text_3", + "value": "不拦截 SELECT_ALL start:" + }, + { + "name": "SelectMenu_Text_4", + "value": "自定义选择菜单弹出时触发该回调" + }, + { + "name": "SelectMenu_Text_5", + "value": "自定义选择菜单关闭时触发该回调" } ] } \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/resources/base/profile/main_pages.json b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/resources/base/profile/main_pages.json index 1898d94f58..2e5e78d67e 100644 --- a/code/DocsSample/ArkUISample/TextComponent/entry/src/main/resources/base/profile/main_pages.json +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/main/resources/base/profile/main_pages.json @@ -1,5 +1,12 @@ { "src": [ - "pages/Index" + "pages/Index", + "pages/propertyString/CreateApply", + "pages/propertyString/StyledStringStyle", + "pages/propertyString/StyledStringParagraphStyle", + "pages/propertyString/StyledStringImageAttachment", + "pages/propertyString/StyledStringGestureStyle", + "pages/propertyString/StyledStringHtml", + "pages/propertyString/StyledStringSceneExample" ] -} +} \ No newline at end of file diff --git a/code/DocsSample/ArkUISample/TextComponent/entry/src/ohosTest/ets/test/index.test.ets b/code/DocsSample/ArkUISample/TextComponent/entry/src/ohosTest/ets/test/index.test.ets index 74242ee433..0587758e31 100644 --- a/code/DocsSample/ArkUISample/TextComponent/entry/src/ohosTest/ets/test/index.test.ets +++ b/code/DocsSample/ArkUISample/TextComponent/entry/src/ohosTest/ets/test/index.test.ets @@ -13,12 +13,11 @@ * limitations under the License. */ -import { describe, it, expect, beforeAll } from '@ohos/hypium'; +import { describe, it, expect, beforeAll, Level } from '@ohos/hypium'; // 导入测试依赖kit -import { abilityDelegatorRegistry, Driver, ON, MatchPattern } from '@kit.TestKit'; +import { abilityDelegatorRegistry, Driver, ON, MatchPattern, On, Component } from '@kit.TestKit'; import { UIAbility, Want } from '@kit.AbilityKit'; - const delegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); const bundleName = abilityDelegatorRegistry.getArguments().bundleName; let abilityDelegator: abilityDelegatorRegistry.AbilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); @@ -50,8 +49,9 @@ export default function IndexTest() { * @tc.number UiTest_001 * @tc.name testCreateText * @tc.desc 测试文本创建场景示例 + * @tc.level: Level 1 */ - it('testCreateText', 0, async (done: Function) => { + it('testCreateText', Level.LEVEL1, async (done: Function) => { console.info('uitest: testCreateText begin'); let driver = Driver.create(); let buttonComponent = await driver.findComponent(ON.text('Text', MatchPattern.CONTAINS)); @@ -62,8 +62,10 @@ export default function IndexTest() { expect(sampleButton === null).assertFalse(); await sampleButton.click(); - let textString = await driver.findComponent(ON.text('This is a text string', MatchPattern.CONTAINS)); - let textResource = await driver.findComponent(ON.text('module description', MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.CreateText_Text_1')); + let textString = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.module_desc')); + let textResource = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); expect(textString === null).assertFalse(); expect(textResource === null).assertFalse(); await driver.pressBack(); @@ -74,10 +76,11 @@ export default function IndexTest() { /** * @tc.number UiTest_002 - * @tc.name testCreateText + * @tc.name testTextSpan * @tc.desc 测试文本段创建场景示例 + * @tc.level: Level 1 */ - it('testTextSpan', 0, async (done: Function) => { + it('testTextSpan', Level.LEVEL1, async (done: Function) => { console.info('uitest: testTextSpan begin'); let driver = Driver.create(); let componentButton = await driver.findComponent(ON.text('Text', MatchPattern.CONTAINS)); @@ -90,13 +93,28 @@ export default function IndexTest() { str = await getResourceString($r('app.string.TextSpan_textContent_2')); let textSpan = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.TextSpan_textContent_3')); + let textColorSpan1 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); str = await getResourceString($r('app.string.TextSpan_textContent_4')); - let textColorSpan = await driver.findComponent(ON.text('我是Span2', MatchPattern.CONTAINS)); + let textColorSpan2 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.TextSpan_textContent_5')); + let textColorSpan3 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + + let uppercase = await driver.findComponent(ON.text('I am Upper-span', MatchPattern.CONTAINS)); + expect(uppercase === null).assertFalse(); + + let textBeforeClick = await driver.findComponent(ON.text('I am Upper-span2', MatchPattern.CONTAINS)); + expect(textBeforeClick === null).assertFalse(); + await textBeforeClick.click(); str = await getResourceString($r('app.string.TextSpan_textContent_6')); - let textCase = await driver.findComponent(ON.text('I am Upper-span', MatchPattern.CONTAINS)); + let textAfterClick = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(textSpan === null).assertFalse(); - expect(textColorSpan === null).assertFalse(); - expect(textCase === null).assertFalse(); + expect(textColorSpan1 === null).assertFalse(); + expect(textColorSpan2 === null).assertFalse(); + expect(textColorSpan3 === null).assertFalse(); + expect(textColorSpan3 === null).assertFalse(); + expect(textAfterClick === null).assertFalse(); await driver.pressBack(); await driver.pressBack(); console.info('uitest: testTextSpan end'); @@ -107,8 +125,9 @@ export default function IndexTest() { * @tc.number UiTest_003 * @tc.name testCustomTextStyle * @tc.desc 测试自定义文本样式场景示例 + * @tc.level: Level 1 */ - it('testCustomTextStyle', 0, async (done: Function) => { + it('testCustomTextStyle', Level.LEVEL1, async (done: Function) => { console.info('uitest: testCustomTextStyle begin'); let driver = Driver.create(); let buttonComponent = await driver.findComponent(ON.text('Text', MatchPattern.CONTAINS)); @@ -125,9 +144,85 @@ export default function IndexTest() { let textCenter = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); str = await getResourceString($r('app.string.TextAlign_End')); let textRight = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + + let longText1 = await driver.findComponent(ON.text( + 'This is the setting of textOverflow to Clip text content This is the setting of textOverflow ' + + 'to None text content. This is the setting of textOverflow to Clip text content This is the setting ' + + 'of textOverflow to None text content.', MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.CustomTextStyle_textContent_1')); + let longText2 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.CustomTextStyle_textContent_2')); + let longText3 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.CustomTextStyle_textContent_8')); + let longText4 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + + let customLineHeight = await driver.findComponent(ON.text( + 'This is the text with the line height set. This is the text with the line height set.', + MatchPattern.CONTAINS)); + let customTextLineAndColor = await driver.findComponent(ON.text('This is the text', MatchPattern.CONTAINS)); + + let scrollComponent: Component = await driver.waitForComponent(ON.id('scroll_'), 1000); + let scrollCenter = await scrollComponent.getBoundsCenter(); + await driver.swipe(scrollCenter.x, scrollCenter.y + 400, scrollCenter.x, scrollCenter.y - 400, 3000); + await driver.waitForIdle(500, 500); + + let customTextBaselineOffset1 = + await driver.findComponent(ON.text('This is the text content with baselineOffset 0.', MatchPattern.CONTAINS)); + let customTextBaselineOffset2 = + await driver.findComponent(ON.text('This is the text content with baselineOffset 30.', MatchPattern.CONTAINS)); + let customTextBaselineOffset3 = + await driver.findComponent(ON.text('This is the text content with baselineOffset -20.', MatchPattern.CONTAINS)); + let customTextLetterSpace1 = + await driver.findComponent(ON.text('This is the text content with letterSpacing 0.', MatchPattern.CONTAINS)); + let customTextLetterSpace2 = + await driver.findComponent(ON.text('This is the text content with letterSpacing 3.', MatchPattern.CONTAINS)); + let customTextLetterSpace3 = + await driver.findComponent(ON.text('This is the text content with letterSpacing -1.', MatchPattern.CONTAINS)); + + await driver.swipe(scrollCenter.x, scrollCenter.y + 400, scrollCenter.x, scrollCenter.y - 400, 3000); + await driver.waitForIdle(500, 500); + + str = await getResourceString($r('app.string.CustomTextStyle_textContent_3')); + let customTheSizeOfText1 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.CustomTextStyle_textContent_4')); + let customTheSizeOfText2 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.CustomTextStyle_textContent_5')); + let customTheSizeOfText3 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.CustomTextStyle_textContent_6')); + let customTheSizeOfText4 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + let textCase1 = await driver.findComponent(ON.text('This is the text content with textCase set to Normal.', + MatchPattern.CONTAINS)); + let textCase2 = await driver.findComponent(ON.text('This is the text content with textCase set to LowerCase.', + MatchPattern.CONTAINS)); + let textCase3 = await driver.findComponent(ON.text('This is the text content with textCase set to UpperCase.', + MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.CustomTextStyle_textContent_7')); + let copyOption = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(textLeft === null).assertFalse(); expect(textCenter === null).assertFalse(); expect(textRight === null).assertFalse(); + expect(longText1 === null).assertFalse(); + expect(longText2 === null).assertFalse(); + expect(longText3 === null).assertFalse(); + expect(longText4 === null).assertFalse(); + expect(customLineHeight === null).assertFalse(); + expect(customTextLineAndColor === null).assertFalse(); + expect(customTextBaselineOffset1 === null).assertFalse(); + expect(customTextBaselineOffset2 === null).assertFalse(); + expect(customTextBaselineOffset3 === null).assertFalse(); + expect(customTextLetterSpace1 === null).assertFalse(); + expect(customTextLetterSpace2 === null).assertFalse(); + expect(customTextLetterSpace3 === null).assertFalse(); + expect(customTheSizeOfText1 === null).assertFalse(); + expect(customTheSizeOfText2 === null).assertFalse(); + expect(customTheSizeOfText3 === null).assertFalse(); + expect(customTheSizeOfText4 === null).assertFalse(); + expect(textCase1 === null).assertFalse(); + expect(textCase2 === null).assertFalse(); + expect(textCase3 === null).assertFalse(); + expect(copyOption === null).assertFalse(); + await driver.pressBack(); await driver.pressBack(); console.info('uitest: testCustomTextStyle end'); @@ -138,8 +233,9 @@ export default function IndexTest() { * @tc.number UiTest_004 * @tc.name testTextAddEvent * @tc.desc 测试文本增加事件场景示例 + * @tc.level: Level 1 */ - it('testTextAddEvent', 0, async (done: Function) => { + it('testTextAddEvent', Level.LEVEL1, async (done: Function) => { console.info('uitest: testTextAddEvent begin'); let driver = Driver.create(); let buttonComponent = await driver.findComponent(ON.text('Text', MatchPattern.CONTAINS)); @@ -155,6 +251,7 @@ export default function IndexTest() { await textClick.click(); str = await getResourceString($r('app.string.TextAddEvent_textContent_2')); expect(await textClick.getText() === str).assertTrue(); + await driver.pressBack(); await driver.pressBack(); console.info('uitest: testTextAddEvent end'); @@ -163,10 +260,65 @@ export default function IndexTest() { /** * @tc.number UiTest_005 + * @tc.name testSelectMenu + * @tc.desc 测试设置选中菜单场景示例 + * @tc.level: Level 1 + */ + it('testSelectMenu', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testSelectMenu begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('Text', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.SetSelectionMenu_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + str = await getResourceString($r('app.string.SelectMenu_textContent_1')); + let selectMenuText = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(selectMenuText === null).assertFalse(); + + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testSelectMenu end'); + done(); + }) + + /** + * @tc.number UiTest_006 + * @tc.name testAIMenu + * @tc.desc 测试设置AI菜单场景示例 + * @tc.level: Level 1 + */ + it('testAIMenu', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testAIMenu begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('Text', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.SetUpAIMenu_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + str = await getResourceString($r('app.string.AIMenu_Text_1')); + let aiMenuText = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(aiMenuText === null).assertFalse(); + + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testAIMenu end'); + done(); + }) + + /** + * @tc.number UiTest_007 * @tc.name testHotSearch * @tc.desc 测试热搜榜场景示例 + * @tc.level: Level 1 */ - it('testHotSearch', 0, async (done: Function) => { + it('testHotSearch', Level.LEVEL1, async (done: Function) => { console.info('uitest: testHotSearch begin'); let driver = Driver.create(); let buttonComponent = await driver.findComponent(ON.text('Text', MatchPattern.CONTAINS)); @@ -185,6 +337,27 @@ export default function IndexTest() { expect(textHotSearch2 === null).assertFalse(); expect(textHotSearch3 === null).assertFalse(); expect(textHotSearch4 === null).assertFalse(); + + str = await getResourceString($r('app.string.TextHotSearch_textContent_1')); + let hotText1 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.TextHotSearch_textContent_2')); + let hotText2 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.TextHotSearch_textContent_3')); + let hotText3 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.TextHotSearch_textContent_4')); + let hotText4 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.TextHotSearch_textContent_5')); + let hotText5 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.TextHotSearch_textContent_6')); + let hotText6 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + + expect(hotText1 === null).assertFalse(); + expect(hotText2 === null).assertFalse(); + expect(hotText3 === null).assertFalse(); + expect(hotText4 === null).assertFalse(); + expect(hotText5 === null).assertFalse(); + expect(hotText6 === null).assertFalse(); + await driver.pressBack(); await driver.pressBack(); console.info('uitest: testHotSearch end'); @@ -192,11 +365,12 @@ export default function IndexTest() { }) /** - * @tc.number UiTest_006 + * @tc.number UiTest_008 * @tc.name testCreateTextInput * @tc.desc 测试创建文本输入框场景示例 + * @tc.level: Level 1 */ - it('testCreateTextInput', 0, async (done: Function) => { + it('testCreateTextInput', Level.LEVEL1, async (done: Function) => { console.info('uitest: testCreateTextInput begin'); let driver = Driver.create(); let buttonComponent = await driver.findComponent(ON.text('TextInput', MatchPattern.CONTAINS)); @@ -214,8 +388,10 @@ export default function IndexTest() { expect(textInput === null).assertFalse(); expect(textArea === null).assertFalse(); expect(textArea2 === null).assertFalse(); + await textInput.inputText('textInput'); await textArea.inputText('textArea'); + await driver.pressBack(); await driver.pressBack(); console.info('uitest: testCreateTextInput end'); @@ -223,12 +399,13 @@ export default function IndexTest() { }) /** - * @tc.number UiTest_007 + * @tc.number UiTest_009-1 * @tc.name testSetTextInputType * @tc.desc 测试设置文本输入框类型场景示例 + * @tc.level: Level 1 */ - it('testSetTextInputType', 0, async (done: Function) => { - console.info('uitest: testSetTextInputType begin'); + it('testSetTextInputType1', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testSetTextInputType1 begin'); let driver = Driver.create(); let buttonComponent = await driver.findComponent(ON.text('TextInput', MatchPattern.CONTAINS)); expect(buttonComponent === null).assertFalse(); @@ -240,22 +417,69 @@ export default function IndexTest() { let textInput1 = await driver.findComponent(ON.id('Normal')); let textInput2 = await driver.findComponent(ON.id('Password')); + let textInput3 = await driver.findComponent(ON.id('Email')); + let textInput4 = await driver.findComponent(ON.id('Number')); + expect(textInput1 === null).assertFalse(); expect(textInput2 === null).assertFalse(); - await textInput1.inputText('Normal'); - await textInput2.inputText('Password'); + expect(textInput3 === null).assertFalse(); + expect(textInput4 === null).assertFalse(); + + await textInput1.inputText('aaa'); + await textInput2.inputText('aaa'); + await textInput3.inputText('123456@example.com'); + await textInput4.inputText('123456789'); + await driver.pressBack(); await driver.pressBack(); - console.info('uitest: testSetTextInputType end'); + + console.info('uitest: testSetTextInputType1 end'); done(); }) /** - * @tc.number UiTest_008 + * @tc.number UiTest_009-2 + * @tc.name testSetTextInputType + * @tc.desc 测试设置文本输入框类型场景示例 + * @tc.level: Level 1 + */ + it('testSetTextInputType2', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testSetTextInputType2 begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('TextInput', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.SetTextInputType_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let textInput5 = await driver.findComponent(ON.id('PhoneNumber')); + let textInput6 = await driver.findComponent(ON.id('NUMBER_DECIMAL')); + let textInput7 = await driver.findComponent(ON.id('URL')); + + expect(textInput5 === null).assertFalse(); + expect(textInput6 === null).assertFalse(); + expect(textInput7 === null).assertFalse(); + + await textInput5.inputText('+86 123-0123-0456'); + await textInput6.inputText('9.15'); + await textInput7.inputText('http://www.example.com'); + + await driver.pressBack(); + await driver.pressBack(); + + console.info('uitest: testSetTextInputType2 end'); + done(); + }) + + /** + * @tc.number UiTest_010 * @tc.name testCustomTextInputStyle * @tc.desc 测试自定义文本输入框样式场景示例 + * @tc.level: Level 1 */ - it('testCustomTextInputStyle', 0, async (done: Function) => { + it('testCustomTextInputStyle', Level.LEVEL1, async (done: Function) => { console.info('uitest: testCustomTextInputStyle begin'); let driver = Driver.create(); let buttonComponent = await driver.findComponent(ON.text('TextInput', MatchPattern.CONTAINS)); @@ -277,11 +501,12 @@ export default function IndexTest() { }) /** - * @tc.number UiTest_009 + * @tc.number UiTest_011 * @tc.name testTextInputAddEvent * @tc.desc 测试文本输入框增加事件场景示例 + * @tc.level: Level 1 */ - it('testTextInputAddEvent', 0, async (done: Function) => { + it('testTextInputAddEvent', Level.LEVEL1, async (done: Function) => { console.info('uitest: testTextInputAddEvent begin'); let driver = Driver.create(); let buttonComponent = await driver.findComponent(ON.text('TextInput', MatchPattern.CONTAINS)); @@ -303,16 +528,154 @@ export default function IndexTest() { }) /** - * @tc.number UiTest_010 + * @tc.number UiTest_012 + * @tc.name testTextInputSelectMenu + * @tc.desc 测试设置选中菜单场景示例 + * @tc.level: Level 1 + */ + it('testTextInputSelectMenu', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testTextInputSelectMenu begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('TextInput', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.SelectionMenu_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + str = await getResourceString($r('app.string.SelectMenu_textContent_1')); + let selectMenuText = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(selectMenuText === null).assertFalse(); + + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testTextInputSelectMenu end'); + done(); + }) + + /** + * @tc.number UiTest_013 + * @tc.name testTextInputAutoFill + * @tc.desc 自动填充 + * @tc.level: Level 1 + */ + it('testTextInputAutoFill', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testTextInputAutoFill begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('TextInput', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.Auto_Fill')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testTextInputAutoFill end'); + done(); + }) + + /** + * @tc.number UiTest_014 + * @tc.name testSetOmissionProperty + * @tc.desc 设置省略属性 + * @tc.level: Level 1 + */ + it('testSetOmissionProperty', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testSetOmissionProperty begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('TextInput', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.Set_Omission_Property')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + str = await getResourceString($r('app.string.Set_Omission_Property_textContent')); + let textInput = await driver.findComponent(ON.type('TextInput', MatchPattern.CONTAINS)); + expect(textInput === null).assertFalse(); + await textInput.click(); + let selectMenuText = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(selectMenuText === null).assertFalse(); + + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testSetOmissionProperty end'); + done(); + }) + + /** + * @tc.number UiTest_015 + * @tc.name testKeyboardAvoidance + * @tc.desc 测试键盘避让场景示例 + * @tc.level: Level 1 + */ + it('testKeyboardAvoidance', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testKeyboardAvoidance begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('TextInput', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.KeyboardAvoidance_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let textInput = await driver.findComponent(ON.type('TextInput')); + await textInput.inputText('textInput'); + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testKeyboardAvoidance end'); + done(); + }) + + /** + * @tc.number UiTest_016 + * @tc.name testCursorAvoidance + * @tc.desc 光标避让 + * @tc.level: Level 1 + */ + it('testCursorAvoidance', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testCursorAvoidance begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('TextInput', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let scrollComponent: Component = await driver.waitForComponent(ON.id('scroll_'), 1000); + let scrollCenter = await scrollComponent.getBoundsCenter(); + await driver.swipe(scrollCenter.x, scrollCenter.y + 400, scrollCenter.x, scrollCenter.y - 400, 3000); + await driver.waitForIdle(500, 500); + let str = await getResourceString($r('app.string.CursorAvoidance_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let TextArea = await driver.findComponent(ON.type('TextArea')); + await TextArea.click(); + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testCursorAvoidance end'); + done(); + }) + + /** + * @tc.number UiTest_017 * @tc.name testLoginRegisterPage * @tc.desc 测试登录/注册场景示例 + * @tc.level: Level 1 */ - it('testLoginRegisterPage', 0, async (done: Function) => { + it('testLoginRegisterPage', Level.LEVEL1, async (done: Function) => { console.info('uitest: testLoginRegisterPage begin'); let driver = Driver.create(); let buttonComponent = await driver.findComponent(ON.text('TextInput', MatchPattern.CONTAINS)); expect(buttonComponent === null).assertFalse(); await buttonComponent.click(); + let scrollComponent: Component = await driver.waitForComponent(ON.id('scroll_'), 1000); + let scrollCenter = await scrollComponent.getBoundsCenter(); + await driver.swipe(scrollCenter.x, scrollCenter.y + 400, scrollCenter.x, scrollCenter.y - 400, 3000); + await driver.waitForIdle(500, 500); let str = await getResourceString($r('app.string.LoginRegisterPage_title')); let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); expect(sampleButton === null).assertFalse(); @@ -326,31 +689,925 @@ export default function IndexTest() { await password.inputText('password'); await driver.pressBack(); await driver.pressBack(); + await driver.pressBack(); console.info('uitest: testLoginRegisterPage end'); done(); }) /** - * @tc.number UiTest_011 - * @tc.name testKeyboardAvoidance - * @tc.desc 测试键盘避让场景示例 + * @tc.number UiTest_018 + * @tc.name testCreateRichEditor + * @tc.desc 创建RichEditor组件 + * @tc.level: Level 1 */ - it('testKeyboardAvoidance', 0, async (done: Function) => { - console.info('uitest: testKeyboardAvoidance begin'); + it('testCreateRichEditor', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testCreateRichEditor begin'); let driver = Driver.create(); - let buttonComponent = await driver.findComponent(ON.text('TextInput', MatchPattern.CONTAINS)); + let buttonComponent = await driver.findComponent(ON.text('RichEditor', MatchPattern.CONTAINS)); expect(buttonComponent === null).assertFalse(); await buttonComponent.click(); - let str = await getResourceString($r('app.string.KeyboardAvoidance_title')); + let str = await getResourceString($r('app.string.Create_RichEditor_Component_title')); let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); expect(sampleButton === null).assertFalse(); await sampleButton.click(); + str = await getResourceString($r('app.string.Create_RichEditor_Component_title_1')); + let richEditor1 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.Create_RichEditor_Component_title_2')); + let richEditor2 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(richEditor1 === null).assertFalse(); + expect(richEditor2 === null).assertFalse(); - let textInput = await driver.findComponent(ON.type('TextInput')); - await textInput.inputText('textInput'); await driver.pressBack(); + await driver.waitForIdle(2000, 2000); await driver.pressBack(); - console.info('uitest: testKeyboardAvoidance end'); + console.info('uitest: testCreateRichEditor end'); + done(); + }) + + /** + * @tc.number UiTest_019 + * @tc.name testSetAttributes + * @tc.desc 设置属性 + * @tc.level: Level 1 + */ + it('testSetAttributes', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testSetAttributes begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('RichEditor', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.Set_Attributes_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + let scrollComponent: Component = await driver.waitForComponent(ON.id('scroll_'), 1000); + let scrollCenter = await scrollComponent.getBoundsCenter(); + str = await getResourceString($r('app.string.Set_Attributes_title_1')); + let richEditor1 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.Set_Attributes_title_2')); + let richEditor2 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(richEditor1 === null).assertFalse(); + expect(richEditor2 === null).assertFalse(); + await driver.swipe(scrollCenter.x, scrollCenter.y + 400, scrollCenter.x, scrollCenter.y - 400, 3000); + await driver.waitForIdle(500, 500); + str = await getResourceString($r('app.string.Set_Attributes_title_3')); + let richEditor3 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.Set_Attributes_title_4')); + let richEditor4 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.Set_Attributes_title_5')); + let richEditor5 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.Set_Attributes_title_6')); + let richEditor6 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(richEditor3 === null).assertFalse(); + expect(richEditor4 === null).assertFalse(); + expect(richEditor5 === null).assertFalse(); + expect(richEditor6 === null).assertFalse(); + await driver.waitForIdle(500, 500); + await driver.pressBack(); + await driver.delayMs(1000); + await driver.pressBack(); + await driver.delayMs(1000); + console.info('uitest: testSetAttributes end'); + done(); + }) + + /** + * @tc.number UiTest_020 + * @tc.name testAddEvent + * @tc.desc 添加事件 + * @tc.level: Level 1 + */ + it('testAddEvent', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testAddEvent begin'); + let driver = Driver.create(); + await driver.waitForIdle(500, 500); + let buttonComponent = await driver.findComponent(ON.text('RichEditor', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.Add_Event_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + let scrollComponent: Component = await driver.waitForComponent(ON.id('scroll_'), 1000); + let scrollCenter = await scrollComponent.getBoundsCenter(); + str = await getResourceString($r('app.string.Add_Event_title_1')); + let richEditor1 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.Add_Event_title_2')); + let richEditor2 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.Add_Event_title_3')); + let richEditor3 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.Add_Event_title_4')); + let richEditor4 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(richEditor1 === null).assertFalse(); + expect(richEditor2 === null).assertFalse(); + expect(richEditor3 === null).assertFalse(); + expect(richEditor4 === null).assertFalse(); + + await driver.swipe(scrollCenter.x, scrollCenter.y + 400, scrollCenter.x, scrollCenter.y - 500, 3000); + await driver.waitForIdle(500, 500); + str = await getResourceString($r('app.string.Add_Event_title_5')); + let richEditor5 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.Add_Event_title_6')); + let richEditor6 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + str = await getResourceString($r('app.string.Add_Event_title_7')); + let richEditor7 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(richEditor5 === null).assertFalse(); + expect(richEditor6 === null).assertFalse(); + expect(richEditor7 === null).assertFalse(); + await driver.waitForIdle(500, 500); + await driver.pressBack(); + await driver.waitForIdle(2000, 2000); + await driver.pressBack(); + console.info('uitest: testAddEvent end'); + done(); + }) + + /** + * @tc.number UiTest_021 + * @tc.name testSetUserPresetTextStyles + * @tc.desc 通过setTypingStyle设置用户预设的文本样式 + * @tc.level: Level 1 + */ + it('testSetUserPresetTextStyles', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testSetUserPresetTextStyles begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('RichEditor', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.Set_User_PresetText_Styles_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + await driver.pressBack(); + await driver.waitForIdle(2000, 2000); + await driver.pressBack(); + console.info('uitest: testSetUserPresetTextStyles end'); + done(); + }) + + /** + * @tc.number UiTest_022 + * @tc.name testBackplaneHighlighting + * @tc.desc 通过setSelection设置组件内的内容选中时部分背板高亮 + * @tc.level: Level 1 + */ + it('testBackplaneHighlighting', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testBackplaneHighlighting begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('RichEditor', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.Backplane_Highlighting_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + await driver.pressBack(); + await driver.waitForIdle(2000, 2000); + await driver.pressBack(); + console.info('uitest: testBackplaneHighlighting end'); + done(); + }) + + /** + * @tc.number UiTest_023 + * @tc.name testAddTextContent + * @tc.desc 添加文本内容 + * @tc.level: Level 1 + */ + it('testAddTextContent', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testAddTextContent begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('RichEditor', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.Add_TextContent_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + let button = await driver.findComponent(ON.text('addTextSpan')); + expect(button === null).assertFalse(); + await button.click(); + str = await getResourceString($r('app.string.AddTextContent_Text_2')); + let richEditor1 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(richEditor1 === null).assertFalse(); + await driver.pressBack(); + await driver.waitForIdle(2000, 2000); + await driver.pressBack(); + console.info('uitest: testAddTextContent end'); + done(); + }) + + /** + * @tc.number UiTest_024 + * @tc.name testAddImageContent + * @tc.desc 添加图片内容 + * @tc.level: Level 1 + */ + it('testAddImageContent', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testAddImageContent begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('RichEditor', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.Add_ImageContent_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + let button = await driver.findComponent(ON.text('addImageSpan')); + expect(button === null).assertFalse(); + await button.click(); + str = await getResourceString($r('app.string.AddImageContent_Text_1')); + let richEditor1 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(richEditor1 === null).assertFalse(); + await driver.pressBack(); + await driver.waitForIdle(2000, 2000); + await driver.pressBack(); + console.info('uitest: testAddImageContent end'); + done(); + }) + + /** + * @tc.number UiTest_025 + * @tc.name testAddBuilderDecoratorContent + * @tc.desc 添加@Builder装饰器修饰的内容 + * @tc.level: Level 1 + */ + it('testAddBuilderDecoratorContent', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testAddBuilderDecoratorContent begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('RichEditor', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.Add_Builder_DecoratorContent_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + let button = await driver.findComponent(ON.text('addBuilderSpan')); + expect(button === null).assertFalse(); + await button.click(); + str = await getResourceString($r('app.string.AddBuilderDecoratorContent_Text_3')); + let richEditor1 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(richEditor1 === null).assertFalse(); + await driver.pressBack(); + await driver.waitForIdle(2000, 2000); + await driver.pressBack(); + console.info('uitest: testAddBuilderDecoratorContent end'); + done(); + }) + + /** + * @tc.number UiTest_026 + * @tc.name testAddSymbolSpanContent + * @tc.desc 添加SymbolSpan内容 + * @tc.level: Level 1 + */ + it('testAddSymbolSpanContent', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testAddSymbolSpanContent begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('RichEditor', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let scrollComponent: Component = await driver.waitForComponent(ON.id('scroll_'), 1000); + let scrollCenter = await scrollComponent.getBoundsCenter(); + await driver.swipe(scrollCenter.x, scrollCenter.y + 400, scrollCenter.x, scrollCenter.y - 400, 3000); + await driver.waitForIdle(500, 500); + let str = await getResourceString($r('app.string.Add_SymbolSpanContent_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + let button = await driver.findComponent(ON.text('addSymbolSpan')); + expect(button === null).assertFalse(); + await button.click(); + str = await getResourceString($r('app.string.AddSymbolSpanContent_Text_1')); + let richEditor1 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(richEditor1 === null).assertFalse(); + await driver.pressBack(); + await driver.waitForIdle(2000, 2000); + await driver.pressBack(); + console.info('uitest: testAddSymbolSpanContent end'); + done(); + }) + + /** + * @tc.number UiTest_027 + * @tc.name testGetGraphicInfoInComponent + * @tc.desc 获取组件内图文信息 + * @tc.level: Level 1 + */ + it('testGetGraphicInfoInComponent', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testGetGraphicInfoInComponent begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('RichEditor', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let scrollComponent: Component = await driver.waitForComponent(ON.id('scroll_'), 1000); + let scrollCenter = await scrollComponent.getBoundsCenter(); + await driver.swipe(scrollCenter.x, scrollCenter.y + 400, scrollCenter.x, scrollCenter.y - 400, 3000); + await driver.waitForIdle(500, 500); + let str = await getResourceString($r('app.string.Get_GraphicInfo_In_Component_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + let button = await driver.findComponent(ON.text('getSpans')); + expect(button === null).assertFalse(); + await button.click(); + str = await getResourceString($r('app.string.GetGraphicInfoInComponent_Text_1')); + let richEditor1 = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(richEditor1 === null).assertFalse(); + await driver.pressBack(); + await driver.waitForIdle(2000, 2000); + await driver.pressBack(); + console.info('uitest: testGetGraphicInfoInComponent end'); + done(); + }) + + /** + * @tc.number UiTest_028 + * @tc.name testCreatSymbolGlyph + * @tc.desc 测试创建图标场景示例 + * @tc.level: Level 1 + */ + it('testCreatSymbolGlyph', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testCreatSymbolGlyph begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('SymbolGlyph', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.CreatSymbolGlyph_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let symbolGlyph = await driver.findComponent(ON.type('SymbolGlyph')); + expect(symbolGlyph === null).assertFalse(); + + await driver.pressBack(); + await driver.waitForIdle(2000, 2000); + await driver.pressBack(); + console.info('uitest: testCreatSymbolGlyph end'); + done(); + }) + + /** + * @tc.number UiTest_029 + * @tc.name testSymbolGlyphSpanAddToText + * @tc.desc 测试添加到文本场景示例 + * @tc.level: Level 1 + */ + it('testSymbolGlyphSpanAddToText', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testSymbolGlyphSpanAddToText begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('SymbolGlyph', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.SymbolGlyphSpanAddToText_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let symbolSpan1 = await driver.findComponent(ON.id('1')); + expect(symbolSpan1 === null).assertFalse(); + + let text2 = await driver.findComponent(ON.text('48')); + expect(text2 === null).assertFalse(); + let text3 = await driver.findComponent(ON.text('72')); + expect(text3 === null).assertFalse(); + let text4 = await driver.findComponent(ON.text('96')); + expect(text4 === null).assertFalse(); + + let symbolSpan2 = await driver.findComponent(ON.id('2')); + expect(symbolSpan2 === null).assertFalse(); + let symbolSpan3 = await driver.findComponent(ON.id('3')); + expect(symbolSpan3 === null).assertFalse(); + let symbolSpan4 = await driver.findComponent(ON.id('4')); + expect(symbolSpan4 === null).assertFalse(); + + let scrollComponent: Component = await driver.waitForComponent(ON.id('scroll_'), 1000); + let scrollCenter = await scrollComponent.getBoundsCenter(); + await driver.swipe(scrollCenter.x, scrollCenter.y + 400, scrollCenter.x, scrollCenter.y - 400, 3000); + await driver.waitForIdle(500, 500); + + let text5 = await driver.findComponent(ON.text('Light')); + expect(text5 === null).assertFalse(); + let text6 = await driver.findComponent(ON.text('Normal')); + expect(text6 === null).assertFalse(); + let text7 = await driver.findComponent(ON.text('Bold')); + expect(text7 === null).assertFalse(); + let text8 = await driver.findComponent(ON.text('Black')); + expect(text8 === null).assertFalse(); + let text9 = await driver.findComponent(ON.text('Green')); + expect(text9 === null).assertFalse(); + let text10 = await driver.findComponent(ON.text('Pink')); + expect(text10 === null).assertFalse(); + str = await getResourceString($r('app.string.SymbolAddToText_Text_1')); + let text11 = await driver.findComponent(ON.text(str)); + expect(text11 === null).assertFalse(); + str = await getResourceString($r('app.string.SymbolAddToText_Text_2')); + let text12 = await driver.findComponent(ON.text(str)); + expect(text12 === null).assertFalse(); + str = await getResourceString($r('app.string.SymbolAddToText_Text_3')); + let text13 = await driver.findComponent(ON.text(str)); + expect(text13 === null).assertFalse(); + str = await getResourceString($r('app.string.SymbolAddToText_Text_4')); + let text14 = await driver.findComponent(ON.text(str)); + expect(text14 === null).assertFalse(); + str = await getResourceString($r('app.string.SymbolAddToText_Text_5')); + let text15 = await driver.findComponent(ON.text(str)); + expect(text15 === null).assertFalse(); + str = await getResourceString($r('app.string.SymbolAddToText_Text_6')); + let text16 = await driver.findComponent(ON.text(str)); + expect(text16 === null).assertFalse(); + + let symbolSpan5 = await driver.findComponent(ON.id('5')); + expect(symbolSpan5 === null).assertFalse(); + let symbolSpan6 = await driver.findComponent(ON.id('6')); + expect(symbolSpan6 === null).assertFalse(); + let symbolSpan7 = await driver.findComponent(ON.id('7')); + expect(symbolSpan7 === null).assertFalse(); + let symbolSpan8 = await driver.findComponent(ON.id('8')); + expect(symbolSpan8 === null).assertFalse(); + let symbolSpan9 = await driver.findComponent(ON.id('9')); + expect(symbolSpan9 === null).assertFalse(); + let symbolSpan10 = await driver.findComponent(ON.id('10')); + expect(symbolSpan10 === null).assertFalse(); + let symbolSpan11 = await driver.findComponent(ON.id('11')); + expect(symbolSpan11 === null).assertFalse(); + let symbolSpan12 = await driver.findComponent(ON.id('12')); + expect(symbolSpan12 === null).assertFalse(); + let symbolSpan13 = await driver.findComponent(ON.id('13')); + expect(symbolSpan13 === null).assertFalse(); + let symbolSpan14 = await driver.findComponent(ON.id('14')); + expect(symbolSpan14 === null).assertFalse(); + let symbolSpan15 = await driver.findComponent(ON.id('15')); + expect(symbolSpan15 === null).assertFalse(); + let symbolSpan16 = await driver.findComponent(ON.id('16')); + expect(symbolSpan16 === null).assertFalse(); + + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testSymbolGlyphSpanAddToText end'); + done(); + }) + + /** + * @tc.number UiTest_030 + * @tc.name testSymbolGlyphSpanCustomIconAnimation + * @tc.desc 测试自定义图标动效场景示例 + * @tc.level: Level 1 + */ + it('testSymbolGlyphSpanCustomIconAnimation', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testSymbolGlyphSpanCustomIconAnimation begin'); + let driver = Driver.create(); + await driver.waitForIdle(500, 500); + let buttonComponent = await driver.findComponent(ON.text('SymbolGlyph', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.SymbolGlyphSpanCustomIconAnimation_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + str = await getResourceString($r('app.string.SymbolCustomIconAnimation_Text_1')); + let text1 = await driver.findComponent(ON.text(str)); + expect(text1 === null).assertFalse(); + let symbolGlyph1 = await driver.findComponent(ON.id('1')); + expect(symbolGlyph1 === null).assertFalse(); + str = await getResourceString($r('app.string.SymbolGlyphSpanCustomIconAnimation_Button_1')); + let button1 = await driver.findComponent(ON.text(str)); + expect(button1 === null).assertFalse(); + await button1.click(); + str = await getResourceString($r('app.string.SymbolGlyphSpanCustomIconAnimation_Button_2')); + expect(await button1.getText() === str).assertTrue(); + + str = await getResourceString($r('app.string.SymbolCustomIconAnimation_Text_2')); + let text2 = await driver.findComponent(ON.text(str)); + expect(text2 === null).assertFalse(); + let symbolGlyph2 = await driver.findComponent(ON.id('2')); + expect(symbolGlyph2 === null).assertFalse(); + let button2 = await driver.findComponent(ON.text('trigger')); + expect(button2 === null).assertFalse(); + await button1.click(); + await driver.waitForIdle(500, 500); + await driver.pressBack(); + await driver.delayMs(1000); + await driver.pressBack(); + console.info('uitest: testSymbolGlyphSpanCustomIconAnimation end'); + done(); + }) + + /** + * @tc.number UiTest_031 + * @tc.name testSymbolGlyphSpanAddEvent + * @tc.desc 测试添加事件场景示例 + * @tc.level: Level 1 + */ + it('testSymbolGlyphSpanAddEvent', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testSymbolGlyphSpanAddEvent begin'); + let driver = Driver.create(); + await driver.waitForIdle(500, 500); + let buttonComponent = await driver.findComponent(ON.text('SymbolGlyph', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.SymbolGlyphSpanAddEvent_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let symbolGlyph = await driver.findComponent(ON.id('symbolGlyph1')); + expect(symbolGlyph === null).assertFalse(); + await symbolGlyph.click(); + await driver.waitForIdle(500, 500); + await driver.delayMs(1000); + await driver.pressBack(); + await driver.waitForIdle(2000, 2000); + await driver.pressBack(); + console.info('uitest: testSymbolGlyphSpanAddEvent end'); + done(); + }) + + /** + * @tc.number UiTest_032 + * @tc.name testSymbolGlyphSpanSceneExample + * @tc.desc 测试播放列表场景示例 + * @tc.level: Level 1 + */ + it('testSymbolGlyphSpanSceneExample', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testSymbolGlyphSpanSceneExample begin'); + let driver = Driver.create(); + await driver.waitForIdle(500, 500); + let buttonComponent = await driver.findComponent(ON.text('SymbolGlyph', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.SymbolGlyphSpanSceneExample_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let text1 = await driver.findComponent(ON.id('text1')); + expect(text1 === null).assertFalse(); + let symbolGlyph1 = await driver.findComponent(ON.id('symbolGlyph1')); + expect(symbolGlyph1 === null).assertFalse(); + str = await getResourceString($r('app.string.SymbolSceneExample_Text_1')); + let text = await driver.findComponent(ON.text(str)); + expect(text === null).assertFalse(); + await text.click(); + str = await getResourceString($r('app.string.SymbolSceneExample_Text_2')); + expect(await text.getText() === str).assertTrue(); + await text.click(); + str = await getResourceString($r('app.string.SymbolSceneExample_Text_3')); + expect(await text.getText() === str).assertTrue(); + let text2 = await driver.findComponent(ON.id('text2')); + expect(text2 === null).assertFalse(); + let text3 = await driver.findComponent(ON.id('text3')); + expect(text3 === null).assertFalse(); + let text4 = await driver.findComponent(ON.id('text4')); + expect(text4 === null).assertFalse(); + + str = await getResourceString($r('app.string.SymbolSceneExample_Text_5')); + let text5 = await driver.findComponent(ON.text(str)); + expect(text5 === null).assertFalse(); + let symbolGlyph2 = await driver.findComponent(ON.id('symbolGlyph2')); + expect(symbolGlyph2 === null).assertFalse(); + let symbolGlyph3 = await driver.findComponent(ON.id('symbolGlyph3')); + expect(symbolGlyph3 === null).assertFalse(); + str = await getResourceString($r('app.string.SymbolSceneExample_Text_6')); + let text6 = await driver.findComponent(ON.text(str)); + expect(text6 === null).assertFalse(); + let symbolGlyph4 = await driver.findComponent(ON.id('symbolGlyph4')); + expect(symbolGlyph4 === null).assertFalse(); + let symbolGlyph5 = await driver.findComponent(ON.id('symbolGlyph5')); + expect(symbolGlyph5 === null).assertFalse(); + str = await getResourceString($r('app.string.SymbolSceneExample_Text_7')); + let text7 = await driver.findComponent(ON.text(str)); + expect(text7 === null).assertFalse(); + let symbolGlyph6 = await driver.findComponent(ON.id('symbolGlyph6')); + expect(symbolGlyph6 === null).assertFalse(); + let symbolGlyph7 = await driver.findComponent(ON.id('symbolGlyph7')); + expect(symbolGlyph7 === null).assertFalse(); + str = await getResourceString($r('app.string.SymbolSceneExample_Text_8')); + let text8 = await driver.findComponent(ON.text(str)); + expect(text8 === null).assertFalse(); + let symbolGlyph8 = await driver.findComponent(ON.id('symbolGlyph8')); + expect(symbolGlyph8 === null).assertFalse(); + let symbolGlyph9 = await driver.findComponent(ON.id('symbolGlyph9')); + expect(symbolGlyph9 === null).assertFalse(); + str = await getResourceString($r('app.string.SymbolSceneExample_Text_9')); + let text9 = await driver.findComponent(ON.text(str)); + expect(text9 === null).assertFalse(); + let symbolGlyph10 = await driver.findComponent(ON.id('symbolGlyph10')); + expect(symbolGlyph10 === null).assertFalse(); + let symbolGlyph11 = await driver.findComponent(ON.id('symbolGlyph11')); + expect(symbolGlyph11 === null).assertFalse(); + str = await getResourceString($r('app.string.SymbolSceneExample_Text_10')); + let text10 = await driver.findComponent(ON.text(str)); + expect(text10 === null).assertFalse(); + let symbolGlyph12 = await driver.findComponent(ON.id('symbolGlyph12')); + expect(symbolGlyph12 === null).assertFalse(); + let symbolGlyph13 = await driver.findComponent(ON.id('symbolGlyph13')); + expect(symbolGlyph13 === null).assertFalse(); + str = await getResourceString($r('app.string.SymbolSceneExample_Text_11')); + let text11 = await driver.findComponent(ON.text(str)); + expect(text11 === null).assertFalse(); + let symbolGlyph14 = await driver.findComponent(ON.id('symbolGlyph14')); + expect(symbolGlyph14 === null).assertFalse(); + let symbolGlyph15 = await driver.findComponent(ON.id('symbolGlyph15')); + expect(symbolGlyph15 === null).assertFalse(); + str = await getResourceString($r('app.string.SymbolSceneExample_Text_12')); + let text12 = await driver.findComponent(ON.text(str)); + expect(text12 === null).assertFalse(); + + await driver.pressBack(); + await driver.waitForIdle(2000, 2000); + await driver.pressBack(); + console.info('uitest: testSymbolGlyphSpanSceneExample end'); + done(); + }) + + /** + * @tc.number UiTest_033 + * @tc.name testCreateApply + * @tc.desc 测试创建并应用属性字符串场景示例 + * @tc.level: Level 1 + */ + it('testCreateApply', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testCreateApply begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('StyledString', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.Create_Apply_StyledString_MutableStyledString_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + str = await getResourceString($r('app.string.CreateApply_Text_1')); + let styledString = await driver.findComponent(ON.text(str)); + expect(styledString === null).assertFalse(); + str = await getResourceString($r('app.string.CreateApply_Text_2')); + let mutableStyledString = await driver.findComponent(ON.text(str)); + expect(mutableStyledString === null).assertFalse(); + + await driver.pressBack(); + await driver.waitForIdle(2000, 2000); + await driver.pressBack(); + console.info('uitest: testCreateApply end'); + done(); + }) + + /** + * @tc.number UiTest_034 + * @tc.name testStyledStringStyle + * @tc.desc 测试设置文本样式场景示例 + * @tc.level: Level 1 + */ + it('testStyledStringStyle', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testStyledStringStyle begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('StyledString', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.StyledStringStyle_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let mutableStyledString1 = await driver.findComponent(ON.id('1')); + expect(mutableStyledString1 === null).assertFalse(); + let mutableStyledString2 = await driver.findComponent(ON.id('2')); + expect(mutableStyledString2 === null).assertFalse(); + let mutableStyledString3 = await driver.findComponent(ON.id('3')); + expect(mutableStyledString3 === null).assertFalse(); + let mutableStyledString4 = await driver.findComponent(ON.id('4')); + expect(mutableStyledString4 === null).assertFalse(); + let mutableStyledString5 = await driver.findComponent(ON.id('5')); + expect(mutableStyledString5 === null).assertFalse(); + let mutableStyledString6 = await driver.findComponent(ON.id('6')); + expect(mutableStyledString6 === null).assertFalse(); + + await driver.pressBack(); + await driver.waitForIdle(2000, 2000); + await driver.pressBack(); + console.info('uitest: testStyledStringStyle end'); + done(); + }) + + /** + * @tc.number UiTest_035 + * @tc.name testStyledStringParagraphStyle + * @tc.desc 测试设置段落样式场景示例 + * @tc.level: Level 1 + */ + it('testStyledStringParagraphStyle', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testStyledStringParagraphStyle begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('StyledString', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.StyledStringParagraphStyle_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + str = await getResourceString($r('app.string.StyledStringParagraphStyle_Text_1')); + let mutableStyledString1 = + await driver.findComponent(ON.text(str)); + expect(mutableStyledString1 === null).assertFalse(); + let button = await driver.findComponent(ON.text('change')); + expect(button === null).assertFalse(); + await button.click(); + await driver.waitForIdle(500, 500); + + await driver.pressBack(); + await driver.waitForIdle(2000, 2000); + await driver.pressBack(); + console.info('uitest: testStyledStringParagraphStyle end'); + done(); + }) + + /** + * @tc.number UiTest_036 + * @tc.name testStyledStringImageAttachment + * @tc.desc 测试使用图片场景示例 + * @tc.level: Level 1 + */ + it('testStyledStringImageAttachment', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testStyledStringImageAttachment begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('StyledString', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.StyledStringImageAttachment_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + str = await getResourceString($r('app.string.StyledStringImageAttachment_Button_1')); + let button = await driver.findComponent(ON.text(str)); + expect(button === null).assertFalse(); + await button.click(); + await driver.waitForIdle(500, 500); + let text1 = await driver.findComponent(ON.id('text1')); + expect(text1 === null).assertFalse(); + + await driver.pressBack(); + await driver.waitForIdle(2000, 2000); + await driver.pressBack(); + console.info('uitest: testStyledStringImageAttachment end'); + done(); + }) + + /** + * @tc.number UiTest_037 + * @tc.name testStyledStringGestureStyle + * @tc.desc 测试设置事件场景示例 + * @tc.level: Level 1 + */ + it('testStyledStringGestureStyle', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testStyledStringGestureStyle begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('StyledString', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.TStyledStringGestureStyle_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let text1 = await driver.findComponent(ON.id('text1')); + expect(text1 === null).assertFalse(); + + await driver.pressBack(); + await driver.waitForIdle(2000, 2000); + await driver.pressBack(); + console.info('uitest: testStyledStringGestureStyle end'); + done(); + }) + + /** + * @tc.number UiTest_038 + * @tc.name testStyledStringHtml + * @tc.desc 测试格式转换场景示例 + * @tc.level: Level 1 + */ + it('testStyledStringHtml', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testStyledStringHtml begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('StyledString', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.StyledStringHtml_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + str = await getResourceString($r('app.string.StyledStringHtml_Button_1')); + let addButton = await driver.findComponent(ON.text(str)); + expect(addButton === null).assertFalse(); + await addButton.click(); + await driver.waitForIdle(500, 500); + let text1 = await driver.findComponent(ON.id('text1')); + expect(text1 === null).assertFalse(); + + let toHtmlButton = await driver.findComponent(ON.text('toHtml')); + expect(toHtmlButton === null).assertFalse(); + await toHtmlButton.click(); + await driver.waitForIdle(500, 500); + let text3 = await driver.findComponent(ON.id('text3')); + expect(text3 === null).assertFalse(); + + let fromHtmlButton = await driver.findComponent(ON.text('fromHtml')); + expect(fromHtmlButton === null).assertFalse(); + await fromHtmlButton.click(); + await driver.waitForIdle(500, 500); + let text2 = await driver.findComponent(ON.id('text2')); + expect(text2 === null).assertFalse(); + + await driver.pressBack(); + await driver.waitForIdle(3000, 3000); + await driver.pressBack(); + console.info('uitest: testStyledStringHtml end'); + done(); + }) + + /** + * @tc.number UiTest_039 + * @tc.name testStyledStringSceneExample + * @tc.desc 测试会员过期提示场景示例 + * @tc.level: Level 1 + */ + it('testStyledStringSceneExample', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testStyledStringSceneExample begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('StyledString', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.StyledStringSceneExample_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let text1 = await driver.findComponent(ON.id('text1')); + expect(text1 === null).assertFalse(); + str = await getResourceString($r('app.string.StyledStringSceneExample_Button_1')); + let button = await driver.findComponent(ON.text(str)); + expect(button === null).assertFalse(); + + await driver.pressBack(); + await driver.waitForIdle(2000, 2000); + await driver.pressBack(); + console.info('uitest: testStyledStringSceneExample end'); + done(); + }) + + /** + * @tc.number UiTest_040 + * @tc.name testTextDrawingDisplay + * @tc.desc 测试Text组件的文本绘制与显示场景示例 + * @tc.level: Level 1 + */ + it('testTextDrawingDisplay', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testTextDrawingDisplay begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('NDK', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.TextDrawingDisplay_NDK_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let text = await driver.findComponent(ON.type('Text')); + expect(text === null).assertFalse(); + + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testTextDrawingDisplay end'); + done(); + }) + + /** + * @tc.number UiTest_041 + * @tc.name testListenTextBoxEvents + * @tc.desc 测试输入框文本事件监听场景示例 + * @tc.level: Level 1 + */ + it('testListenTextBoxEvents', Level.LEVEL1, async (done: Function) => { + console.info('uitest: testListenTextBoxEvents begin'); + let driver = Driver.create(); + let buttonComponent = await driver.findComponent(ON.text('NDK', MatchPattern.CONTAINS)); + expect(buttonComponent === null).assertFalse(); + await buttonComponent.click(); + let str = await getResourceString($r('app.string.ListenTextBoxEvents_NDK_title')); + let sampleButton = await driver.findComponent(ON.text(str, MatchPattern.CONTAINS)); + expect(sampleButton === null).assertFalse(); + await sampleButton.click(); + + let textArea = await driver.findComponent(ON.type('TextArea')); + expect(textArea === null).assertFalse(); + + await driver.pressBack(); + await driver.pressBack(); + console.info('uitest: testListenTextBoxEvents end'); done(); }) }) diff --git a/code/DocsSample/ArkUISample/TextComponent/screenshots/device/image1.png b/code/DocsSample/ArkUISample/TextComponent/screenshots/device/image1.png index 6c0e5b4f315ad520a9c6a67da376587056af6c2b..bf96a4175ed623325acd0dfe3cbc57e23a6f9c66 100644 GIT binary patch literal 174814 zcmV)3K+C_0P)Px#1am@3R0s$N2z&@+hyVZ}07*naRCr#jy$RgD+gLq*A0(MFPf4X{ppc`?Q8H!< zWk`k+A@h(-$1x8lGGwTbV>~qcm9avolrfPaQK3*cam<|Gwbowiy4T+CbNKx~|Ns3t z_p|rDhPBpp?ft&zd7t-rpYJgzfA*A9w^O(MI_8*~!+;Ufnrk`?wV=&$O6?T+VP3Hm zN_@r#Ffe_!SsWd!7;`y=@hfkcTBm`7x9bWGldd3H`Pq;~3n@~A)<=4&7;8qDb*5hT z13fy@8)@zuT%Tkmw)q>|Jy`X*nZ`K4yY_v8a9z^oUOI+#);(#1t&EX!@JwWm<5w-y zc|=0g$ynKDvf#I0g0tr|Wqs~d<{+r9e zJi<3LF$C(oNxK4DPvB)7{q~tZa|wR*Yh?;mzS8FXU3|<_jokwhI2!?DJ()rWG5TTT zt+gLoXTN<0+Lk>?>=JQ6+RpENaZvV4^Zq{RHOh;=lWyf7WwFq;7P=Nbnt(~L-G4-0 z;ALo}zcQ__uE7}HiUWFbZ?g8}ZF>T$C#<;%EE+}!kMRfw%x**$ zB>RyX6q9zEf`^(-8}W{FOr7ySN^&Z4f{8U#QiYYhh^m&|GQdr%yZ-lFQ z5B1l&yCqRiLUz+m-A;F8s;4oo5*^VDEi$Jp0tk(&o1Xhy1l5bk=Z zxo$$xp{yD)?YgWpK;d%?%!Ieta?r1UhV=xo;;_l7Ssy@*!??`Hdbx-pT)GVExbnGX zyM5jOy=v(gOn~bEjKG$@i6=PwObEO4frkrvJlDEi)`~FmMLcY6@1!wFURnZ+MGEhT z9^+_)pI92riF90CYwkJ_&(_pK=gZlAT3aV`3}7x{7)LZi3w-7kpGxX5_{~S`x~;$W zGW%daBS=&0lD#nj89806ctzQI-6;3VXD55v;ypRg-_Ac!AJY)vx-?B(_p|o`9CfEX z>*~4sObW!;$nxC-;ZUD6OudrX+I*%6A+QNgHtt!_5MFwn+dP$%wX`1-UX~IFhAuwvw%{6j>1()L*gb}=~zx8Cy5)T-}(=2Rj zpk47*-zrbHSq_ddz;q z6x<_;j{;ZeCYQ@Y*MQ!HUgMHO_#~?s=a|B_>_7Vu8ZdQjq&W>eJ~z}Cn#@5=3s{7> z&rA(`_vxTbvGloqP19yh?>|TAvm9w*-J!300#UkBcH7EG3Bt@;7$bXw3={3v0^H_S zj%#nBEf~Q^`_%Z0$i^|RM)KhXF0Nzn1RA0+uZI+r&6x@mnf-2>AX{kiz{hy;FjmcA zz8fPAuDb=VVA5dD*5Ei24L%7K1PuS4?+fgb+`d#8Pjdv2$zE*g~1s%7Lrv7Kdv+q67WKy;HV6$`B^=luR3L ztkZ^Nt!dVXMaUX>;sd1f2~+m&qmr6Sn9NZu2Wc^fEoEWif6B2#~{CJZ5+gAJRB@~&+&X%_eWq6Pg=T9 z%BA1on)JTIF5TADdn-KacOTsw#*3Tu>VvhUeuj$MTFm41%0KzVF4U z<(|mY=hy4jiWK$3u-y-E%I}!9CgijR_m##WhnOJ65c(32ZpCN#}&KlP%bqJixRPhK^NzWHKuvFX3~gp?34?)F++^|gjnLm=>27QJ!Bur zhX?8Q9xD_BvE0W9?>ZP%S7Tw$#mMF8nrtKJh{-@}qYM22PSoQZ`vpsg<`i!CHGGb1 zJ<>@4T$SrukKn;Ae@ln9T2Q8RdVdjPorIRyl`{K~eIAXcsVp zThOj6AQ|m7b?dTjE&-IzJ#3#vfu1&QP25-RuOJ=Q>%bszXm5Vx*WGf2XM@jDlPoaQ zQOQ}3wXwgUf%>)X{e~{^t2p9l&d?>_?k23*4uKA=g9GvFm1nK>o1X&e3G^73R2vlx z??fK!E?lA-NeOOF7a5quMN=?wzPK^;0hf)jnvXiSb3BdOe| zRo9dgT&>RnX;?N*zSe-XZtG?L%G_G8)}8vSBM%0l>fuP7c|^wm#3_)2Ib@5JT~PVp zX1W7RW(TkiTy%e_Ij;scy%5QdB4cnD1AWp6qdSco-%Q)TZQCdgT_y;otTTY01p z4GL?)tx1?c?``N5_cZIsUZh6uv+8jhY-4YP>N#SaPZx6If{%9^6~o-J)2F&KzcnI8 z0IAzL4Q;H}Q-;JKjkvAJYxs`T;XVLIxlD&{V@F{MryOG8c3u0De#zjRYhlifDu?kS zfm)nce)kwA>*`t-{_Hbj3VLg`j-lCHnkQGElZwfHnSx{a za2pe&FtF@^F#AR%Amk}w{MS^j64{cW*+u(ZOgF%=sK7}lad&KExWRrBelZwADdAQEUDn8O{Q2yp|G z+?&$P5A3OEX>@Un6!yjLwUOxp3;1eI2QL;f8J6L>hEKQ%zf&?S*f?HiZ`R zx<}LID2|vx#T;XVom2VT-{iEuspl2Y*lft?31U_n=;&NIC!6>g6M{LFUb^IyX)aEJ zvtF32ed<#IbR6cj@J-6HQD%&^>tXFV%zYVHxreY3OZ$` zi?E5Mb?<>}$;C8bG`TRce&Pl;Vp*R#q2E}r@8MG(Arc>Jo?Y)ay5RS{dsSh+*+lM&& zsSkP5l^|_$@v5WuL%BXX3{x${(dGK-mIz|kgQ2_UZK!~lul4NcyY|LR3ZuQ| zd+G<`RY&&)T2VjX>cLo?m`|cumpK*KI0P7)-HWjSyKTaDzIX|%d``tnT`0C|jDXqxpsB zS|&Y6tlRYxNDKED=`a~D=aVl*EII+u{0j##cqR;{HI_EDJ{Y9A&z-n@t}s%&H6U3z z#F2mMgJPV*u^z0;y?~vez(5Svs*O3C(^n7F;6O$T6Lym!L@`s(g+)x|A)m1{2tP)1 zb?wlp_|yy>#^^RA?Cy^>xu28>JdKRyVhobhx}rSBWG{`u7zMUwVRnC915u<~X|9c< zYB3J^bSri5W5v6E)|UaAPr1M;yZ4$Q&Jz}Wiopc&4D$p&+ca9Ydp#166q*zZTVlHQ zUHtH`H6wl6%UF{~y4}B($Lp-ad94?cC9Zo39%*k)G9c7_@198)d{ZwOyw^@h^jCZw zRR?`o5+v%Dt#v3DJep1f?ic0a!5YA`FX5f`*WuHCG75opE19(uT(q@z9c`2_rkNDZ zoC^mg!U2Z>WA16En8zU@-1+&R34>V*WSL=l$s3APG3ioBC=^ z<)ftFwVaN(__f|xOJ1Ly^<1^KsFg9DSQG1wnA8^L5sP@}mv-ZwR*$Fp57gB7!khT; zM}*=V9ZO!xQu=H3j_s}DP38K4okj+gm}zhbE` z@LDf?g6gKiApXSW91qgH)|{FU!ow=g^?+pU&1(YTyLZHaPnbEfPq54HHFGI;zp|%@ z&yWsP-Ck2$-3Q?MuyS8#s<8qVW*%$m^TLYU%*xpjvo?t5rwi~})3Pv!t`;_;9g3Cl zGK6zz(#<#pQ0IW*W6$AN%%Ohv{+KB6j_3n#a5%U7Qn~hHTp;)U*r8zW3Hj>wNDN>G z=)@mdn6o;~16TQoC0$ut;!}(AY)4K==s9DdK{<>I4b6cd-|{m~JQKJua*q$yl{~~b zz}vM#V_p@{dzZM5===kx@oK6 z&~=7ASxyYbItIlAFo_VLAi6T949KCo1IK#Gb!CW$8={b-JDY77auIkhz+5!T-f=M2 z#hlRSdK{PW$<>08j(lS&$gz!Geq(p73Ub4u10<$~u1kEm zZ;YxOYiYeo_g*!pYBze6-DhQh4P5#OJ}$1aj(xc|DB}0bxsKc$#-uLyLN;?cq~SI3 z+WY2yO??B!qRVG;J!=kg@2F2TcfUNTVCt$hYhv)eUMT5X_o8(*xIlpCUNdp$YWjl& z6;}bRKX8ORgr;_A9uy=YFZ{qkl1G^3PwMV<#dUomb8pO@{_Y#{q#@52IVfPS-TcNg zcWXebz`7>on}l}P;X+iSb@cy3KqL*EN-OyzxAW*2zNtR((S_i;nFC&63X4PXA=I2A zN$rQ~CWo*&7xuc3@U0hn!=#~$Q{`Kh`>U`4VGe5)aQ6T>0w71=yN?q@^dvQ4?wV7l zb+>*7f(VnTrTe+Iy9*n!PDnkYp~8|jpM~5%YD*CX!j_0*dY%!y#zHQ6Yb13Hs~a(llODNRm)D&T z25W{1SaFulaIm2;@_?%F6lahwL_}_;`lt-{=hBL`So{6#|zO|)+k>i!@uAu@N7g$;!;SvuIJCcR1DbbvpqkCe`)=FUmCwngIks&$Zr2cwfKSR@$ zXfkslRP(GEIjwWR?T1r;%pK-Y_f|=^F1|~<1S%ZPi!yeStGSv^*&5eB5zUp2z5v-D3&p;pRsqcs}ZVFIu zta<8}w28vddk>;{t*fGlfibXcBbKxn$lSfBipf593;_t=*RtGuTM>z2xz+^$=0aT5 z(ml6m`7#VK#E!z&yzB{iltVc6rui)acEc)W>W^?RZbt?Pix{b=wpX{TjKBA7$ zJP=He;&`|NggQW8H~HkFFgka7`T;0Are0z+k1>(YCepd%WSk%dj=4jR{nQ66f(<-{ zOO#|$c<3CF?m+$(q{i8Ur8GHf!Q__Y(m2 z)i`O0y0|Za=e6k=TKU}%<=UP-GB;_(xeJ~5%XyZ9kvh5%E09B&91x?M^GclRRthoe zfgC2l9G7d-lH9nZn|a2KT3VlC*E+kOQ3rd63ph1+Nt5C*nlt04U?qAltk<=ry|KiL zA$hF@c3;ew9?w&g=L{kF-m|fJ0j3ziP5VF`q^o9TNgU$g_dZOB%5!+`IrT1=@vQ+I zxqoXsA;5u&Mr(2HQx5cp!5XGMIRL$q5DeDT+7dW$*$2cs>0m;{2V2LMPZmAq?iu8vWMX7mcAV%A|9{b@#UV;k~ zCPRbTbK+@Xjgr>;V@zU1EOCJEgc=hs%yY|-05FMaErE|*^Rb>FX+34nzT`Z)n+`a@ zRn2QH&gmLln*fwP!sMeY$6=~DV=-5*xnyQ>_Q7WDZWJ}Z0hpSY8#Y49?-+$n{OLnJ za#C0Or4bm-Ykjc!R=%}%Z6fa)C9?ah{N}R`i>4@pXcTGo4IbAX8GD~#6xN#84HQPk zQSQ>LTmw=i4g6ZrubinL#zBp)GwYM^G-c1}&Kiud>(j^BmEqtaK(YXuq$bGshO{u* z5Z|#T0)B|$R5(76F8ok)eK?TE3%Q|rDl)LCO?Tn~V%?P1mm6UY7Oa~B2JRtD)**d} zLu%@G-3V(9)=1>KtXoS;V#0p6UbwgzKI2Zc!=<_usZH!vV;|ZFM73Qh8E1M*Fi-H= z#@c0POO-g)M-Vv2keIAV{2XF|Y4#!Wym#htnk8bro`=Q{&Z!3mVKSqS^qA&)z-TU* zsMYc1XsDVXj&;h&QFG!182c&gNxyS6D!nEcr~v zcsx{Gp9yma%$O>Jaj>oW?eAW<7_#k`@VmG6GyuS(tf-+IjU4L?Kc?Or?%xOt^1u~_ zF|)76$ld}h@f);s@C>M4m!0*&XFaXk0Meg(m1oU+(-=|jk;1HHa>T;9>MuEEqiz;B z;>m|8*19<$7e3`qy7zQ~bWf33@oSGr#fKioTsAC-?{&?Sk9hL2zl(m?V7-h-99iaz z@Bo@wjf< zWQT3)bH%b}@Yh4@Q@qTx#(}o)u`!Ws0NJdud!t@z7~Ecnll_1eV@X%`OcFRCynV{+ z+z3oOQBC`in8YRUz-Aq(lL5Pp*rE4G>;g_GHD|4hQ1T(pv}M!B*onvmIVee)B!MQ# zrer~gWsF5G^AtG6fufR(OIZT(q2lP67!lg~n|RNs6xG>NW79bRNh_^p$?*2d% z!rf%+s&zup4WGcWJ_6v5Ygvv&C9l4&-8z7?28ly5`#_qSW8?snxJqz+ty_s09F{s< z3T%dL4A^9}4ItiUw#>+@awQhYhXdOwUkWNg!oMOwE8W2O8%yR)6vri6P^}24` ziHjNqJ!y}+5NFJFKhozKh_hVGtK0oF?-W-4Ol8VaAMy_74)|#gkH~OM7*h{;)d%P~ zq~E;Mi+t&z9dN3Reys6eJ{eSsA{2vI<-$)L(l$T@qhvug2DQpKodN3-ck30Ov0IaI zlt%(N9pk;D9dXKOy&=whNgT|(zR+!|)?fH`(w2vn*v*>c$`QM)zCEx2g&veZr_JBX29%y!dg0w z-+LIjuG@QMU5*WifyaVIU23DZq~W^7a{QwcC6PvncK0}1eA=O`rsO%HFT^!g^wj;)J=7+7kX&W6J5On(Z298mP!Aq6hxs0Z`wN}sRUmol#>jcpVa@JCVk2(FlB(|QirYP4 z;!>k*z;HjhKL+*)tqj~TB)je8R($rdbIQpa1nDMUCz(t<5!(9|9FDdQLcwpmGGsmM zMNnW$8H#tTgBrIc2(f>vP4=c#tZ7=0xkDehmGAnzU(5r@D%d9D0VC!s?}U>%4#X(C z>!L2$f}2|SP?zi&VDji3tdVP7nA0}0r^nQn{mq)J3uM;TfYu~bb90Fra)b#O%1J$# zyA~u(u#rQ%*4dw_Km^sDe$GW;`=nL47;`QpePb}tYW0;bxe%X)$9@I!r& zd(`Jx)qth*TVGAurb$bY=8Qe0?Z}=ZPc^%b%rkJz`y4=5N2%wmaGzUHinL*3j~1{?)a ztQBi+jI|IKur|aPU6diA2Vklxc^V_hQitqQJ>_>zz_riw?xEsXrh=%w=A>xQF{Kv8 zT9>7`r(Pr7vBZ5?$130cwP#b^6_h>5ob0c)S#N4|U9ctgq|LzY z-=UgAOZP{4tgVdMXKFy8u`pE(T$4ruYOfU6>B@H>+)wZI)K}vwC(pq&2e=4`x5Rtt zk+BxAr|x@`5RSu$nzUw#H7DkR1*3atU)L!<4=J~8Wz6{Q2}y@9DP1$Qs7TllV|_AD z=T{{ST5&cn@}pKlD~5UDYkkr-07p#5G9`6kT}IovTsX1L`qz308M=D!;m{>Wx`5UF za#IM>t!ux`qmSZPL0cQJ1IPXE`0(3i-R^n!9vTr3Ku+RTa@OQ}*h}5X(HJl)k&qdi zJ#?5!YMmM($*oI!heu!Omm}xaM;9I{F6ibxkTwJ~uK-*F_f=Tz>ki9EQYhJbmVD0V zXe|aozU;VuQDSr79a=((CnbK#{<*X@vATc`P#x|#w#K&-ihpLKShDu(zjHs-C# zJPrfC@>nDAeT%c#%00pnIhKjhwQ}w|_$>3tDI78yO0*+PN!iDV)4UBHVB$W=S0t_1 zgvs`B)c^n>07*naRES@3YE8F$AwH+17S7chG{9%W={{4;6<1KRXL;^=ExY$&)kw+W z;}ixO#{~{!rEZ78MqXdQLQaj@cZW>pql}2jT9MpZfoUS)c8_LCuBO_;-x_POY9(LA zE+x>w8Um-M3g%$F6rfs2DCq%ieRK=M9EW%^Uhu?4?po`#MvTOAbUcYwujUFHn6g)e)RvE%`^`IW?>9uDDlP0H&yVZcmRgAW`^g%T&-eZVpfZGZ^S z%p<&TtdFBGO+P@e+Urr+o)2Cd1(uqv&;2l#3#Lxtx6QS<)*6Y4y2OE@a{-FW@u))q z#I{?0YjTe}4-n!oPfPGbSfmR*O=4l-g^u7irgL3Db4e@*73Z;Oqc+%Bn_}H}>QVyc z?j4NAZVqux@nvf)%!S3F1LqirBu?9)xx!EW?B`GI4KzUpVNNm>V6j+It?JaAd21Yv zvmMJrq9(j4Xe3NIUJP_TwjT?3NE&TI%p#Y0tF7xWP7(zEbSPcB!J-#PSvC2vu6=Jo zOd5T6I<*Rywy1OMefw3Q_iri|_`pFh6FeDX=5Q|m`UPU{31ZRdeCL{J>O*eE+P_Lz z_bS!;On#$2XAOtIfX^DteOkR{kb)P@KF1DOF^!M0`-{0D1D7_e1=3iKkNt=+Kp)*J zTHz3Hju7^9SBBirJe$UJVMq2IxdNQdbnvZb<3OvYy&_x%CGKhy<=DRL zU-sodzfbFHBlm2&) zv0nF`DTN`K14ECtHC;`nuf-{PER65-zxLT&6QKxJ9bJ=nrhZ5q_at?>AE-;d{b21H zQy=Mtp=oc;5sW34%WhEMk7;i4EF&~$&kps^`Upuu`*}&9bE&BxA~y3D{;7mqcmqu> z-?|s4xv$y}%aQ!O7l$+<*w@Mj9Rm$-nYZ9geR3Z%Mst@As0kbX?2$Clyx5W0 zIBP9(xCG=M;XGtBM_?n@*J*tZGj_*KNrNc0^w((UMhcf|isL)4o0Z@Lo0jtT{wXAN zxqm)iYwVOSEHh1C)9w+diy(aS$Jq5@2o-Fg5-r*!5MZ!81V=XB#I3Fo_FY!j*t6^c zLc60Q?}%S;$=fkeJoP%ZM#po^CPfTzCaj3{hGf3=yJuVjuO`M}Ia<4a%>zEfy9YI< zyd%AJob(e{_$s4oQ^?SvxU759C|u(iD|>%Li|ayg=wYtv;8;G^)Pjs2BYe(DGZW{0 zV^N#(JU4~8+;3nbymKmW?Hi#&FJ*`W12KeS7h_DyMQ9ZkY~;-~;+!WRITY);Orr9X$R}$;dIPJGJMn2Dq*ER2WiQ~R6SZ#wQ_$9_T);d(~e#@OS zp#<=Y$9lX+=2~;O4+5mrTB|(LN`4!&MwPqAFhe=6DQY$@HRv`5N5zsu4w;VhHtT4N z;H1CS)(iN6?e9TpTziwa(8jfmnAb%bYgJ8&)3rKS1#wWG>&?0cx?(EWn5>~5R9^3S z%Yx533}R=E%tb9>vow$Nfl~%a-X+1We8e(boW`(Taye76xrU#&Vu+{Pn2j%5V>88I zHBNSE>RPN1@zP;gtzEuD^}1j1xraHotv3T8lVb>(pBXkq5xIjHA5C=Nf7xj>Tf0MG0!EMd5Od zA-JY<6G4P-aiWYheY(BZSQhtq0^J9|Ko)-*!0bsOnA8HuDPj_+c|JgLbpu-rup$>z z;&XD;*NuQq1ZebTCyzBU#}4blTJwx!sC-=m^yqf&2}$h0lPnD543uxu0K0YUGFlJv z$VY^6dCoe^)O~47m6RxohnPp&3NDA{}=LD8(A&!zUKZu7KkORmCGx0~j03(jU zz#&fe7I}?nT=92WiitX`9Te7%N!!7vnm7nI``doSf(kbFz`W+1z!G?1i$V<=b+Nt( zP0g*9gd@$`OldtCOPfHu7GdPZt^Hw&YXSzAT4S_MU>Yv*IagmYhPm?Dj*&f7?HDoO(o#N#i)8KVRHU@5buz~yJVmVH zt&Jfh8>4&cIM+Cxm%tgBd+!@B>#lj%pt@Zz^Bs#RYL{-B<+C1|9Pik$O}&y%gcB3- z0Kny%W6n7HYXK}%apD}|GIY^^u+9^Ps0T6w#uS<~9iPGxhQWsbffyL61Pq`o+VO*8 z#JPCdLex~06JnIO<}#=4*$}2lFQ?WnJU4|}Mrdz}<1tS9qfy3VjN-Bn?g8PIcf_XJ z$%lu$2&Ue`?^=`t$Rjz*@0x@GGvl?EoYBVw@f;jZLN0WKPc;37fi>OI<~4JCJEqp% z2h5R{_(*mdas$(O46w!#KIepO98MX;r}XCSzDS38I9k8>)|z<699DCLw zF*b)nF|Z#ohHKJ;pyrW?#*^O6We5{wwO9u!C$%z!LPyZVx4E9)~nbUDO5 z_L+m-{;B`a>smr4@fSXaIUfGb1-EX*Wv=TE8djaPMSG_D5l1ZOWY(BtXb$Pjo_Ad6 za;kY^iiZz9;QXAN`-smXrC3YNCk)kW8%F_KN4HKjz;3<94fvrNbzrvQId{>4SYUQdFz8OM zmCst7>wM-6B@>P@=_Ba~V%^e)5x9x%a6^($IX*XzpP(J5L~C+y*I0&Ghsm4^O>l=c z&%0RF<31skI;EBT60u^@Wq~p8eAVLKMyT6L9@{0Q^>(~_qFDFMJ+X#EwbADr`6)u0 zjpLe8m(K_0eN`@NsnI#sjFENMWs2saQ#nJ+_#9{izy}*g5!h%lqE>(jC=P&h$ZinX z+AdKeaF6dIkPmaK7M}Se(8V0tOz3c~u!x6zz`Dj7Td(O5z+lA-3vrFf#qe`bJV(Ua zCcAUpqwHJeBQg7%o5fsc8Whdp7~^=qtjTNVWj=FN$7qZQ6huFG)r0oJ?o`zb9K*S( z3fn>5o86)f5uPxtomLf{wUb-g$eDRHXDl8x=h}A6u?%rBrOzd?cEyjR(F@0z*L}36 zjP;&RI9g1;2$=MwZq?L0&XL_`1o_>=1jD@Ut{wGF!uDcmuiNR4^ElNizQ(11-hwet z9_ghV)#nikEXNu4-{V>8rcpM8LItlnH}# z;ZmFihQMar##e6dUts_$wU{Qcs2h|L<{G$GAg4>51c zAqI1Vg3$4HzzMrB84F+f<;y){oN~#7TWbuy2rVqk5oFt>5B736=8#Unn5(AC$Jk}E z*@KM0j=`wg#b@IbIyR=_q<@GbkS-K04p_1vMl2kR*;6$Od|(StQ^t@3I>4ta%2>3t z2|)&sMy2hVoQ^o_?4X)h2Y3~0PC~EX|`l*Xr0FT`THQ?9@!x z3wq6|5tm2ka;`_?YTZlZ)WWF)DAv%S81pek08{Nwt`R9y9#YIxPNb(KLdxKt6E13V zj^y+gdgmq}<`h8`lF{w;Fzp%)jyT6=c;zt_+Qrj)VfSU6%&oanM%}gG{v!ssx&Z+W z+{VTt{oO+Yn%Bt~tsf&vblay~^5B*ptZ{Lyhoopdr^Oo_o*EY;)0~UZf4W1RXC8k!4rh_`#KeDdn{S#4-GVO%lY_orN^WhY%ZeU7csWwo9PGr#rnT)0mw zjs=~@=suB0b!DjSuu&5+K0|{Vk&7H$=adIl4X+Pko%Tl!5^%)y6flu5F_9Apqqd7I5>T$kC=wf(1 z5T+go5!l&(i_W;N!@0sCgtUpS>w%AX;1_o`1b*vM7!$IOjiCVRXQD(|8~Y+m)=Y4P zMQr!OHgJy6esoOs$oS-l1i&0x6JBvy2jk(haOc;WJ%=6ysD`FmM7qZ2mft!F9~@YU zx1KeM$fqQKN;o2@}U+oQR=F1;}N+)LM%U7d9It zA4c;G3v!x8wLOzo3p__Aj`$HaF{iGdn2xKW0$_XDY}6EQ1+ zH7SOJu(Li=MqL?``p0?miU7d@1ED|-Fw|pCQUtLjWogsyK+5Ay~c0|VyFdo zatnmH<|XmCJT+IlH0j<6f6p8|STk4H*4|v@3c4Lx!qXd4*+5GLa?d_SSb}=*6$`rWH+7#2xAQW#lleM$>)JQA~QZ?%jOjJA@fpL zIqaW!lrZgu@@SKvT)+T+;3kD#3hjMLoW`(FV+z)0)&(C3@GdyKz0j-|?Dcf3hZ^) z>0CGuZ{cWxA%w*Xpqnkh6mC=yC~nZrk8G}mxj4mV8pG@tL~bxl*3{Y%UpH_vf2t?3 z7W~!?4A+EsfML)$76KancfRB8+xy@D{_U$@{pyHkEsh74mSO5c3m@YbPV&()E@)~E ziuGPN>`>j#H(u8nqUiG-V3<0LI2F^OnAc6b)T#i(C~e@tSC?z4@iU+K%=WR5e1zk4 zaSvuw@2_>3SFoKxO?A6J4FgPpI_D4%aIGTVVz*L^K!Olw{U8~}3M+kk^;u^4)lX?iY*V;9duXSpYz2;oluF<%SAs%y( zs20X?KKy-_7*v<}mE1Y@V-yyBx*JEe!I%AIKN3SYHo0cR5E3|A5G!~)$4Pk%&8%n5Gqhx@}A`OS%?F+C>+YShgXCzef87=v89GLF5LgE6|j z2aFXy`E`3r{~Dt(=dBv2+6$=HuEREIle`h=7}H`M^Io8ivL_ej?iKe%YfL)Mc?=%$ z+%E?xmP^EDu59!<7js?SKSTAX3G}R(YyoNys;UI5T*3! zJl2K>+|~kH0ObC_?lnTJoxIY-sn!jXf=D_zI2CW>ilc`6-us^05B}iAw+H_v(Rk@mEpQp%eG%QL4|*FwEnrcBi>0&^R`cA8o(s>Axpyg(X8<@DEi!aaqx_i% ztrI`^9KfW3IrS*~Ds4VTGBQI)3_0d;4W9TcA z?yWRUeo&hrF~J+$&7&Bk@Yb5WgFzgkp87x@)UMdXcW=E13_-kskf-@%SDbYaQ@0yu z%x+|0w}#LyRu$N*gXenp0(2^WKRXJtZuU(#&z1Zby*^Uwf{}6Evr1wgEGqiVsr+!S z<+^8W4=lkDwY6gc93+6V#?!(ak^3WK5e$xzJ|>zIx*j|x2VLgI!lc52$uS*gK7=bC zgJ6#AlQBF}D)5ou5l(T^Zm=4OE&Z-lw1l($tnxi1K17>S*z5qgjh z7c`|l`Id~S*4$e_TYF*}vD22>tx$ zKewIh9A~flY;j{P+c|5j`z?R_mMO0{k(A=}oRPCSaOx(_DLnmt!PRz9a-ghXEM zn{CRa-}S2=_Fr+9o%`lK3}EGJ(fYB@{$TDK)9^{kupuvcC0GuQTYJU&p}7MBg9Sz| z7G)#7@)WYyT=uMElH*{F7#s^cOGwPDhvz|e3$rGQ8h%QPIN}N);nZX@ODak4jyRn>V)o_`vcE>hYUc8JOnseG6Zf6D&>&maBz)$?-0P7bAB?zERC6oX zWpG&ww=ClrQx91-ZPB0JW7u^iHcYElatQ-|)~Bn_igfqh$IYEh+UMXC4_?91K6@Tl14MNb2f8YgZ+&k!BbDoX-veG z&EXgkZ~cA76hKW)GV;96IvOux8?z?X-8SH|y8UuZ*{9X-!%FS|bq+Awj^rTp)Vy4y zcH>0N>`|?!UJ4KKZO2?VJ(R8W7$2kZ*>A;I3rE=)XKpT(t6&T;o1>dMLigNQyT(a- z`OV*b5-;qm(VCkr6kJPiX7pa>ZnICs6O@%{h&&#W!KraG?D z&U)6fZWsEF?*ItR)759HtcT7Cg7e%MV%ld0?KSYMqo&BUe%Ge5sRdYFv#?G}Yu286 ziNDqdTM}Un{D`x=_pc1r>OJY+Cl;0Oy~+JCJi;gX;P0549_Xk0i-#W^$>N0%unLqL!V{A)qX-=+@KJzHxoAN84 zxthB+%8?ep+1}?R_^hXEgaMk6FHJHXIsb^64vxUAJ$Z>CO_Iy#o`=zS&Jpa0&15*1 zz4!h#w&L9rrqm*P#d<|z?R~x%T}S$4aWx_|wOd2?0se^Ryou$|npko>&bF+PS>-sQ zTX1qaY}XeA+{d~aL-VlX1*E4v^~u|(KmF8Hl{87XVuGw027GH~5XMF|oL3NK%~V zrpQ!;buDr@9~|@#`)5D<+3jTm-EbxphzHSa{R~d<9SX znG`kFJasCSbkt}<#nJ8u_>|B(5LfpoOToghJ^hVE#(|gTmnPszck2-W|34ahqMEe> zq~f_3%B!4XPX6pE%9NvlRJa?^2SQ?q=L*dTpX^;|#vv(qu*B8Hnp5^JghA1SS{DB2 zPWjw+uY2BOd&!Gm#Dsg^>pt6Y4|~{#gLL5wU4XV{KI?b48{O!}oa6fNzkPW7@ylJ7 z^H;z2&$cUE{)&UYo4RfHxzD|}-+9(EmGS@2@T+&e%l4SZJZ^xoZTluPLzzDI(T{Go zyyeZecfR8tr%C+tKY#P>DNpNn zkv?3vyZtY1PkPdmMGgLHu=i^@#Q*Xy@87O?`5)iD^rbJ&dD^}qP8e7uP8^5*jEtZ= z{L<~Wlj@22H@mKNt!r;5z3dMaCY??)ZI6d^w5Ww@D!{_W*sj8h^Dw^21WbP+mM!N9 z$*&3bL0df3pu`_~KZkIy*A$9%+ByA0`^uu}6*N}B6iOUu`0P|~D6#Lg|gGQ|S zMwsZK*FIy$;%Lzaa-t=NdcI6@ujf$CfPyR>4G2ORHH_9N|64XPt+?R_pHb4?o= zdtmZI_-ma<`r6?0`JD>V;v3<+f36p6b5Fiyk4di{BO&!#gJY&WSkDSc_P%#+B^$qc z3T?1EDEMu{m|7;C&PSd!Yr10!hD`u68`k9XF{;7DbGmaySC(BFWp-`BN@ii#Q(6{%7ADHfziZ;6VEiWnQxi3p0+0HH$?5do!$ zib^LI6p<2oPa-u+3pD`(gx+EZCB44<-I~F`({NVqS9Hgu$ho0E9ld~ z36^~d`_M(deG7>$oUOP5`ObR8=-YqZ?A(y&$DwXWU*$3xVw20ZR=Wb7=?PXzs4u5@ zK?B7JMOmF_91e+x*3GbKfUskz`ydJa*4M%OhB4l43eANhPnm&myXhV!p&~3{-11m^ z#?6LhJ^>{p&`%lG^@a2?>K57Rn6Q)3qM0gW@xv95+u|n9V3qY7EcmrEwI&h;BLsFQRzQ@AMJIG^v}fz3jmf5ez7t7NTOx zbfJ`rxGB)%%yXDXd!D{zJq=$zzPb~v>ylBd*Vv3q_7*Zjdf++Uf*JtoStPF$>H>op zKZ*Qn<S4MCP;53XULvjV{$ofI7 ze#gETfCsFQw!`vN$)2<-;=Zo#!oPWH>}YnGxLF=Vgz>}Lq{svb4Zm!&Px#0NNlKjD z;_y8{CF+U-Ep&6!VG{c=+q(6Sw4|I^RTpolvlg9Xul8>~tEa(VqqDYnUwA*jjI&9d z7zU@3f}gpI-VYu%$b1mq?Hj33Yv_Q{H`F#Vc_tf@t8>I$ns(`|*F$XkBj@?&RPUr; zC*k*WpWMiT+I&6~GmI^1b1g3b%*)qURO~1{P_EiVc6f9jEPGjSPx=E0gd89UJ5FZ$l zOw0c4_3pP5gdDugPDAnH=tvHh!-hzh5E)mwc*Njp72kRpPBW}d32R-Wp>tQYNW76tq=w-Z#u*bOp;&JiUR0UySA!j=*Dy8#uNLEaI~6zu=v({R z`<-@pQO)Cz$1kriRw1;`e9aItDc6M&)bxB|OFEfB`KIG+H!ypKV$MJ?=%ZxZ?MrPF zvvpP#y8$bnO41L}$>o@%LkS#GDw*aa$fU^Qxv}(2aw91uTE@j+P(j8$jTFwPHXxYa zfCaW2=qjLO_8c>GFfoXT62GPZM7;oCGPZ}+u5cWhD^;m%;CrZ2&I1Z&9tTXzpi&|R zzts%ntT3;q3tzPZZW9r=b7JEe9#a))5w!M`-Q?GYkGP+Wx_10QdyK)8e%Ou*&Bu?v zAUa$iLbce0@CzERrq3%MIrqZnXf$BB;ZCAS@eBD#;GXNRU;He3+%%-q@jWi$rv&GM zBccO4LP!-kAItDzSri|zEv94rbs*0rqW^~TOq-@y%2c&>>{SA{Hy%{!Je6Ske)~pt zy>o+$sCC>nz-%)YO&^4eQu*vqKl%DQSnO{_XBUG8?>mSwyP@jEqxxjXq!!`^I2_k@ z9#&;euR)hU+mh;mYd;}=hPb|c)u^8^4I?h6o`cwww=y^%&&mv+40UXYMgLs!5*cx*yk$JOtmkz~1IF;v92>-n*!7@Ny0L zK?`@}2kb3~JT5hB9s5rd^Nr<^9eE)0hf4=2AlSmI`Kw+>&v#CXT2#r6fLqD@hZ7}N zl|P(lENVOWVgX+U5fjn`FG-Q@DqBgOB=b~?Qw1dfIgJh9Z?QwEQg}iWA9li#J;+dmv_O;gq`N*zfUX%-T!s zxu0a;M0R74tio!vq%O-39Q4|1P{xN-EJ082&J`(`K6*-BrUqCt3!)x#6KsV`>X%jMg+Wrj`ds7$>bp#%La%w>pk zn@?Z9z7XpItPt6VNP;TXOOd5k@nHoh`qK zV+C~q=0yO0rh98p!z^tBx}VePky7xE(URd&;ilUYp&x=d+>$++#@j2HlGl;j_aZ^q`JM1u^t24U>6$R`bJLgPNC-B$NT`zC=jRTw=r&cG*c9A zkGn9x%KN26j=5cjw?zaBW59PHpTGUs$mTR2yo*=l51IOL{{twi3Nv@Xwkq&Xm#^Gi zb(~l?WDN{)cfL?xMhnIk3>xD@Q+)q;ZX06=aEbfGf4^OOs?;f|uEAA(TM5MrQq+k7 zc0G}~8-D5_$qtJ3vQn26kU1H#F2u&a2KZD;t?g-+gBZCsNTiV8Zk3S-1JB}Ln{%UA zRciTnZs3VhoHGWUA^+eU7kJABGsQ{ce?2@=``oC*p+c#f6FE z?rkyq|MPH)+!X?T(!lkyU};ueH+)8bW5SJ?~s*9KY~i8shnOyd=Lfz1L*q zPoKfk6+h%&c&G}IEN?YK*7mPH|FGjf5CBFqSX@n8sRT141F2rE}tyMr`+=9 z`aVChNAdZf<`%M!Z+f`fKhe#xBFytwb2>W`Olj-Lq&#P|ekh~0@7~u_w`p4+oJ~%R zfm}XBP;TAT8%3JIwc?Q67T~Dn9eiEnp8!B%jr_!~+)@N?$WDB~VhY8z0M1kCX7gn! zGma;rqD))M^krFM8eaH>-xK&yXaFOJ&g-Hx*jlJMq>{rt1|@ocYdc5{1>S?q5`%l- zbitVU%(Y%|t6c7Hbs{WcgPK&Md+Wtv%bm^x845=c563DeEcMm~BMMt#gRm2rKelze z?Ge(28D0UX$d{dwud!=!zd`;2?@wWGM!X{>(i3>m5EPq%IY#A^@J9SQ1q(kpc@}aL z`!}*Zzzt|MedyGTjhE0rW&sk`@E_%|@8@&AVV(Ps=ltvVS%qNKIBfxBHDCdJ0Xadb zo=HKyyy>qJ=^OT56wQy!ZxD};S8pQWt&~m|cK_P;daF01uYVLCH;Z#D8Wvab!i?T|^@!Zfbwu)Yml0i` zw;HjFGNDmUn3ibHNT<>S%gr5%?*=VK;fixwYP`~sgjA`!;y5ya!#YB z@ibdo4V%jmZk>5Y8aPmKKljv&XTqC>5^33Del7#I$YzH&7CN|p+hcX9mF4p9jg@#6 z0AujtQNy=?0xu%jKMcn;Lv+mQY&GIuME#apA%OSSJrbQ={1EXG$k55sT!dm++6@b> zA8s#%CuQzRtL+KBHPdpZhW&K*`_Vxk$wMkrtJaym46YNcFw7FE?yJdqoNMO*Vy@ ze5`i8%#tae#!C9T<-a4EO98jgV8ug;M%|Y8n0fztF8RJpTRlqlcMH24{{ zy7E@O>-&G$IYXIu`mIf6J;~8-_;D%zx(jJyY<(d$wxlLC+bqH&yWY{Q{f6|d**nLi zdG{Iu(uyJxj^Z2CyeXzm@xJM&I^k@VvA-mAX-RjXi}%g;J?RY`?Pi>;xW z`V%h{^0PQ(;TDzc%L+Av&8MCh;+Iggs{n}s?_OHH-tpT)(Sjc%OhDna3JqA*Z^ROr z*-Ejq>O^(4Z7%T+#tbE}*SbXbi;jf+`Rni?f#!jUO}v7l*N3i>QDNvc*0QKY-R!uy z{dMWY{VrOE$h=&Vur{e$04|Ohv)E8_k(gYQF!eF^DZ^IkBh|i}2OXNE%F3OIe~a-Y zsBmQGK}9ZziJIienX^ATg^N$PX3J-7vCDpp5gkgW1Pz{;*gUUl5}Ojf+%FjOrR%bs zzqnegnTS6hYHlfej!5`}SQzPVGuu&FC)YaE^zEs}INWn2aR)luYc_}(%#c3a*%$da zyf@d?|qeJ=M@JbHie?UgcvZoz7vk^UbgdZpj*JBS{5He67F4?{?9PTqh- zOtXLRSv?FeqjewtR5QdKvl#=pUNfQOtkH0mA>;Ve-IR#E_@Cm9Z$JueeJJ9qgFN&M zyS?C)@Jn+r263JrF!i?|FnO2`3(N`ZSg1isI4JlhgR)N=2ZD$7IXfZ#i18Uee6=~o z#TP^kC&vHhnl!eSR~$H0t`;9?5@tFcKu{stj)U(q4oHj9xM`cBzwz4;rLM>1|lO)y}@uzAL67A4s)OhmWAAn9SiMq=xM zE*rzsx5q&&uw>IFC`zzjYjFGHBXtaE#F5>GdToju)yB5eE;FKkA zQkGODXm=?di@u5)FF+5M@-Fd`Vtl8rV#wwpPMjO85Y0!I<#*G{Rs92;Q|Duk%QqE% zVv##W85u@@hiuU zU?)v(|MhO}fhzC5TUaJ-YHq1?B#YbzFI{@gLs3F=y~e;^ifn`q3c_&be$t99?tD?4K*(e5PBq9CG6Zi{Q1jl6_r&@@lzA?u^FQ^>yQ| z-OI+ut$HhM5B}8-2!uxKYC}-`fn<(tnn<6uyyEL8lA%Dvvk*V6qJ`sfxjO4kvfIMk zCJzqJKk}VkHmRYbS&plTGrqs7D4Tz> zhd#rK4atp2l$uD4fqV_4P^k4-x-aX~F7I7GA37Q+SJGVM@gaAQg|A9`0I7Z<73gts zq4-W0nTn;WP};OY)>L#mdXii7UAd`R>`@!<`LGff$+R!>9ZEY|or>BpL}8tm zYsKl)I}IC;<6kFn!p;@o!^Rt>es{*9XR;TDRXJRBpPKWk&sqh4R>cAT2=X{?8(lRN zuXM@p4#aLVm?^F94uV?ZKHnt{1KI}<0vi_4KAhGT-A4Q}y9Q5p^{`t5)zGM)CtwRA zhQ*$qpE&|rcRMqk@7C+RY90&@PWJY(Z5SP@vBj<*7C0IW!@qN7ECm-YT&}x@ee&&7 zJ_#c$XpVp;+duw2^8Q4+LxAybTA-c$tsa)4pf&Jjeoqwxia(I9e*h{Rklb=`T9t{J zBK@o-Inu5_@x32ahKcJy;*L zW6s6#z15^i>r?cfcUA4#AvvIq z4qWrroqx^%om7{(yHfdOn-qAu&f{oN&9(KHxg?`z=@KC+E{y3rbW!8!UZ<357O3fX z=|pIHtDEvd9cWujR;uXhQ}WA##MRT3Jd350=71C(P|1$y}G|fv40VkGN zxaAtR16#legkappP@+#yT1tp{^fhJlMce%odp7=9nq^}$!Icy5V`xvb%nOkI;bUy? z&;~+CA(R`t_{Hn0Y*6Yq)tfT8rcskpz~R-JTWPhkCtt(q-Y#x}dsBGvKG?l&-LrFT zqiH*ff_1j*19Ht%bX~Wq`M&}bzpGgxz8q=W^`NE0+o=iCbhcnZYG1#9@cXMb^k)7W zoi;JtDhn{vf0SwIB=5V{G!WQ(XzKi-u*mJXd#4dSVc_*Lf@&wadL=5~G=web-j3nF zQSY5Mc^XL-Ow^43`(ZdCo}tq6F^xZ;6m)LulW{8Yu4~lMUTBQe(Bh+&>g%9R`<`;=LU9MjfMt0&>_RQ{W8}+z>%yOHp)(PiOvN_D6Z4E# z0e&s5g?l-&>l?6c3hT%H!Kx)N&;}Q5wiTJV8*5SPdJrZ2AxF{kzO1Jz%hs=X7qPHT zdFtiM(QJs1Q}#FHOs~JdeLLI5{hdC!u2DF*=Bf4^9NaJ&t64cNPFrKEGE#ro-yZG1jmsUC#L{zGoS3Qhp-P&x`PDmdGph;fKv9=ewzd3fDS{-5-<2tNxzi9=GeE*;i zdU>hW@8;U$l8Nv5@JClt(vIfcy|12pBlk;_gObPR+o7$z*hfVqn)~iO8sfH+u%4hFu$e-l(caqCws!CZGk@$4@#n2TYmV&7C zlS3P+%QMTX;jg)`jy3`nB)?@=3dxwb+>J3gUhB%@R>dDN(%TOvFkVulPDs8SjoRBQ zqNQwKeHR5m+(dwaoVjjW8YR3xhWk)=@Axfpo9Z6I5VSV4h2-)5QVQvl{*6|3(Ao{;iH?zF>4bnd*_TR2 z!vkB0T8%65>>Q7g$RuTF(9C#eg4?q;2RKQt0P*xuR$$WB_{tE#4zG!Mz$2@xJkEBBdSy=9aHUfN98p#v;qRC56M0SYyi645-O_@=mUSNL*5K#Sdl0W! zyuN~rXVayns~BP#{vRk-nU{MpGeM`gE&}jR+heui6G=W3D{pWB;P51! zsil}56E;&6{_2bpT6p6`TqKpI8kN`@qso*O|ESAxPO-k5!h4m`_S4fFL7OneN0w}F ztwOriZLPF23TI6&7`F!9Zp|npB-pb?EORI!5lDAs(8pVnW7%KYBvlaycFBWf>NTT$ zlwCaA69c$zxM;~fJ$KmFV-uTg<}<=>GqLzzvpi0_EMIIwM08GI1W%xZiz)onaKxXl zXZGg=#w&yRfnnhxwm#KO*rOs9Ufu58G-&CX>N7j{lV|>%Ysy1Bic2ipOMa%Cz>thw z14Z5|8$5R0$=k2N*I7fZ?WEcKUL~>4Vc~4Vd<5$VBz-OAl@sf%?WhW;(d}|9 z^geLDY?oilqUk4ROrVcx*nBHK*ZDa7dS+7R(XM>O($c$XqMy6Vs-BtmPp%eqYIr zK7M6jUwX0uw z$kV!q*&^vsVN^OZJW7bRsu127m;Cna8zO2Gzthg|DMpZWf-a2}2)jCvfFR_|(X;Jt zX|b7O@n7C;HBk;bEF6xI6PKl7$3jwmNuhSdb5y4=P^ci2oRso;?TZc$KoT{nR=F1-O?>;<>o@q{x-dd( z=sb)i!;)LWz~sd}4CP?KnDztn5bIg(cYiBy!v~Vgmre>+6l;%~bjD$?;fYS*FBP}y zq-CZ%lEm8q)X}nB$CfPSbzl+}UIThR;&Nra!~6;A!zDcFjW0exIkC1}$1w4F((m#W z&y?kOSdf{8p2>8T;M)Uabuw&Pkn7dPIbsxvlp}`E|g{ z&e6-nQE=e$wj-L}p2okTZ@2mTH|q5PDyB0S+YWw99JTT*DU#U;9QHuWuMJ1-O5&0( zbPc|MztDEdJ4mQp&~7*-O-{$s!Ur#GIX9yC()U8_bgGdme^Rk!MBBL+#q6{KDgeE8k= zOgIHlGXBWy3B~1XfH9~eqFH|0Hm&f#n?$(FRw*sgRBHZaSbnmd10xZ(P45<@I4$3! z+-Ev^Zyj>Hi7Q1EyS$3zu1N_tUqB0E1an%<;np8tS91jpY4v0yuX~IW)~{pg>Gyvx ze&qaF$W>SlSlN)h5cTri!>&kToGIr~)c&CLd)|9U%1>R&UOP1tHUBC7Nk1@dxA)R5 zYsG%K*YraH%4a8%e;$eo`A_^x7HqSIta#;tdlw3iDs3|ndsTt9M=yl{-0ricyaf!jI+ z!vxSn^!gp}jR7qu-(wRK(KR2&rsu(y4vkuS8Hpfn?5%yQw+{S7%-cdgA$-ynH$68( z5DY?6MZpsv>479lGSS`(Z}0>Dh3AO z&Tx^=@io`M9hz2Ms(EoMsr*M~7qtx|ZrVM{+-^LbS^FegtS)bmSpG(0L1}375fs}x zGn&6nZE1a(cje_{oxEMr)!P#ecWd%*&LvAAfPIwcJy0SLJul zFXesLcl4FsHQHkBes`Dh^*ty1k6OJh%BOknp$RiaGx9YY6IJ5gxp8d9h zj^fv)42@To*P6W@)zTG|D`d75J!zS-w?S&Ow`6;-c2C`FZTl;pMu#2dG*ZLs!UV3y zJz;BYpL|o&vgcIfYR%tULL)VrX}q_0K(B4Z`wGomrm``w-&SizU011EB7AdkpSdxa z3;rP&Qok;3aMY-eUU3wAWUN~_%1Wg%<6R_tqS#oh;VG(dL`xL|U#(Mc^I#XS4Tn$+ ze#vWRDK${J?5lXL3{^aamdJGOL5xKmB*u=joqfll4|Qcuo1>4PnU1XUU)@9fl#WHG zc~9g-YWW?IaMy$Xr(;08Aqat-8sPGR&7z|N3)_KO(-QBH(5o~>YTdSEl!Pk!%Sthn z%uQ-fU*k70DImkR8%5P{W>s`1L5U!FXc=W9XPKJgrFrGs2;vG8kxPQj_W~B z=kq%o_}>@u#Pd{PNey((28zRdp9bJW8ImcK6RlJ8QWvI^#0pIjmEYM}FWX6&kPkO!iJ zKt_&}F)0-S5e+pfRFp`yQ^gcXDogGN-c@AXoQ4xop#1Nf&;9}W&{}Uv&FV~M5*YpM zJyV!Hvuf=nqRp}jj`3AZMO4WQaprb8ESs`7N)$H=R;-So>uw}{?L!+N%cli)yYxm zi`oVE-+8y#99n?CHv>K9aYv1qvtPUxeV3<4s@uaNN_m8zXVk->BM$Ttjrz=C80$}2RbGOTD>q?)+pnXQr>ElEcWl$nV0 z=ebBUeR%xi;MsUC=O(&?uvN@{9TI)gK&NSn$4F&VG9n|bQ%J`KVQ5PLoEr`r)xwsh^E`&63#z>yQmx#va zTJLR){nAP5lJY-TH{T!PbGkmm&#QRh_z4#sLuJ(sSW+{dUK3Syk_qT%qjO(4OH2Y) z8bOx44N}VRAnX}_`5b=C&Uy3W@B+HJ$ci7eaFpH4>fc8X4n4hA)epWs3q0+&Dj|g4 z?P}7r<|s`t#WiA5C|2Y_6?R*RXJBYN$YLEYv_OSPZWQ?s;gLS4$NOT0&w(!sOj_5OZib# z0GF9m%LP&kbdh)`dMaFYPRx?unK2CA^4LL@?w(e{b;Pr)-pwRLPkUE!W)PMEiKR z9;>U(KZZM5*Is!f3!ZIPt6$6fn(?IeXU0hJrblYNMQ1DRWDe_s^rj94nJ_?z3ul;w zAGGmQrJ2@DSz6zPV8Raf`cgh0F_j(JBoHz8`wiz$;8r}fLlHrASL{1g@Yx5Y%cTkA zsW@*pmfJ6uVGMNbBmObs$C@~IJO%O3?V98fq5+LDCj%RC)|c?nVhT!t0_PdbuM5jD z{%cu7YhfJ0ABSiCDI6_Fu-oNo_UF{4>aRD ziE|UR&VQY%$C3jJDyX;_l&FUVFyTPLKP57Vuzrq(p&iAsF~S`DK~uyce{?)v(ruw5 zV(n_Dtrv+EGIW?<#`YN5mLcb>`%5yaxbDJr?TV$=?qV!BR_#S3{%>yT=)DaYhp{Zf z=Ba(Xc^Lek`xL(3_ z5aS*p99zH~qS#InwnpR^p_%~VP%(_kV?%`ts7E-)b@1`Ud}I$l%H6wWD_!1WUN3O} zH^j%^I)IR=2ZrQrfv21Ypl?aZ$ix^=%lNcYDDR{^^$78kRbPDrV=MBic`xNsUH9NZK|nOomejvXR@^gywvI*ENr&b>rje` zGdRARbsd-a+WX9x&myXmHx;T?{eTO|IgZ#}(ka+JwW>f%__AcG!{Ocpme@>Y3hs3$ zyvE^k4_#?79%_>kboT#k+_MGh~F^9Hm1XeWp( zQtwUpg4%m>ckAhuYd@L}W_l1|+^s#dSQ@K(`-%33?o)jtSU?EQ|?n^z<4{H|BqV2%#>usz$nw$nmqzjs%C*l^<8kgKwg|hFeq zUb^(xg+}maP%9aXwuAA4mxDW>#$VBS`d38%bp=brhZJ#p* zvSu;{+j!a4+kR$r)Ue#TXifwvwd>)2T?gVJ+$tPviFMcbAwLa^_d`hPK&K^cRFMt} zO?j&gW{#;PzIeCgSST7}yx`tHxi8UaO3H!j+CzjJb1$>=qOQocN=hk=aR zbEPkCJjBamoA3={qCdpGF0pM zSFQQsjUdhE8RvB39@^&`klJ~R=mLi0dQEMP^yd2)k8lhZ@- z+ZWx)$bTNlc?wYwj+U@*&;Z_S_5NWimnb0eM-EcnPw!yLw?-fs#Gn_85r zR4BkIzHFt>8gJi8k;;{J8~C@gWofD?&EwE{_(R$oSV(BnK%%Jc`;>agZkGtYt;#mbK zBz)kumf008qWR%(4MB_e|B^2gv!pp{;w2V7uYhb`?DN!Ix@luCmRWX@t9&8gs>iqp z?0+Fuw4^qQ64E1!skIDX`d1b|bzu(f@QFD}gP2yMM1OlDWL z+A2pm9UwaDkjaedI(tESpyqan?k|C0{vGg^2 zkLX!umhKh`c3<@oOI3g_cgJ3+02~D-d6djMIgN#{80Ww4ltxY!IDB8CEo!Zi4peIm zBv>^uEpA=~my=`PcUMhP@l7RR;|7P~khJIsE>y!Gi930}q(~b6>Ax||` zo?8XCHxxKwAG)ae_;Y#`QLQ4U@1#|B8vm`3&#HOLC%oVjd^ROS+@izDOKl=7o&){| zp>Uf~Gcv-gXIQ3p8FEADh@_DZ(dP$I0?Bd>A`5)M1|z|1B9scms~(YbaVdn+nYQpY zSCA2qb#6i7g`BNx6&;fnI|S5Q5;UP!hyq?uPk4IP#vU!lfq%(Jsba`~kv*2dSzf9# zJ)LVY?o#q;c)8~j*9^@*oL~OmR0YSowCl5HEXS;0iuf^nkI_cLesd{>)4F?gK-ed@ zo4EG-&@3+m*RCK1!Qm89RStay5ZZ3s8;bKc%JSIB<;v7ky;;p5;4viLNvP*)5=8RBI;S)}}c-KeQ%RxAJLZWQJDnA*IoY z4oOpRt`#v1e4inhl`dG6w-lwsZZvx{0qD7E-8!i)_%K`$B2aB_ov8_(GO4rDtAB1zfo-YUQ8Gc#eh$e zEqC*z=uqUo4~7(?S-ofbE%S-Bo8xQQ%n^-?o9^|Cg5m{{%zpowf^C?vfr)G1Yiz4T zMXD~BS6}yp&qugvNe1rA495J{ogvLs3C02c5@r?jN^1ETne`0|wyIa_5(G4cQRk6_ z5TY#gJ~(=Vd`Rf(kV%K@WhukzF}9q-(fOAQ3y@!Nx#zSkYhLnuFNI+SG^aARO7n|# z;h6bTm~E9Xz~82kF#_3>Q+1Kkn0^@aCequfh4AfoD6!w3i;Ua1dq2jEF#9x4>J@c) zDkrz{a~x{NXbGuAu-$IG9zSE{AEv27Chhf-_)^)n6HF-#Gi8j;SxEp_9Plei!HfF9 zd?;QN3ziha1o4TF*jtLN3E%^9^{gy1%Nq~sr$fbmX#=Hv?-T?6h^+#VXt6dmoNeDd z3t9-z#ng3^mkz#&9}$Qj_psHYx)j!LnqKM7I!FyO5FpL;w&@f47Z*0ZgSJ@)ZpeE1 zk~AH+M686b6*cy+MEDyL%SG=}L_nHhFQJJlePCv$A(L+RNDE&J+W`77y+Za{tTeOu zwWx_kP|9ir)2-MxhTqkK=HExIQ}E@;)z`Q*_5g@J&=aF~bzdNz3E(iLZZaz-QB)u| zh8CI5RGOR7n-F7IS+)pvc?p$O1;v94xv>}wzXP*MpbOD7!!dq5033yIAZS6s|ILaF z$FqK^rjHZ8O|GQoCBPK{swfj zbM{*}glZLBE#)dV=NWK5Du*aaG_UyvC3h={4z`eWYduK5(RBlA#Q83aP@nygtrNfF zC}5k%srmu=30TS-xN`*^uJI>)zw8xSnCjZSPm>DJZ28eD!)isN-2BNMbyi`xY*WP~ zlk79O8_((hyggT`n)Ts0ONr6T1@9$o&ApjxuC!2ihVB``^%RkQa5iF&dKY=jW2}Sa zbM2f90Q+&)Skp@L%YMx?%d{Y{_lABHYlq~+1*LaP6M+Uno%9)U8Srj)Wm zh>vkQ^P8FvG$0Hh8LebdmA=RsUQ2XcPMgq)j40%)|C53=$1_0$&(OJyeZQGB9f` zq21C7x%cTRazC^bbK-38(H26omz3YE2S3zY1hJ8l-Ie5%W-*0dZu1R(PRAzZ6Ox*D z2XYt3gqZ!rO1;(PW81Zl%N(9Hu2mW@;I!B@n(e>O#{udQO8q8teP-laPeBD4;gD^q z0S5qGThhx*iiNHBB8aY&8AHtDnX;xfysXqrV>yjpq78Ls(Y`A5qaK=VmbW1j7h}2- zNwlKKi>2klI8Wa=ji+7?W1Cd;@>g<@lb&7Ygp)2^)Vdk}3Zm1;+zj&q4t!dO$B^rZI@3!3ZWD!s85_s`jo_n&9JO`rZ#J0( z`}V;G)wwgq-j%)aMg#Fv<7(}u5A7B+Amj=XRy4^05fOG-jSIyQCAJ&pNb7y8D-!4N zIZs@AfBv)daep0|p|j{s)SXlx1|0+zbeOt$6!_++*muoOwW|wTy-2~NfH@uNq z!`lWjYu((KtiO`5!GcGrG}}G~^7S=(E#3CEQe;xX6n&))?xP8aI1c<bf4<*hxVpx1`b&U%7#e`(Ht&tR4B-FS_G9M$TYsx$sz_n(=Rxtj)iW6Mgq znt1YRQTXARJpu4{nG3&+DqA}z57KnOM)%y4o8Q3NE-%+DKfZKVn?R0x{DLhUFgz3{ zdO5NEO%L~#*qnk??daS{+0|_$cOm*kUAwik2kjpSq1$(^%XhvXn^Ch z+NRvMywOOM>8{jMZ9l>fP8slg`qbGajat9VSd0DW`Nd3igXr_Lq>lklmp02wbrgWUMedDjAy3GGdlIKJt#0NT z%Y}WRP$Nf)!Nlt>ik86k8e-MTLLmQ7l5dq)eM(+?0cCf{)2rvBKBfU8-(Ba`5-)D6 zR;H?PKlJFj;+v8=lW#UWHF>h_J5rK-rxKk?mFyYkfPYs0zMP}D6Qe$4*-xM3UIaF$ zKdz3O@zw$kEE;$`{)R6eQP&2a>yNJ?H9t>fs(!MCK*Qaz0L^s-XjHbl-#B*uK{%gPeO@5pcSe$e1 zm-?t~5RAqcx6M}UAy_PpCe)IqOYc`X$DgXuF}H@@Xvpw*G&gDPf8za9uat$Jy+qa< z>JM~;S;6BV8QqQB|12EF!I|0LtTOJi+|!<&WTZDQS$o54?(%mQHYRSnJ(l^he5J1V zgLuavF5*r?<%HBtwR62KzylGm1?DWcHve8LeRW^)ct~+$Qq#fWo&R=p zKT3&CNDVuk*-zV9bY9xTI5BTeF{yR7E#{5jk4A*5iaZ$Wcv~RL+*|nry#6A5=hh3R z@FRpS&#B&fnI=ZjMpoO5wNnsFzS=>h%P(^FCLB5`r1{_inuYLuc^0`Pa5ZGEbejy+)PVMPI}2 z+H(Sm$UB|6ee{ThRyAQgr>n~EwgKjG7Z3!Wf6}w=R=gOUW#T#dM_2vnF5s}OsM|+( zY-uaDi|9n_CItah{mhhPA;p&a%yM*XY877i<9cu4h^o-9$jITyzIEK zsHKQ2HmpfktpY{d09`Oue{A#i>X=oZ5#ORv#DL| z%wMy$=ehTP!6)lht^L-2rM$5k#&n0l*Ls#tHF_Ln{8c3xI|hzgxcM5`SA!RR*MtP6 zObjjJ_y3<3z$XG)#`J>#<94Q?VmdnykuMLw`}@MYqBNiNwWho(qxDiLi!>@Ot=2X} z)5O^QFrbNSp9VO<@i1gh-}p+&Sn30|M0gdiLw(jE5)A(b z4vtWH8}GF6ZqCvwUN*$&y*7n_uW{zob)2_|%wu!awExn=}%6*&0PSKvV zA@OQ1)=gA`_Ox==(_JMB@KS!Q$<0g?^E{BTcyWj`^+<9j{;p3O*qoa!ghRaZ+RoQd zbSz)KV`m$B%7pSIsArV5@6;!E`xD$Hkf$M+tvC35Z;WzaRG+<;x~Ovs&g%}HXP25l z_MF4TZF*ZE;2t^CmbC`bHle`um7-aCy zS&X;xif`2zmtx<8)7o>+-Vn$Yul;yPo|ze=LKpA)-XGixQc}kpQf`{YJmfoJf9S|# zgV&lZGr>!2yOtVyCwFk!$-Wd9uX~;5k^_^xx51A#njx{rB-^h;SKM

AtkKPcNQ0 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

w<7UBx^3zuwa24d&EGJTeHxC*6mleEmub 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

>|>567h$ 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

2de1D*(AC1=JUTxL|~k zv#@~}gF{LUVwH>;7L*e3Fpo$1rnaCrT>GAO)biUpfe+5<1wt5%5VqMC;mKTXd*er0 zbBkwcUu{OfFcp%(`OwS+T_d|Nrrf}wdlV?eFny7S!3`Q7mh7flj1eYXWP_S#7wCHF zI2k@moXie=@-(jZ2?(xEFq05(L4gycsujye$vctkcz3MGFe_hg|NX~%ujclMzwStzA`Kh^92{~MlTM>c(GN@H%T)feWZd=h z>LqR?d|4Ad`+~QU5@)c-d6pAP#2QsgQWav!kuY%VG3mc8y*!+Rj*I)u?gM(o0%Qwj z6;x@B0#sQg#$KwMqLmtiHud`)bSwZyN03M;Ox&+wg*q-{fHPks%;j6TpmVs?Vf6k6 zFLIh#ixsEe9T~WbmW;|{RrXD?J8?Sixip14FaMlxg%RL1tWz^&!UW2C>yVJhtUs0K z>tOzYKXQ1h&`T1ASP2?J+t!R8H3NDM4OCPPB%@4CJ5mn#DlI!4^pzT!NRk=XZwF`e zyU!#CCG4AB=-BKX8=x1mRac^ zb>IZmCSC6Th6L_31`Wi@W*E=zX>-0}Ageh30cv2GgAe!aB&DrBektJ|9}{wAp%b5% z);ON{`Wg{73Ii?ST6DmRd))0osi3J<8EOxXq>T{_egb{5?WpY(!4z13Tc=yzSMOJ1 z25j&Iv(4H32SMh9N)S}rGRH!pqx>SYK;C*>*#AN~z+x(FYYeA4nz06mRwcH!z^P8P zl*vKauB|l{MsTUUR7W+&iAzqIn(V(gvtTHHk;MtltUJM0!qzU&IfD021~y>?CS6HuVR0ff=T&*+WYdbB)9KhQ_ChZ^OTiSWoG46nNup#Xk}_@W#)io4msh3 z3X15lY*gzwQrh(PyS15t{h+<*~H3ggpcMRUUHQ5 zccMev0FFL;Bhg4RD~sJ9dOd|e7mW)DGiTp7+@IyWEw z8;m|%tbZ%L$zp@=WDVCM=LfuCki;an&Hql$T-xibq7VT|#fa}tb8pdI#(gwW`mHk+ zTB1YAL(e19pex+Toku3dOR06g=}>@HDH68Oy2dUFqb-;f07iE&iNq>y&Rj+0#B z`ma`%pV{+Hg0U-56ls)f`-E!#Kj_YOvOnMc&1KPFx@+)#lc}}R$<*LC>nn_Y7u$iq z?Zb%VG#k55uKHp4T>58O!!x?VLlviMrkC|PEBQn zr=>Z!rj~C_EneZ1eP&U~vT3?HNh#>=-I*uY>g#wBwaL0c&3prX_=SebaAU zcmVd6-V+tKl>)e;2apGk%_;-u+nfo#eD~wVQRzDo(E{Hq#m#ooiXU$MOM1;~0d=}v?+Dp?TKtxI&Iss%U&n!GFQ5;-`xKiR zo;v8P=fxrSq4=uSnCnx7X6>#2Qm)40!)f4XBaVaG+z3UmX4A{K!1w20@|!ZYm! zPVVuYHv?C%Ayj6Mk_L}w$c&$p`}aX7syjseFXTucS>Il%R1xbuum-rJa|eE^^Tp|# zmMk)x;yRvfH8#D;-phLvz!pQz0Yq1q;BC%-D*euKPmKaQZ1cEHegJ#xynpDWq{m~( zwcL}N>XvXf=IGGD+cR&YqOIrR!tx?2gClefHI2gqKJ2WkA9Vzh{@-sVQm;mR6t4w% zU{hE35Bp>zXR8)=9d`g|sk>&6&RY9*fB*7T_~luJJHcf3>+R}|PnQZl4AS?YdCbXD z6J$^{$h6s%v2VkM4JTVQ(oM`e^!aacmaxGNfmd$=JlXwbPB&Bly4A$h{bt@vfkepH zqN}Q>kEH9pN>}MiOpUFrn4x}sV{S{D8<0BYHLN|{e5@#y6w!P3ZzR066d!)Hq5;(Z z5`CGj=yk*T_MF(7zcOqw@~xrS8TP2UIKGK#oXAON`SA+v$h*1b*Q<^stL;EL%)gR1 zMqD|ZSZ7nsUoM#%#HyN${qVWx15`;NEs|31uwBH~FW!^QNb#g78HRl61(>Jm%>G3p zrQvk)g^P~{o9uCI3V#9B^uCQ{M{uud)(7I=&a0r?1 z2{`@m)?aEz7e+kEe}V!`i_@b|tu<&3w8=_Q?#uSY*5&ovzj(s!DYiO0hAq2vE;d~q zI9^T)VHENU@%mlT>-lFpZcXg*(88*1{!=}^X#X5fYF~(@j7shuEzOz}w(i8u>S-01 zZI6Ykyl?#KVe{Hn&7o0!k6h7p^qb9{#q6tI#6qk{bMnO=xljfMC_Z!SmLG(G6hj0b z-QVIPc_Zkl6o_|ajIdMd<6|fKpazgHv7h402eq>~Cd*fJ8)cnFZaqZhdrIbUn^<4F zNBaFZnfaqUx~PwS!03bJ>7!49t#ZGi?;c(N^HAmJ(OL$iyp`J+jD_^bm^GZH0Mm`{PO1#NTYr4r$tt-jT~5g;>nydaqtwQe)>DdYti4s` zeC}mLDeX_hf9E;)hWKzCxDb2ybG4C`#eO^@-M-lR-D9KNQ<$~wdyFt_nvnX<{-V^JQBb#j2<)VAkVT~2Y#mun1`Fo^HhbLy|0F$-S&O>@ z=M)@A;p-6P4*uNy;_CR&;FsJ68~TtFiP;@Z;XIT+7Jiv|9Cohq1tm8#?`f7&v{=7; zD3B?tlX?*eDWF^Zhqj2;=X&DW&@wjca$?JsQd_EW5-Cgj(0It+x1CC_+N4A z36lJhh*HmEu46{K4E^gjPxPq#XoWi+8z1@4;ft{Wd=fOisL>FIieJ4hdmo8n`Ks5-TZ*A zp_hE#K+}?8bogYaPH*&gLnhsvRd%^~v^8C?M;e1?#f1x~#DeyumK1i;^!EZ1?W|@9 z(dPz(@sxUMx^XgQINe-)t;t?5?0SJQ9_-d(zu&R1CQ-ETL(b_!12w(>%s+7Oxgmfs_(et5 z(c^X==_8Q3FT`Vkm>f)9C=oGIw7l=)y*DLS*u#(;`xEnllA+A7VA3n4io!qqr&`Ms z^6y^pDBn@6u5qI?X2LdjOUDmkKVfHVpxanmTWVl?I0kNl?bxJEVR8^?4s2ALP?x<_ zSH7VpMAAQ`+68pA1)r_%DpV4Nct7s2X<^wX9rK!3<-yEZZswZgDRO>>zt&@A` z&-Q6*o$cmPQk?Iep_usOxuDA1xtiZXi?}?gG|4?%uA|k!#1q1$T$@WmyM&k90URMw9pwhCPi0jz6h}sEmFP3BS#z7EWl0IPX1kp62 z-(_R?3a#ObVm^^LhP&RTPX0-*;u=x$^_OgN7=u-ew36g`&Bi==R9`AJ(B3y~STTK2 z7Gsg1ELe-5HdJH7k5%e$ZYb0R9MbuoHCK{?n_^+qsaf|g)?r9&cCnjUgFQpdRiKD^ z$zRBG+t6H<-&jaG>icfZpqWl$;MDwRI<&ilP^d$zR(l&jrak=F4_;k+=4Gu{?+246$sVH7DozKiL-RvZ#&X&G8$n?X++&oa5oVhw(j zo#efs_L5O#qFHz*06_8eo3G~xLR?2!y}rWHwuD-X|UPKoGlfPDAmJ`?(mcDk4HVqavq zpp-&8e^9(r_I2m56s8`|r1-aVhXiTwIpW zL2149=>=TaH197F5WUq+!w`yh4RaZ^O`jeufGty@LJx>FCXv%fLSr~Regf9%`e1#7 zHyhCShRV9ipmp*vAGonEHdh#Fe>!}?Di`g7_R1=3G^oJXgtexpqmHJHU{FHS2H4B! zpCY@2dHbH}Sms^*&b{@+L-Pl|jA`1N!UL8hl&Sax?{b2KQubW;l5kv4CpD0HfRh;* zcF1IDsT))3l@afi{K>a#O41P$;xeD6k*1(uACJ%;LYt+`Wl~ZCP=QH^JZ31^|lUU|~#e3}#LW;&zYGk3LUldA1`G#O;^t3B?J2)2TnszBv$hv|ME|&tVn4D;p=)&|Qs#2z>+-%62rb;Q|^Ts4&H$UGrgWoF~Q`%&Nqz z2>D6^hYtPmKZCPJkiiuHG9@y|!HuIO-^sWV@Hrxk%@gpj7{$f>;9Xxd!zJBW-u=B>K5RFbFZtw`J^+Ta*@`$Bzr6aoU zp(!xI-VODpuOoT}H|dY2ML~=iT&_~6%e-^q*@ocZMe_P~7~2+CVONQ`We20WAulMI zVq5G&o=*s_)|{Y&5D{2VXC6M6@%3^%Ic-s(Q^=PUWR9{0e>aw4lg9?Yk%Cb+$q&jd)PIAHlJP8InC3ua3P^toO$t zx7nm-Z#~9!qgI$5(L$jIe#F#~j_fB&9U4iKQ?>9yR|pr=#^McQW*6Nn6V4ltc`EY0 zlKqTF|K_j!xwk2AZY7^d5-2G zz`b-O%loxUI_l9m?E0?dsyNcUT+ju-9NW-%pR7_V=+@=FtpR4pM2>&^61^feI$Z?x zJU45^Pmy(?78fUnsn2s@CD2}_q34y%TZdR*S}@Sw{ZjkE_)5~zT*ho8RVCku>}{j>-KFxQ8Jr?_k+e8$ zo#h=ozO&7Wa1=;ul|prcu8#zo@9Yb~IQCVr#%dAW)0A}q-|RVcz0-pUMACV0agn<`DTo?`J6< znEoweMV5v}^No-D?q_EBjouXNtIO>*p?+6xdDM<;VSNeHZa*GqPzIlKBDktUBYwEm zOQf566P1pw3)2ZMoYvJc!7*a2h2qXN$So7|(zNKwsu(UW+Qt|p=n^uHe4W>>9=MfT z!7CIrxG&x}sl7r9Oqm8w%JTO%n4&koG06+}D|VYjDVYwq*DFFZP`Ix|n*&RsC0a5o z4p>ygS{lm5!eFHF*qyJVZk3U+G=<8+ekR?Nu4lLpY};6$)X!X3mgG3_7g`bHRb4DM zWu?SIh9(%&%)CHYm(dWVl*x7;W73#yxImwl zd{jlrlIor0)?o)0YUhLP-`Fmp7QWHb)dXQFCAhGN>?Oa!S+XHH-rjq+J;xlXHE6kl zM;EgkUrGCr2d`Rn=wdyHR{6|*UyrUqyZ{czgPA_LqaX}@ljxF8Jr47#R~b`twM}3wr6zbs*ys-_Y%oT9SJkE;3NnrPCHF(#! zk|IjXdDvllLKr?e{$ODS+$q(CZJQiusX$>YEhpdWy(8uZZKlzoM|)D3!f%*9jX~W$ z&%$6%Ts>@{CJoj!phrVah?!Me!Ww4_?AIyec$L>De7*@8ES#F*3Vo^*4Pmc%V*FE% zBghX&Ro__Vzqb7nzuY3AZpZ9gY>#Cbv-Ya1y{?XEsDU|#IT61T(+vuZJTa^ytl^4b zhF3I5y3I<1^E?OP~anha@y0EuNcn^<PB*Ytk9>ytdCbo@nA&C4_RRp zO_pbrr=g?o#4FZBESou96XqM#z_)ej#ha84d_u?6AgJL?H{*r2_HB>q)tVP&R1@p> zkGzIDI)G|=3S65A5e3BgSMQd_AOkntpo*gbzVjXohG`76ciD_Pl_x}Fi!miS^zvDR zSCYStLlhc)jY0Rv-P42zptX!N1*I&n1O=HKlWz5A zb~*65c}MdjS-n=-e7|l&ee%t4pN|L5YuUEAnI%@(CqOir^+L~A@%pbwY~Ne+4)Iz} z#yvIb7VfPqR+Zy-mqifOHJ%%NRK!0<-TqiHw^2z;4S9<+)-}MS&&Si~b-jMqFSpf%(I8Z@jgj)`J<2gcteZHUuJ#UDib0!z z9sFlg^TXn)4B)_`4Ma7vPGhfHAst^GV8=1HqPjjk~eqG(H+lrzkNH#!qUuVPTCdaFEi1uDpAf+l$ci*7t z&-rdSlE@b_&9*{0Q+8o4a$fKWDj~K zIk2c%Xdf_J!B0*X>))MkNAPexdz}ZZ!Zq%QX+2@#k)`D?P{^0> z?RTyvnx^TLKTeu^b>I?lsVF)9$ij>Rp*V{Sm@B77*2U2bOj@oZuWTS$F2x|d1Y3fx zIE9hgTx=#nQ)&$nc7B-eUxAd_U3 ze62B}#KQfc+0lgQt5e)DIMUAbqg!U%AI%Iy-*31=v@zN?`F=pR($+y#x9!D&5#F$y zAvQnRBS!Z@u3+fOH0`L(JpP4z552pdIu~zbt1E|>?aL8 zqc@dv=v{j+r!;541Rq^frBG$wWfqkO4tDupu1qjPzW)&c`Ci(sVzOn$q2JT_MO2%& zF{pX%#ECZJh|4WRsJwy;KYU*OvGTRu3gg4-KP}&iFMBbyYYl>C?raD~(%m%XH=eea zKJt2?C$MOI_&=dB;B`9Zruycd@J1I$zey+e)?i7=rD00*<@b-w7RjdsOt+eTz7G}&f zXpdzBp^@EL4PJ!jhe1g{U%9eod$TbpC=y+y^BISzw#Ie!UkPP7YA4sB;pkRf2Y6O_ z2k1YsldXG>q^&&x0^9cQ_Mix8V@E&K9LGnH`r!td_WkAtWxSyzpFs+&DMyE3LtAwJ zDI&n|f8RFo*=LF;XEmV8%OJi2~+5(>y#IbrH^=Y7Y(yOsVLko7ugD)8_9FIs%z&p-pC0{rg_>zEPY_X8D=znlts3zb#*1t%B#9Jh`%WA}xlO=3YlL#Y=M+=7%q z+5ZgalTBw_JD!U0rz#UpMeN==f_H!O(}i6DS*0keC9pk1+Vp%RI`&fd80kSo_b+^H z-5D+V%uZV!Y?*ev&PZm#=H1R^<6PHYeR#gTXji3Mdy%p_m>6>a#D5~UG50{pmcOOp zym@`MoP^h>Cq}1$MooQrXlXB{U~seQSEDbirPYt8Y2?Pwh&U=?7C+cnHf&QczQg+U z{X=nD(s|;(WM|7ipGUWD%?WI?lKtl=Pl}2Ltv2ER zo)i*VY6gDg0;~?oDl}Io=!&vimBOkNemNzpSXjlvDi&6qxK&qnMGve>VO0vhwBafi zR(h1GD!YS0IWA+CnLR>DWCQdpJ3YA|>;B)+;au%ZW6rLZc6U)pdL3#(XI#lq_5 z@#+>j5HbM&KOqHYhdA9JAlD&EUKGDHz--CH3mxk?gG()!w3ChjsW>V3b~xoV(jA#C zT{)U7iytsJ(&ES&jVGE>CFsTqdE|nX>wSfg!)m2(<|a-UxN9F?n}wMB63}v}Fj1TE z{IX!N*(BLuJfpI4dKwBPu(BGMn(;<+=i$s#o080RNpHN%sn@7fEflwCs_8=PmZ-uk z#4GP|QUMi6Ygee2LG+Y3U9~XeKRHJBu9PIZ^Y(~lssqVGa|;*Rd(PsjyaQ`Yq3!-z?8(8d?xzV{Vc z)hpZP-edgRA@07yi2hn0M=KmF;I}!VOne=P5ch~5VIyu_CS8{tG!oFnBBpEy%|4W7 z5;knzDJd$t;PL#=zzL72aiDN~hTpP3^=Y)!VGO*zpK34bbfwqPeR?dOl5Ta=7oyj<%hkzowEd5VnxVxq$REhYq~A$j+HpvWfy;Ull&u zWR}9`kZZ7gfvuPbM3QC~INcYc;~0C--3 zBscPOixj55zB~U^HpPe7HIP@S44~c`NS~Q>uF`Q?s~9#_UO`4TB)XcgyN(ev0+Z6A zTvzT_A%pBBnNiHmjs~MdN8%0Y9bi34R5FF@Ygc4PHu^roXF@76Q19+h8|OPT#xuhh z&J+gA1^iZO#>M&b4SB0IYY=C++nHygHsM&MbGVPP8Yzyvfq?f9Ra4X=W}4=zYhVL2 zJrDW%IgD3Vf6LVj*MRCy)Hx!DOE zso0nr^291Cj8WI{y5j32SF%s_;cO>Z)f}D7I7mm=4DRgdWM5uO>lxR>PMW(mN$TyU znKmxsd}_!z{*tyu_K|^Xs#w5=TG33etomI@V9Y1dA8PM*6}2?s2N^6pjc%1lzENSc z{JDu*NOZ7`Goq!t#u{wdG=u+~*<~WlA(ut|J0endlwZ|H`(88)8;ieDY zLK(HW{Y&wv#3Wm8cUfjviyFo{V)k)*D_+QF-dwt*bY{h3^Ea*U$ zd*}GEr)9ZxGU_*S|9POMTT|A+xa(`-;y9!MlG4eUp%0F%?3fb3zc# z@YC94?)PS(o;kB@#De-(jIE`_8xpGFm#G>q4riB6Z!a==-gCb&T=+;Wh9_-- z8J88|qtCv}SZUmQ>kg`PGnnqSkyt3)_04mUboK}6;AEC!=|iy zZv@89ktxds_!Kq|3!u69HHQRC6G5K0LrhAsc)KC;Bcg<`r!6~$3OW2;faM`LJ1b?| z=YV>bK4nuJ*usE7m6^LEtxJ@eQ0@;YRHv?w$wYr;_8^1(JrGmT^(j4(nrvU4fn?i> z@oMXJhW(r4v`SvTxkZB247B!=uh$>lqp!6O$bdbv>51GJVcuW-QwCVF#c;YY&@LTtfCxv>K)wZQw)MLiqwqb=R!1y4z4WSekKen@7n{8U*GWZp9`6Xfw@E*&Cpx1 z5-T^oeXxFgr}BIB!Cx1^g&TpUoiG^xZ$|7sK;=9rQ@i+UJ=9qY%<)2t4){-+;L3wf h9z=>5uQo-f6y$A9dFXNDwg~Wd;jG0O^eN{*{}=Q*ulxW2 literal 26463 zcmeHv1yo#1y6(n3gdo8^K+xcBAy{yC2myk0aCav_Z~`O{+&u*M5G+7&cWB%-IP`0B z=E$5mckbMK=e>2;TQsYx>HT+C)&K2p*Dt$vK_(yz!2RbE(h>j+3;@7D{{YA|AO;{K zA|fFoAR{3mp`ak6qT^toqoJV_Jix}pAt59qB_SjxCZ}emC8uPhA||Hee$4oUm4kzW zjFwlBhfRQ)orCSR5f~H{6m&Fnd<+bHHVR@2w*T@A@&&*`MgU+3;9w{LSS%PgEEq@| zKn5Kr0?f}B@V6HXEF3%nA`&tRDjM_)mG=Qy7&tgscsK+EczEcyJ)v>{9t+_C1*<3` zwvr(dr7aGdZ*)2`)zh*TT;;)iYWA0QekiDT5Ag{IAJNd#J*Ma2{7FWM*aOx_PbtF06H8D^yI-|0m8s3A6-VCs5p)y z%>SOE3}l2p_E8eY0six1;u5qaUp+(}snW>hbShkPq*fKBGjOseLRg{k5j4)16S#2B z(K$|dq*(s}TP|iMnqRV3ftomFN$6VMC9*BiaV^l&p;5}kU-yI101`gZzfg;t4KE=(7dA@ z&cd$vOegg{Gh^v2c$d#H4bwQIVeQgd9Rj4Uwa%Y*Lx6Cn3t8=VTojx-?@O$lu~(lZ zJtPUDgT2P>cFAoc4A05WHFIMVJGs1WlM$W?m-KKJAnQr*6|-asJ1*All)=mdHuMalcQ3oXfACjyRYaUlQZJrKi((CTWBK*jiq=2NhG1A&w+O zN^~TqQQACu^?os^sUG&{14xeI_BX5tlrEsBF)KFXb{_EuDRy&NZufE_K&iR_Q=YCx z6aJ^BIurI@(lz=g?6FfmT#r$JuqgJS_!?_6wDN*8V@-VV`DvnVcGFke=vJLPY4=t` zR~chFz!%t_Gy#^*ksM;Hd(-n)66|_{0FH|B%jj}=X4MC{w(%zfMZMStmE%i^Iy|db zZBN<1)q8mumzHRRovitp`xc7hBJ>VTi&5==_j&N4Wf|;4n-ML)g0aaiBZ7dV^lvH} zXyAEVP!*o@u(_LaEa=rDbweGQM?6~acum))%a+u=%}_s(ueIT$;mn!{DhkaGtxxPe z{E5p<9@3@#;A`fg!*)hS7G-rQveoy2%A!VB0!xv7KKvF8@uQ_bK+QNMZ*ufo4L=X> zCL0GkY9wc`yc*4a&U7mi`t9!B3myfSYiSp=mo)64o; zb+jX@Iq<5&b2f(Ob@ge^lx*@cft88<%;+Ckh`qQWi{TcQre9B{il-!rV^GkFL>3U7 z^pR-OiZO(hsz#0{N_S?iQ`8uXHZ>w`+#GTc>KGoj);0FkBJ>`K6FV`n%CN!AQnDcQ z3-;N5+0gPLKhRIlRruWV{8e=XnCDep&ADPcxgnz6tlKeu7LuMgjtX?Xp!>U0a5`31 zU8UUOj$=2?cC|%*ZhPZC8rpdv9-o=-;knfFW;8zx_+@m&d|&y!L5<-O4_)I6VGD&gS?PYSWrjg)dC!p=<^irCIHpNg!N z9&?V&m^V>ZgiebOc(t46w4#qD5E|L+T=7_ z=~wb$Yc3||u6#@4BnLaz`n)cPA!ib|cNiU4ubI7sKlbXFl+SDa9m|DdC-w9dK4>zkBe}m_L_qN;?#AaR;u>U&a0Ru z#dtG9krIy_UNZSBMI<6{Tde|Sw@Ktz)cWCMZXs`j#ha$dQsYvd16qG8>+G0Tnf=`a z%hy8`Ix99Mg)Pa&)5$yo-9$t z&es-QdLzv1S*Ta1P>dUo1ZJK`eWAcgGaUHnn1)<2f6j2xf9*nhGhBqhA{whTRJrkb zx@Tm&GQ_kZ$`SpE)Ac=J0S!mX#l7;grXzz(^}UMeA|c6y@S5qq?W0pq{-HDHRtPXb zrATIRbTbLH4Vx$1vsZ%hUKKE%oz~u9L4NfE=1PmP8;Mj7Jg4u-6CUM_`=0V55MT>+ z(*p$pP)fu>0A24BBOSuH)RUkDXOrfh%V#WjSEg1gR6KiQX#)<;+j94Y<&GNm%5&z~ zt!8J|a^(3g1`sT*TNOd&;?(0)fo0*(eL=$UnB)G5NBx9n`WS>;;x5db?rZT2rSaoL zSxZQ#rq&qx^}6#R97(-mTKm`S6{6tsIyPAum`WSowbDfq;=YiqGiQAo2J8EvGQCnv zklghs+H~M&n_H=P}7T4zP77hsC{GOH%ewSdcQq%rPT;BZjyzXSjxcY7>acj`G zjTpX2BkgyL>W(=e80`cW?NSK)Cwp!*_1 zLGN*QOU7{G6eBr}m|;i?nODC1t@Nw=vDyB>bv-_(ew6q^vt{Lhq)JM~_%K1d_z_a? zgS4e#vPCJh0|-!{a4IeoEino=@G>4cz5IuhwiIkAUCzJkeCVdOm7d>sWGOPZ-~<&F zr9N11-j7;;$Y(Gm)W2qVz1w>>)lz5d<~9T;&+_B(&3cK776gciTP(d;vWEa^8k&Wb zxSog%^haWs1|bf;Mmt18Ut@CP%K1;j9Q*Mv2m!Cs#T{Cm!)fITEm@Hr&+RZI+c@&2 zshUEaOP)ROSmtL}My6#xuQ#T!k#n_u=ZJ2m@Wv2;ZM87Tv}DQ}(-;eUc5)ac zh0d0R)q+@dg$V)3i)n9KG9iE%XJPufig~q0_33!?>k$^z^UuLw>D2Jm)ON-X3b+z! z8Z$eX9O@fccc{9*TJ6kq2g^I*sT06v*sfN`vK1<%%*n5*KyAH2nDE+`7zFs@+I&_g z(EJbr^pCxP06s_F2ad0D36@qJgsAD-6)up-mu}p~^T#B@vvntD^bHJVvQEbX1zI1x z4#$N-EkL2IT~7H?3bny1G+}b+(Re2JvZYo0*w@_&U)X6kwxuwRQ14&+W92?=y?nmm zMofH8=c!;neOywD^)lQ@95oa+j|9N|u5*SdQ}MRDs$rBOl6Mk!E3dx@!u!m~_mOPQ}H&67&{a+di`T{P9z zPG*b!eKv@8ZkYKc3DQG56_#8KXivT(S6iY_3X~c3k0jQM5Z_A$(}54Ni^D5(^6#b8 zS+tTA>hJ|xKLJ+U(QWH0Jv^b;{IT$lOKYgZ7CLj&Q*|?SGuG-^xD5eb_3d(5%?^)q zSh(p`m0DDd8-{@>zj0LwnedVo1A70uzxvas^`XlMeSxDS4&0UhDF#wfa5O%6?~RrA zj`L=FJRiUFN$7(Brav-&)_HkpC?0z!-r54URcI)1C%gmU7bd)a&L5`Iinwl32}Ie^ z!H(jzdCrhlT>RZ-iHly`HIIBxLS+s-ysCOn1?J?l`-qfP zUqV%Np8bw^4YqdbVbbz01_G2HeJ)pzryQ#B>fY7qwe|7^w+%dp04_N;YK>AnYfWZw z+M#r5P|Nq1#Sj{blmE@7#fOH#$k6EmfEGmPbODP>m*E@uCv)oeA2jsG4sIL0HM74q z{HwqG4;=tDcJ$rJ-5Bcm=>k|HU4NXaaMg>|ToH+fU@BvaIysalHx)aEk|d3&E!cXA z(76Pq7M7+e^U}nTe>5`dSXVGzHz$NGe?t^XJ7nOOZG5YCK+-;98N5)9^{fcl9F9xI z$NP;B0!ZkCA>*7wJXb%nePf35GST!ahSrRX10El)Cj4_)px1xn=Ll3#Hpi5uQVJP7->Q^tQScop_%#KNpCER?NT3$V?#s z=r|48EWhFQ_+JS#7R01g&dGMX-nrgZy3p@7_1}zdNKQh4scX8L`-3W;sn?}LkyOy? ztuF>H_b-A&;lGoXLx4Yz=^-p3z4h&{BL80a%b=kB{!N>oi&QEN9R<{uR)L!XlL%?rC|Jlw@41PateK{`|^bKmfKQ>;#|@X=z6|w1~U`2hAOg7KK5>XB!6GLS=^p?G*@9MM!#sCuE?DX*G&6u@Qx!7LBIG*#nhHE9h_Ww zhuNG&FQY&yIsJP#zT!Blc>fz6FmX0xD-ua>g_ao` zG4py{RADwq>ViInqs#L+KQxlmtA}wT<6vDQ1ofJ~c=PS_>^EzdCHOm;?J$N+pnKG3TD=sq1 z2KK6R=2Bx?x)lQf)!gfOk5hkiXtHaq+)e#<1Y5lUvdiw4bPB(qgnCL##O!ywL3jU+ z9p!$OsW!aC>>t@XK^X*0)|pjU9N3THXjhO3$cayQOXxSJbogtFbM-!dT_N#A=HZN0 zJ&1DH?7TRvliyfB=8(_9v&iPYcHKM`ijmZ!(vUz8gHh(gk}qLj%qcj%A>tY;GcEUK z#J+BYW>l5VG)xV!LekdN;%EmhE^y;4l=A8Vak>J+;r;N?9xG$LH-?Kq!Clo3KW&5N zFs9_Ag{re%-J+tz?N8V%^$?w~QnHMQk2JIG)%&F@8Y`QFdra*y+6+S0WZe4+NfZ^6a=D3ge) z+9x;u`q2JcdYbGyePi*D?9=2EnfIoLkIYOCKXP?FEcoa^MHRZ}*sB0W^v#&vOmNnJ zcxbuA{Ipd_^B7ggDr*6=*j685+{3tTE;n1dBpk$flI_f&^lh1<rQu8~TnD}TRUtrAAkP!SIPyp(eRc?dTtRkBd!_&Z z5ch6yN3Uq&n40i3<=7c*JFE!$O<*->f_&KMAF2lAk_9ej_LWEFWjI*ym-G9UI`9=~J>X$L3GZ zHW)Dn+kA1`5m=fl-l(feEz)VY@SJhR%6vZ?bv;I+dO;}0JgCd^_J-PgiX~_c0!TM~ zuB|tJW<#}W9D6TA_C?qNX-8c+SsS5zGkVMh_n=-UHiA>wn)z0!)63dyaUA7ey@@|t z+JEC`#oE#I@{xt|8p&`gq}^O$+f-qD!ANg6p!s&jP~BWnxpgjce)@Zbaq=a~_!@7n zo=F-I>Bq145E$gNlYJ*VMLn_()h6nW0zIL5X4IVum)56xljWthwH%kJfb*_tsQSk# zslK)JNUNTMGfzM2GRjTI77oD($|wueYxY+d?RhHbgKMJ4`arEh)DR#r863{BNrNWE5ug+O%3!swb{PeSY(e({ zf7sE-@e*lDaUyA|0!rBL-)#UAY0i+6GvQ|kxD`tJQwS~q-q9D2+83R2VSF$f!&8N3 z`Xr;r<8>9IoNHqaA1EhrxNY*I?MI-um+(7@F9x<-h#R5V$YyL8zrG`-5vJ`17DINy zLfsnCyct@eccf)Gk|U`-DZ?xd7-G@~l-0qnIj*GzB<;O(bfwwC$Pz&AnRb}fLyf^3 zgdiQ!*HfN_qE_`3;pxg{k>c>S0~&&h-tg0AOPZISIjOcMz4D+Mt~R2ckb_EIeOCW3 z;N*cK?fu-hRO3tW-McJhASZ98mACud-VIH8?qs$*se%Uqcn{H*(Da<8KND_0A?jh6 zSei1eUR3o@ZKy#7jjff1r?@9M1QDH6urdt>v%_@hUiiq{>Z%tnl;VNZAL2PTF;|$a zg|%(hJw>FGqPCik;z{SUG3DkCykar|&)>T)l&y&PvOY93^Tr@5PK|$hBrI{)i>x6* zhyXe%nzk6`DsV&^f{5LpPsbj{uNB(OhZ~Z;nWM9O+I@ayXmzADO{CdsE~VNbflTFe z&qkPjqavKB4e!Q7yE&Mup~?kaDZ4VN%B<^#yd_ffqv8Y=U#qH~X{WQBRkDfkltdDi zOxJhv_!`;(v72v5!okNy-l!AZ`!4I|@h9HadM_7rTn`XMCh(D_uRxiRt=wK@`)z~< z0VPa3IT3n$Oq&D(+x|6GtVh@po@EOAra^lG{HA$aneHUBC+RMyu?^B?a8KX>FS6o? z_%8hVpT`~8-I!i}Zt!_;oi>HjLVvyBSsw`j^j>)gsE-xwtP&O|%dof4}rPOg*)0iyI6(Kj$I3Um1XR;>^08=u*6=Tg29#*#y(2^bLP+ zPp_$daZBNTNlLYyykEx&|3pI$9P@`Sul)}X?Ze32tb-fabI%g{=vV^ssaaMmgpAo<`r&ZaE^=LBBG?fP*)DOU~xtW`cHAe!<++uqeUf%QlJ{ei6Vp zB5Smm<*T;U2kZQ2bCz41R{gG=ljujrM&@7O%;0?h@Y~SN#|KpM!wyhmY-ybvfd4F9{4dK* z&ipKem?+goVtYdsqF=%>QIYyeo)#+Scjf5F6^Q3OFFI;VqC&UJ@2AEza0C2BB5s%n z;YZ#l`CzKVqfM~xifn@9p>b}3qh0>bfbwS$s@9#WKC&YEBa78MR*a;L1^rtokzY{} z8*=X8Q>Rfl4S|HVRE$z46Zdcex%OJ#L-wQG;SsOO))}o?ZC;rqS3|>=2NVWt2GUCU zyJSMe@&c7qy=Uwlr7=SvYxA27+R6Ad*QesM$z}KnR%z?fJJ*I9xxWfyYRGuxtyRYinu`m|U20in)`5Mb{5F?zYUI`re2Lb3%Z|3#HZO)8^;Eo%jxx|2Z90WY`_42jFA6>Q_kU>Hp?*{ub6}X=?reC;xSd z=(lXbKW2~aM1Rbs{r`-HiZ&hzZyNIY@2OpY-bDq@cGFE2*9IN^HkS#FsN`avg|Z#; zWw1PYzku3ObI=^Lqnnjj^eh51z6b(bAaiE(angHWSr6*=IhqfjEhiN6p)!zmwrk^M zfcf?05$y*x-_h>BR&Rd{UHo94llp#98C%1@ISo3^Bm7@Cp?}KQ|0^aKOZEfN8>O+d z!T{r!`NO~EZJ}mU<1spYL}|gaS)Fn9xLoiOG0bS>3;G|f-0gyDtE0uo?M5piDMpbR z*860A^>$Y*V}%9Qmhm+w=_=hDq@5Xqb9>-TjFyRkX4X@o(UT#YR?(-41~H#!%a>o~>RYLJmt0bX zm5hHS<*yqujp$d3%l%|jZBJaGzi{EMTHbR~hLDr*Y3^>A7bK&zz7rq^-!0O0F4`f5 zBp3k-t*eUf+Xb1Azy4G!Y4G$OhViI?F$rJUO+!g+otq#Ac79-Dz8nP5cWdm=iXM|1 z9rULHR3idZ3d7FK3!n?!f_f{8w6^Da;30s`Ve^O=?&NseOEW%P6X|22ra%+zcNWa) z;%tUgqU3>o-Kqhv2!JI&ao6}v&jUEw1FqOCh2jl;{VZxM-RrO&4bkKP(|r6+fw9NB zqvb=EESA<_w#k`RTl|-SV4H;}3t;0&&R3&- zD0r8~$+pMSU7W_-pP)cf1L5IaW*y&l79OuOdwe{kGsEUXEd_a+d#-uLtP)&>XcKtk zVtf|g%q2no2CmVwS2^=dGplyXo*fUoN^W&d_=XTpHqM+23i z9fIRy`@A7UwnQ3_o-dHOsiURTJLgSI2%xyST3Zd*L|}2GqlaIQb}e6`mg{pqDk%la z$sew@k&?+NYo#6TkXMW{jWRBgv(gikufmO%O-C@4@5`ry$q&t@u2^Lr714tan6c)O zh?LcoZO+yNkqJ(zMD0smjUtI=H3YedRa)SUiTyRTp)NEB=7RcIs+<8= zVTZ`)%R(5NiVC?~iH=o2Dyy2!EvcMnO&U^d&<`cMz4@5Z3{-~cGHPa>ZZ4G$=3*CT z`3`l=zYdvzxp>q}&9 zj4WRWs~@|MJ7F1^3{T783{7vuL$HAQ^VAnx4y5`46xR3C<9l9IFXsh*xz7PGi*e;;=tsKtCfuuRZ`fz zE_q;R&9Bq@>ALIT-s4jO+@yS$a;Zu`3V%O03Zg=Dzq zPH!Krl%BMHHBK2L4u8+HZof0%=s3dp;%_&zeEz-f1rPZuxZFPCIU^qwf4Lr6+ht$d zH7(oQ6M1-RO`s|B0*70Vy6ra6k877d+AW5<4*`OMx0XOdvjj#A#}k?7{`!mhmIpFo zuF4p%;J<~rsw_AVbf=C)b~k#&RG5Qf5~kE|nwENcH~8LzN+Q+>7Ilmhl;c+xxiL)O zbUUpOWlL(NSl3ayP7uq5D_9V79AWs2*WQ~PiLN=>Ck7E@SAC%IlMGem)sP_f-xjy> z22Fq%%5?%d9j6tmL~Bwn%swJsgpn0{8iSX(xk?hN6VDwDBJ+=wEEJXGdqG=A8|Q9# z6_;DdPc_CJKfsSoy^N$03=KWPekW1@Y#osq>W;RzRXelI$gix#_0*Fte~i_3>qxhJ zR9W&N_aPToTJmna>`-dMveP!OjbIFD`oK`{1G!HVHIj=x6HFigk~0JV806|DPIoVx zw-nCohi@KGA#<7v+f;~nioAvZtopIKYknLO16SNQD$LU%k;!z&v}sp}44I`N-wQgb z=g=+aox-29UKm;dYo_qOQGa3*0CVO2> z+fw(-89q5gm-0c?F=YtDi%urVQUo5r*flz_}h6tHCHKgRLxBKF*V%4F9!&s>OF z{Qx5(k*ZR08ght8#aL3xgO7!GHql|<~4rIoZq)=(bG;YjVL9fobo)*D}y4Jw5 zkYq^=BD1a--W8h6?{!9;@OQNp;>u;{c;Z5=QiuCyos^|=?09S1QWgT3Y*w*;8ez(^ z%(;)m_E=D*#%jh($TTbRp85R!*W1UDI2P4T(HmfVS$S%NtC@2~HP)4-*x^#`lhfht z<(l}#9dh&Rw_Pz3VR$YOpiaTI3;d}wD3Jxfs@RHYv4T&j42yDy;(OAO4{Mm>`zZnI z*4U}8d+||K!LRg4&z>{Bc+4ZDK*5E{n>Lz*81E2_sFao zkmXK-+(@Qq%qRatnTQnym2t#67F3t#)2&=bQp1hA`3}x=268>$=LaPXbq?E!_ZyTm zx`^^MBnZ$k6(wy|Y$uGl)lcz4oY4ontTt8|3%=y*n(`jE+csn3R%(oS=+GxmH4fsP z6TdZUdUjz7pZc}Pd=55JwtDn^_r7E6Z#6LdWx1E~W|xoF5ep zP?V(%zWafZCK*|-m#sPyUkrA6f8_@!%@eHGjrPWeynOv3-n2ZqrxzO?mprYH-|bax zKUsGj=38d)U};We_2>(+Qe;YICdInabH(zAH)F^0H*yRZiEV0A~|OR zdfRAfUOtq<9BHx*y@tv#nir|bEq0!>@c3G!l#B;qy6AXO>j^MHZ~AicVMD- z2wp zw>xSh`7>59J++kH-E(A;H$I#?yf9!L6|QRl5MbGw2%mJm#TI5ei`b5yF||HZ!$b|X zQUN2O(0iND7*SDCFuZ~Qi#u^+m5%w7n^RTsrvXGY+spzL?<1C9EL?^T?e7ItG^4e; zBYymh%)D|$%8UO*rGgoWpaaPx)s6X$5zC^-lgKx2jDg6y^5Pz^fL9{+Mf|jN+mO@6rP61+xD@%wFk-m2KDIr_ZTRZz@ z(=~#n)12|y9BPoudRO6Pn-LiVlo`sk?VE-hJj&*^SMg{L6>=yW zghmD;@lNdD6&%GP`?KAw1H4E}KCl^Vwm+)XHwtuB70Np0oLABU9~F#(7je5&=T8$2 zKPRf1^wWNaTH%aPh7Li+-!dn^uMPTjxz?ZGVOilB_~j|XWP2*U;aE`(3)(9GKU!Cc zD_>mpHFiVo_Q{LK!B7?e^qN`IhbeKmI52jhc?1dRl*vDHjAD#~Y7OHzryG(#Q<8MB zy|_BP-h0sHJ*C%sLq2!XJ2d{Q+!*>kE6o8z{n_eV@_Fdr*mujoyK;xY9S80>aL0i= z4%~6zjstfbxZ}Vb2ktm<$ALQz+;QNJ19u#_vU?l^GAfjbV|ao~;vcO1Cmz#Rwf zIB>^-I}Y4&;En@#9Ju4a9S80>aL0i=4%~6zf5rg@7VU$3Noit42C^QL@)Jy8N0lT;h!xb*8Yr0#2+Je;QOpK4yDoxVxB zE{v=)nyyaRSh-53gJWn-mxx@$&09Wrh(OLUcCRMbgtm17{u^WT(O`_#3g z?fCsHiEKaWOcuJ45h-*7I+l;eM?(F~-*0$3o9JM98W`*g+RD#Tm1}F0Z;Z@MZB9-G zAi!tX`~8s`v_k&b*e=>z(jmF~9hvsld>&u>4i|Tsa-fe&ym=HWR3IUU`Ft}k4Sg0# zGg5EpWusII0gBnGZ+|a(!SgyYn=g@Gja$!aQ_)|5<`@sXm!>b}oR)GwoVa*=_Y(9x z(&PN6`^UaG8`}kUw(#|i7WJbaOz}$JUwpTeCm1dwK!m(ia^`dG$otrf+`CJ7+nAIgXzaa)`_U=Xz;50*u11x;gUVgt{8@(ApR^YCP(&Kw@_d zHQf=iLlx`hZA?oDkeQoyFaBTHh7!6Z(O>R)`7a&+T-khYqlr9-qsiyIjATIfSv!qy zb3+8L%GKp+rCAy#$AQV4x0wS(;xX7IQ!@6i4V!}DQ^;d8quK5e1q$=skUN&j{3okK z8TfUED94Vg%VQ)$P8p;6Qr!qtcO?yMM1-#S$HH-7dL+Sx;g8@+X@*ORR}~U=oZ|Nc zE9Q4#eLkCB79k2MXj31^^_3F%xAHlT95(ly^z=CU&5@l%>=PVZk0J?W7CUk%B6@{n ziDj7EPPXkaSeer#Dl~J1IrCT7Ql}1An*ArMx1ncs2>K8L^t2XdF>$t4MU-{;KZ@YP zbTdD2tl7xg%H7C;lD})A1xCk*3Kj(KvNctwJWGQh~@|(_g;1qVlHCZ&v$o frcJ9YrtFKLi=m#$e{Ua(|BZWN{F5=kKqmhWc8j$0 diff --git a/code/DocsSample/ArkUISample/TextComponent/screenshots/device/image2.jpeg b/code/DocsSample/ArkUISample/TextComponent/screenshots/device/image2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..8516710ce8b4ac1f3790841aa45d0302809e7c25 GIT binary patch literal 76241 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 ad);Y&Mv$zy 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
UA+lt4HY`EC* z-Nt{11N{a(|FbQpumcT)&U4J!sY_;AMfNN{jXlgYp}$2K{sA5RAITE^;|re)?IUK4 z`QxBUhgGDN)T#tFknNJB*bX1*amCQU9kh-UK-&OGbFcet1xMZit>Jp#e6w>ci3pMN zY1!*1SRz}}h$f*PrHhtmbxBe{xl`v@lk5JI#&L-W@!ASs7viQ{l$3!ZQpbA@hGyQ_ zj(rMvw*I3mc#xyMdSStU^(lX1rN#68;CA{C2DgK(ubV1iN2~4`v|{~o93PXZuracF zYM*2iU7RF=3mWahGmY5?-lxCaaN?^qrv_THiWi{)v?%SZH^&C@F8;n8xelO5lFIhij&yQpnY{z&rb1++#7N#_c`J@WydD6mTj^))BinF4&Z)_=M|{2a8jilkM+L^d z@PVTT$0rkNh4Pq@D$m>tg~Z4yuCuLW(=A*Uj)vOjM(m&~6s|WyhxzJ98lFGVm~*t( zMo?g+BROlw!TlcN3u1WpUyXhM`coSPw;rk!^ODvs4l^8U?=vI_0m>=Ne~U=5&CW^{ zNSf9kV@ubwHN(&;>94+8#s3AA(4wgVXrYqUZ-I`#t9BRUBuPvTJi#1qs(-0m?50lb z5>X%xF!)q7Ci&n=v773h0XDRz*Z;FO?L;axv~03*o0EV4%l}qO?T@d)U)TTqdiB>_ z{WVvA*}z{m@RtqzWdr}W+dyfnU6+VMAQ9A$=h#xzq&{3>Sk&L0%%%6zvsB34vU5x*IvCnem-aJ(2BvsbM0Fz0UX1pC-Du6kJ>?@#AA4Ca=fH8F^Ya$5ZTod% zieH_Vv2DKL39Rs{K?AH}9Z>>vF`3riR*rctPS1zkCVykl|GkFsZVlWVNsouZp|09GANl)EeWY@70$ak>e-6wW9^Emu|lex=W7AyD!9+nCG% z5&b{JHU2#5|7SpefAZeI^o?l#MG)2a71m~#r|F#-w{rb2&WEKaN4ZGw_~MBCL)Q7~mm+@K zmKu$;ejR}8lLLKzRa{Q`h;sfUGOsk{rutL~V+0c1ayH>#OMuy*^}UknRNN-9TS%nE zij-()Mq}U?fP0RcbCJ-?A1T^y-FvP{a}|S_9FwHJVu>dS&+E0m*HYG)3x`PDjPuNY zUtCY{SDyO#??2YxkNfwdRfzlrz}^$Ai>sX>M~d`5B!Ypq#diw2r`Pfm%d_%Rg?<6< zp&5M`BlJ{XL~P)fSC9n%VC^w3mMJl)e=)Jh?fA^K2%)>(pzB?0^4Gn9)0JTNBs6*h Ot@il;dBgqn?Oy;fd$rC0 literal 0 HcmV?d00001 diff --git a/code/DocsSample/ArkUISample/TextComponent/screenshots/device/image3.jpeg b/code/DocsSample/ArkUISample/TextComponent/screenshots/device/image3.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ad6f0ba651630c7a10d878035860f8bd406676f2 GIT binary patch literal 37086 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