From b320b418348b06382d14c42d3efc8be82039e2b9 Mon Sep 17 00:00:00 2001 From: the-leo Date: Tue, 18 Mar 2025 21:33:11 +0300 Subject: [PATCH] Lessons resources commit_hash:39fa333110b40aaf54822cd059ba234934e82055 --- .mapping.json | 38 +++ client/android/sample/README.md | 13 + client/android/sample/build.gradle | 1 + .../sample/src/main/assets/sample.json | 24 ++ .../divkit/sample/ArtikaTypefaceProvider.kt | 26 ++ .../yandex/divkit/sample/MainPageActivity.kt | 15 ++ .../divkit/sample/MultiTypefaceProvider.kt | 26 ++ .../sample/SuperTriviaTypefaceProvider.kt | 26 ++ .../sample/src/main/res/font/artika.ttf | Bin 0 -> 9960 bytes .../sample/src/main/res/font/super_trivia.ttf | Bin 0 -> 160488 bytes .../06. Typed Actions/mixed_actions.json | 172 ++++++++++++ .../06. Typed Actions/only_typed_actions.json | 185 +++++++++++++ .../07. DSL/layout_application/build.gradle | 23 ++ .../gradle/wrapper/gradle-wrapper.properties | 7 + .../07. DSL/layout_application/gradlew | 252 ++++++++++++++++++ .../07. DSL/layout_application/gradlew.bat | 94 +++++++ .../layout_application/settings.gradle | 1 + .../src/main/kotlin/Application.kt | 18 ++ .../src/main/kotlin/CardTemplate.kt | 53 ++++ .../src/main/kotlin/LayoutRenderer.kt | 92 +++++++ .../src/main/kotlin/data/PostData.kt | 8 + .../src/main/kotlin/data/Utils.kt | 22 ++ .../src/main/kotlin/data/Variables.kt | 5 + .../src/main/resources/output/div.json | 75 ++++++ .../08. Text/text_with_decoration.json | 128 +++++++++ .../08. Text/text_without_decoration.json | 59 ++++ .../09. Containers/container/constrained.json | 78 ++++++ .../09. Containers/container/overlap.json | 73 +++++ .../09. Containers/container/separator.json | 92 +++++++ .../09. Containers/container/wrap.json | 75 ++++++ .../09. Containers/gallery/gallery.json | 148 ++++++++++ .../09. Containers/grid/grid.json | 99 +++++++ .../09. Containers/layout_provider.json | 90 +++++++ .../09. Containers/pager/infinite_scroll.json | 115 ++++++++ .../09. Containers/tab/simple_tab.json | 98 +++++++ .../09. Containers/tab/title_animations.json | 119 +++++++++ .../10. Item builder/item_builder.json | 174 ++++++++++++ .../11. Animations/action_animation.json | 116 ++++++++ .../11. Animations/animators.json | 205 ++++++++++++++ .../11. Animations/transition_animation.json | 151 +++++++++++ .../transition_change_animation.json | 228 ++++++++++++++++ .../11. Item builder/item_builder.json | 174 ++++++++++++ .../12. User-declared functions/function.json | 215 +++++++++++++++ 43 files changed, 3613 insertions(+) create mode 100644 client/android/sample/src/main/java/com/yandex/divkit/sample/ArtikaTypefaceProvider.kt create mode 100644 client/android/sample/src/main/java/com/yandex/divkit/sample/MultiTypefaceProvider.kt create mode 100644 client/android/sample/src/main/java/com/yandex/divkit/sample/SuperTriviaTypefaceProvider.kt create mode 100644 client/android/sample/src/main/res/font/artika.ttf create mode 100644 client/android/sample/src/main/res/font/super_trivia.ttf create mode 100644 lessons_resources/06. Typed Actions/mixed_actions.json create mode 100644 lessons_resources/06. Typed Actions/only_typed_actions.json create mode 100644 lessons_resources/07. DSL/layout_application/build.gradle create mode 100644 lessons_resources/07. DSL/layout_application/gradle/wrapper/gradle-wrapper.properties create mode 100755 lessons_resources/07. DSL/layout_application/gradlew create mode 100644 lessons_resources/07. DSL/layout_application/gradlew.bat create mode 100644 lessons_resources/07. DSL/layout_application/settings.gradle create mode 100644 lessons_resources/07. DSL/layout_application/src/main/kotlin/Application.kt create mode 100644 lessons_resources/07. DSL/layout_application/src/main/kotlin/CardTemplate.kt create mode 100644 lessons_resources/07. DSL/layout_application/src/main/kotlin/LayoutRenderer.kt create mode 100644 lessons_resources/07. DSL/layout_application/src/main/kotlin/data/PostData.kt create mode 100644 lessons_resources/07. DSL/layout_application/src/main/kotlin/data/Utils.kt create mode 100644 lessons_resources/07. DSL/layout_application/src/main/kotlin/data/Variables.kt create mode 100644 lessons_resources/07. DSL/layout_application/src/main/resources/output/div.json create mode 100644 lessons_resources/08. Text/text_with_decoration.json create mode 100644 lessons_resources/08. Text/text_without_decoration.json create mode 100644 lessons_resources/09. Containers/container/constrained.json create mode 100644 lessons_resources/09. Containers/container/overlap.json create mode 100644 lessons_resources/09. Containers/container/separator.json create mode 100644 lessons_resources/09. Containers/container/wrap.json create mode 100644 lessons_resources/09. Containers/gallery/gallery.json create mode 100644 lessons_resources/09. Containers/grid/grid.json create mode 100644 lessons_resources/09. Containers/layout_provider.json create mode 100644 lessons_resources/09. Containers/pager/infinite_scroll.json create mode 100644 lessons_resources/09. Containers/tab/simple_tab.json create mode 100644 lessons_resources/09. Containers/tab/title_animations.json create mode 100644 lessons_resources/10. Item builder/item_builder.json create mode 100644 lessons_resources/11. Animations/action_animation.json create mode 100644 lessons_resources/11. Animations/animators.json create mode 100644 lessons_resources/11. Animations/transition_animation.json create mode 100644 lessons_resources/11. Animations/transition_change_animation.json create mode 100644 lessons_resources/11. Item builder/item_builder.json create mode 100644 lessons_resources/12. User-declared functions/function.json diff --git a/.mapping.json b/.mapping.json index 4b3916f91..376da3d5c 100644 --- a/.mapping.json +++ b/.mapping.json @@ -12272,12 +12272,17 @@ "client/android/sample/src/main/AndroidManifest.xml":"divkit/public/client/android/sample/src/main/AndroidManifest.xml", "client/android/sample/src/main/assets/sample.json":"divkit/public/client/android/sample/src/main/assets/sample.json", "client/android/sample/src/main/ic_launcher-playstore.png":"divkit/public/client/android/sample/src/main/ic_launcher-playstore.png", + "client/android/sample/src/main/java/com/yandex/divkit/sample/ArtikaTypefaceProvider.kt":"divkit/public/client/android/sample/src/main/java/com/yandex/divkit/sample/ArtikaTypefaceProvider.kt", "client/android/sample/src/main/java/com/yandex/divkit/sample/AssetReader.kt":"divkit/public/client/android/sample/src/main/java/com/yandex/divkit/sample/AssetReader.kt", "client/android/sample/src/main/java/com/yandex/divkit/sample/DivViewFactory.kt":"divkit/public/client/android/sample/src/main/java/com/yandex/divkit/sample/DivViewFactory.kt", "client/android/sample/src/main/java/com/yandex/divkit/sample/MainPageActivity.kt":"divkit/public/client/android/sample/src/main/java/com/yandex/divkit/sample/MainPageActivity.kt", + "client/android/sample/src/main/java/com/yandex/divkit/sample/MultiTypefaceProvider.kt":"divkit/public/client/android/sample/src/main/java/com/yandex/divkit/sample/MultiTypefaceProvider.kt", "client/android/sample/src/main/java/com/yandex/divkit/sample/SampleDivActionHandler.kt":"divkit/public/client/android/sample/src/main/java/com/yandex/divkit/sample/SampleDivActionHandler.kt", + "client/android/sample/src/main/java/com/yandex/divkit/sample/SuperTriviaTypefaceProvider.kt":"divkit/public/client/android/sample/src/main/java/com/yandex/divkit/sample/SuperTriviaTypefaceProvider.kt", "client/android/sample/src/main/res/drawable/ic_launcher_background.xml":"divkit/public/client/android/sample/src/main/res/drawable/ic_launcher_background.xml", "client/android/sample/src/main/res/drawable/ic_launcher_foreground.xml":"divkit/public/client/android/sample/src/main/res/drawable/ic_launcher_foreground.xml", + "client/android/sample/src/main/res/font/artika.ttf":"divkit/public/client/android/sample/src/main/res/font/artika.ttf", + "client/android/sample/src/main/res/font/super_trivia.ttf":"divkit/public/client/android/sample/src/main/res/font/super_trivia.ttf", "client/android/sample/src/main/res/layout/activity_main_page.xml":"divkit/public/client/android/sample/src/main/res/layout/activity_main_page.xml", "client/android/sample/src/main/res/mipmap-anydpi-v26/ic_launcher.xml":"divkit/public/client/android/sample/src/main/res/mipmap-anydpi-v26/ic_launcher.xml", "client/android/sample/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml":"divkit/public/client/android/sample/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml", @@ -20000,6 +20005,39 @@ "json-builder/typescript/test/tsconfig.json":"divkit/public/json-builder/typescript/test/tsconfig.json", "json-builder/typescript/tsconfig.eslint.json":"divkit/public/json-builder/typescript/tsconfig.eslint.json", "json-builder/typescript/tsconfig.json":"divkit/public/json-builder/typescript/tsconfig.json", + "lessons_resources/06. Typed Actions/mixed_actions.json":"divkit/public/lessons_resources/06. Typed Actions/mixed_actions.json", + "lessons_resources/06. Typed Actions/only_typed_actions.json":"divkit/public/lessons_resources/06. Typed Actions/only_typed_actions.json", + "lessons_resources/07. DSL/layout_application/build.gradle":"divkit/public/lessons_resources/07. DSL/layout_application/build.gradle", + "lessons_resources/07. DSL/layout_application/gradle/wrapper/gradle-wrapper.properties":"divkit/public/lessons_resources/07. DSL/layout_application/gradle/wrapper/gradle-wrapper.properties", + "lessons_resources/07. DSL/layout_application/gradlew":"divkit/public/lessons_resources/07. DSL/layout_application/gradlew", + "lessons_resources/07. DSL/layout_application/gradlew.bat":"divkit/public/lessons_resources/07. DSL/layout_application/gradlew.bat", + "lessons_resources/07. DSL/layout_application/settings.gradle":"divkit/public/lessons_resources/07. DSL/layout_application/settings.gradle", + "lessons_resources/07. DSL/layout_application/src/main/kotlin/Application.kt":"divkit/public/lessons_resources/07. DSL/layout_application/src/main/kotlin/Application.kt", + "lessons_resources/07. DSL/layout_application/src/main/kotlin/CardTemplate.kt":"divkit/public/lessons_resources/07. DSL/layout_application/src/main/kotlin/CardTemplate.kt", + "lessons_resources/07. DSL/layout_application/src/main/kotlin/LayoutRenderer.kt":"divkit/public/lessons_resources/07. DSL/layout_application/src/main/kotlin/LayoutRenderer.kt", + "lessons_resources/07. DSL/layout_application/src/main/kotlin/data/PostData.kt":"divkit/public/lessons_resources/07. DSL/layout_application/src/main/kotlin/data/PostData.kt", + "lessons_resources/07. DSL/layout_application/src/main/kotlin/data/Utils.kt":"divkit/public/lessons_resources/07. DSL/layout_application/src/main/kotlin/data/Utils.kt", + "lessons_resources/07. DSL/layout_application/src/main/kotlin/data/Variables.kt":"divkit/public/lessons_resources/07. DSL/layout_application/src/main/kotlin/data/Variables.kt", + "lessons_resources/07. DSL/layout_application/src/main/resources/output/div.json":"divkit/public/lessons_resources/07. DSL/layout_application/src/main/resources/output/div.json", + "lessons_resources/08. Text/text_with_decoration.json":"divkit/public/lessons_resources/08. Text/text_with_decoration.json", + "lessons_resources/08. Text/text_without_decoration.json":"divkit/public/lessons_resources/08. Text/text_without_decoration.json", + "lessons_resources/09. Containers/container/constrained.json":"divkit/public/lessons_resources/09. Containers/container/constrained.json", + "lessons_resources/09. Containers/container/overlap.json":"divkit/public/lessons_resources/09. Containers/container/overlap.json", + "lessons_resources/09. Containers/container/separator.json":"divkit/public/lessons_resources/09. Containers/container/separator.json", + "lessons_resources/09. Containers/container/wrap.json":"divkit/public/lessons_resources/09. Containers/container/wrap.json", + "lessons_resources/09. Containers/gallery/gallery.json":"divkit/public/lessons_resources/09. Containers/gallery/gallery.json", + "lessons_resources/09. Containers/grid/grid.json":"divkit/public/lessons_resources/09. Containers/grid/grid.json", + "lessons_resources/09. Containers/layout_provider.json":"divkit/public/lessons_resources/09. Containers/layout_provider.json", + "lessons_resources/09. Containers/pager/infinite_scroll.json":"divkit/public/lessons_resources/09. Containers/pager/infinite_scroll.json", + "lessons_resources/09. Containers/tab/simple_tab.json":"divkit/public/lessons_resources/09. Containers/tab/simple_tab.json", + "lessons_resources/09. Containers/tab/title_animations.json":"divkit/public/lessons_resources/09. Containers/tab/title_animations.json", + "lessons_resources/10. Item builder/item_builder.json":"divkit/public/lessons_resources/10. Item builder/item_builder.json", + "lessons_resources/11. Animations/action_animation.json":"divkit/public/lessons_resources/11. Animations/action_animation.json", + "lessons_resources/11. Animations/animators.json":"divkit/public/lessons_resources/11. Animations/animators.json", + "lessons_resources/11. Animations/transition_animation.json":"divkit/public/lessons_resources/11. Animations/transition_animation.json", + "lessons_resources/11. Animations/transition_change_animation.json":"divkit/public/lessons_resources/11. Animations/transition_change_animation.json", + "lessons_resources/11. Item builder/item_builder.json":"divkit/public/lessons_resources/11. Item builder/item_builder.json", + "lessons_resources/12. User-declared functions/function.json":"divkit/public/lessons_resources/12. User-declared functions/function.json", "readme_pictures/ads-sdk.png":"divkit/public/readme_pictures/ads-sdk.png", "readme_pictures/alice.png":"divkit/public/readme_pictures/alice.png", "readme_pictures/app_screen.png":"divkit/public/readme_pictures/app_screen.png", diff --git a/client/android/sample/README.md b/client/android/sample/README.md index 028709b45..b0052efc5 100644 --- a/client/android/sample/README.md +++ b/client/android/sample/README.md @@ -1,3 +1,16 @@ +# DivKit Sample app + +Presents a minimalistic application showing the capabilities of the DivKit framework. + +The application uses fonts free for personal and commercial use, the intellectual rights to which belong to the following authors: +Super Trivia Font: + Designed by: All Super Font https://nhfonts.etsy.com/ + https://fontesk.com/super-trivia-font/ + +Artika Font: + Designed by: Anastasiya Davydava https://www.behance.net/anastasdavydav + https://fontesk.com/artika-font/ + # DivKit Android. Quick start. ## Connect the library. To connect the library to the project, all you have to do is add three dependencies to build.gradle: diff --git a/client/android/sample/build.gradle b/client/android/sample/build.gradle index fc0b721e9..483d92e4e 100644 --- a/client/android/sample/build.gradle +++ b/client/android/sample/build.gradle @@ -39,6 +39,7 @@ dependencies { implementation project(':div-rive') implementation project(':utils') implementation project(':div-pinch-to-zoom') + implementation project(':div-markdown') implementation libs.androidx.coreKtx implementation libs.androidx.activity diff --git a/client/android/sample/src/main/assets/sample.json b/client/android/sample/src/main/assets/sample.json index 90dd70c32..4c921f719 100644 --- a/client/android/sample/src/main/assets/sample.json +++ b/client/android/sample/src/main/assets/sample.json @@ -230,6 +230,7 @@ { "type": "input", "hint_text": "Toast your mind", + "font_family": "super_trivia", "hint_color": "#666", "width": { "type": "match_parent" @@ -281,6 +282,7 @@ { "type": "text", "text": "Toast!", + "font_family": "super_trivia", "paddings": { "top": 10, "left": 10, @@ -306,6 +308,28 @@ } ] }, + { + "type": "text", + "text_alignment_horizontal": "center", + "text": "**Info**: no error in code `println(\"Hello World!\")`", + "background": [ + { + "type": "solid", + "color": "#fff" + } + ], + "paddings": { + "top": 5, + "bottom": 5, + "left": 5, + "right": 5 + }, + "extensions": [ + { + "id": "markdown" + } + ] + }, { "type": "divgram_card", "likes_counter": "@{card0.likes}", diff --git a/client/android/sample/src/main/java/com/yandex/divkit/sample/ArtikaTypefaceProvider.kt b/client/android/sample/src/main/java/com/yandex/divkit/sample/ArtikaTypefaceProvider.kt new file mode 100644 index 000000000..eb2a1fe80 --- /dev/null +++ b/client/android/sample/src/main/java/com/yandex/divkit/sample/ArtikaTypefaceProvider.kt @@ -0,0 +1,26 @@ +package com.yandex.divkit.sample + +import android.content.Context +import android.graphics.Typeface +import androidx.core.content.res.ResourcesCompat +import com.yandex.div.core.font.DivTypefaceProvider + +class ArtikaTypefaceProvider( + private val context: Context, +) : DivTypefaceProvider { + override fun getRegular(): Typeface { + return ResourcesCompat.getFont(context, R.font.artika) ?: Typeface.DEFAULT + } + + override fun getMedium(): Typeface { + return ResourcesCompat.getFont(context, R.font.artika) ?: Typeface.DEFAULT + } + + override fun getLight(): Typeface { + return ResourcesCompat.getFont(context, R.font.artika) ?: Typeface.DEFAULT + } + + override fun getBold(): Typeface { + return ResourcesCompat.getFont(context, R.font.artika) ?: Typeface.DEFAULT + } +} diff --git a/client/android/sample/src/main/java/com/yandex/divkit/sample/MainPageActivity.kt b/client/android/sample/src/main/java/com/yandex/divkit/sample/MainPageActivity.kt index fb8f8338d..20eebf037 100644 --- a/client/android/sample/src/main/java/com/yandex/divkit/sample/MainPageActivity.kt +++ b/client/android/sample/src/main/java/com/yandex/divkit/sample/MainPageActivity.kt @@ -4,6 +4,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.yandex.div.core.Div2Context import com.yandex.div.core.DivConfiguration +import com.yandex.div.markdown.DivMarkdownExtensionHandler import com.yandex.div.picasso.PicassoDivImageLoader import com.yandex.div.rive.OkHttpDivRiveNetworkDelegate import com.yandex.div.rive.RiveCustomViewAdapter @@ -48,8 +49,22 @@ class MainPageActivity : AppCompatActivity() { DivPinchToZoomConfiguration.Builder(this).build() ) ) + .extension(DivMarkdownExtensionHandler(this)) .divCustomContainerViewAdapter(RiveCustomViewAdapter.Builder(this, OkHttpDivRiveNetworkDelegate(OkHttpClient.Builder().build())).build()) .visualErrorsEnabled(true) + .apply { + if (ENABLE_CUSTOM_FONTS) { + typefaceProvider(MultiTypefaceProvider(this@MainPageActivity)) + } + } + .additionalTypefaceProviders(mapOf( + "artika" to ArtikaTypefaceProvider(this@MainPageActivity), + "super_trivia" to SuperTriviaTypefaceProvider(this@MainPageActivity), + )) .build() } + + companion object { + private const val ENABLE_CUSTOM_FONTS = true + } } diff --git a/client/android/sample/src/main/java/com/yandex/divkit/sample/MultiTypefaceProvider.kt b/client/android/sample/src/main/java/com/yandex/divkit/sample/MultiTypefaceProvider.kt new file mode 100644 index 000000000..e0c14042f --- /dev/null +++ b/client/android/sample/src/main/java/com/yandex/divkit/sample/MultiTypefaceProvider.kt @@ -0,0 +1,26 @@ +package com.yandex.divkit.sample + +import android.content.Context +import android.graphics.Typeface +import androidx.core.content.res.ResourcesCompat +import com.yandex.div.core.font.DivTypefaceProvider + +class MultiTypefaceProvider( + private val context: Context, +) : DivTypefaceProvider { + override fun getRegular(): Typeface { + return ResourcesCompat.getFont(context, R.font.artika) ?: Typeface.DEFAULT + } + + override fun getMedium(): Typeface { + return ResourcesCompat.getFont(context, R.font.artika) ?: Typeface.DEFAULT + } + + override fun getLight(): Typeface { + return ResourcesCompat.getFont(context, R.font.artika) ?: Typeface.DEFAULT + } + + override fun getBold(): Typeface { + return ResourcesCompat.getFont(context, R.font.super_trivia) ?: Typeface.DEFAULT + } +} diff --git a/client/android/sample/src/main/java/com/yandex/divkit/sample/SuperTriviaTypefaceProvider.kt b/client/android/sample/src/main/java/com/yandex/divkit/sample/SuperTriviaTypefaceProvider.kt new file mode 100644 index 000000000..00b8e0232 --- /dev/null +++ b/client/android/sample/src/main/java/com/yandex/divkit/sample/SuperTriviaTypefaceProvider.kt @@ -0,0 +1,26 @@ +package com.yandex.divkit.sample + +import android.content.Context +import android.graphics.Typeface +import androidx.core.content.res.ResourcesCompat +import com.yandex.div.core.font.DivTypefaceProvider + +class SuperTriviaTypefaceProvider( + private val context: Context, +) : DivTypefaceProvider { + override fun getRegular(): Typeface { + return ResourcesCompat.getFont(context, R.font.super_trivia) ?: Typeface.DEFAULT + } + + override fun getMedium(): Typeface { + return ResourcesCompat.getFont(context, R.font.super_trivia) ?: Typeface.DEFAULT + } + + override fun getLight(): Typeface { + return ResourcesCompat.getFont(context, R.font.super_trivia) ?: Typeface.DEFAULT + } + + override fun getBold(): Typeface { + return ResourcesCompat.getFont(context, R.font.super_trivia) ?: Typeface.DEFAULT + } +} diff --git a/client/android/sample/src/main/res/font/artika.ttf b/client/android/sample/src/main/res/font/artika.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1c97ee2d8a0ba37259db9cf583ea2881484f9727 GIT binary patch literal 9960 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 Ln-l&&C-wgT_ty3` literal 0 HcmV?d00001 diff --git a/client/android/sample/src/main/res/font/super_trivia.ttf b/client/android/sample/src/main/res/font/super_trivia.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6a81c84c3bbec9ddb8b253389df9c2ad34bd6b09 GIT binary patch literal 160488 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 z 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 C2$>fE literal 0 HcmV?d00001 diff --git a/lessons_resources/06. Typed Actions/mixed_actions.json b/lessons_resources/06. Typed Actions/mixed_actions.json new file mode 100644 index 000000000..ac791342d --- /dev/null +++ b/lessons_resources/06. Typed Actions/mixed_actions.json @@ -0,0 +1,172 @@ +{ + "templates": { + "button": { + "type": "text", + "width": { + "type": "match_parent" + }, + "height": { + "type": "wrap_content" + }, + "paddings": { + "left": 16, + "top": 16, + "right": 16, + "bottom": 16 + }, + "margins": { + "top": 16, + "bottom": 16, + "left": 16, + "right": 16 + }, + "border": { + "corner_radius": 8 + }, + "background": [ + { + "type": "solid", + "color": "#0E000000" + } + ], + "font_size": 16, + "font_weight": "medium", + "text_alignment_vertical": "center", + "text_alignment_horizontal": "center", + "text_color": "#000000", + "alpha": 1, + "alignment_horizontal": "center", + "alignment_vertical": "center" + } + }, + "card": { + "log_id": "div2_sample_card", + "variables": [ + { + "name": "my_edit_text", + "type": "string", + "value": "" + }, + { + "name": "in_text_state", + "type": "boolean", + "value": false + } + ], + "states": [ + { + "state_id": 0, + "div": { + "type": "container", + "items": [ + { + "type": "state", + "id": "data_state", + "states": [ + { + "state_id": "url", + "div": { + "type": "button", + "text": "Copy url", + "actions": [ + { + "typed": { + "type": "copy_to_clipboard", + "content": { + "type": "url", + "value": "https://ya.ru/" + } + }, + "log_id": "copy url" + } + ] + } + }, + { + "state_id": "text", + "div": { + "type": "button", + "text": "Copy string", + "actions": [ + { + "typed": { + "type": "copy_to_clipboard", + "content": { + "type": "text", + "value": "Copied string" + } + }, + "log_id": "copy string" + } + ] + } + } + ] + }, + { + "type": "button", + "text": "Switch content", + "actions": [ + { + "log_id": "switch_to_url", + "is_enabled": "@{in_text_state}", + "url": "div-action://set_state?state_id=0/data_state/url" + }, + { + "log_id": "switch_to_text", + "is_enabled": "@{!in_text_state}", + "url": "div-action://set_state?state_id=0/data_state/text" + }, + { + "log_id": "remember_state", + "url": "div-action://set_variable?name=in_text_state&value=@{!in_text_state}" + } + ] + }, + { + "type": "input", + "width": { + "type": "match_parent" + }, + "height": { + "type": "wrap_content" + }, + "margins": { + "left": 16, + "top": 20, + "right": 16, + "bottom": 16 + }, + "paddings": { + "left": 16, + "top": 10, + "right": 16, + "bottom": 10 + }, + "alpha": 1, + "alignment_horizontal": "center", + "alignment_vertical": "center", + "background": [ + { + "type": "solid", + "color": "#0e000000" + } + ], + "border": { + "corner_radius": 8 + }, + "font_size": 16, + "font_weight": "medium", + "text_color": "#000000", + "hint_text": "Paste here", + "text_variable": "my_edit_text", + "line_height": 22, + "select_all_on_focus": 1, + "keyboard_type": "single_line_text" + } + ] + } + } + ] + } +} diff --git a/lessons_resources/06. Typed Actions/only_typed_actions.json b/lessons_resources/06. Typed Actions/only_typed_actions.json new file mode 100644 index 000000000..3044947b3 --- /dev/null +++ b/lessons_resources/06. Typed Actions/only_typed_actions.json @@ -0,0 +1,185 @@ +{ + "templates": { + "button": { + "type": "text", + "width": { + "type": "match_parent" + }, + "height": { + "type": "wrap_content" + }, + "paddings": { + "left": 16, + "top": 16, + "right": 16, + "bottom": 16 + }, + "margins": { + "top": 16, + "bottom": 16, + "left": 16, + "right": 16 + }, + "border": { + "corner_radius": 8 + }, + "background": [ + { + "type": "solid", + "color": "#0E000000" + } + ], + "font_size": 16, + "font_weight": "medium", + "text_alignment_vertical": "center", + "text_alignment_horizontal": "center", + "text_color": "#000000", + "alpha": 1, + "alignment_horizontal": "center", + "alignment_vertical": "center" + } + }, + "card": { + "log_id": "div2_sample_card", + "variables": [ + { + "name": "my_edit_text", + "type": "string", + "value": "" + }, + { + "name": "in_text_state", + "type": "boolean", + "value": false + } + ], + "states": [ + { + "state_id": 0, + "div": { + "type": "container", + "items": [ + { + "type": "state", + "id": "data_state", + "states": [ + { + "state_id": "url", + "div": { + "type": "button", + "text": "Copy url", + "actions": [ + { + "typed": { + "type": "copy_to_clipboard", + "content": { + "type": "url", + "value": "https://ya.ru/" + } + }, + "log_id": "copy url" + } + ] + } + }, + { + "state_id": "text", + "div": { + "type": "button", + "text": "Copy string", + "actions": [ + { + "typed": { + "type": "copy_to_clipboard", + "content": { + "type": "text", + "value": "Copied string" + } + }, + "log_id": "copy string" + } + ] + } + } + ] + }, + { + "type": "button", + "text": "Switch content", + "actions": [ + { + "log_id": "switch_to_url", + "is_enabled": "@{in_text_state}", + "typed": { + "type": "set_state", + "state_id": "0/data_state/url" + } + }, + { + "log_id": "switch_to_text", + "is_enabled": "@{!in_text_state}", + "typed": { + "type": "set_state", + "state_id": "0/data_state/text" + } + }, + { + "log_id": "remember_state", + "typed": { + "type": "set_variable", + "variable_name": "in_text_state", + "value": { + "type": "boolean", + "value": "@{!in_text_state}" + } + } + } + ] + }, + { + "type": "input", + "width": { + "type": "match_parent" + }, + "height": { + "type": "wrap_content" + }, + "margins": { + "left": 16, + "top": 20, + "right": 16, + "bottom": 16 + }, + "paddings": { + "left": 16, + "top": 10, + "right": 16, + "bottom": 10 + }, + "alpha": 1, + "alignment_horizontal": "center", + "alignment_vertical": "center", + "background": [ + { + "type": "solid", + "color": "#0e000000" + } + ], + "border": { + "corner_radius": 8 + }, + "font_size": 16, + "font_weight": "medium", + "text_color": "#000000", + "hint_text": "Paste here", + "text_variable": "my_edit_text", + "line_height": 22, + "select_all_on_focus": 1, + "keyboard_type": "single_line_text" + } + ] + } + } + ] + } +} diff --git a/lessons_resources/07. DSL/layout_application/build.gradle b/lessons_resources/07. DSL/layout_application/build.gradle new file mode 100644 index 000000000..b957649ae --- /dev/null +++ b/lessons_resources/07. DSL/layout_application/build.gradle @@ -0,0 +1,23 @@ +plugins { + id 'application' + id 'java' + id 'org.jetbrains.kotlin.jvm' version '1.9.0' +} + +group = 'com.yandex.divkit.example.dsl' +version = '1.0.0' + +repositories { + mavenCentral() +} + +dependencies { + implementation "com.yandex.div:kotlin-json-builder:31.3.0" + + implementation "com.fasterxml.jackson.core:jackson-core:2.18.2" + implementation "com.fasterxml.jackson.core:jackson-databind:2.18.2" +} + +application { + mainClass = 'com.yandex.divkit.example.dsl.Application' +} diff --git a/lessons_resources/07. DSL/layout_application/gradle/wrapper/gradle-wrapper.properties b/lessons_resources/07. DSL/layout_application/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..09523c0e5 --- /dev/null +++ b/lessons_resources/07. DSL/layout_application/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/lessons_resources/07. DSL/layout_application/gradlew b/lessons_resources/07. DSL/layout_application/gradlew new file mode 100755 index 000000000..f5feea6d6 --- /dev/null +++ b/lessons_resources/07. DSL/layout_application/gradlew @@ -0,0 +1,252 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/lessons_resources/07. DSL/layout_application/gradlew.bat b/lessons_resources/07. DSL/layout_application/gradlew.bat new file mode 100644 index 000000000..9b42019c7 --- /dev/null +++ b/lessons_resources/07. DSL/layout_application/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/lessons_resources/07. DSL/layout_application/settings.gradle b/lessons_resources/07. DSL/layout_application/settings.gradle new file mode 100644 index 000000000..511bbe51b --- /dev/null +++ b/lessons_resources/07. DSL/layout_application/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'divkit_example_layout_generator' diff --git a/lessons_resources/07. DSL/layout_application/src/main/kotlin/Application.kt b/lessons_resources/07. DSL/layout_application/src/main/kotlin/Application.kt new file mode 100644 index 000000000..d90ba8f5c --- /dev/null +++ b/lessons_resources/07. DSL/layout_application/src/main/kotlin/Application.kt @@ -0,0 +1,18 @@ +package com.yandex.divkit.example.dsl + +import com.fasterxml.jackson.databind.ObjectMapper +import java.io.File + +class Application { + companion object { + @JvmStatic + fun main(args: Array) { + val data = LayoutRenderer().render() + + val mapper = ObjectMapper().writerWithDefaultPrettyPrinter() + val jsonText = mapper.writeValueAsString(data) + + File("./src/main/resources/output/div.json").writeText(jsonText) + } + } +} diff --git a/lessons_resources/07. DSL/layout_application/src/main/kotlin/CardTemplate.kt b/lessons_resources/07. DSL/layout_application/src/main/kotlin/CardTemplate.kt new file mode 100644 index 000000000..56c5be7d2 --- /dev/null +++ b/lessons_resources/07. DSL/layout_application/src/main/kotlin/CardTemplate.kt @@ -0,0 +1,53 @@ +package com.yandex.divkit.example.dsl + +import com.yandex.divkit.example.dsl.data.Variables +import divkit.dsl.Url +import divkit.dsl.action +import divkit.dsl.actionSetVariable +import divkit.dsl.center +import divkit.dsl.container +import divkit.dsl.core.reference +import divkit.dsl.defer +import divkit.dsl.edgeInsets +import divkit.dsl.fixedSize +import divkit.dsl.image +import divkit.dsl.stringValue +import divkit.dsl.template +import divkit.dsl.text + +object CardTemplate { + val descriptionRef = reference("description") + val imageRef = reference("img") + + val template by lazy(LazyThreadSafetyMode.NONE) { + template("sample_card") { + container( + margins = edgeInsets(all = 10), + width = fixedSize( + value = 150, + ), + items = listOf( + image().defer( + imageUrl = imageRef, + ), + text( + textAlignmentHorizontal = center, + ).defer( + text = descriptionRef, + ) + ), + actions = listOf( + action( + logId = "post_selected", + typed = actionSetVariable( + variableName = Variables.SELECTED_POST_DESCRIPTION, + value = stringValue().defer( + value = descriptionRef, + ) + ) + ) + ) + ) + } + } +} diff --git a/lessons_resources/07. DSL/layout_application/src/main/kotlin/LayoutRenderer.kt b/lessons_resources/07. DSL/layout_application/src/main/kotlin/LayoutRenderer.kt new file mode 100644 index 000000000..cba0eac98 --- /dev/null +++ b/lessons_resources/07. DSL/layout_application/src/main/kotlin/LayoutRenderer.kt @@ -0,0 +1,92 @@ +package com.yandex.divkit.example.dsl + +import com.yandex.divkit.example.dsl.data.PostData +import com.yandex.divkit.example.dsl.data.Variables.SELECTED_POST_DESCRIPTION +import com.yandex.divkit.example.dsl.data.exampleData +import divkit.dsl.Div +import divkit.dsl.Divan +import divkit.dsl.Url +import divkit.dsl.center +import divkit.dsl.container +import divkit.dsl.core.bind +import divkit.dsl.core.expression +import divkit.dsl.data +import divkit.dsl.divan +import divkit.dsl.evaluate +import divkit.dsl.gallery +import divkit.dsl.horizontal +import divkit.dsl.render +import divkit.dsl.root +import divkit.dsl.scope.DivScope +import divkit.dsl.stringVariable +import divkit.dsl.text + +class LayoutRenderer { + fun render(): Divan { + val postDataList = exampleData + + return divan { + data( + logId = "generated_div", + div = container( + items = listOf( + createSelectedPostIndicator(), + createPostsGallery(postDataList), + ) + ), + variables = listOf( + stringVariable( + name = SELECTED_POST_DESCRIPTION, + value = "none", + ) + ) + ) + } + } + + private fun DivScope.createSelectedPostIndicator(): Div { + return text( + textAlignmentHorizontal = center, + ).evaluate( + text = expression("Selected post: @{$SELECTED_POST_DESCRIPTION}"), + ) + } + + private fun DivScope.createPostsGallery(posts: List): Div { + return gallery( + orientation = horizontal, + items = buildList { + posts.forEach { post -> + add(createCard(post)) + } + } + ) + } + + private fun DivScope.createCard(person: PostData): Div { + return with(CardTemplate) { + render( + template, + descriptionRef bind person.description, + imageRef bind Url.create(person.imageUrl.toString()), + ) + } + } + + @Suppress("unused") + private fun getLayoutHardWay(): Divan { + return divan { + data( + logId = "generated_div", + states = listOf( + root( + stateId = 0, + div = container( + // Layout + ) + ) + ), + ) + } + } +} diff --git a/lessons_resources/07. DSL/layout_application/src/main/kotlin/data/PostData.kt b/lessons_resources/07. DSL/layout_application/src/main/kotlin/data/PostData.kt new file mode 100644 index 000000000..460451552 --- /dev/null +++ b/lessons_resources/07. DSL/layout_application/src/main/kotlin/data/PostData.kt @@ -0,0 +1,8 @@ +package com.yandex.divkit.example.dsl.data + +import java.net.URL + +data class PostData( + val imageUrl: URL, + val description: String, +) diff --git a/lessons_resources/07. DSL/layout_application/src/main/kotlin/data/Utils.kt b/lessons_resources/07. DSL/layout_application/src/main/kotlin/data/Utils.kt new file mode 100644 index 000000000..fb09b0f32 --- /dev/null +++ b/lessons_resources/07. DSL/layout_application/src/main/kotlin/data/Utils.kt @@ -0,0 +1,22 @@ +package com.yandex.divkit.example.dsl.data + +import java.net.URL + +val exampleData = listOf( + PostData( + imageUrl = URL("https://raw.githubusercontent.com/divkit/divkit/91a4fe592d2ee4ba247f87cd769caf2527dcea80/client/android/divkit-demo-app/src/main/assets/images/district/item_background_1.png"), + description = "Аллея со скамейкой" + ), + PostData( + imageUrl = URL("https://raw.githubusercontent.com/divkit/divkit/91a4fe592d2ee4ba247f87cd769caf2527dcea80/client/android/divkit-demo-app/src/main/assets/images/district/item_background_2.png"), + description = "Дорожка около пруда" + ), + PostData( + imageUrl = URL("https://raw.githubusercontent.com/divkit/divkit/91a4fe592d2ee4ba247f87cd769caf2527dcea80/client/android/divkit-demo-app/src/main/assets/images/district/item_background_3.png"), + description = "Пересечение дорожек" + ), + PostData( + imageUrl = URL("https://raw.githubusercontent.com/divkit/divkit/91a4fe592d2ee4ba247f87cd769caf2527dcea80/client/android/divkit-demo-app/src/main/assets/images/district/item_background_4.png"), + description = "Вечерняя аллея с фонарём" + ), +) diff --git a/lessons_resources/07. DSL/layout_application/src/main/kotlin/data/Variables.kt b/lessons_resources/07. DSL/layout_application/src/main/kotlin/data/Variables.kt new file mode 100644 index 000000000..f66030f20 --- /dev/null +++ b/lessons_resources/07. DSL/layout_application/src/main/kotlin/data/Variables.kt @@ -0,0 +1,5 @@ +package com.yandex.divkit.example.dsl.data + +object Variables { + val SELECTED_POST_DESCRIPTION = "selected_post_description" +} diff --git a/lessons_resources/07. DSL/layout_application/src/main/resources/output/div.json b/lessons_resources/07. DSL/layout_application/src/main/resources/output/div.json new file mode 100644 index 000000000..4b333d912 --- /dev/null +++ b/lessons_resources/07. DSL/layout_application/src/main/resources/output/div.json @@ -0,0 +1,75 @@ +{ + "card" : { + "log_id" : "generated_div", + "states" : [ { + "state_id" : 0, + "div" : { + "type" : "container", + "items" : [ { + "type" : "text", + "text" : "Selected post: @{selected_post_description}", + "text_alignment_horizontal" : "center" + }, { + "type" : "gallery", + "items" : [ { + "type" : "sample_card", + "description" : "Аллея со скамейкой", + "img" : "https://raw.githubusercontent.com/divkit/divkit/91a4fe592d2ee4ba247f87cd769caf2527dcea80/client/android/divkit-demo-app/src/main/assets/images/district/item_background_1.png" + }, { + "type" : "sample_card", + "description" : "Дорожка около пруда", + "img" : "https://raw.githubusercontent.com/divkit/divkit/91a4fe592d2ee4ba247f87cd769caf2527dcea80/client/android/divkit-demo-app/src/main/assets/images/district/item_background_2.png" + }, { + "type" : "sample_card", + "description" : "Пересечение дорожек", + "img" : "https://raw.githubusercontent.com/divkit/divkit/91a4fe592d2ee4ba247f87cd769caf2527dcea80/client/android/divkit-demo-app/src/main/assets/images/district/item_background_3.png" + }, { + "type" : "sample_card", + "description" : "Вечерняя аллея с фонарём", + "img" : "https://raw.githubusercontent.com/divkit/divkit/91a4fe592d2ee4ba247f87cd769caf2527dcea80/client/android/divkit-demo-app/src/main/assets/images/district/item_background_4.png" + } ], + "orientation" : "horizontal" + } ] + } + } ], + "variables" : [ { + "type" : "string", + "name" : "selected_post_description", + "value" : "none" + } ] + }, + "templates" : { + "sample_card" : { + "type" : "container", + "actions" : [ { + "log_id" : "post_selected", + "typed" : { + "type" : "set_variable", + "value" : { + "type" : "string", + "$value" : "description" + }, + "variable_name" : "selected_post_description" + } + } ], + "items" : [ { + "type" : "image", + "$image_url" : "img" + }, { + "type" : "text", + "$text" : "description", + "text_alignment_horizontal" : "center" + } ], + "margins" : { + "bottom" : 10, + "left" : 10, + "right" : 10, + "top" : 10 + }, + "width" : { + "type" : "fixed", + "value" : 150 + } + } + } +} \ No newline at end of file diff --git a/lessons_resources/08. Text/text_with_decoration.json b/lessons_resources/08. Text/text_with_decoration.json new file mode 100644 index 000000000..e98e0be7e --- /dev/null +++ b/lessons_resources/08. Text/text_with_decoration.json @@ -0,0 +1,128 @@ +{ + "templates": { + "example_text": { + "type": "text", + "font_size": 20, + "margins": { + "bottom": 10, + "top": 10 + } + } + }, + "card": { + "log_id": "generated_div", + "states": [ + { + "state_id": 0, + "div": { + "margins": { + "left": 10, + "right": 10 + }, + "type": "container", + "separator": { + "show_between": true, + "style": { + "color": "#999", + "type": "shape_drawable", + "shape": { + "type": "rounded_rectangle", + "item_width": { + "type": "fixed", + "value": 1000 + }, + "item_height": { + "type": "fixed", + "value": 1 + } + } + } + }, + "items": [ + { + "type": "example_text", + "text": "Long text that should not take up more than 1 line", + "max_lines": 1, + "ellipsis": { + "text": "… SHOW MORE", + "ranges": [ + { + "start": 2, + "end": 11, + "font_size": 11, + "font_weight": "medium", + "text_color": "#95A5A6" + } + ] + }, + "text_shadow": { + "color": "#30d5c8", + "alpha": 1, + "blur": 1, + "offset": { + "x": { + "value": 3 + }, + "y": { + "value": 3 + } + } + } + }, + { + "type": "example_text", + "text": "Long text with many possibilities for highlighting and adding some elements. For example,\n Su\u00ADper\u00ADcal\u00ADifrag\u00ADilis\u00ADtic\u00ADex\u00ADpi\u00ADali\u00ADdo\u00ADcious", + "alignment_horizontal": "end", + "width":{ + "type": "fixed", + "value": 260 + }, + "text_alignment_horizontal": "end", + "text_gradient": { + "type": "gradient", + "angle": 60, + "colors": [ + "#8b00ff", + "#ffa500" + ] + }, + "images": [ + { + "start": 67, + "url": "https://yastatic.net/s3/doc-binary/src/divkit/divkitfav.png" + } + ], + "ranges": [ + { + "start": 0, + "end": 4, + "letter_spacing": 2 + }, + { + "start": 38, + "end": 50, + "font_weight": "bold" + }, + { + "start": 78, + "end": 89, + "underline": "single" + } + ] + }, + { + "type": "example_text", + "text_alignment_horizontal": "center", + "text": "**Info**: no error in code `println(\"Hello World!\")`", + "extensions": [ + { + "id": "markdown" + } + ] + } + ] + } + } + ] + } +} diff --git a/lessons_resources/08. Text/text_without_decoration.json b/lessons_resources/08. Text/text_without_decoration.json new file mode 100644 index 000000000..9f07df9f8 --- /dev/null +++ b/lessons_resources/08. Text/text_without_decoration.json @@ -0,0 +1,59 @@ +{ + "templates": { + "example_text": { + "type": "text", + "font_size": 20, + "margins": { + "bottom": 10, + "top": 10 + } + } + }, + "card": { + "log_id": "generated_div", + "states": [ + { + "state_id": 0, + "div": { + "margins": { + "left": 10, + "right": 10 + }, + "type": "container", + "separator": { + "show_between": true, + "style": { + "color": "#999", + "type": "shape_drawable", + "shape": { + "type": "rounded_rectangle", + "item_width": { + "type": "fixed", + "value": 1000 + }, + "item_height": { + "type": "fixed", + "value": 1 + } + } + } + }, + "items": [ + { + "type": "example_text", + "text": "Long text that should not take up more than 1 line" + }, + { + "type": "example_text", + "text": "Long text with many possibilities for highlighting and adding some elements. For example, Supercalifragilisticexpialidocious" + }, + { + "type": "example_text", + "text": "**Info**: no error in code `println(\"Hello World!\")`" + } + ] + } + } + ] + } +} diff --git a/lessons_resources/09. Containers/container/constrained.json b/lessons_resources/09. Containers/container/constrained.json new file mode 100644 index 000000000..a4f136531 --- /dev/null +++ b/lessons_resources/09. Containers/container/constrained.json @@ -0,0 +1,78 @@ +{ + "templates": { + "basic_text": { + "type": "text", + "font_size": 15, + "margins": { + "top": 12, + "bottom": 12 + }, + "border": { + "corner_radius": 10 + }, + "paddings": { + "top": 10, + "bottom": 10, + "start": 10, + "end": 10 + }, + "background": [ + { + "type": "solid", + "color": "#600000ff" + } + ], + "width": { + "type": "wrap_content", + "constrained": true + } + } + }, + "card": { + "log_id": "generated_div", + "states": [ + { + "state_id": 0, + "div": { + "type": "container", + "orientation": "vertical", + "width": { + "type": "fixed", + "value": 350 + }, + "margins": { + "top": 10, + "left": 10, + "right": 10, + "bottom": 10 + }, + "border": { + "stroke": { + "color": "#000" + } + }, + "items": [ + { + "type": "container", + "orientation": "horizontal", + "items": [ + { + "type": "basic_text", + "text": "Block 1.1 has a larger width" + }, + { + "type": "basic_text", + "text": "Block 1.2" + }, + { + "type": "basic_text", + "text": "Block 1.3" + } + ] + } + ] + } + } + ] + } +} diff --git a/lessons_resources/09. Containers/container/overlap.json b/lessons_resources/09. Containers/container/overlap.json new file mode 100644 index 000000000..1bd04a904 --- /dev/null +++ b/lessons_resources/09. Containers/container/overlap.json @@ -0,0 +1,73 @@ +{ + "templates": { + "block": { + "type": "container", + "width": { + "type": "fixed", + "value": 100 + }, + "height": { + "type": "fixed", + "value": 100 + }, + "background": [ + { + "type": "solid", + "$color": "background_color" + } + ] + } + }, + "card": { + "log_id": "generated_div", + "states": [ + { + "state_id": 0, + "div": { + "margins": { + "top": 10, + "left": 10, + "right": 10, + "bottom": 10 + }, + "type": "container", + "orientation": "overlap", + "width": { + "type": "fixed", + "value": 150 + }, + "height": { + "type": "fixed", + "value": 150 + }, + "items": [ + { + "type": "block", + "background_color": "#6000ff00" + }, + { + "type": "block", + "background_color": "#600000ff", + "alignment_horizontal": "end", + "alignment_vertical": "bottom" + }, + { + "type": "text", + "text": "Everything in one container", + "width": { + "type": "fixed", + "value": 100 + }, + "text_alignment_horizontal": "center", + "alignment_horizontal": "end", + "font_size": 15, + "margins": { + "top": 12 + } + } + ] + } + } + ] + } +} diff --git a/lessons_resources/09. Containers/container/separator.json b/lessons_resources/09. Containers/container/separator.json new file mode 100644 index 000000000..59f9d12f4 --- /dev/null +++ b/lessons_resources/09. Containers/container/separator.json @@ -0,0 +1,92 @@ +{ + "templates": { + "basic_text": { + "type": "text", + "font_size": 15, + "margins": { + "top": 12, + "bottom": 12 + }, + "border": { + "corner_radius": 10 + }, + "paddings": { + "top": 10, + "bottom": 10, + "start": 10, + "end": 10 + }, + "background": [ + { + "type": "solid", + "color": "#600000ff" + } + ], + "width": { + "type": "fixed", + "value": 150 + } + } + }, + "card": { + "log_id": "generated_div", + "states": [ + { + "state_id": 0, + "div": { + "margins": { + "top": 10, + "left": 10, + "right": 10, + "bottom": 10 + }, + "type": "container", + "orientation": "vertical", + "border": { + "stroke": { + "color": "#000" + } + }, + "items": [ + { + "type": "container", + "orientation": "vertical", + "separator": { + "style": { + "type": "shape_drawable", + "color": "#000", + "shape": { + "type": "rounded_rectangle", + "item_width": { + "type": "fixed", + "value": 100 + }, + "item_height": { + "type": "fixed", + "value": 1 + } + } + } + }, + "content_alignment_horizontal": "center", + "items": [ + { + "type": "basic_text", + "text": "Block 1.1" + }, + { + "type": "basic_text", + "text": "Block 1.2" + }, + { + "type": "basic_text", + "text": "Block 1.3" + } + ] + } + ] + } + } + ] + } +} diff --git a/lessons_resources/09. Containers/container/wrap.json b/lessons_resources/09. Containers/container/wrap.json new file mode 100644 index 000000000..7466d0e49 --- /dev/null +++ b/lessons_resources/09. Containers/container/wrap.json @@ -0,0 +1,75 @@ +{ + "templates": { + "basic_text": { + "type": "text", + "font_size": 15, + "margins": { + "top": 12, + "bottom": 12 + }, + "border": { + "corner_radius": 10 + }, + "paddings": { + "top": 10, + "bottom": 10, + "start": 10, + "end": 10 + }, + "background": [ + { + "type": "solid", + "color": "#600000ff" + } + ], + "width": { + "type": "fixed", + "value": 150 + } + } + }, + "card": { + "log_id": "generated_div", + "states": [ + { + "state_id": 0, + "div": { + "margins": { + "top": 10, + "left": 10, + "right": 10, + "bottom": 10 + }, + "type": "container", + "orientation": "vertical", + "border": { + "stroke": { + "color": "#000" + } + }, + "items": [ + { + "type": "container", + "orientation": "horizontal", + "layout_mode": "wrap", + "items": [ + { + "type": "basic_text", + "text": "Block 1.1" + }, + { + "type": "basic_text", + "text": "Block 1.2" + }, + { + "type": "basic_text", + "text": "Block 1.3" + } + ] + } + ] + } + } + ] + } +} \ No newline at end of file diff --git a/lessons_resources/09. Containers/gallery/gallery.json b/lessons_resources/09. Containers/gallery/gallery.json new file mode 100644 index 000000000..603dc381c --- /dev/null +++ b/lessons_resources/09. Containers/gallery/gallery.json @@ -0,0 +1,148 @@ +{ + "templates": { + "basic_text": { + "type": "text", + "font_size": 15, + "margins": { + "top": 12, + "bottom": 12, + "start": 12, + "end": 12 + }, + "border": { + "corner_radius": 10 + }, + "paddings": { + "top": 10, + "bottom": 10, + "start": 10, + "end": 10 + }, + "background": [ + { + "type": "solid", + "color": "#600000ff" + } + ], + "width": { + "type": "match_parent" + }, + "alignment_horizontal": "center", + "reuse_id": "text" + }, + "image_block": { + "type": "container", + "background": [ + { + "type": "solid", + "color": "#2000ffff" + } + ], + "border": { + "corner_radius": 10 + }, + "margins": { + "top": 12, + "bottom": 12, + "start": 12, + "end": 12 + }, + "paddings": { + "top": 10, + "bottom": 10, + "start": 10, + "end": 10 + }, + "items": [ + { + "type": "image", + "$image_url": "url", + "height": { + "type": "fixed", + "value": 250 + }, + "scale": "fit" + } + ], + "reuse_id": "image" + } + }, + "card": { + "log_id": "generated_div", + "states": [ + { + "state_id": 0, + "div": { + "margins": { + "top": 10, + "left": 10, + "right": 10, + "bottom": 10 + }, + "type": "container", + "orientation": "vertical", + "border": { + "stroke": { + "color": "#000" + } + }, + "items": [ + { + "type": "gallery", + "height": { + "type": "fixed", + "value": 300 + }, + "items": [ + { + "type": "basic_text", + "text": "Block 1" + }, + { + "type": "basic_text", + "text": "Block 2" + }, + { + "type": "image_block", + "url": "https://yastatic.net/s3/home/divkit/wombat.jpg" + }, + { + "type": "basic_text", + "text": "Block 3" + }, + { + "type": "basic_text", + "text": "Block 4" + }, + { + "type": "basic_text", + "text": "Block 5" + }, + { + "type": "image_block", + "url": "https://yastatic.net/s3/home/divkit/ducks.jpg" + }, + { + "type": "basic_text", + "text": "Block 6" + }, + { + "type": "basic_text", + "text": "Block 7" + }, + { + "type": "basic_text", + "text": "Block 8" + }, + { + "type": "basic_text", + "text": "Block 9" + } + ] + } + ] + } + } + ] + } +} \ No newline at end of file diff --git a/lessons_resources/09. Containers/grid/grid.json b/lessons_resources/09. Containers/grid/grid.json new file mode 100644 index 000000000..2477dee4c --- /dev/null +++ b/lessons_resources/09. Containers/grid/grid.json @@ -0,0 +1,99 @@ +{ + "templates": { + "grid_element": { + "type": "container", + "width": { + "type": "match_parent", + "weight": 1 + }, + "height": { + "type": "match_parent", + "weight": 1 + }, + "margins": { + "left": 8, + "top": 8, + "right": 8, + "bottom": 8 + }, + "background": [ + { + "type": "solid", + "$color": "background_color" + } + ], + "border": { + "corner_radius": 8 + }, + "delimiter_style": { + "color": "#00000000" + } + } + }, + "card": { + "log_id": "grid_layout", + "states": [ + { + "state_id": 0, + "div": { + "type": "container", + "orientation": "vertical", + "items": [ + { + "type": "grid", + "width": { + "type": "fixed", + "value": 288 + }, + "height": { + "type": "fixed", + "value": 370 + }, + "margins": { + "top": 16 + }, + "paddings": { + "left": 8, + "top": 8, + "right": 8, + "bottom": 8 + }, + "alignment_horizontal": "center", + "column_count": 3, + "items": [ + { + "type": "grid_element", + "row_span": 2, + "background_color": "#D098D3" + }, + { + "type": "grid_element", + "background_color": "#FFCC00" + }, + { + "type": "grid_element", + "background_color": "#e1bae3" + }, + { + "type": "grid_element", + "column_span": 2, + "background_color": "#ffe066" + }, + { + "type": "grid_element", + "column_span": 3, + "height": { + "type": "fixed", + "value": 200 + }, + "content_alignment_vertical": "space-around", + "background_color": "#D098D3" + } + ] + } + ] + } + } + ] + } +} diff --git a/lessons_resources/09. Containers/layout_provider.json b/lessons_resources/09. Containers/layout_provider.json new file mode 100644 index 000000000..ab8025386 --- /dev/null +++ b/lessons_resources/09. Containers/layout_provider.json @@ -0,0 +1,90 @@ +{ + "templates": { + "block": { + "type": "container", + "margins": { + "left": 10, + "right": 10, + "top": 10, + "bottom": 10 + }, + "items": [ + { + "type": "text", + "$text": "text", + "font_size": 16, + "width": { + "type": "wrap_content" + }, + "margins": { + "left": 10, + "right": 10, + "top": 10, + "bottom": 10 + } + } + ], + "background": [ + { + "type": "solid", + "color": "#A0FFA0" + } + ] + } + }, + "card": { + "log_id": "test", + "variables": [ + { + "name": "block1_height", + "type": "integer", + "value": 0 + }, + { + "name": "block1_width", + "type": "integer", + "value": 0 + } + ], + "states": [ + { + "state_id": 0, + "div": { + "type": "container", + "paddings": { + "left": 10, + "top": 10, + "right": 10, + "bottom": 10 + }, + "items": [ + { + "type": "block", + "text": "width = height x 4\nheight = wrap_content", + "width": { + "type": "fixed", + "value": "@{block1_height * 4}" + }, + "layout_provider": { + "height_variable_name": "block1_height", + "width_variable_name": "block1_width" + } + }, + { + "type": "block", + "width": { + "type": "fixed", + "value": "@{block1_height * 2}" + }, + "height": { + "type": "fixed", + "value": "@{block1_width}" + }, + "text": "width = block1_height x 2\nheight = block1_width" + } + ] + } + } + ] + } +} diff --git a/lessons_resources/09. Containers/pager/infinite_scroll.json b/lessons_resources/09. Containers/pager/infinite_scroll.json new file mode 100644 index 000000000..d020c177a --- /dev/null +++ b/lessons_resources/09. Containers/pager/infinite_scroll.json @@ -0,0 +1,115 @@ +{ + "templates": { + "basic_text": { + "type": "text", + "font_size": 15, + "margins": { + "top": 12, + "bottom": 12, + "start": 12, + "end": 12 + }, + "border": { + "corner_radius": 10 + }, + "paddings": { + "top": 10, + "bottom": 10, + "start": 10, + "end": 10 + }, + "background": [ + { + "type": "solid", + "color": "#600000ff" + } + ], + "width": { + "type": "match_parent" + }, + "alignment_horizontal": "center", + "text_alignment_horizontal": "center" + } + }, + "card": { + "log_id": "generated_div", + "states": [ + { + "state_id": 0, + "div": { + "margins": { + "top": 10, + "left": 10, + "right": 10, + "bottom": 10 + }, + "type": "container", + "orientation": "vertical", + "border": { + "stroke": { + "color": "#000" + } + }, + "items": [ + { + "type": "pager", + "id": "pager_id", + "orientation": "horizontal", + "layout_mode":{ + "type": "fixed", + "neighbour_page_width": { + "type": "fixed", + "value": 10 + } + }, + "infinite_scroll": true, + "items": [ + { + "type": "basic_text", + "text": "Block 1" + }, + { + "type": "basic_text", + "text": "Block 2" + }, + { + "type": "basic_text", + "text": "Block 3" + } + ] + }, + { + "type": "indicator", + "pager_id": "pager_id", + "inactive_item_color": "#d0d1d9", + "active_item_color": "#000000", + "alignment_horizontal": "center", + "height": { + "type": "fixed", + "value": 30 + }, + "width": { + "type": "wrap_content" + }, + "shape": { + "type": "rounded_rectangle", + "item_width": { + "type": "fixed", + "value": 10 + }, + "item_height": { + "type": "fixed", + "value": 2 + }, + "corner_radius": { + "type": "fixed", + "value": 2 + } + } + } + ] + } + } + ] + } +} \ No newline at end of file diff --git a/lessons_resources/09. Containers/tab/simple_tab.json b/lessons_resources/09. Containers/tab/simple_tab.json new file mode 100644 index 000000000..bf0745b3a --- /dev/null +++ b/lessons_resources/09. Containers/tab/simple_tab.json @@ -0,0 +1,98 @@ +{ + "templates": { + "text_block": { + "type": "text", + "border": { + "corner_radius": 8, + "stroke": { + "color": "#ffffff", + "width": 2 + } + }, + "background": [ + { + "color": "#0e000000", + "type": "solid" + } + ], + "font_size": 20, + "text_alignment_vertical": "center", + "text_alignment_horizontal": "center", + "text_color": "#000000", + "height": { + "type": "fixed", + "value": 80 + } + } + }, + "card": { + "log_id": "sample_card", + "states": [ + { + "state_id": 0, + "div": { + "type": "container", + "orientation": "vertical", + "items": [ + { + "type": "tabs", + "height": { + "type": "wrap_content" + }, + "paddings": { + "left": 16, + "right": 16 + }, + "margins": { + "top": 4, + "bottom": 28 + }, + "items": [ + { + "title": "Tab 1", + "div": { + "type": "text_block", + "text": "Item 0", + "width": { + "type": "match_parent" + } + } + }, + { + "title": "Tab 2", + "div": { + "type": "text_block", + "text": "Item 1", + "width": { + "type": "match_parent" + } + } + }, + { + "title": "Tab 3", + "div": { + "type": "text_block", + "text": "Item 3", + "width": { + "type": "match_parent" + } + } + }, + { + "title": "Tab 4", + "div": { + "type": "text_block", + "text": "Item 4", + "width": { + "type": "match_parent" + } + } + } + ] + } + ] + } + } + ] + } +} diff --git a/lessons_resources/09. Containers/tab/title_animations.json b/lessons_resources/09. Containers/tab/title_animations.json new file mode 100644 index 000000000..1390febd1 --- /dev/null +++ b/lessons_resources/09. Containers/tab/title_animations.json @@ -0,0 +1,119 @@ +{ + "templates": { + "text_block": { + "type": "text", + "border": { + "corner_radius": 8, + "stroke": { + "color": "#ffffff", + "width": 2 + } + }, + "background": [ + { + "color": "#0e000000", + "type": "solid" + } + ], + "font_size": 20, + "text_alignment_vertical": "center", + "text_alignment_horizontal": "center", + "text_color": "#000000", + "height": { + "type": "fixed", + "value": 80 + } + }, + "tabs_preset": { + "type": "tabs", + "height": { + "type": "wrap_content" + }, + "paddings": { + "left": 16, + "right": 16 + }, + "tab_title_style": { + "animation_type": "none", + "item_spacing": 5 + }, + "margins": { + "top": 4, + "bottom": 28 + }, + "items": [ + { + "title": "Tab 1", + "div": { + "type": "text_block", + "text": "Item 0", + "width": { + "type": "match_parent" + } + } + }, + { + "title": "Tab 2", + "div": { + "type": "text_block", + "text": "Item 1", + "width": { + "type": "match_parent" + } + } + }, + { + "title": "Tab 3", + "div": { + "type": "text_block", + "text": "Item 3", + "width": { + "type": "match_parent" + } + } + }, + { + "title": "Tab 4", + "div": { + "type": "text_block", + "text": "Item 4", + "width": { + "type": "match_parent" + } + } + } + ] + } + }, + "card": { + "log_id": "sample_card", + "states": [ + { + "state_id": 0, + "div": { + "type": "container", + "orientation": "vertical", + "items": [ + { + "type": "tabs_preset", + "tab_title_style": { + "animation_type": "slide", + "item_spacing": 5 + } + }, + { + "type": "tabs_preset", + "tab_title_style": { + "animation_type": "fade", + "item_spacing": 5 + } + }, + { + "type": "tabs_preset" + } + ] + } + } + ] + } +} diff --git a/lessons_resources/10. Item builder/item_builder.json b/lessons_resources/10. Item builder/item_builder.json new file mode 100644 index 000000000..e096f40d5 --- /dev/null +++ b/lessons_resources/10. Item builder/item_builder.json @@ -0,0 +1,174 @@ +{ + "templates": { + "cardContainer": { + "type": "container", + "border": { + "corner_radius": 16, + "stroke": { + "color": "#aaaaaa", + "width": 1 + } + }, + "margins": { + "bottom": 6 + }, + "width": { + "type": "wrap_content" + }, + "orientation": "vertical", + "paddings": { + "top": 12, + "bottom": 12, + "left": 12, + "right": 12 + } + } + }, + "card": { + "log_id": "prototypes", + "variables": [ + { + "name": "data", + "type": "array", + "value": [ + { + "style": "only_text", + "title": "First text card" + }, + { + "style": "only_text", + "title": "Second text card" + }, + { + "style": "with_image", + "title": "Card with image", + "image_url": "https://yastatic.net/s3/home/divkit/wombat.jpg" + }, + { + "style": "add_button" + } + ] + } + ], + "states": [ + { + "state_id": 0, + "div": { + "type": "gallery", + "orientation": "vertical", + "margins": { + "top": 10, + "start": 10, + "end": 10, + "bottom": 10 + }, + "item_builder": { + "type": "prototype", + "data": "@{data}", + "data_element_name": "item", + "prototypes": [ + { + "selector": "@{getStringFromDict(item, 'style') == 'only_text'}", + "div": { + "type": "cardContainer", + "items": [ + { + "type": "text", + "text": "@{getStringFromDict(item, 'title')}", + "font_size": 16, + "margins": { + "bottom": 4 + }, + "width": { + "type": "wrap_content" + } + } + ], + "width": { + "type": "wrap_content" + } + } + }, + { + "selector": "@{getStringFromDict(item, 'style') == 'with_image'}", + "div": { + "type": "cardContainer", + "items": [ + { + "type": "image", + "image_url": "@{getStringFromDict(item, 'image_url')}", + "width": { + "type": "fixed", + "value": 150 + }, + "height": { + "type": "fixed", + "value": 150 + } + }, + { + "type": "text", + "text": "@{getStringFromDict(item, 'title')}", + "text_alignment_horizontal": "center", + "font_size": 16, + "margins": { + "left": 4 + } + } + ], + "width": { + "type": "wrap_content" + } + } + }, + { + "selector": "@{getStringFromDict(item, 'style') == 'add_button'}", + "div": { + "type": "cardContainer", + "background": [ + { + "type": "solid", + "color": "#3000ffff" + } + ], + "items": [ + { + "type": "text", + "text": "Add item", + "font_size": 16, + "width": { + "type": "wrap_content" + }, + "paddings": { + "start": 13, + "end": 13, + "top": 13, + "bottom": 13 + }, + "actions": [ + { + "log_id": "add_card", + "typed": { + "type": "array_insert_value", + "variable_name": "data", + "value": { + "type": "dict", + "value": { + "style": "only_text", + "title": "Additional card" + } + } + } + } + ] + } + ] + } + } + ] + } + } + } + ] + } +} \ No newline at end of file diff --git a/lessons_resources/11. Animations/action_animation.json b/lessons_resources/11. Animations/action_animation.json new file mode 100644 index 000000000..adb316e20 --- /dev/null +++ b/lessons_resources/11. Animations/action_animation.json @@ -0,0 +1,116 @@ +{ + "templates": { + "button": { + "type": "text", + "height": { + "type": "fixed", + "value": 48 + }, + "margins": { + "left": 16, + "right": 16, + "bottom": 16 + }, + "border": { + "corner_radius": 16 + }, + "background": [ + { + "type": "solid", + "$color": "background_color" + } + ], + "font_size": 14, + "font_weight": "medium", + "text_alignment_vertical": "center", + "text_alignment_horizontal": "center" + } + }, + "card": { + "log_id": "sample_card", + "states": [ + { + "state_id": 0, + "div": { + "type": "container", + "orientation": "vertical", + "margins": { + "top": 24, + "bottom": 24 + }, + "items": [ + { + "type": "button", + "background_color": "#00B341", + "text": "Fade", + "text_color": "#000000", + "actions": [ + { + "log_id": "fade_button_press", + "url": "div-action://animation/fade" + } + ], + "action_animation": { + "name": "fade", + "start_value": 1.0, + "end_value": 0.4, + "duration": 500, + "interpolator": "ease_in_out" + } + }, + { + "type": "button", + "background_color": "#0077FF", + "text_color": "#ffffff", + "text": "Scale", + "actions": [ + { + "log_id": "scale_button_press", + "url": "div-action://animation/scale" + } + ], + "action_animation": { + "name": "scale", + "start_value": 1.0, + "end_value": 0.4, + "duration": 500, + "interpolator": "ease_in_out" + } + }, + { + "type": "button", + "background_color": "#FFCC00", + "text": "Set", + "text_color": "#000000", + "actions": [ + { + "log_id": "set_button_press", + "url": "div-action://animation/set" + } + ], + "action_animation": { + "name": "set", + "items": [ + { + "name": "fade", + "start_value": 1.0, + "end_value": 0.2, + "duration": 300, + "interpolator": "ease_in_out" + }, + { + "name": "scale", + "start_value": 1.0, + "end_value": 0.5, + "duration": 500, + "interpolator": "ease_in_out" + } + ] + } + } + ] + } + } + ] + } +} diff --git a/lessons_resources/11. Animations/animators.json b/lessons_resources/11. Animations/animators.json new file mode 100644 index 000000000..26eb4435b --- /dev/null +++ b/lessons_resources/11. Animations/animators.json @@ -0,0 +1,205 @@ +{ + "templates": { + "case_container": { + "type": "container", + "orientation": "vertical", + "paddings": { + "left": 16, + "top": 16, + "right": 16, + "bottom": 16 + }, + "background": [ + { + "type": "solid", + "$color": "background_color" + } + ] + }, + "title": { + "type": "text", + "font_size": 24, + "font_weight": "bold", + "text_alignment_horizontal": "center", + "text_alignment_vertical": "center", + "text_color": "#586E75" + }, + "button": { + "type": "text", + "height": { + "type": "fixed", + "value": 48 + }, + "paddings": { + "left": 8, + "top": 8, + "right": 8, + "bottom": 8 + }, + "background": [ + { + "type": "solid", + "$color": "background_color" + } + ], + "border": { + "corner_radius": 8 + }, + "font_size": 20, + "font_weight": "medium", + "text_alignment_horizontal": "center", + "text_alignment_vertical": "center", + "text_color": "#FDF6E3" + } + }, + "card": { + "log_id": "variable_animators", + "states": [ + { + "state_id": 0, + "div": { + "type": "case_container", + "background_color": "#FDF6E3", + "items": [ + { + "type": "title", + "margins": { + "bottom": 16 + }, + "text": "Spinner animator" + }, + { + "id": "spinner", + "type": "image", + "width": { + "type": "fixed", + "value": 48 + }, + "height": { + "type": "fixed", + "value": 48 + }, + "margins": { + "bottom": 16 + }, + "image_url": "https://yastatic.net/s3/home/divkit/spinner.png", + "tint_color": "@{tint_color}", + "transform": { + "rotation": "@{rotation_angle}" + }, + "alignment_horizontal": "center", + "variables": [ + { + "name": "rotation_angle", + "type": "number", + "value": 0.0 + }, + { + "name": "tint_color", + "type": "color", + "value": "#268BD2" + } + ], + "animators": [ + { + "type": "number_animator", + "id": "rotation_animator", + "variable_name": "rotation_angle", + "duration": 1000, + "start_value": 0, + "end_value": 360, + "interpolator": "ease_in_out", + "$cancel_actions": "rotation_animator_cancel_actions" + }, + { + "type": "color_animator", + "id": "tint_color_animator", + "variable_name": "tint_color", + "duration": 2000, + "start_value": "#268BD2", + "end_value": "#D33682", + "$cancel_actions": "tint_color_animator_cancel_actions" + } + ], + "rotation_animator_cancel_actions": [ + { + "log_id": "reset_rotation_animation", + "url": "div-action://set_variable?name=rotation_angle&value=0" + } + ], + "tint_color_animator_cancel_actions": [ + { + "log_id": "reset_tint_color_animation", + "url": "div-action://set_variable?name=tint_color&value=%23268BD2" + } + ] + }, + { + "type": "container", + "orientation": "horizontal", + "items": [ + { + "type": "button", + "margins": { + "right": 16 + }, + "background_color": "#2AA198", + "text": "Start", + "actions": [ + { + "log_id": "start_rotation_animation", + "scope_id": "spinner", + "typed": { + "type": "animator_start", + "animator_id": "rotation_animator", + "direction": "normal", + "repeat_count": { + "type": "infinity" + } + } + }, + { + "log_id": "start_tint_color_animation", + "scope_id": "spinner", + "typed": { + "type": "animator_start", + "animator_id": "tint_color_animator", + "direction": "alternate", + "repeat_count": { + "type": "infinity" + } + } + } + ] + }, + { + "type": "button", + "background_color": "#CB4B16", + "text": "Stop", + "actions": [ + { + "log_id": "stop_rotation_animation", + "scope_id": "spinner", + "typed": { + "type": "animator_stop", + "animator_id": "rotation_animator" + } + }, + { + "log_id": "stop_tint_color_animation", + "scope_id": "spinner", + "typed": { + "type": "animator_stop", + "animator_id": "tint_color_animator" + } + } + ] + } + ] + } + ] + } + } + ] + } +} diff --git a/lessons_resources/11. Animations/transition_animation.json b/lessons_resources/11. Animations/transition_animation.json new file mode 100644 index 000000000..3d2682ba4 --- /dev/null +++ b/lessons_resources/11. Animations/transition_animation.json @@ -0,0 +1,151 @@ +{ + "templates": { + "button": { + "type": "text", + "paddings": { + "left": 16, + "top": 16, + "right": 16, + "bottom": 16 + }, + "margins": { + "left": 24, + "right": 24 + }, + "border": { + "corner_radius": 8 + }, + "background": [ + { + "type": "solid", + "color": "#0E000000" + } + ], + "font_size": 14, + "font_weight": "medium", + "text_alignment_vertical": "center", + "text_alignment_horizontal": "center", + "text_color": "#000000" + }, + "in_out_transition_demo_block": { + "type": "text", + "height": { + "type": "fixed", + "value": 88 + }, + "margins": { + "left": 24, + "right": 24, + "bottom": 8 + }, + "border": { + "corner_radius": 16 + }, + "background": [ + { + "type": "solid", + "color": "#3F28C3" + } + ], + "text_color": "#ffffff", + "font_size": 14, + "text_alignment_vertical": "center", + "text_alignment_horizontal": "center" + } + }, + "card": { + "variables": [ + { + "name": "change_state", + "type": "string", + "value": "none" + }, + { + "name": "set_state", + "type": "string", + "value": "visible" + } + ], + "variable_triggers": [ + { + "condition": "@{change_state == 'set' && set_state == 'visible'}", + "mode": "on_variable", + "actions": [ + { + "log_id": "update change_state flag", + "url": "div-action://set_variable?name=change_state&value=none" + }, + { + "log_id": "update change_state flag", + "url": "div-action://set_variable?name=set_state&value=invisible" + } + ] + }, + { + "condition": "@{change_state == 'set' && set_state == 'invisible'}", + "mode": "on_variable", + "actions": [ + { + "log_id": "update change_state flag", + "url": "div-action://set_variable?name=change_state&value=none" + }, + { + "log_id": "update change_state flag", + "url": "div-action://set_variable?name=set_state&value=visible" + } + ] + } + ], + "log_id": "sample_card", + "states": [ + { + "state_id": 0, + "div": { + "type": "container", + "orientation": "vertical", + "margins": { + "top": 24, + "bottom": 24 + }, + "items": [ + { + "type": "in_out_transition_demo_block", + "id": "set_in_out", + "text": "Animated item", + "visibility": "@{set_state}", + "transition_out": { + "type": "set", + "items": [ + { + "type": "fade", + "duration": 1000 + }, + { + "type": "scale", + "duration": 1000 + } + ] + }, + "transition_in": { + "type": "slide", + "edge": "right", + "duration": 1000 + } + }, + { + "type": "button", + "alignment_horizontal": "center", + "text": "Run", + "actions": [ + { + "log_id": "set_state", + "url": "div-action://set_variable?name=change_state&value=set" + } + ] + } + ] + } + } + ] + } +} diff --git a/lessons_resources/11. Animations/transition_change_animation.json b/lessons_resources/11. Animations/transition_change_animation.json new file mode 100644 index 000000000..92437e34c --- /dev/null +++ b/lessons_resources/11. Animations/transition_change_animation.json @@ -0,0 +1,228 @@ +{ + "templates": { + "image_block": { + "type": "image", + "image_url": "https://yastatic.net/s3/home/divkit/samples/slide_04.jpeg", + "border": { + "corner_radius": 18 + } + }, + "button": { + "type": "text", + "width": { + "type": "match_parent" + }, + "height": { + "type": "wrap_content" + }, + "paddings": { + "left": 16, + "top": 16, + "right": 16, + "bottom": 16 + }, + "margins": { + "left": 24, + "right": 24 + }, + "border": { + "corner_radius": 8 + }, + "background": [ + { + "type": "solid", + "color": "#0E000000" + } + ], + "font_size": 14, + "font_weight": "medium", + "text_alignment_vertical": "center", + "text_alignment_horizontal": "center", + "text_color": "#000000" + } + }, + "card": { + "log_id": "sample_card", + "variables": [ + { + "name": "change_state", + "type": "boolean", + "value": false + }, + { + "name": "state", + "type": "boolean", + "value": false + } + ], + "variable_triggers": [ + { + "condition": "@{change_state && state}", + "mode": "on_variable", + "actions": [ + { + "log_id": "update change_state flag", + "url": "div-action://set_variable?name=change_state&value=false" + }, + { + "log_id": "update change_state flag", + "url": "div-action://set_variable?name=state&value=false" + }, + { + "log_id": "change state", + "url": "div-action://set_state?state_id=0/transition_change_demo_state/state1" + } + ] + }, + { + "condition": "@{change_state && !state}", + "mode": "on_variable", + "actions": [ + { + "log_id": "update change_state flag", + "url": "div-action://set_variable?name=change_state&value=false" + }, + { + "log_id": "update state variable", + "url": "div-action://set_variable?name=state&value=true" + }, + { + "log_id": "change state", + "url": "div-action://set_state?state_id=0/transition_change_demo_state/state2" + } + ] + } + ], + "states": [ + { + "state_id": 0, + "div": { + "type": "container", + "orientation": "vertical", + "margins": { + "top": 24, + "bottom": 24 + }, + "items": [ + { + "type": "container", + "orientation": "overlap", + "margins": { + "left": 16, + "right": 16, + "bottom": 16 + }, + "items": [ + { + "type": "container", + "background": [ + { + "type": "solid", + "color": "#CDE3EF" + } + ], + "width": { + "type": "match_parent" + }, + "height": { + "type": "match_parent" + }, + "border": { + "corner_radius": 18 + } + }, + { + "type": "text", + "text": "Hidden text", + "text_alignment_horizontal": "center", + "font_size": 24, + "margins": { + "top": 30 + } + }, + { + "type": "text", + "text": "That was revealed", + "alignment_horizontal": "end", + "alignment_vertical": "bottom", + "text_alignment_horizontal": "center", + "font_size": 24, + "margins": { + "bottom": 30, + "end": 30 + }, + "width": { + "type": "fixed", + "value": 95 + } + }, + { + "type": "state", + "width": { + "type": "match_parent" + }, + "height": { + "type": "fixed", + "value": 250 + }, + "id": "transition_change_demo_state", + "states": [ + { + "state_id": "state1", + "div": { + "type": "image_block", + "id": "image", + "width": { + "type": "match_parent" + }, + "height": { + "type": "match_parent" + }, + "transition_change": { + "type": "change_bounds", + "duration": 1000 + } + } + }, + { + "state_id": "state2", + "div": { + "type": "image_block", + "id": "image", + "alignment_horizontal": "left", + "alignment_vertical": "bottom", + "width": { + "type": "fixed", + "value": 150 + }, + "height": { + "type": "fixed", + "value": 150 + }, + "transition_change": { + "type": "change_bounds", + "duration": 1000 + } + } + } + ] + } + ] + }, + { + "type": "button", + "alignment_horizontal": "center", + "text": "Run", + "actions": [ + { + "log_id": "set_state1", + "url": "div-action://set_variable?name=change_state&value=true" + } + ] + } + ] + } + } + ] + } +} \ No newline at end of file diff --git a/lessons_resources/11. Item builder/item_builder.json b/lessons_resources/11. Item builder/item_builder.json new file mode 100644 index 000000000..e096f40d5 --- /dev/null +++ b/lessons_resources/11. Item builder/item_builder.json @@ -0,0 +1,174 @@ +{ + "templates": { + "cardContainer": { + "type": "container", + "border": { + "corner_radius": 16, + "stroke": { + "color": "#aaaaaa", + "width": 1 + } + }, + "margins": { + "bottom": 6 + }, + "width": { + "type": "wrap_content" + }, + "orientation": "vertical", + "paddings": { + "top": 12, + "bottom": 12, + "left": 12, + "right": 12 + } + } + }, + "card": { + "log_id": "prototypes", + "variables": [ + { + "name": "data", + "type": "array", + "value": [ + { + "style": "only_text", + "title": "First text card" + }, + { + "style": "only_text", + "title": "Second text card" + }, + { + "style": "with_image", + "title": "Card with image", + "image_url": "https://yastatic.net/s3/home/divkit/wombat.jpg" + }, + { + "style": "add_button" + } + ] + } + ], + "states": [ + { + "state_id": 0, + "div": { + "type": "gallery", + "orientation": "vertical", + "margins": { + "top": 10, + "start": 10, + "end": 10, + "bottom": 10 + }, + "item_builder": { + "type": "prototype", + "data": "@{data}", + "data_element_name": "item", + "prototypes": [ + { + "selector": "@{getStringFromDict(item, 'style') == 'only_text'}", + "div": { + "type": "cardContainer", + "items": [ + { + "type": "text", + "text": "@{getStringFromDict(item, 'title')}", + "font_size": 16, + "margins": { + "bottom": 4 + }, + "width": { + "type": "wrap_content" + } + } + ], + "width": { + "type": "wrap_content" + } + } + }, + { + "selector": "@{getStringFromDict(item, 'style') == 'with_image'}", + "div": { + "type": "cardContainer", + "items": [ + { + "type": "image", + "image_url": "@{getStringFromDict(item, 'image_url')}", + "width": { + "type": "fixed", + "value": 150 + }, + "height": { + "type": "fixed", + "value": 150 + } + }, + { + "type": "text", + "text": "@{getStringFromDict(item, 'title')}", + "text_alignment_horizontal": "center", + "font_size": 16, + "margins": { + "left": 4 + } + } + ], + "width": { + "type": "wrap_content" + } + } + }, + { + "selector": "@{getStringFromDict(item, 'style') == 'add_button'}", + "div": { + "type": "cardContainer", + "background": [ + { + "type": "solid", + "color": "#3000ffff" + } + ], + "items": [ + { + "type": "text", + "text": "Add item", + "font_size": 16, + "width": { + "type": "wrap_content" + }, + "paddings": { + "start": 13, + "end": 13, + "top": 13, + "bottom": 13 + }, + "actions": [ + { + "log_id": "add_card", + "typed": { + "type": "array_insert_value", + "variable_name": "data", + "value": { + "type": "dict", + "value": { + "style": "only_text", + "title": "Additional card" + } + } + } + } + ] + } + ] + } + } + ] + } + } + } + ] + } +} \ No newline at end of file diff --git a/lessons_resources/12. User-declared functions/function.json b/lessons_resources/12. User-declared functions/function.json new file mode 100644 index 000000000..3d3943e5c --- /dev/null +++ b/lessons_resources/12. User-declared functions/function.json @@ -0,0 +1,215 @@ +{ + "templates": { + "block": { + "type": "container", + "width": { + "type": "fixed", + "value": 100 + }, + "border": { + "corner_radius": 50 + }, + "height": { + "type": "fixed", + "value": 100 + }, + "background": [ + { + "type": "solid", + "$color": "background_color" + } + ] + }, + "color_input": { + "type": "input", + "font_size": 16, + "margins": { + "top": 10 + }, + "text_alignment_horizontal": "center", + "width": { + "type": "fixed", + "value": 150 + }, + "border": { + "corner_radius": 4, + "stroke": { + "color": "#000" + } + } + } + }, + "card": { + "log_id": "generated_div", + "variables": [ + { + "name": "input_1", + "type": "string", + "value": "00ff00" + }, + { + "name": "input_2", + "type": "string", + "value": "0000ff" + }, + { + "name": "input_3", + "type": "string", + "value": "ff0000" + }, + { + "name": "color_1", + "type": "color", + "value": "#5500ff00" + }, + { + "name": "color_2", + "type": "color", + "value": "#550000ff" + }, + { + "name": "color_3", + "type": "color", + "value": "#55ff0000" + } + ], + "states": [ + { + "state_id": 0, + "div": { + "type": "container", + "width": { + "type": "match_parent" + }, + "height": { + "type": "match_parent" + }, + "content_alignment_horizontal": "center", + "content_alignment_vertical": "center", + "items": [ + { + "margins": { + "left": 10, + "right": 10 + }, + "type": "container", + "orientation": "overlap", + "width": { + "type": "fixed", + "value": 150 + }, + "height": { + "type": "fixed", + "value": 150 + }, + "items": [ + { + "type": "block", + "background_color": "@{color_1}", + "alignment_horizontal": "center" + }, + { + "type": "block", + "background_color": "@{color_2}", + "alignment_horizontal": "end", + "alignment_vertical": "bottom" + }, + { + "type": "block", + "background_color": "@{color_3}", + "alignment_horizontal": "start", + "alignment_vertical": "bottom" + } + ] + }, + { + "type": "color_input", + "text_variable": "input_1", + "margins": { + "top": 40 + } + }, + { + "type": "color_input", + "text_variable": "input_2" + }, + { + "type": "color_input", + "text_variable": "input_3" + }, + { + "type": "text", + "text": "Mix!", + "text_alignment_horizontal": "center", + "font_size": 20, + "margins": { + "top": 10 + }, + "background": [ + { + "type": "solid", + "color": "#600000ff" + } + ], + "width": { + "type": "fixed", + "value": 150 + }, + "border": { + "corner_radius": 4 + }, + "functions": [ + { + "name": "reduce_alpha", + "arguments": [ + { + "name": "init_color", + "type": "string" + } + ], + "return_type": "color", + "body": "@{toColor('#55@{init_color}')}" + } + ], + "actions": [ + { + "log_id": "set_color_1", + "typed":{ + "type": "set_variable", + "variable_name": "color_1", + "value": { + "type": "color", + "value": "@{reduce_alpha(input_1)}" + } + } + }, + { + "log_id": "set_color_2", + "typed":{ + "type": "set_variable", + "variable_name": "color_2", + "value": { + "type": "color", + "value": "@{reduce_alpha(input_2)}" + } + } + }, + { + "log_id": "set_color_3", + "typed":{ + "type": "set_variable", + "variable_name": "color_3", + "value": { + "type": "color", + "value": "@{reduce_alpha(input_3)}" + } + } + } + ] + } + ] + } + } + ] + } +}