From 4b61e7a3c1253bd866340344ced80f857836ab07 Mon Sep 17 00:00:00 2001 From: Sandesh Date: Sat, 21 Mar 2026 17:15:37 +0530 Subject: [PATCH 1/3] Add icon --- README.md | 6 +++++- androidApp/src/main/AndroidManifest.xml | 1 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2545 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1738 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3343 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 5403 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 7310 bytes docs/icon.png | Bin 0 -> 27097 bytes docs/icon.svg | 19 ++++++++++++++++++ 9 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 androidApp/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 androidApp/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 androidApp/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 docs/icon.png create mode 100644 docs/icon.svg diff --git a/README.md b/README.md index 5be57bc..60296e2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,10 @@ # JsonCMP -[![Build](https://github.com/skymansandy/jsonCMP/actions/workflows/deploy.yml/badge.svg)](https://github.com/skymansandy/jsonCMP/actions/workflows/deploy.yml) [![Coverage](https://img.shields.io/badge/coverage-100%25-brightgreen)](https://github.com/skymansandy/jsonCMP/actions/workflows/deploy.yml) [![Maven](https://img.shields.io/badge/maven-1.0.0--alpha1-blue)](https://github.com/skymansandy/jsonCMP/packages) +

+ JsonCMP Icon +

+ +[![Build](https://github.com/skymansandy/jsonCMP/actions/workflows/deploy.yml/badge.svg)](https://github.com/skymansandy/jsonCMP/actions/workflows/deploy.yml) [![Coverage](https://img.shields.io/badge/coverage-100%25-brightgreen)](https://github.com/skymansandy/jsonCMP/actions/workflows/deploy.yml) [![Maven](https://img.shields.io/badge/maven-1.0.0--alpha1-blue)](https://github.com/skymansandy/jsonCMP/packages) Kotlin Multiplatform Compose JSON viewer and editor component for Android, iOS, and JVM Desktop. diff --git a/androidApp/src/main/AndroidManifest.xml b/androidApp/src/main/AndroidManifest.xml index 386388d..dee31b9 100644 --- a/androidApp/src/main/AndroidManifest.xml +++ b/androidApp/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ diff --git a/androidApp/src/main/res/mipmap-hdpi/ic_launcher.png b/androidApp/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..dd9c6366d43798027c8c00f475940e885eba979c GIT binary patch literal 2545 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 Hu0mjfKY`)e literal 0 HcmV?d00001 diff --git a/androidApp/src/main/res/mipmap-mdpi/ic_launcher.png b/androidApp/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..bff852bb0d60301bb633912db9c28e43352c59b4 GIT binary patch literal 1738 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 Z{s-5#wrf6C2^RnW002ovPDHLkV1njjcP9V< literal 0 HcmV?d00001 diff --git a/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png b/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..f74c633f49c55039354e80ca036b1aa0a19260b1 GIT binary patch literal 5403 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 FV1oGzRonmo literal 0 HcmV?d00001 diff --git a/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..83faa8a9e5f9338cb0f0ce114be99392d0386bae GIT binary patch literal 7310 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 literal 0 HcmV?d00001 diff --git a/docs/icon.png b/docs/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d6db3bde08f84f96ff94d4e3bff316e13327836d GIT binary patch literal 27097 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 + + + + + + + + + + + + + + + + From 1b12d15fa6b9f215f300dffadf9c149983384c11 Mon Sep 17 00:00:00 2001 From: Sandesh Date: Sat, 21 Mar 2026 18:18:17 +0530 Subject: [PATCH 2/3] Update publishing --- .github/workflows/deploy.yml | 15 +++--- README.md | 13 ++--- build.gradle.kts | 50 ++++++++++++------- docs/getting-started/installation.md | 15 ++---- gradle/libs.versions.toml | 2 + .../jsoncmp/component/editor/CodeEditor.kt | 7 ++- scripts/publish.sh | 11 ++-- 7 files changed, 58 insertions(+), 55 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index b98c17f..d6489de 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -10,7 +10,6 @@ concurrency: permissions: contents: write - packages: write pages: write id-token: write @@ -102,7 +101,7 @@ jobs: BUILD_BADGE="[![Build](https://github.com/${REPO}/actions/workflows/deploy.yml/badge.svg)](https://github.com/${REPO}/actions/workflows/deploy.yml)" COVERAGE_BADGE="[![Coverage](https://img.shields.io/badge/coverage-${COVERAGE}%25-${COLOR})](https://github.com/${REPO}/actions/workflows/deploy.yml)" VERSION_ESCAPED=$(echo "$VERSION" | sed 's/-/--/g') - MAVEN_BADGE="[![Maven](https://img.shields.io/badge/maven-${VERSION_ESCAPED}-blue)](https://github.com/${REPO}/packages)" + MAVEN_BADGE="[![Maven Central](https://img.shields.io/badge/maven--central-${VERSION_ESCAPED}-blue)](https://central.sonatype.com/artifact/dev.skymansandy/json-cmp)" BADGE_LINE="${BUILD_BADGE} ${COVERAGE_BADGE} ${MAVEN_BADGE}" @@ -129,7 +128,7 @@ jobs: git push publish: - name: Publish SDK + name: Publish to Maven Central needs: test-and-coverage runs-on: macos-latest steps: @@ -142,11 +141,13 @@ jobs: - uses: gradle/actions/setup-gradle@v4 - - name: Publish to GitHub Packages + - name: Publish and release to Maven Central env: - MAVEN_REPO_USERNAME: ${{ github.actor }} - MAVEN_REPO_PASSWORD: ${{ secrets.GITHUB_TOKEN }} - run: ./gradlew publishAllPublicationsToGitHubPackagesRepository + ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.OSSRH_USERNAME }} + ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.OSSRH_PASSWORD }} + ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.GPG_PRIVATE_KEY }} + ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.GPG_PASSPHRASE }} + run: ./gradlew publishAndReleaseToMavenCentral --no-configuration-cache deploy-docs: name: Deploy Docs diff --git a/README.md b/README.md index 60296e2..55b212c 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ JsonCMP Icon

-[![Build](https://github.com/skymansandy/jsonCMP/actions/workflows/deploy.yml/badge.svg)](https://github.com/skymansandy/jsonCMP/actions/workflows/deploy.yml) [![Coverage](https://img.shields.io/badge/coverage-100%25-brightgreen)](https://github.com/skymansandy/jsonCMP/actions/workflows/deploy.yml) [![Maven](https://img.shields.io/badge/maven-1.0.0--alpha1-blue)](https://github.com/skymansandy/jsonCMP/packages) +[![Build](https://github.com/skymansandy/jsonCMP/actions/workflows/deploy.yml/badge.svg)](https://github.com/skymansandy/jsonCMP/actions/workflows/deploy.yml) [![Coverage](https://img.shields.io/badge/coverage-100%25-brightgreen)](https://github.com/skymansandy/jsonCMP/actions/workflows/deploy.yml) [![Maven Central](https://img.shields.io/badge/maven--central-1.0.0--alpha1-blue)](https://central.sonatype.com/artifact/dev.skymansandy/json-cmp) Kotlin Multiplatform Compose JSON viewer and editor component for Android, iOS, and JVM Desktop. @@ -18,19 +18,14 @@ Kotlin Multiplatform Compose JSON viewer and editor component for Android, iOS, ## Installation -Add the GitHub Packages repository to your `settings.gradle.kts`: +Add `mavenCentral()` to your repositories in `settings.gradle.kts`: ```kotlin // settings.gradle.kts dependencyResolutionManagement { repositories { - maven { - url = uri("https://maven.pkg.github.com/skymansandy/jsonCMP") - credentials { - username = providers.gradleProperty("gpr.user").orNull ?: System.getenv("GITHUB_USERNAME") - password = providers.gradleProperty("gpr.key").orNull ?: System.getenv("GITHUB_TOKEN") - } - } + mavenCentral() + google() } } ``` diff --git a/build.gradle.kts b/build.gradle.kts index f25eb20..4d1486d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,6 +10,7 @@ plugins { alias(libs.plugins.detekt) apply false alias(libs.plugins.mokkery) apply false alias(libs.plugins.kover) + alias(libs.plugins.mavenPublish) apply false } dependencies { @@ -29,28 +30,41 @@ subprojects { val jsoncmpGroup = findProperty("jsoncmp.group") as String val jsoncmpVersion = findProperty("jsoncmp.version") as String - group = jsoncmpGroup - version = jsoncmpVersion - - apply(plugin = "maven-publish") + apply(plugin = "com.vanniktech.maven.publish") afterEvaluate { - extensions.findByType()?.apply { - repositories { - maven { - name = "GitHubPackages" - url = uri( - System.getenv("MAVEN_REPO_URL") - ?: "https://maven.pkg.github.com/skymansandy/jsonCMP" - ) - credentials { - username = System.getenv("MAVEN_REPO_USERNAME") - ?: findProperty("gpr.user") as? String ?: "" - password = System.getenv("MAVEN_REPO_PASSWORD") - ?: findProperty("gpr.key") as? String ?: "" - } + tasks.withType().configureEach { + isEnabled = !gradle.startParameter.taskNames.any { it.contains("MavenLocal", ignoreCase = true) } + } + } + + extensions.configure { + coordinates(jsoncmpGroup, name, jsoncmpVersion) + publishToMavenCentral(com.vanniktech.maven.publish.SonatypeHost.CENTRAL_PORTAL, automaticRelease = true) + signAllPublications() + + pom { + name.set("JsonCMP") + description.set("Kotlin Multiplatform Compose JSON viewer and editor component") + url.set("https://github.com/skymansandy/jsonCMP") + licenses { + license { + name.set("MIT License") + url.set("https://opensource.org/licenses/MIT") + } + } + developers { + developer { + id.set("skymansandy") + name.set("skymansandy") + email.set("iamsandythedev@gmail.com") } } + scm { + url.set("https://github.com/skymansandy/jsonCMP") + connection.set("scm:git:git://github.com/skymansandy/jsonCMP.git") + developerConnection.set("scm:git:ssh://github.com/skymansandy/jsonCMP.git") + } } } } diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md index 1fd8ce2..20cda50 100644 --- a/docs/getting-started/installation.md +++ b/docs/getting-started/installation.md @@ -2,27 +2,18 @@ ## Repository Setup -JsonCMP is published to GitHub Packages. Add the repository to your `settings.gradle.kts`: +JsonCMP is published to Maven Central. Add `mavenCentral()` to your repositories in `settings.gradle.kts`: ```kotlin // settings.gradle.kts dependencyResolutionManagement { repositories { - maven { - url = uri("https://maven.pkg.github.com/skymansandy/jsonCMP") - credentials { - username = providers.gradleProperty("gpr.user").orNull ?: System.getenv("GITHUB_USERNAME") - password = providers.gradleProperty("gpr.key").orNull ?: System.getenv("GITHUB_TOKEN") - } - } + mavenCentral() + google() } } ``` -> **Note:** GitHub Packages requires authentication. Add `gpr.user` and `gpr.key` to your -> `~/.gradle/gradle.properties` or set `GITHUB_USERNAME` and `GITHUB_TOKEN` environment variables. -> The token needs the `read:packages` scope. - ## Gradle (Kotlin DSL) Add the dependency to your KMP module: diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0865786..cbff344 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -22,6 +22,7 @@ composeBom = "2026.03.00" detekt = "1.23.8" mokkery = "3.3.0" kover = "0.9.7" +mavenPublish = "0.30.0" kotest = "6.1.7" turbine = "1.2.1" @@ -65,3 +66,4 @@ androidLint = { id = "com.android.lint", version.ref = "agp" } detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } mokkery = { id = "dev.mokkery", version.ref = "mokkery" } kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" } +mavenPublish = { id = "com.vanniktech.maven.publish", version.ref = "mavenPublish" } diff --git a/json-cmp/src/commonMain/kotlin/dev/skymansandy/jsoncmp/component/editor/CodeEditor.kt b/json-cmp/src/commonMain/kotlin/dev/skymansandy/jsoncmp/component/editor/CodeEditor.kt index 41f6c2f..23cc0b0 100644 --- a/json-cmp/src/commonMain/kotlin/dev/skymansandy/jsoncmp/component/editor/CodeEditor.kt +++ b/json-cmp/src/commonMain/kotlin/dev/skymansandy/jsoncmp/component/editor/CodeEditor.kt @@ -148,18 +148,17 @@ private fun LineNumberGutter( } .padding(start = 12.dp, end = 8.dp), ) { measurables, constraints -> - val textLayout = textLayoutResult val placeables = measurables.map { it.measure(constraints.copy(minWidth = 0, minHeight = 0)) } val width = placeables.maxOfOrNull { it.width } ?: 0 - val height = if (textLayout != null && textLayout.lineCount > 0) { - textLayout.getLineBottom(textLayout.lineCount - 1).toInt() + val height = if (textLayoutResult.lineCount > 0) { + textLayoutResult.getLineBottom(textLayoutResult.lineCount - 1).toInt() } else { placeables.sumOf { it.height } } layout(width, height) { placeables.forEachIndexed { index, placeable -> - val y = textLayout?.getLineTop(index)?.toInt() ?: (index * (placeables.firstOrNull()?.height ?: 0)) + val y = textLayoutResult.getLineTop(index).toInt() ?: (index * (placeables.firstOrNull()?.height ?: 0)) placeable.placeRelative(0, y) } } diff --git a/scripts/publish.sh b/scripts/publish.sh index d6743aa..7af734d 100755 --- a/scripts/publish.sh +++ b/scripts/publish.sh @@ -41,11 +41,12 @@ EXAMPLES: $(basename "$0") --remote --version 1.0.0-beta1 ENVIRONMENT VARIABLES (for --remote): - MAVEN_REPO_URL Remote Maven repository URL - MAVEN_REPO_USERNAME Repository username - MAVEN_REPO_PASSWORD Repository password/token + OSSRH_USERNAME Sonatype OSSRH username + OSSRH_PASSWORD Sonatype OSSRH password/token + GPG_PRIVATE_KEY ASCII-armored GPG private key (for signing) + GPG_PASSPHRASE GPG key passphrase - Alternatively, set gpr.user and gpr.key in ~/.gradle/gradle.properties + Alternatively, set ossrh.username and ossrh.password in ~/.gradle/gradle.properties EOF exit 0 } @@ -134,7 +135,7 @@ fi if [[ "$TARGET" == "local" ]]; then MAVEN_TASK="publishToMavenLocal" else - MAVEN_TASK="publishAllPublicationsToGitHubPackagesRepository" + MAVEN_TASK="publishAndReleaseToMavenCentral" fi cd "$PROJECT_ROOT" From 053d5eecab3fad7d68f0d3890f531f6c7e0f9706 Mon Sep 17 00:00:00 2001 From: Sandesh Date: Sat, 21 Mar 2026 18:34:22 +0530 Subject: [PATCH 3/3] Update icon --- README.md | 2 +- docs/getting-started/installation.md | 4 ++-- docs/icon-logo.svg | 11 +++++++++++ gradle.properties | 2 +- mkdocs.yml | 6 ++++-- 5 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 docs/icon-logo.svg diff --git a/README.md b/README.md index 55b212c..253d850 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Then add the dependency: ```kotlin // build.gradle.kts dependencies { - implementation("dev.skymansandy:json-cmp:1.0.0-alpha1") + implementation("dev.skymansandy:json-cmp:") } ``` diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md index 20cda50..cc4ac93 100644 --- a/docs/getting-started/installation.md +++ b/docs/getting-started/installation.md @@ -25,7 +25,7 @@ Add the dependency to your KMP module: kotlin { sourceSets { commonMain.dependencies { - implementation("dev.skymansandy:json-cmp:1.0.0-alpha2") + implementation("dev.skymansandy:json-cmp:") } } } @@ -36,7 +36,7 @@ Add the dependency to your KMP module: ```kotlin // build.gradle.kts dependencies { - implementation("dev.skymansandy:json-cmp:1.0.0-alpha2") + implementation("dev.skymansandy:json-cmp:") } ``` diff --git a/docs/icon-logo.svg b/docs/icon-logo.svg new file mode 100644 index 0000000..0ae3ba3 --- /dev/null +++ b/docs/icon-logo.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/gradle.properties b/gradle.properties index f94d15c..b8c09e6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,4 +17,4 @@ android.r8.strictFullModeForKeepRules=false #Publishing jsoncmp.group=dev.skymansandy -jsoncmp.version=1.0.0-alpha1 +jsoncmp.version=1.0.0-beta1 diff --git a/mkdocs.yml b/mkdocs.yml index 5dd4dfe..9ee183d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -8,13 +8,13 @@ theme: name: material palette: - scheme: default - primary: teal + primary: deep purple accent: amber toggle: icon: material/brightness-7 name: Switch to dark mode - scheme: slate - primary: teal + primary: deep purple accent: amber toggle: icon: material/brightness-4 @@ -29,6 +29,8 @@ theme: - content.tabs.link - search.highlight - search.share + logo: icon-logo.svg + favicon: icon.png icon: repo: fontawesome/brands/github