diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/.gitignore" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/.gitignore" new file mode 100644 index 0000000000000000000000000000000000000000..dc4e6353bf3caf74c5953d0bec81c72a3635bf33 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/.gitignore" @@ -0,0 +1,9 @@ +/node_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/AppScope/app.json5" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/AppScope/app.json5" new file mode 100644 index 0000000000000000000000000000000000000000..937e48cb410222191b78d7b2619357faf960da70 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/AppScope/app.json5" @@ -0,0 +1,11 @@ +{ + "app": { + "bundleName": "com.melody.anim.myapplication", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name", + "distributedNotificationEnabled": true + } +} diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/AppScope/resources/base/element/string.json" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/AppScope/resources/base/element/string.json" new file mode 100644 index 0000000000000000000000000000000000000000..f056a05f4e95035f41a0bf1c1268ff5369580b29 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/AppScope/resources/base/element/string.json" @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "MelodyUIAnimEffect" + } + ] +} diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/AppScope/resources/base/media/app_icon.png" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/AppScope/resources/base/media/app_icon.png" new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c Binary files /dev/null and "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/AppScope/resources/base/media/app_icon.png" differ diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/README.md" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/README.md" new file mode 100644 index 0000000000000000000000000000000000000000..8e4e34ea4d527583541807a5353e80f68e68a014 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/README.md" @@ -0,0 +1,155 @@ +# HarmonyOS【挑战赛第三期】玩转ArkUI动效 + +## 简介 + +**本项目通过ArkTS结合SVG相关知识点制作了一个水母动画效果。** + +> **作者**:[Halifax](https://juejin.cn/user/8451824316670/posts) +> +> **文章已发布至华为开发者联盟**:[HarmonyOS【挑战赛第三期】玩转ArkUI动效 - 水母动画](https://developer.huawei.com/consumer/cn/forum/topic/0202105790886170594?fid=0101587866109860105) +> +> **哔哩哔哩在线演示视频**:[HarmonyOS【挑战赛第三期】玩转ArkUI动效 - 水母动画演示](https://b23.tv/X5z3OgC) + + +![水母动画效果GIF](./screenshot/app_effect.gif) + + +灵感来自这个[Html+Css+JS制作的一个水母动画](https://codepen.io/cassie-codes/pen/BMXENG) +我通过HarmonyOS的ArkUI实现了它。 + +## 目录结构 +```txt +│ main -> ets +│ +├─common #公共目录 +│ └─constants #常量类目录 +│ CommonConstants.ets #公共常量类 +│ JellyFishPaths.ets #定义了水母里面全部的PathData +│ RouterConstants.ets #路由常量定义类 +│ +├─entryability #入口Ability +│ EntryAbility.ts #第一个Ability入口类 +│ +├─model +│ JellyfishBodySurfaceModel.ets #水母Body表面Model +│ JellyfishBubbleModel.ets #水母气泡Model +│ JellyfishEyeModel.ets #水母眼睛Model +│ JellyfishFaceModel.ets #水母脸部Model +│ JellyfishWindowModel.ets #水母后面的窗口Model +│ +├─pages #页面目录 +│ JellyfishPage.ets #水母页面 +│ LauncherPage.ets #启动页 +│ +├─view #组件目录 +│ GroupBody.ets #Body分组 +│ GroupBubbles.ets #气泡分组 +│ GroupFace.ets #脸部分组 +│ GroupFrackles.ets #雀斑分组 +│ GroupJellyfish.ets #水母重要部位分组 +│ GroupLeftEye.ets #左边眼睛分组 +│ GroupRightEye.ets #右边眼睛分组 +│ GroupTentacles.ets #触手分组 +│ JellyfishLayout.ets #水母视图容器 +│ RadialGradientRect.ets #渐变窗口背景容器 +│ +└─viewmodel #ViewModel目录 + JellyFishViewModel.ets #水母数据管理ViewModel +``` + +## 动画实现方式 + +项目里面用到了:显示动画**animateTo** 和 属性动画 **animation** + +数据状态管理存储都放在**JellyFishViewModel**里面 + +水母的**眨眼睛**,使用的是**animateTo**,通过显示动画修改:**水母眼睛的缩放和不透明度来达到眨眼睛效果** + +我们来简单看下眨眼动画: +```ts + blinkAnimateTo() { + animateTo({ + duration: 150, + curve: Curve.EaseOut, + iterations: 1, + playMode: PlayMode.Normal, + onFinish:()=> { + // 闭眼之后,再恢复回睁眼状态 + this.blinkScale =this.blinkScale == 0.3?1:0.3 + this.blinkAlpha =this.blinkAlpha == 0? 1: 0 + } + }, () => { + this.blinkScale =this.blinkScale == 0.3?1:0.3 + this.blinkAlpha =this.blinkAlpha == 0? 1: 0 + }) + } +``` +然后给我们的水母眼睛设置**缩放**和**透明度**属性就能眨眼睛了,下面是左侧眼睛的代码: +```ts + Shape() { + Path() + .fill(...) + .commands(...) + } + .scale({ y: this.blinkScale, centerY: '233px' }) + .opacity(this.blinkAlpha) + .viewPort({ + width: '530.46px', + height: '563.1px' + }) +``` +我们整个水母body上下移动,是如何做到的呢? + +我们利用了属性动画**animation**更新组件的属性**translate里面的y轴数据**达到上下移动的动画,我们简单看下下面的**伪代码**,它是如何做到不停的上下移动的: +```ts +Stack() { + // 水母的body元素分组 + ... +} +.translate({ y : this.translateY }) +.onAreaChange(()=>{ + this.translateY = -30 +}) +.animation({ + duration: 3000, // 动画时长 + iterations: 1, // 播放次数 + playMode: PlayMode.Normal, // 动画模式 + onFinish: () => { + // 动画播放完成回调 + this.translateY = this.translateY == 0? -30 : 0 + } +}) + +``` + +这样我们就做到,让水母整个body元素上下动画移动了,且不会停止。 + +那么水母的脸部怎么做到上下左右动画移动,且不会和body同步,有错位和落差的效果呢? + +问的好,我们再来看一下水母脸部的动画怎么处理的: + +```ts +Stack() { + // 脸部数据 + ... +} +.translate({ y : this.translateY, x: this.translateX }) +.onAreaChange(()=>{ + this.translateY = -25 + this.translateX = ... + // 这里其实我们是在viewModel中,使用Math.random来计算translateX的值的 + // 感兴趣的可以打开我们的源码查看 +}) +.animation({ + duration: 3000, // 动画时长 + iterations: 1, // 播放次数 + playMode: PlayMode.Normal, // 动画模式 + onFinish: () => { + // 动画播放完成回调 + this.translateY = this.translateY == 0? -25 : 0 + this.translateX = ... + // 这里其实我们是在viewModel中,使用Math.random来计算translateX的值的 + // 感兴趣的可以打开我们的源码查看 + } +}) +``` \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/build-profile.json5" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/build-profile.json5" new file mode 100644 index 0000000000000000000000000000000000000000..d7b1117cdb34aab2983ac65026d9e8dcc91332d1 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/build-profile.json5" @@ -0,0 +1,27 @@ +{ + "app": { + "signingConfigs": [], + "compileSdkVersion": 9, + "compatibleSdkVersion": 9, + "products": [ + { + "name": "default", + "signingConfig": "default", + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/.gitignore" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/.gitignore" new file mode 100644 index 0000000000000000000000000000000000000000..5a6ba80fa3d9498a23ae8ae7d9518f8743fa8a96 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/.gitignore" @@ -0,0 +1,4 @@ +/node_modules +/.preview +/build +/.cxx \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/build-profile.json5" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/build-profile.json5" new file mode 100644 index 0000000000000000000000000000000000000000..20c75049f2d45e57d267899b6547c79fb6aa84c1 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/build-profile.json5" @@ -0,0 +1,14 @@ +{ + "apiType": 'stageMode', + "buildOption": { + }, + "targets": [ + { + "name": "default", + "runtimeOS": "HarmonyOS" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/hvigorfile.ts" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/hvigorfile.ts" new file mode 100644 index 0000000000000000000000000000000000000000..80e4ec5b81689f238c34614b167a0b9e9c83e8d9 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/hvigorfile.ts" @@ -0,0 +1,2 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +export { hapTasks } from '@ohos/hvigor-ohos-plugin'; diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/package-lock.json" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/package-lock.json" new file mode 100644 index 0000000000000000000000000000000000000000..15bc7145be1490029883067847743ea7134cf545 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/package-lock.json" @@ -0,0 +1,5 @@ +{ + "name": "entry", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/package.json" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/package.json" new file mode 100644 index 0000000000000000000000000000000000000000..c4e988f30f2ec9e3430a4d0c8f05e89fabbc2659 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/package.json" @@ -0,0 +1,13 @@ +{ + "name": "entry", + "version": "1.0.0", + "ohos": { + "org": "huawei", + "buildTool": "hvigor", + "directoryLevel": "module" + }, + "description": "example description", + "repository": {}, + "license": "ISC", + "dependencies": {} +} diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/common/constants/CommonConstants.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/common/constants/CommonConstants.ets" new file mode 100644 index 0000000000000000000000000000000000000000..5fe9b65ecf72e875bb2cd3755b3e5ddd23a789cd --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/common/constants/CommonConstants.ets" @@ -0,0 +1,154 @@ +/** + * CommonConstants + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/11/30 17:59 + */ +export default class CommonConstants { + /** + * 全屏宽度比 + */ + static readonly FULL_WIDTH: string = '100%' + + /** + * 全屏高度比 + */ + static readonly FULL_HEIGHT: string = '100%' + + /** + * flexGrow + */ + static readonly FLEX_GROW_1 = 1 + + /** + * 启动页文字介绍左边间距 + */ + static readonly LAUNCHER_LIFE_TEXT_SPACING: number = 0.1 + + /** + * 启动页文字介绍的间距 + */ + static readonly LAUNCHER_TEXT_INTRODUCE_SPACING: number = 3.4 + + /** + * 启动页文字介绍顶部的外边距 + */ + static readonly LAUNCHER_TEXT_INTRODUCE_MARGIN_TOP: string = '1.3%' + + /** + * 启动页文字标题顶部的外边距 + */ + static readonly LAUNCHER_TEXT_TITLE_MARGIN_TOP: string = '0.5%' + + /** + * 启动页图片距离顶部的外边距 + */ + static readonly LAUNCHER_IMAGE_MARGIN_TOP: string = '16.2%' + + /** + * 启动页内容介绍的高度 + */ + static readonly LAUNCHER_TEXT_INTRODUCE_HEIGHT: string = '2.7%' + + /** + * 模拟启动页延迟关闭时长 + */ + static readonly LAUNCHER_DELAY_TIME = 4000 + + /** + * SVG的viewPort宽度 + */ + static readonly JELLY_FISH_VIEW_PORT_WIDTH = '530.46px' + + /** + * SVG的viewPort高度 + */ + static readonly JELLY_FISH_VIEW_PORT_HEIGHT = '563.1px' + + /** + * SVG眨眼的Y轴中心点 + */ + static readonly JELLY_FISH_EYE_CENTER_Y = '233px' + + /** + * 脸部内容最小运动范围 + */ + static readonly JELLY_FISH_FACE_MOTION_MIN_RANGE = -25 + + /** + * 水母整个身体最小运动范围 + */ + static readonly JELLY_FISH_TRANSLATE_Y_MOTION_MIN_RANGE = -30 + + /** + * Y轴运动的时长:3秒 + */ + static readonly JELLY_FISH_TRANSLATE_Y_DURATION = 3000 + + /** + * 水母眨眼动画时长 + */ + static readonly JELLY_FISH_BLINK_ANIM_DURATION = 150 + + /** + * 动画运动次数 + */ + static readonly JELLY_FISH_ANIM_MOTION_COUNT = 1 + + /** + * 不透明度:45% + */ + static readonly OPACITY_PERCENT_45 = '0.45' + + /** + * 不透明度:49% + */ + static readonly OPACITY_PERCENT_49 = '0.49' + + /** + * 不透明度:50% + */ + static readonly OPACITY_PERCENT_50 = '0.5' + + /** + * 不透明度:60% + */ + static readonly OPACITY_PERCENT_60 = '0.6' + + /** + * 不透明度:66% + */ + static readonly OPACITY_PERCENT_66 = '0.66' + + /** + * 不透明度:67% + */ + static readonly OPACITY_PERCENT_67 = '0.67' + + /** + * 不透明度:72% + */ + static readonly OPACITY_PERCENT_72 = '0.72' + + /** + * 不透明度:75% + */ + static readonly OPACITY_PERCENT_75 = '0.75' + + /** + * 不透明度:77% + */ + static readonly OPACITY_PERCENT_77 = '0.77' + + /** + * 不透明度:89% + */ + static readonly OPACITY_PERCENT_89 = '0.89' + + /** + * 不透明度:100% + */ + static readonly OPACITY_PERCENT_100 = '1' + +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/common/constants/JellyFishPaths.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/common/constants/JellyFishPaths.ets" new file mode 100644 index 0000000000000000000000000000000000000000..1710d7cad940e165754f6a3579d66f52b1c786e3 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/common/constants/JellyFishPaths.ets" @@ -0,0 +1,57 @@ +/** + * 水母相关pathData数据 + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/12/01 14:31 + */ +export default class JellFishPaths { + static readonly freckle1: string = "M330 225.23a4.16 4.16 0 0 0-.1.55c-.52 3.79 3.9 6.73 5.91 3 2.42-4.46-4.66-8.14-5.81-3.55z" + static readonly freckle2: string = "M322.89 215.5a3.94 3.94 0 0 0-1.32 3.61 3 3 0 1 0 5.91 0c.27-3.81-2.76-4.98-4.59-3.61z" + static readonly freckle3: string = "M206.88 241.24c-.88 2-.11 4.56 3.36 4.27 3.87-.33 5.42-5.85.75-6.62a3.79 3.79 0 0 0-4.11 2.35z" + static readonly freckle4: string = "M206.88 241.24c-.88 2-.11 4.56 3.36 4.27 3.87-.33 5.42-5.85.75-6.62a3.79 3.79 0 0 0-4.11 2.35z" + static readonly bubble1: string = "M384.85 167.41c-7.37 4.94-6.92 18 4.34 16.82a19.89 19.89 0 0 0 3.34-.71c13.54-4.17 9.8-20.35-3.66-17.77a10.52 10.52 0 0 0-4.02 1.66z" + static readonly bubble2: string = "M130.5 266.76c-6 4-5.59 14.59 3.51 13.61a15.22 15.22 0 0 0 2.7-.57c11-3.38 7.93-16.47-3-14.38a8.85 8.85 0 0 0-3.21 1.34z" + static readonly bubble3: string = "M424.53 152.72c2.41-6-5.11-13.82-12-7.41s2.41 15.31 9.3 10.64a7.19 7.19 0 0 0 2.7-3.23z" + static readonly bubble4: string = "M392.89 142.46c1.65-4.09-3.5-9.45-8.22-5.07s1.65 10.47 6.36 7.28a4.87 4.87 0 0 0 1.86-2.21z" + static readonly bubble5: string = "M114 242.88c-2-.26-4.34 1.09-3.68 4.42 1.68 8.05 11.35-3.48 3.68-4.42z" + static readonly leftEye: string = "M262 233.63a3.1 3.1 0 1 0-3 3.19 3.1 3.1 0 0 0 3-3.19z" + static readonly rightEye: string = "M294 232.72a3.1 3.1 0 1 0-3 3.18 3.1 3.1 0 0 0 3-3.18z" + static readonly mouth: string = "M286.84 244s-.11-.12-.32-.31a9.91 9.91 0 0 1-.81-.76l-.5-.53c-.16-.2-.31-.41-.48-.61s-.27-.46-.41-.69a6.83 6.83 0 0 1-.29-.75 5.86 5.86 0 0 1-.06-3 7.71 7.71 0 0 1 .29-1.05 3.46 3.46 0 0 1 .13-.39.49.49 0 1 0-.8-.55 3.31 3.31 0 0 0-.33.38 5.42 5.42 0 0 0-.68 1.12 5.32 5.32 0 0 0-.53 2.93 4.34 4.34 0 0 0 .07.52h-.08a9.59 9.59 0 0 1-1.64.53 11.21 11.21 0 0 1-1.15.22 10.31 10.31 0 0 1-1.29.17 12 12 0 0 1-1.41.1c-.48 0-1.07.05-1.48 0l-1.46-.06c-.48 0-.94-.11-1.39-.15s-.88-.17-1.29-.23-.78-.2-1.13-.29-.65-.22-.93-.31a5 5 0 0 1-.67-.28 2.56 2.56 0 0 0 0-.27 5.08 5.08 0 0 0 0-1.1 6 6 0 0 0-1.12-3 2.65 2.65 0 0 0-.32-.39.5.5 0 0 0-.67-.15.49.49 0 0 0-.15.68 3.33 3.33 0 0 1 .12.39 9.13 9.13 0 0 1 .26 1.06 5.81 5.81 0 0 1-.14 3 6.81 6.81 0 0 1-.31.74l-.43.67c-.18.2-.34.41-.49.61l-.52.51a9 9 0 0 1-.83.74c-.21.18-.33.3-.33.3a.49.49 0 0 0 .5.81s.16-.05.44-.17a6.14 6.14 0 0 0 1.15-.56c.22-.15.48-.3.72-.49s.49-.43.73-.68.45-.57.67-.87.24-.49.35-.74a2.77 2.77 0 0 0 .42.27 7 7 0 0 0 1 .53 7.33 7.33 0 0 0 1.23.48 8.56 8.56 0 0 0 1.41.38c.5.08 1 .2 1.54.24l1.6.09c.61 0 1.05 0 1.58-.07a11.79 11.79 0 0 0 1.53-.18 9.58 9.58 0 0 0 1.44-.31 8.32 8.32 0 0 0 1.25-.42 6.92 6.92 0 0 0 1-.47 5.28 5.28 0 0 0 .6-.36c.09.19.18.37.26.55s.42.62.64.89.48.49.71.71.49.35.71.51a7.4 7.4 0 0 0 1.13.59l.44.18a.47.47 0 0 0 .51-.11.48.48 0 0 0 .01-.6z" + static readonly face: string = "M283.26 178.86c-17.72-1.84-36.33 5.33-52.24 17.37a110.1 110" + + ".1 0 0 0-22.14 22.06c-8.54 11.67-14 31.93-7.48 47.29 8.82 20.73 29.67 14.17 44" + + ".32 15.6 14.34 1.55 28.68-.52 43-.52 10.47 0 20.94 1 31.4-.51 9.36-1.39 21.38-9" + + ".12 24-22.07 4.24-21-13.77-45.52-24.27-58.37-10.69-13.1-23.39-19.48-36.59-20" + + ".85z" + static readonly outerJelly: string = "M340.52 295.71c-10.12 1.19-15.63-.12-20.38-1.64-3.63-1.17-6" + + ".84-2.44-11.37-2.83l-1-.06c-1-.06-2.05-.06-3.17 0a21.37 21.37 0 0 0-8 2.28c-1.27" + + ".59-2.6 1.21-4.09 1.82a42.23 42.23 0 0 1-10.6 3c-1 .16-2 .29-3.11.37-1.56.14-3" + + ".26.22-5.09.22h-.51c-1.74 0-3.35-.08-4.84-.2-.6 0-1.15-.08-1.7-.15a47.37 47.37 0" + + " 0 1-9.43-1.8 8.25 8.25 0 0 1-.92-.29 75 75 0 0 1-8-3.34L248 293a19.06 19.06 0 0" + + " 0-6.86-1.81c-1.27-.06-2.44-.12-3.56-.14h-1a51.6 51.6 0 0 0-9.87.67c-8 1.38-10" + + ".86 4.29-22.82 4.06-22.13 0-9.51-11.13-11-17.8-7.24-33.11-.69-63.69 18-83.91 14" + + ".65-15.86 35.74-24.25 61-24.25 23.56 0 43.94 8.81 59 25.44 19.21 21.29 27 53.84 " + + "20 83-1.67 6.46 10.68 14.95-10.37 17.45z" + static readonly tentaclePath: string = "M226.31 258.64c.77 8.68 2.71 16.48 1.55 25 .15-.78 8.24-5 15.18-7.37 23-3.1 10.84-4.65 22.55 1.17 32.52 4.65 7.37 7.75 11.71 5.81 21.25-2.33 8.67-7.37 16.91-2.71 26 4.26 8.68 7.75 4.34 8.14-3 .39-12.14 0-24.28.77-36 .78-16.91-12-27.75-2.71-44.23 7-12.15 11.24-33 7.76-46.83z" + static readonly tentacle2: string = "M246.47 259.51a75 75 0 0 1 3.1 33.39c-1.55 11.71-8.91 20" + + ".82-8.91 33 0 10 3.48 18.21 5.81 27.75 2.71 10.41.39 19.51-.78 30.35-1.55 9.11-4" + + ".65 24.29-.77 33.39s7.37 4.77 7.37-2.6c0-6.07-.78-11.71-1.17-17.77-.39-8.25 3" + + ".1-12.58 5-20.39 5.43-21.24-9.3-42.06-3.49-63.31 2.72-11.27 10.86-22.55 11.25-34" + + ".26.38-6.07-1.55-14.74-2.72-20.38z" + static readonly tentacle3: string = "M276.54 262.11c-1.55 9.11 2.21 17.35-.51 26.89-3.87 12.57-8" + + ".2 23.41-8.58 37.29 0 10.41 5.78 15.61 7.72 25.15 2.72 11.28-2.73 19.95-5.44 30" + + ".35-1.94 6.51-3.11 15.62-.79 22.12 3.49 8.24 5.43 7.81 3.88 18.21-.78 4.77-2.72 " + + "17.35 4.26 19.09 5.43.86 5.82-6.94 5.82-11.72-.39-12.57-3.49-24.28-3.11-37.29" + + ".39-14.31 4.66-27.75 5.82-42.06.39-7.37-1.94-13-3.49-19.95-2.33-10.4-.78-15.17 3" + + ".1-24.71 4.65-10.85 5.28-21.25 6.06-33 .77-6.07 2.53-13-.54-18.65v.44z" + static readonly tentacle4: string = "M300.34 261.25c1.55 14.3 7 19.94 1.17 34.68-5.43 12.15-8.53" + + " 22.12-3.88 35.13 3.88 10.84 5.43 18.21 3.88 30.36-1.56 10-2.33 19.94 4.26 28.61" + + " 13.57 17.35 10.86-10.4 8.14-19.07-1.55-6.08-3.49-11.71-2.71-18.22 1.16-8.24 3" + + ".88-14.31 1.55-23-1.55-6.07-5-10.41-3.88-17.35s5.82-12.14 6.59-19.51c1.17-7.37 3" + + ".49-30.35-3.1-35.56z" + static readonly tentacle5: string = "M254.44 253.48c-8.78 25.12-15.81 53.28 2.61 77.35 11.06 14.46 42.58 51.91 38.16 69.8-3.91 15.83-20.78 24.73-14.17 28.18 8.22 3.21 22.2-26 18.7-41.25-3.89-16.94-17.68-35.47-34.38-54.78-2.48-2.86-13.15-18.09-14-35.58-1-19.92 12.84-42.61 12.38-42.62-3.13-.02-8.1-4.53-9.3-1.1z" + static readonly tentacle6: string = "M276.84 253.3c7.24 20.7 13 43.91-2.15 63.75-9.11 11.91-35.1 42.78-31.45 57.53 3.22 13.05 13.8 19.9 11.68 23.22-2.87 3.86-16.15-16.76-16.55-25.86-.72-16.2 12.73-33.92 29.47-53.28 2-2.36 10.84-14.91 11.57-29.33.82-16.41-10.59-35.12-10.2-35.12 2.54-.02 6.64-3.74 7.63-.91z" + static readonly tentacle7: string = "M295.27 254.27c5.83 16.69 12.69 18.82 1.58 35.22a45 45 0 0 0-6.67 19.22c-.52 6.52 6.09 13.33 5.5 19.6-2.35 24.92-17.13 46.55-19.33 44.29-4.35-4.6 22.07-28.6 12.46-51.16-8.38-19.64 6.49-36.53 9.9-42.49 2.75-4.8-11.51-24.51-11.42-24.51 2.05-.01 5.93-.6 7.98-.17z" + static readonly tentacle8: string = "M256.56 252.22c-7 6.09-17.21 14-23.17 24-5.55 9.25-7.06 20.43-7.66 27.88-.53 6.52 2.21 13.76 5.49 19.6 14 24.92-15.62 46.55-19.33 44.29-4.55-4 14.59-16.95 17.41-23.45 2.91-6.69-.07-16.29-5-27.71-8.38-19.64 1-39.25 4.37-45.2 2.75-4.81 19.82-19 19.91-19 2.1-.07 5.92-.84 7.98-.41z" + static readonly tentacle9: string = "M288.76 254.4c7 6.09 17.21 14 23.17 24 5.55 9.25 7.06 20.43 7.66 27.88.53 6.52-2.21 13.76-5.49 19.6-14 24.93 9 45 19.33 44.29 6.58-4.07-14.59-16.95-17.41-23.45-2.91-6.69.07-16.28 5-27.71 8.38-19.64-1-39.25-4.37-45.2-2.75-4.81-19.82-19-19.91-19-2.1-.06-5.92-.81-7.98-.41z" +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/common/constants/RouterConstants.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/common/constants/RouterConstants.ets" new file mode 100644 index 0000000000000000000000000000000000000000..9feaef4b441cc5462f5e4a22c0090babe78f0858 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/common/constants/RouterConstants.ets" @@ -0,0 +1,13 @@ +/** + * 路由常量定义 + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/11/30 17:56 + */ +export default class RouterConstants { + /** + * 首页 + */ + static readonly PAGE_HOME = 'pages/JellyfishPage' +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/entryability/EntryAbility.ts" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/entryability/EntryAbility.ts" new file mode 100644 index 0000000000000000000000000000000000000000..ea94f06eaff7ffa10816f3f9fc9c18222ed81afb --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/entryability/EntryAbility.ts" @@ -0,0 +1,51 @@ +import hilog from '@ohos.hilog'; +import Ability from '@ohos.application.Ability' +import Window from '@ohos.window' + +export default class EntryAbility extends Ability { + onCreate(want, launchParam) { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + hilog.info(0x0000, 'testTag', '%{public}s', 'want param:' + JSON.stringify(want) ?? ''); + hilog.info(0x0000, 'testTag', '%{public}s', 'launchParam:' + JSON.stringify(launchParam) ?? ''); + } + + onDestroy() { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: Window.WindowStage) { + // Main window is created, set main page for this ability + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/LauncherPage', (err, data) => { + if (err.code) { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.ERROR); + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? ''); + }); + } + + onWindowStageDestroy() { + // Main window is destroyed, release UI related resources + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground() { + // Ability has brought to foreground + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground() { + // Ability has back to background + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +} diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/model/JellyfishBodySurfaceModel.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/model/JellyfishBodySurfaceModel.ets" new file mode 100644 index 0000000000000000000000000000000000000000..4e8fb886e9a49b67f7e9afc02348d17d10d76a8c --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/model/JellyfishBodySurfaceModel.ets" @@ -0,0 +1,10 @@ +/** + * JellyfishBodySurfaceModel + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/12/05 14:20 + */ +export class JellyfishBodySurfaceModel { + translationY: number = 0 +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/model/JellyfishBubbleModel.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/model/JellyfishBubbleModel.ets" new file mode 100644 index 0000000000000000000000000000000000000000..a4d4df2bf41dbbfeef8afb6625f1535038becfa4 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/model/JellyfishBubbleModel.ets" @@ -0,0 +1,10 @@ +/** + * JellyfishBubbleModel + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/12/05 16:42 + */ +export class JellyfishBubbleModel{ + scaleValue : number = 1 +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/model/JellyfishEyeModel.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/model/JellyfishEyeModel.ets" new file mode 100644 index 0000000000000000000000000000000000000000..c1f423285adc753ed65898a6eca62d91c511fb67 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/model/JellyfishEyeModel.ets" @@ -0,0 +1,17 @@ +/** + * JellyfishEyeModel + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/12/05 11:30 + */ +export class JellyfishEyeModel{ + /** + * 眨眼缩放等级:[0.3-1] + */ + blinkScale: number = 1 + /** + * 眨眼不透明度等级:[0-1] + */ + blinkAlpha: number = 1 +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/model/JellyfishFaceModel.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/model/JellyfishFaceModel.ets" new file mode 100644 index 0000000000000000000000000000000000000000..0cec98b74999d6488b4b55bd07293b5facf76048 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/model/JellyfishFaceModel.ets" @@ -0,0 +1,12 @@ +/** + * JellyfishFaceModel + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/12/05 14:54 + */ +export class JellyfishFaceModel{ + animCount: number = 1 + translationY: number = 0 + translationX: number = 0 +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/model/JellyfishWindowModel.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/model/JellyfishWindowModel.ets" new file mode 100644 index 0000000000000000000000000000000000000000..d612223ee4cd8b7d6faa194ad6a46e107917789f --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/model/JellyfishWindowModel.ets" @@ -0,0 +1,17 @@ +/** + * JellyfishWindowModel + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/12/05 16:30 + */ +export class JellyfishWindowModel { + /** + * 窗口背景色 + */ + backgroundColors:any[] + /** + * 窗口大小 + */ + screenSize: number[] = [0, 0] +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/pages/JellyfishPage.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/pages/JellyfishPage.ets" new file mode 100644 index 0000000000000000000000000000000000000000..0a8e336aae6446a45cff4cedd0bf01c63f72269a --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/pages/JellyfishPage.ets" @@ -0,0 +1,75 @@ +import { JellyFishViewModel } from '../viewmodel/JellyFishViewModel'; +import { JellyfishLayout } from '../view/JellyfishLayout'; +import { RadialGradientRect } from '../view/RadialGradientRect'; +import CommonConstants from '../common/constants/CommonConstants' +import router from '@ohos.router' + +/** + * 水母首页 + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/11/30 18:19 + */ +@Entry +@Component +struct JellyfishPage { + @State viewModel: JellyFishViewModel = new JellyFishViewModel() + aboutToAppear() { + // 清除启动页,防止在首页点击返回按钮之后显示启动页 + router.clear() + } + + /** + * 水母眨眼animateTo动画 + */ + blinkAnimateTo() { + animateTo({ + duration: CommonConstants.JELLY_FISH_BLINK_ANIM_DURATION, + curve: Curve.EaseOut, + iterations: CommonConstants.JELLY_FISH_ANIM_MOTION_COUNT, + playMode: PlayMode.Normal, + onFinish:()=> { + // 闭眼之后,再恢复回睁眼状态 + this.viewModel.switchBlink() + } + }, () => { + this.viewModel.switchBlink() + }) + } + + build() { + Stack({ alignContent:Alignment.Bottom }) { + // 渐变背景色 + RadialGradientRect({ viewModel: $viewModel }) + + // 水母视图 + JellyfishLayout({ viewModel: $viewModel }) + + // 底部操作按钮 + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }){ + Button($r('app.string.jelly_fish_blink')) + .flexGrow(CommonConstants.FLEX_GROW_1) + .optButtonStyle() + .onClick(() => { + this.blinkAnimateTo() + }) + + Button($r('app.string.jelly_fish_switch_window_bg')) + .flexGrow(CommonConstants.FLEX_GROW_1) + .optButtonStyle() + .onClick(() => { + this.viewModel.switchWindowBackground() + }) + }.margin({bottom: $r('app.float.button_options_menu_margin_bottom')}) + } + .width(CommonConstants.FULL_WIDTH) + .height(CommonConstants.FULL_HEIGHT) + } +} + +@Extend(Button) function optButtonStyle() { + .height($r('app.float.button_options_height')) + .margin($r('app.float.button_options_inner_margin')) + .fontSize($r('app.float.button_options_btn_font_size')) +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/pages/LauncherPage.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/pages/LauncherPage.ets" new file mode 100644 index 0000000000000000000000000000000000000000..fa2678c62e65aee62d8ad6fd07b1b1304d469d18 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/pages/LauncherPage.ets" @@ -0,0 +1,69 @@ +import router from '@ohos.router' +import CommonConstants from '../common/constants/CommonConstants' +import RouterConstants from '../common/constants/RouterConstants' + +/** + * 启动页 + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/11/30 17:52 + */ +@Entry +@Component +struct LauncherPage { + private timerId: number = 0 + + aboutToAppear() { + // 设置倒计时 + this.timerId = setTimeout(() => { + router.push({ url: RouterConstants.PAGE_HOME}) + }, CommonConstants.LAUNCHER_DELAY_TIME) + } + + onPageHide() { + // 清除倒计时 + clearTimeout(this.timerId) + } + + build() { + Stack() { + Image($r('app.media.ic_launcher_background')) + .width(CommonConstants.FULL_WIDTH) + .height(CommonConstants.FULL_HEIGHT) + + Column() { + Image($r('app.media.app_icon')) + .width($r('app.float.launcher_logo_size')) + .height($r('app.float.launcher_logo_size')) + .margin({ top: CommonConstants.LAUNCHER_IMAGE_MARGIN_TOP }) + + Text($r('app.string.code_label_demo_name')) + .height($r('app.float.launcher_life_text_height')) + .codeLabelSplashTextStyle(FontWeight.Bold, + CommonConstants.LAUNCHER_LIFE_TEXT_SPACING, + $r('app.float.launcher_text_title_size'), + $r('app.color.code_label_demo_name_color')) + .margin({ top: CommonConstants.LAUNCHER_TEXT_TITLE_MARGIN_TOP }) + + Text($r('app.string.code_label_demo_introduce')) + .height(CommonConstants.LAUNCHER_TEXT_INTRODUCE_HEIGHT) + .codeLabelSplashTextStyle(FontWeight.Normal, + CommonConstants.LAUNCHER_TEXT_INTRODUCE_SPACING, + $r('app.float.launcher_text_introduce_size'), + $r('app.color.code_label_demo_introduce_color')) + .opacity($r('app.float.launcher_text_opacity')) + .margin({ top: CommonConstants.LAUNCHER_TEXT_INTRODUCE_MARGIN_TOP }) + } + .height(CommonConstants.FULL_HEIGHT) + .width(CommonConstants.FULL_WIDTH) + } + } +} + +@Extend(Text) function codeLabelSplashTextStyle (fontWeight: number, textAttribute: number, fontSize: Resource, fontColor: Resource) { + .fontWeight(fontWeight) + .letterSpacing(textAttribute) + .fontSize(fontSize) + .fontColor(fontColor) +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupBody.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupBody.ets" new file mode 100644 index 0000000000000000000000000000000000000000..1c825e1ab934d35984f235a77550b098cc5b7931 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupBody.ets" @@ -0,0 +1,27 @@ +import CommonConstants from '../common/constants/CommonConstants' +import JellFishPaths from '../common/constants/JellyFishPaths' +/** + * Group分组,Body + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/12/01 15:50 + */ +@Component +export struct GroupBody { + build() { + Shape() { + Path() + .commands(JellFishPaths.face) + .fill(Color.White) + + Path() + .commands(JellFishPaths.outerJelly) + .fill(Color.White) + .fillOpacity(CommonConstants.OPACITY_PERCENT_50) + }.viewPort({ + width: CommonConstants.JELLY_FISH_VIEW_PORT_WIDTH, + height: CommonConstants.JELLY_FISH_VIEW_PORT_HEIGHT, + }) + } +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupBubbles.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupBubbles.ets" new file mode 100644 index 0000000000000000000000000000000000000000..ba921c1a6b2e97e9baf008b6d776822d835ea7a0 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupBubbles.ets" @@ -0,0 +1,55 @@ +import { JellyFishViewModel } from '../viewmodel/JellyFishViewModel'; +import CommonConstants from '../common/constants/CommonConstants' +import JellFishPaths from '../common/constants/JellyFishPaths' + +/** + * Group分组,Bubble + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/12/01 15:45 + */ +@Component +export struct GroupBubbles { + @Link viewModel: JellyFishViewModel + + build() { + Shape() { + Path() + .commands(JellFishPaths.bubble1) + .fillOpacity(CommonConstants.OPACITY_PERCENT_67) + .fill(Color.White) + Path() + .commands(JellFishPaths.bubble2) + .fillOpacity(CommonConstants.OPACITY_PERCENT_75) + .fill(Color.White) + Path() + .commands(JellFishPaths.bubble3) + .fillOpacity(CommonConstants.OPACITY_PERCENT_89) + .fill(Color.White) + Path() + .commands(JellFishPaths.bubble4) + .fillOpacity(CommonConstants.OPACITY_PERCENT_77) + .fill(Color.White) + Path() + .commands(JellFishPaths.bubble5) + .fillOpacity(CommonConstants.OPACITY_PERCENT_77) + .fill(Color.White) + }.viewPort({ + width: CommonConstants.JELLY_FISH_VIEW_PORT_WIDTH, + height: CommonConstants.JELLY_FISH_VIEW_PORT_HEIGHT, + }) + .onAreaChange(()=>{ + this.viewModel.bubbleMotion() + }) + .scale({x: this.viewModel.getBubblesScale() , y: this.viewModel.getBubblesScale() }) + .animation({ + duration: CommonConstants.JELLY_FISH_TRANSLATE_Y_DURATION, // 动画时长 + iterations: CommonConstants.JELLY_FISH_ANIM_MOTION_COUNT, // 播放次数 + playMode: PlayMode.Normal, // 动画模式 + onFinish: () => { + this.viewModel.bubbleMotion() + } + }) + } +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupFace.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupFace.ets" new file mode 100644 index 0000000000000000000000000000000000000000..14ed7f870218757e6e042d090dd03ff96534d20e --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupFace.ets" @@ -0,0 +1,51 @@ +import { JellyFishViewModel } from '../viewmodel/JellyFishViewModel'; +import CommonConstants from '../common/constants/CommonConstants'; +import { GroupRightEye } from './GroupRightEye' +import { GroupLeftEye } from './GroupLeftEye' +import JellFishPaths from '../common/constants/JellyFishPaths' + +/** + * Group分组,Face + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/12/01 15:30 + */ +@Component +export struct GroupFace { + @Link viewModel: JellyFishViewModel + + @Styles svgViewPort() { + .size({ + width: CommonConstants.JELLY_FISH_VIEW_PORT_WIDTH, + height: CommonConstants.JELLY_FISH_VIEW_PORT_HEIGHT + }) + } + + build() { + Stack(){ + GroupLeftEye({ viewModel: $viewModel }) + GroupRightEye({ viewModel: $viewModel }) + + Path() + .svgViewPort() + .commands(JellFishPaths.mouth) + .fillOpacity(CommonConstants.OPACITY_PERCENT_72) + .fill($r('app.color.jelly_fish_mouth_color')) + } + .svgViewPort() + .translate({y : this.viewModel.getFaceMotionTranslateY(),x: this.viewModel.getFaceMotionTranslateX()}) + .onAreaChange(()=>{ + this.viewModel.faceMotion(true) + }) + .animation({ + duration: CommonConstants.JELLY_FISH_TRANSLATE_Y_DURATION, // 动画时长 + iterations: CommonConstants.JELLY_FISH_ANIM_MOTION_COUNT, // 播放次数 + playMode: PlayMode.Normal, // 动画模式 + onFinish: () => { + // 动画播放完成回调 + this.viewModel.faceMotion(false) + } + }) + } +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupFrackles.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupFrackles.ets" new file mode 100644 index 0000000000000000000000000000000000000000..7c912d89894d9be429c116cfad4dd3e8a7f716f8 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupFrackles.ets" @@ -0,0 +1,32 @@ +import CommonConstants from '../common/constants/CommonConstants' +import JellFishPaths from '../common/constants/JellyFishPaths' + +/** + * Group分组,Freckles + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/12/01 15:28 + */ +@Component +export struct GroupFreckles { + build() { + Shape() { + Path() + .commands(JellFishPaths.freckle1) + .fill($r('app.color.jelly_fish_freckle_color')) + Path() + .commands(JellFishPaths.freckle2) + .fill($r('app.color.jelly_fish_freckle_color')) + Path() + .commands(JellFishPaths.freckle3) + .fill($r('app.color.jelly_fish_freckle_color')) + Path() + .commands(JellFishPaths.freckle4) + .fill($r('app.color.jelly_fish_freckle_color')) + }.viewPort({ + width: CommonConstants.JELLY_FISH_VIEW_PORT_WIDTH, + height: CommonConstants.JELLY_FISH_VIEW_PORT_HEIGHT, + }) + } +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupJellyfish.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupJellyfish.ets" new file mode 100644 index 0000000000000000000000000000000000000000..bfd6a72ce400cc9ba32de7fe3a6dd8662bef0810 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupJellyfish.ets" @@ -0,0 +1,40 @@ +import { JellyFishViewModel } from '../viewmodel/JellyFishViewModel'; +import { GroupFreckles } from './GroupFrackles'; +import { GroupBody } from './GroupBody'; +import { GroupTentacles } from './GroupTentacles'; +import CommonConstants from '../common/constants/CommonConstants'; + +/** + * Group分组,Freckles + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/12/01 14:37 + */ +@Component +export struct GroupJellyfish { + @Link viewModel: JellyFishViewModel + build() { + Stack(){ + GroupTentacles() + GroupBody() + GroupFreckles() + }.size({ + width: CommonConstants.JELLY_FISH_VIEW_PORT_WIDTH, + height: CommonConstants.JELLY_FISH_VIEW_PORT_HEIGHT, + }) + .translate({ y : this.viewModel.getBodySurfaceMotionTranslateY() }) + .onAreaChange(()=>{ + this.viewModel.bodySurfaceMotion(true) + }) + .animation({ + duration: CommonConstants.JELLY_FISH_TRANSLATE_Y_DURATION, // 动画时长 + iterations: CommonConstants.JELLY_FISH_ANIM_MOTION_COUNT, // 播放次数 + playMode: PlayMode.Normal, // 动画模式 + onFinish: () => { + // 动画播放完成回调 + this.viewModel.bodySurfaceMotion(false) + } + }) + } +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupLeftEye.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupLeftEye.ets" new file mode 100644 index 0000000000000000000000000000000000000000..233f25c8d54a483d5a8a7cef02253eb9c5f6238a --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupLeftEye.ets" @@ -0,0 +1,29 @@ +import { JellyFishViewModel } from '../viewmodel/JellyFishViewModel'; +import CommonConstants from '../common/constants/CommonConstants' +import JellFishPaths from '../common/constants/JellyFishPaths' + +/** + * 左侧眼睛Group + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/12/01 16:11 + */ +@Component +export struct GroupLeftEye { + @Link viewModel: JellyFishViewModel + + build() { + Shape() { + Path() + .fill($r('app.color.jelly_fish_eye_color')) + .commands(JellFishPaths.leftEye) + } + .scale({ y: this.viewModel.getBlinkScale(), centerY: CommonConstants.JELLY_FISH_EYE_CENTER_Y }) + .opacity(this.viewModel.getBlinkAlpha()) + .viewPort({ + width: CommonConstants.JELLY_FISH_VIEW_PORT_WIDTH, + height: CommonConstants.JELLY_FISH_VIEW_PORT_HEIGHT, + }) + } +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupRightEye.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupRightEye.ets" new file mode 100644 index 0000000000000000000000000000000000000000..614b6a442ef74ebade918e48c428de3e435a69df --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupRightEye.ets" @@ -0,0 +1,28 @@ +import { JellyFishViewModel } from '../viewmodel/JellyFishViewModel'; +import CommonConstants from '../common/constants/CommonConstants' +import JellFishPaths from '../common/constants/JellyFishPaths' + +/** + * 右侧眼睛Group + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/12/01 16:13 + */ +@Component +export struct GroupRightEye{ + @Link viewModel: JellyFishViewModel + build(){ + Shape(){ + Path() + .fill($r('app.color.jelly_fish_eye_color')) + .commands(JellFishPaths.rightEye) + } + .scale({ y: this.viewModel.getBlinkScale(), centerY: CommonConstants.JELLY_FISH_EYE_CENTER_Y }) + .opacity(this.viewModel.getBlinkAlpha()) + .viewPort({ + width: CommonConstants.JELLY_FISH_VIEW_PORT_WIDTH, + height: CommonConstants.JELLY_FISH_VIEW_PORT_HEIGHT, + }) + } +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupTentacles.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupTentacles.ets" new file mode 100644 index 0000000000000000000000000000000000000000..5925bc88c29812c7c16af599145b09d444bc0ef7 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/GroupTentacles.ets" @@ -0,0 +1,55 @@ +import CommonConstants from '../common/constants/CommonConstants'; +import JellFishPaths from '../common/constants/JellyFishPaths' + +/** + * Group分组,Tentacles + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/12/01 15:51 + */ +@Component +export struct GroupTentacles { + build() { + Shape() { + Path() + .commands(JellFishPaths.tentaclePath) + .fillOpacity(CommonConstants.OPACITY_PERCENT_49) + .fill(Color.White) + Path() + .commands(JellFishPaths.tentacle2) + .fillOpacity(CommonConstants.OPACITY_PERCENT_66) + .fill(Color.White) + Path() + .commands(JellFishPaths.tentacle3) + .fillOpacity(CommonConstants.OPACITY_PERCENT_45) + .fill(Color.White) + Path() + .commands(JellFishPaths.tentacle4) + .fillOpacity(CommonConstants.OPACITY_PERCENT_60) + .fill(Color.White) + Path() + .commands(JellFishPaths.tentacle5) + .fillOpacity(CommonConstants.OPACITY_PERCENT_100) + .fill(Color.White) + Path() + .commands(JellFishPaths.tentacle6) + .fillOpacity(CommonConstants.OPACITY_PERCENT_100) + .fill(Color.White) + Path() + .commands(JellFishPaths.tentacle7) + .fillOpacity(CommonConstants.OPACITY_PERCENT_100) + .fill(Color.White) + Path() + .commands(JellFishPaths.tentacle8) + .fillOpacity(CommonConstants.OPACITY_PERCENT_100) + .fill(Color.White) + Path() + .commands(JellFishPaths.tentacle9) + .fill(Color.White) + }.viewPort({ + width: CommonConstants.JELLY_FISH_VIEW_PORT_WIDTH, + height: CommonConstants.JELLY_FISH_VIEW_PORT_HEIGHT, + }) + } +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/JellyfishLayout.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/JellyfishLayout.ets" new file mode 100644 index 0000000000000000000000000000000000000000..1d2ec6c176aca0adefc766cc205fcf212acad569 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/JellyfishLayout.ets" @@ -0,0 +1,27 @@ +import { JellyFishViewModel } from '../viewmodel/JellyFishViewModel' +import CommonConstants from '../common/constants/CommonConstants' +import { GroupBubbles } from './GroupBubbles' +import { GroupFace } from './GroupFace' +import { GroupJellyfish } from './GroupJellyfish' + +/** + * JellyfishLayout + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/12/01 13:37 + */ +@Component +export struct JellyfishLayout{ + @Link viewModel: JellyFishViewModel + build(){ + Stack() { + GroupJellyfish({viewModel: $viewModel}) + GroupBubbles({viewModel: $viewModel}) + GroupFace({viewModel: $viewModel}) + } + .width(CommonConstants.FULL_WIDTH) + .height(CommonConstants.FULL_HEIGHT) + .scale({x:2,y:2}) + } +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/RadialGradientRect.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/RadialGradientRect.ets" new file mode 100644 index 0000000000000000000000000000000000000000..f4d9cd4ebe1b83ab2009536f9cca681559e08954 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/view/RadialGradientRect.ets" @@ -0,0 +1,28 @@ +import { JellyFishViewModel } from '../viewmodel/JellyFishViewModel'; +import CommonConstants from '../common/constants/CommonConstants'; + +/** + * RadialGradientRect + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/12/01 09:37 + */ +@Component +export struct RadialGradientRect{ + @Link viewModel: JellyFishViewModel + + build(){ + Stack() + .width(CommonConstants.FULL_WIDTH) + .height(CommonConstants.FULL_HEIGHT) + .onAreaChange((_,newValue)=> { + this.viewModel.updateWindowSize(newValue) + }) + .radialGradient({ + center:[this.viewModel.getWindowSize()[0]/2,this.viewModel.getWindowSize()[1]/2], + colors: this.viewModel.getWindowBackground(), + radius: Math.max(this.viewModel.getWindowSize()[0],this.viewModel.getWindowSize()[1])/2 + }) + } +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/viewmodel/JellyFishViewModel.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/viewmodel/JellyFishViewModel.ets" new file mode 100644 index 0000000000000000000000000000000000000000..d712b97960936d3c2fb3ebcae9ca0312e35bec18 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/ets/viewmodel/JellyFishViewModel.ets" @@ -0,0 +1,210 @@ +import { JellyfishBubbleModel } from '../model/JellyfishBubbleModel'; +import { JellyfishBodySurfaceModel } from '../model/JellyfishBodySurfaceModel'; +import CommonConstants from '../common/constants/CommonConstants'; +import { JellyfishFaceModel } from '../model/JellyfishFaceModel'; +import { JellyfishEyeModel } from '../model/JellyfishEyeModel'; +import { JellyfishWindowModel } from '../model/JellyfishWindowModel'; + +/** + * JellyFishViewModel + * @author Halifax + * @blog https://juejin.cn/user/8451824316670/posts + * @email developer_melody@163.com + * created 2022/12/02 10:05 + */ +@Observed +export class JellyFishViewModel { + /** + * 切换窗口颜色的次数 + */ + private switchWindowColorCount: number = 0 + + /** + * 窗口配置 + */ + private windowModel: JellyfishWindowModel = new JellyfishWindowModel() + + /** + * 水母眼睛配置 + */ + private eyeModel: JellyfishEyeModel = new JellyfishEyeModel() + + /** + * 水母面部数据配置 + */ + private faceModel: JellyfishFaceModel = new JellyfishFaceModel() + + /** + * 水母身体和身体表面配置 + */ + private bodySurfaceModel: JellyfishBodySurfaceModel = new JellyfishBodySurfaceModel() + + /** + * 水母气泡Model + */ + private bubbleModel: JellyfishBubbleModel = new JellyfishBubbleModel() + + constructor() { + this.switchWindowBackground() + } + + /** + * 眨眼缩放等级:[0.3-1] + */ + public getBlinkScale() { + return this.eyeModel.blinkScale + } + + /** + * 眨眼不透明度等级:[0-1] + */ + public getBlinkAlpha() { + return this.eyeModel.blinkAlpha + } + + /** + * 获取当前窗口大小 + */ + public getWindowSize(){ + return this.windowModel.screenSize + } + + /** + * 返回当前窗口背景色 + */ + public getWindowBackground() { + return this.windowModel.backgroundColors + } + + //这里如果针对X轴使用random()* translateY,外部通过animationTo眨眼动画触发,然后快速点击按钮,这里动画阻塞中不执行,导致眼睛和脸分离了,哈哈哈 + /*public getFaceMotionTranslateX() { + // 外部调用的时候不能用Math.random(),需要提前在动画里面计算好 + return (this.faceModel.animCount%3==0? -1:1) * Math.random() * this.faceModel.translationY/3 + }*/ + + /** + * 获取水母脸部X轴运动距离 + */ + public getFaceMotionTranslateX(){ + return this.faceModel.translationX + } + + /** + * 获取水母脸部Y轴运动距离 + */ + public getFaceMotionTranslateY(){ + return this.faceModel.translationY + } + + /** + * 获取水母身体沿Y轴运动的距离 + */ + public getBodySurfaceMotionTranslateY(){ + return this.bodySurfaceModel.translationY + } + + /** + * 刷新切换 + */ + private refreshWindowColor() { + switch(this.switchWindowColorCount) { + case 0 : { + return [['#FF2be4dc',0], ['#FF243484',0.9]] + } + case 1: { + return [['#ffe4b62b',0], ['#ff842477',0.9]] + } + case 2: { + return [['#ffc2ec73',0], ['#ff248469',0.9]] + } + case 3: { + return [['#ff8e2be4',0], ['#ff768424',0.9]] + } + default: { + return [['#ffe42b81',0], ['#ff247c84',0.9]] + } + } + } + + /** + * 切换窗口背景色 + */ + public switchWindowBackground() { + if(this.switchWindowColorCount >3) { + this.switchWindowColorCount = 0 + } + this.windowModel = { + ...this.windowModel, + backgroundColors: this.refreshWindowColor() + } + this.switchWindowColorCount++ + } + + /** + * 更新窗口大小 + * @param area Area + */ + public updateWindowSize(area: Area) { + this.windowModel = { + ...this.windowModel, + screenSize: [ + vp2px(area.width as number), + vp2px(area.height as number) + ] + } + console.log("当前窗口大小:" + this.windowModel.screenSize[0] + "px" + this.windowModel.screenSize[1] + "px") + } + + /** + * 切换眨眼 + */ + public switchBlink() { + this.eyeModel = { + ...this.eyeModel, + blinkScale: this.eyeModel.blinkScale == 0.3?1:0.3, + blinkAlpha: this.eyeModel.blinkAlpha==0? 1: 0 + } + } + + /** + * 更新水母面部动画运动数据 + */ + public faceMotion(fromAreaChange : boolean) { + let animCount = fromAreaChange ? this.faceModel.animCount : this.faceModel.animCount + 1 + let translationY = fromAreaChange ? CommonConstants.JELLY_FISH_FACE_MOTION_MIN_RANGE : (this.faceModel.translationY == 0 ? CommonConstants.JELLY_FISH_FACE_MOTION_MIN_RANGE : 0) + this.faceModel = { + ...this.faceModel, + translationY: translationY, + animCount: animCount, + translationX: (animCount%3==0? -1:1) * Math.random() * translationY/3 + } + } + + /** + * 更新水母身体动画运动数据 + */ + public bodySurfaceMotion(fromAreaChange : boolean) { + this.bodySurfaceModel = { + ...this.bodySurfaceModel, + translationY: fromAreaChange? CommonConstants.JELLY_FISH_TRANSLATE_Y_MOTION_MIN_RANGE:(this.bodySurfaceModel.translationY == 0 ? CommonConstants.JELLY_FISH_TRANSLATE_Y_MOTION_MIN_RANGE : 0) + } + } + + /** + * 简单点,让气泡容器变大,整个气泡就会呈现往外扩散的情况,目前HarmonyOS版本的Shape属性mesh不支持触摸,就不加进来了 + */ + public bubbleMotion() { + this.bubbleModel = { + ...this.bubbleModel, + scaleValue: this.bubbleModel.scaleValue == 1? 1.15: 1 + } + } + + /** + * 返回气泡容器缩放等级 + */ + public getBubblesScale() { + return this.bubbleModel.scaleValue + } + +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/module.json5" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/module.json5" new file mode 100644 index 0000000000000000000000000000000000000000..6df4fc3166652fff0b23477d793a91ed906267f7 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/module.json5" @@ -0,0 +1,44 @@ +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "phone" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "requestPermissions": [ + { + "name": "ohos.permission.READ_MEDIA" + }, + { + "name": "ohos.permission.INTERNET" + } + ], + "abilities": [ + { + "name": "EntryAbility", + "srcEntrance": "./ets/entryability/EntryAbility.ts", + "description": "$string:EntryAbility_desc", + "icon": "$media:app_icon", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:app_icon", + "startWindowBackground": "$color:start_window_background", + "visible": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/base/element/color.json" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/base/element/color.json" new file mode 100644 index 0000000000000000000000000000000000000000..81d88c6e8b99001e1fe0d2f2ab7971bdb0beae23 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/base/element/color.json" @@ -0,0 +1,28 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + }, + { + "name": "code_label_demo_name_color", + "value": "#182431" + }, + { + "name": "code_label_demo_introduce_color", + "value": "#182431" + }, + { + "name": "jelly_fish_eye_color", + "value": "#FFb4bebf" + }, + { + "name": "jelly_fish_mouth_color", + "value": "#FFd3d3d3" + }, + { + "name": "jelly_fish_freckle_color", + "value": "#fff0dfe2" + } + ] +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/base/element/float.json" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/base/element/float.json" new file mode 100644 index 0000000000000000000000000000000000000000..a93617c00bae98c9714e60e60ace01151198698f --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/base/element/float.json" @@ -0,0 +1,40 @@ +{ + "float": [ + { + "name": "launcher_logo_size", + "value": "119vp" + }, + { + "name": "launcher_life_text_height", + "value": "35vp" + }, + { + "name": "launcher_text_title_size", + "value": "26fp" + }, + { + "name": "launcher_text_introduce_size", + "value": "16fp" + }, + { + "name": "launcher_text_opacity", + "value": "0.6" + }, + { + "name": "button_options_menu_margin_bottom", + "value": "16vp" + }, + { + "name": "button_options_height", + "value": "50vp" + }, + { + "name": "button_options_inner_margin", + "value": "16vp" + }, + { + "name": "button_options_btn_font_size", + "value": "18fp" + } + ] +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/base/element/string.json" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/base/element/string.json" new file mode 100644 index 0000000000000000000000000000000000000000..a8ef66cd10d83fda83233d878d2e0f65fe847ccd --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/base/element/string.json" @@ -0,0 +1,32 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "label" + }, + { + "name": "code_label_demo_name", + "value": "【Challenge 3】" + }, + { + "name": "code_label_demo_introduce", + "value": "Play ArkUI animation" + }, + { + "name": "jelly_fish_blink", + "value": "Blink" + }, + { + "name": "jelly_fish_switch_window_bg", + "value": "Switch Background Color" + } + ] +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/base/media/ic_add_more.png" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/base/media/ic_add_more.png" new file mode 100644 index 0000000000000000000000000000000000000000..b70256471ed35fe5ad64cd37a3951c5fc5aa75c2 Binary files /dev/null and "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/base/media/ic_add_more.png" differ diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/base/media/ic_launcher_background.png" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/base/media/ic_launcher_background.png" new file mode 100644 index 0000000000000000000000000000000000000000..92e1b86070be2a0d489e4e1115da7965435bdd52 Binary files /dev/null and "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/base/media/ic_launcher_background.png" differ diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/base/profile/main_pages.json" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/base/profile/main_pages.json" new file mode 100644 index 0000000000000000000000000000000000000000..5437c61af967b0689da83f3e508be289e48584fb --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/base/profile/main_pages.json" @@ -0,0 +1,6 @@ +{ + "src": [ + "pages/LauncherPage", + "pages/JellyfishPage" + ] +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/en_US/element/string.json" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/en_US/element/string.json" new file mode 100644 index 0000000000000000000000000000000000000000..a8ef66cd10d83fda83233d878d2e0f65fe847ccd --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/en_US/element/string.json" @@ -0,0 +1,32 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "label" + }, + { + "name": "code_label_demo_name", + "value": "【Challenge 3】" + }, + { + "name": "code_label_demo_introduce", + "value": "Play ArkUI animation" + }, + { + "name": "jelly_fish_blink", + "value": "Blink" + }, + { + "name": "jelly_fish_switch_window_bg", + "value": "Switch Background Color" + } + ] +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/zh_CN/element/string.json" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/zh_CN/element/string.json" new file mode 100644 index 0000000000000000000000000000000000000000..2bbc654f44aaa3ca1413a4c55d7f15b608739d04 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/main/resources/zh_CN/element/string.json" @@ -0,0 +1,32 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "模块描述" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "label" + }, + { + "name": "code_label_demo_name", + "value": "【挑战赛第三期】" + }, + { + "name": "code_label_demo_introduce", + "value": "玩转ArkUI动效" + }, + { + "name": "jelly_fish_blink", + "value": "眨眼睛" + }, + { + "name": "jelly_fish_switch_window_bg", + "value": "切换背景色" + } + ] +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/ets/test/Ability.test.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/ets/test/Ability.test.ets" new file mode 100644 index 0000000000000000000000000000000000000000..460fe8c8c124c821c5451615acc8949f619dbc3f --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/ets/test/Ability.test.ets" @@ -0,0 +1,36 @@ +import hilog from '@ohos.hilog'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium' + +export default function abilityTest() { + describe('ActsAbilityTest', function () { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(function () { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(function () { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(function () { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(function () { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain',0, function () { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc' + let b = 'b' + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b) + expect(a).assertEqual(a) + }) + }) +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/ets/test/List.test.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/ets/test/List.test.ets" new file mode 100644 index 0000000000000000000000000000000000000000..d766fe249dfc3ada636f27e64d9b64451ce32c93 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/ets/test/List.test.ets" @@ -0,0 +1,5 @@ +import abilityTest from './Ability.test' + +export default function testsuite() { + abilityTest() +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/ets/testability/TestAbility.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/ets/testability/TestAbility.ets" new file mode 100644 index 0000000000000000000000000000000000000000..84765c417cbff3b90c08d4c9accb2ea581ba2df1 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/ets/testability/TestAbility.ets" @@ -0,0 +1,57 @@ +import hilog from '@ohos.hilog'; +import Ability from '@ohos.application.Ability' +import AbilityDelegatorRegistry from '@ohos.application.abilityDelegatorRegistry' +import { Hypium } from '@ohos/hypium' +import testsuite from '../test/List.test' +import Window from '@ohos.window' + +export default class TestAbility extends Ability { + onCreate(want, launchParam) { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onCreate'); + hilog.info(0x0000, 'testTag', '%{public}s', 'want param:' + JSON.stringify(want) ?? ''); + hilog.info(0x0000, 'testTag', '%{public}s', 'launchParam:'+ JSON.stringify(launchParam) ?? ''); + var abilityDelegator: any + abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator() + var abilityDelegatorArguments: any + abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments() + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'start run testcase!!!'); + Hypium.hypiumTest(abilityDelegator, abilityDelegatorArguments, testsuite) + } + + onDestroy() { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onDestroy'); + } + + onWindowStageCreate(windowStage: Window.WindowStage) { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onWindowStageCreate'); + windowStage.loadContent('testability/pages/Index', (err, data) => { + if (err.code) { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.ERROR); + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', + JSON.stringify(data) ?? ''); + }); + } + + onWindowStageDestroy() { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onWindowStageDestroy'); + } + + onForeground() { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onForeground'); + } + + onBackground() { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onBackground'); + } +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/ets/testability/pages/Index.ets" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/ets/testability/pages/Index.ets" new file mode 100644 index 0000000000000000000000000000000000000000..954dfe0e29874c9ef11a5ace1673f79e27999864 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/ets/testability/pages/Index.ets" @@ -0,0 +1,35 @@ +import hilog from '@ohos.hilog'; + +@Entry +@Component +struct Index { + aboutToAppear() { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility index aboutToAppear'); + } + @State message: string = 'Hello World' + build() { + Row() { + Column() { + Text(this.message) + .fontSize(50) + .fontWeight(FontWeight.Bold) + Button() { + Text('next page') + .fontSize(20) + .fontWeight(FontWeight.Bold) + }.type(ButtonType.Capsule) + .margin({ + top: 20 + }) + .backgroundColor('#0D9FFB') + .width('35%') + .height('5%') + .onClick(()=>{ + }) + } + .width('100%') + } + .height('100%') + } + } \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ts" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ts" new file mode 100644 index 0000000000000000000000000000000000000000..94579b9c1535bc11ee56ee53b48fc90a9977e33a --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ts" @@ -0,0 +1,71 @@ +import hilog from '@ohos.hilog'; +import TestRunner from '@ohos.application.testRunner' +import AbilityDelegatorRegistry from '@ohos.application.abilityDelegatorRegistry' + +var abilityDelegator = undefined +var abilityDelegatorArguments = undefined + +function translateParamsToString(parameters) { + const keySet = new Set([ + '-s class', '-s notClass', '-s suite', '-s it', + '-s level', '-s testType', '-s size', '-s timeout', + '-s dryRun' + ]) + let targetParams = ''; + for (const key in parameters) { + if (keySet.has(key)) { + targetParams = `${targetParams} ${key} ${parameters[key]}` + } + } + return targetParams.trim() +} + +async function onAbilityCreateCallback() { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'onAbilityCreateCallback'); +} + +async function addAbilityMonitorCallback(err: any) { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', 'addAbilityMonitorCallback : %{public}s', JSON.stringify(err) ?? ''); +} + +export default class OpenHarmonyTestRunner implements TestRunner { + constructor() { + } + + onPrepare() { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner OnPrepare '); + } + + async onRun() { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner onRun run'); + abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments() + abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator() + var testAbilityName = abilityDelegatorArguments.bundleName + '.TestAbility' + let lMonitor = { + abilityName: testAbilityName, + onAbilityCreate: onAbilityCreateCallback, + }; + abilityDelegator.addAbilityMonitor(lMonitor, addAbilityMonitorCallback) + var cmd = 'aa start -d 0 -a TestAbility' + ' -b ' + abilityDelegatorArguments.bundleName + cmd += ' '+translateParamsToString(abilityDelegatorArguments.parameters) + var debug = abilityDelegatorArguments.parameters['-D'] + if (debug == 'true') + { + cmd += ' -D' + } + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', 'cmd : %{public}s', cmd); + abilityDelegator.executeShellCommand(cmd, + (err: any, d: any) => { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + hilog.info(0x0000, 'testTag', 'executeShellCommand : err : %{public}s', JSON.stringify(err) ?? ''); + hilog.info(0x0000, 'testTag', 'executeShellCommand : data : %{public}s', d.stdResult ?? ''); + hilog.info(0x0000, 'testTag', 'executeShellCommand : data : %{public}s', d.exitCode ?? ''); + }) + hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner onRun end'); + } +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/module.json5" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/module.json5" new file mode 100644 index 0000000000000000000000000000000000000000..46d95d62f1d98834e61853653bc2369cbe5907de --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/module.json5" @@ -0,0 +1,36 @@ +{ + "module": { + "name": "entry_test", + "type": "feature", + "description": "$string:module_test_desc", + "mainElement": "TestAbility", + "deviceTypes": [ + "phone" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:test_pages", + "abilities": [ + { + "name": "TestAbility", + "srcEntrance": "./ets/testability/TestAbility.ets", + "description": "$string:TestAbility_desc", + "icon": "$media:icon", + "label": "$string:TestAbility_label", + "visible": true, + "startWindowIcon": "$media:icon", + "startWindowBackground": "$color:start_window_background", + "skills": [ + { + "actions": [ + "action.system.home" + ], + "entities": [ + "entity.system.home" + ] + } + ] + } + ] + } +} diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/resources/base/element/color.json" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/resources/base/element/color.json" new file mode 100644 index 0000000000000000000000000000000000000000..3c712962da3c2751c2b9ddb53559afcbd2b54a02 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/resources/base/element/color.json" @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/resources/base/element/string.json" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/resources/base/element/string.json" new file mode 100644 index 0000000000000000000000000000000000000000..65d8fa5a7cf54aa3943dcd0214f58d1771bc1f6c --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/resources/base/element/string.json" @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_test_desc", + "value": "test ability description" + }, + { + "name": "TestAbility_desc", + "value": "the test ability" + }, + { + "name": "TestAbility_label", + "value": "test label" + } + ] +} \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/resources/base/media/icon.png" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/resources/base/media/icon.png" new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c Binary files /dev/null and "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/resources/base/media/icon.png" differ diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/resources/base/profile/test_pages.json" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/resources/base/profile/test_pages.json" new file mode 100644 index 0000000000000000000000000000000000000000..b7e7343cacb32ce982a45e76daad86e435e054fe --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/entry/src/ohosTest/resources/base/profile/test_pages.json" @@ -0,0 +1,5 @@ +{ + "src": [ + "testability/pages/Index" + ] +} diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/hvigorfile.ts" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/hvigorfile.ts" new file mode 100644 index 0000000000000000000000000000000000000000..6478186902c0c1ad7c966a929c7d6b7d8ae7a9f3 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/hvigorfile.ts" @@ -0,0 +1,2 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +export { appTasks } from '@ohos/hvigor-ohos-plugin'; \ No newline at end of file diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/package-lock.json" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/package-lock.json" new file mode 100644 index 0000000000000000000000000000000000000000..d91851a5733d2cfd7959dd969ac779b3c0f6202b --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/package-lock.json" @@ -0,0 +1,1098 @@ +{ + "name": "melody_ui_anim_effect", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ohos/hos-sdkmanager-common": { + "version": "2.0.7", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hos-sdkmanager-common/-/@ohos/hos-sdkmanager-common-2.0.7.tgz", + "integrity": "sha512-1dbZlFPImIatThlZWds8sCe6VMKMWCNqOGhoRoEa8FJACKwlUrTybOjCi+MgR5X+vahQDLtDTvMJoZnfMMig6Q==", + "requires": { + "@ohos/sdkmanager-common": "^2.1.5" + } + }, + "@ohos/hvigor": { + "version": "1.3.1", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor/-/@ohos/hvigor-1.3.1.tgz", + "integrity": "sha512-YxIrzzKOPUrXgAe8isUG5q8CTRsP4TIF4Y4KrCeF+uLhMT2FMsd6LYkVj2X9Ib3+siZA+klIUv1Y+kKXMQ55tg==", + "requires": { + "@ohos/hvigor-base": "1.3.1", + "fs-extra": "10.0.1", + "interpret": "1.4.0", + "liftoff": "4.0.0", + "mute-stdout": "1.0.0", + "pretty-hrtime": "1.0.0", + "typescript": "4.7.4", + "v8flags": "3.2.0", + "yargs": "17.5.1" + } + }, + "@ohos/hvigor-base": { + "version": "1.3.1", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-base/-/@ohos/hvigor-base-1.3.1.tgz", + "integrity": "sha512-0NBF9DGtrdG5YmEXPOgXokgd/ukIF7EDUqYSwYY0utwUJ08A1ukR+V+dcywrczu2erb80NCWbMyCeZOtrGNPMQ==", + "requires": { + "fs-extra": "10.0.1", + "iconv-lite": "0.6.3", + "json5": "2.2.0", + "lodash": "4.17.21", + "log4js": "6.4.1", + "once": "1.4.0", + "pretty-hrtime": "1.0.0" + } + }, + "@ohos/hvigor-ohos-plugin": { + "version": "1.3.1", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-ohos-plugin/-/@ohos/hvigor-ohos-plugin-1.3.1.tgz", + "integrity": "sha512-K6Nk2tXNMTJlNf1Ad6nV3+DIQ7iFhBibrelUfHHWqDVlfFUWMxUtpk1Nvs/5RgKIu6O+BJRWJURDgm7mUooAWA==", + "requires": { + "@ohos/hos-sdkmanager-common": "2.0.7", + "@ohos/hvigor-base": "1.3.1", + "@ohos/sdkmanager-common": "2.1.5", + "adm-zip": "0.5.9", + "ajv": "8.10.0", + "deasync": "0.1.28", + "execa": "5.1.1", + "fast-xml-parser": "4.0.3", + "fs-extra": "10.0.1", + "glob": "7.2.0", + "iconv-lite": "0.6.3", + "json5": "2.2.0", + "lodash": "4.17.21", + "pretty-hrtime": "1.0.3", + "resolve-package-path": "4.0.3" + }, + "dependencies": { + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==" + } + } + }, + "@ohos/hypium": { + "version": "1.0.3", + "resolved": "https://repo.harmonyos.com/npm/@ohos/hypium/-/@ohos/hypium-1.0.3.tgz", + "integrity": "sha512-QKh8ngJk1ySbAiKpSTLP5EJIbT8Oja1zV3zwgLD7U9+KX7w2gjNIk3qoP+d13CwpEfaSR3Lxt3exlQLwWSFx3g==" + }, + "@ohos/sdkmanager-common": { + "version": "2.1.5", + "resolved": "https://repo.harmonyos.com/npm/@ohos/sdkmanager-common/-/@ohos/sdkmanager-common-2.1.5.tgz", + "integrity": "sha512-Ka6DncGdEkZ5A9/8aR0oea/PL6yZtPudXTalAX+oXCLIGUxUu400TBcETFZ4fsIePbxmWyOSQW5T1VqUYYIdOg==", + "requires": { + "axios": "0.24.0", + "jszip": "^3.7.0" + } + }, + "adm-zip": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.9.tgz", + "integrity": "sha512-s+3fXLkeeLjZ2kLjCBwQufpI5fuN+kIGBxu6530nVQZGVol0d7Y/M88/xw9HGGUcJjKf8LutN3VPRUBq6N7Ajg==" + }, + "ajv": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==" + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + }, + "axios": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", + "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "requires": { + "follow-redirects": "^1.14.4" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==" + }, + "deasync": { + "version": "0.1.28", + "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.28.tgz", + "integrity": "sha512-QqLF6inIDwiATrfROIyQtwOQxjZuek13WRYZ7donU5wJPLoP67MnYxA6QtqdvdBy2mMqv5m3UefBVdJjvevOYg==", + "requires": { + "bindings": "^1.5.0", + "node-addon-api": "^1.7.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-xml-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.3.tgz", + "integrity": "sha512-xhQbg3a/EYNHwK0cxIG1nZmVkHX/0tWihamn5pU4Mhd9KEVE2ga8ZJiqEUgB2sApElvAATOdMTLjgqIpvYDUkQ==", + "requires": { + "strnum": "^1.0.5" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz", + "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^5.0.0", + "object.defaults": "^1.1.0", + "object.pick": "^1.3.0", + "parse-filepath": "^1.0.2" + } + }, + "flagged-respawn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", + "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==" + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "requires": { + "for-in": "^1.0.1" + } + }, + "fs-extra": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, + "liftoff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-4.0.0.tgz", + "integrity": "sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==", + "requires": { + "extend": "^3.0.2", + "findup-sync": "^5.0.0", + "fined": "^2.0.0", + "flagged-respawn": "^2.0.0", + "is-plain-object": "^5.0.0", + "object.map": "^1.0.1", + "rechoir": "^0.8.0", + "resolve": "^1.20.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "log4js": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.1.tgz", + "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==", + "requires": { + "date-format": "^4.0.3", + "debug": "^4.3.3", + "flatted": "^3.2.4", + "rfdc": "^1.3.0", + "streamroller": "^3.0.2" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mute-stdout": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.0.tgz", + "integrity": "sha512-MaSQenn0f9oxIjtCufclpV00MuYTiHaXPbdcfPIM+quMqoa8cXywjHHx4LhhIAZlXqPWMdcUpYviajfmHtHRJw==" + }, + "node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pretty-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.0.tgz", + "integrity": "sha512-CU2l5CYUAptUYq/671ajexQfXuxJFwwg0n243Kdkx8bTjeenedsWgu8TGHPm03vLfNtk3aTXgySKPp3Usykudw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "requires": { + "resolve": "^1.20.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-package-path": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/resolve-package-path/-/resolve-package-path-4.0.3.tgz", + "integrity": "sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA==", + "requires": { + "path-root": "^0.1.1" + } + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "streamroller": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.3.tgz", + "integrity": "sha512-CphIJyFx2SALGHeINanjFRKQ4l7x2c+rXYJ4BMq0gd+ZK0gi4VT8b+eHe2wi58x4UayBAKx4xtHpXT/ea1cz8w==", + "requires": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==" + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==" + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + } + } +} diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/package.json" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/package.json" new file mode 100644 index 0000000000000000000000000000000000000000..f0000d7815d6c12e4fb33aa84805c3cb0a763c04 --- /dev/null +++ "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/package.json" @@ -0,0 +1,17 @@ +{ + "name": "melody_ui_anim_effect", + "version": "1.0.0", + "ohos": { + "org": "huawei", + "buildTool": "hvigor", + "directoryLevel": "project" + }, + "description": "example description", + "repository": {}, + "license": "ISC", + "dependencies": { + "@ohos/hvigor": "1.3.1", + "@ohos/hvigor-ohos-plugin": "1.3.1", + "@ohos/hypium": "1.0.3" + } +} diff --git "a/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/screenshot/app_effect.gif" "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/screenshot/app_effect.gif" new file mode 100644 index 0000000000000000000000000000000000000000..ee19b20b1c857d455bdcb8075f9d58119c1f2801 Binary files /dev/null and "b/\343\200\220\346\214\221\346\210\230\350\265\233\347\254\254\344\270\211\346\234\237\343\200\221JellyfishAnimation/screenshot/app_effect.gif" differ