Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .github/android_example.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed .github/green-stash.gif
Binary file not shown.
Binary file added .github/ios_example.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed .github/tap-target-image.gif
Binary file not shown.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ local.properties
.idea/*
!.idea/copyright
.DS_Store
/build
build
/captures
.externalNativeBuild
ktlint
34 changes: 14 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,37 +1,31 @@
#### \<Advertisement\>

#### [:mega: Use AI to manage your app's reviews on Google Play :arrow_right:](https://playstorereply.com)
Increase your apps ratings. Engage with all users, no more unanswered reviews.
Save time and increase customer satisfaction.

#### \</Advertisement\>

# tap-target-compose
tap-target-compose is a Jetpack Compose implementation of the [Material Design tap targets](https://m1.material.io/growth-communications/feature-discovery.html#feature-discovery-design), used for feature discovery.
# tap-target-cmp
tap-target-compose is a Compose Multiplatform implementation of the [Material Design tap targets](https://m1.material.io/growth-communications/feature-discovery.html#feature-discovery-design), used for feature discovery.

This library was inspired by its View counterpart, [TapTargetView](https://github.com/KeepSafe/TapTargetView).

| | |
| --- | --- |
| ![](/.github/tap-target-image.gif) | [![](/.github/green-stash.gif)](https://github.com/Pool-Of-Tears/GreenStash) |
| | |
|-----------------------------------|-------------------------------|
| ![](/.github/android_example.gif) | ![](/.github/ios_example.gif) |

# Sample app
This library comes with a sample app that shows examples of how to use it.

* [Click here to see the source code of the sample app](./sample-app/).
* [Click here to see the source code of the example](./example/).

:eyes: If you want to know when a new release of the library is published: [watch this repository on GitHub](https://github.com/PierfrancescoSoffritti/tap-target-compose/watchers).
:eyes: If you want to know when a new release of the library is published: [watch this repository on GitHub](https://github.com/ienground/tap-target-cmp/watchers).

# Download
The Gradle dependency is available via [MavenCentral](https://repo1.maven.org/maven2/com/pierfrancescosoffritti/).

The minimum API level supported by this library is API 13.
The minimum API level supported by this library is API 29.

Add this to your module level `build.gradle` file to start using the library.

```toml
taptarget = { group = "zone.ien.taptargetcmp", name = "taptarget", version = "1.2.1" }
```

```gradle
dependencies {
implementation "com.pierfrancescosoffritti.taptargetcompose:core:1.2.1"
implementation(libs.taptarget)
}
```

Expand Down Expand Up @@ -108,4 +102,4 @@ The library supports chaining of multiple tap targets, but you can also show onl

---

For any question feel free to [open an issue on the GitHub repository](https://github.com/PierfrancescoSoffritti/tap-target-compose/issues).
For any question feel free to [open an issue on the GitHub repository](https://github.com/ienground/tap-target-cmp/issues).
58 changes: 52 additions & 6 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,11 +1,57 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
alias(libs.plugins.android.application) apply false
alias(libs.plugins.jetbrains.kotlin.android) apply false
alias(libs.plugins.android.library) apply false
alias(libs.plugins.gradleNexus.publish)
alias(libs.plugins.jetbrains.dokka)
alias(libs.plugins.android.kotlin.multiplatform.library) apply false
alias(libs.plugins.kotlin.multiplatform) apply false
alias(libs.plugins.serialization) apply false
alias(libs.plugins.vanniktech.mavenPublish) apply false
alias(libs.plugins.android.lint) apply false
alias(libs.plugins.compose.compiler) apply false
}
val isReleaseVersion = !version.toString().endsWith("SNAPSHOT")
Comment thread
ienground marked this conversation as resolved.

apply(from = "./scripts/publish-root.gradle")
subprojects {
plugins.withId("com.vanniktech.maven.publish") {
configure<com.vanniktech.maven.publish.MavenPublishBaseExtension> {
publishToMavenCentral(automaticRelease = true)

// Artifact ID만 각 프로젝트의 이름으로 자동 설정
group = "zone.ien.taptargetcmp"
version = libs.versions.lib.version.name.get()
println("${group} ${project.name} ${version}")
Comment thread
ienground marked this conversation as resolved.

coordinates(group.toString(), project.name, version.toString())

pom {
name = project.name
description = "A Compose Multiplatform implementation of Material Design tap targets, for feature discovery."
inceptionYear = "2026"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low

inceptionYear가 미래 연도인 "2026"으로 설정되어 있습니다. 오타일 수 있으니 현재 연도나 프로젝트 시작 연도로 수정하는 것을 권장합니다.

@ienground

        inceptionYear = "2024"

url = "https://github.com/ienground/tap-target-cmp"
licenses {
license {
name = "Apache-2.0"
url = "https://www.apache.org/licenses/LICENSE-2.0"
}
}
developers {
developer {
id = "ienground"
name = "Ericano Rhee"
url = "https://www.ien.zone"
}
}
scm {
url = "https://github.com/ienground/tap-target-cmp.git"
connection = "scm:git:https://github.com/ienground/tap-target-cmp.git"
developerConnection = "scm:git:https://github.com/ienground/tap-target-cmp.git"
}
}

val isPublishingToMavenLocal = gradle.startParameter.taskNames.any { it.contains("publishToMavenLocal", ignoreCase = true) }
val isSnapshot = version.toString().endsWith("SNAPSHOT")

if (!isSnapshot && !isPublishingToMavenLocal) {
signAllPublications()
}
}
}
}
7 changes: 0 additions & 7 deletions buildSrc/build.gradle.kts

This file was deleted.

This file was deleted.

49 changes: 49 additions & 0 deletions example/androidApp/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget

plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.compose.multiplatform)
alias(libs.plugins.compose.compiler)
}

android {
namespace = "zone.ien.taptargetcmp.example"
compileSdk = libs.versions.android.compileSdk.get().toInt()

defaultConfig {
applicationId = "zone.ien.taptargetcmp.example"
minSdk = libs.versions.android.minSdk.get().toInt()
targetSdk = libs.versions.android.targetSdk.get().toInt()
versionCode = 1
versionName = libs.versions.lib.version.name.get()
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}
}

kotlin {
target {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_21)
}
}

dependencies {
implementation(projects.example.composeApp)
implementation(libs.activity.compose)
implementation(libs.compose.ui.tooling)
}
}
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package zone.ien.taptargetcmp.example

import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: android.os.Bundle?) {
super.onCreate(savedInstanceState)

setContent {
enableEdgeToEdge()
App()
}
}
}

@Preview
@Composable
fun AppAndroidPreview() {
App()
}
50 changes: 50 additions & 0 deletions example/composeApp/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget

plugins {
alias(libs.plugins.kotlin.multiplatform)
alias(libs.plugins.android.kotlin.multiplatform.library)
alias(libs.plugins.serialization)
alias(libs.plugins.compose.multiplatform)
alias(libs.plugins.compose.compiler)
}

kotlin {
androidLibrary {
namespace = "zone.ien.taptargetcmp.example.lib"
compileSdk = libs.versions.android.compileSdk.get().toInt()
minSdk = libs.versions.android.minSdk.get().toInt()

compilerOptions {
jvmTarget.set(JvmTarget.JVM_21)
}

androidResources {
enable = true
}
}

listOf(
iosArm64(),
iosSimulatorArm64()
).forEach { iosTarget ->
iosTarget.binaries.framework {
baseName = "ComposeApp"
isStatic = true
}
}

sourceSets {
commonMain.dependencies {
implementation(libs.compose.material3)
implementation(libs.compose.preview)
implementation(projects.taptarget)
}
commonTest.dependencies {
implementation(libs.kotlin.test)
}
}
}

dependencies {
androidRuntimeClasspath(libs.compose.ui.tooling)
}
Loading
Loading