Skip to content
Draft
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
5 changes: 2 additions & 3 deletions .github/workflows/gh-pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ permissions:

env:
GRADLE_OPTS: -Dorg.gradle.daemon=false
JEKYLL_ENV: production

jobs:
deploy:
Expand All @@ -33,8 +32,8 @@ jobs:
with:
cache-read-only: true

- run: ./gradlew -Pbaseurl='${{ steps.pages.outputs.base_path }}' :website:browserBuild
- run: ./gradlew :documentation:jsBrowserDistribution

- uses: JamesIves/github-pages-deploy-action@v4
with:
folder: website/_site
folder: documentation/build/dist/js/productionExecutable
39 changes: 39 additions & 0 deletions documentation/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
## Android

```shell
./gradlew installDebug
```

## Web

```shell
./gradlew jsBrowserDevelopmentRun
```

## Desktop (JVM)

```shell
./gradlew run
```

## Desktop (macOS)

```shell
./gradlew runDebugExecutableMacosArm64
```

# Development

## Resources

### Charts

Mermaid charts should be placed in the `mermaid/` directory with `.mermaid` extensions.
To convert the `*.mermaid` files (from the `mermaid` directory) to PNGs (in the
`src/commonMain/composeResources/drawable/` directory), run `convert.sh`.

To generate resources and accessors run:

```shell
./gradlew :documentation:generateComposeResClass :documentation:generateResourceAccessorsForCommonMain
```
114 changes: 114 additions & 0 deletions documentation/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
import org.jetbrains.compose.desktop.application.dsl.TargetFormat

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

kotlin {
jvmToolchain(libs.versions.jvm.toolchain.get().toInt())

androidTarget()
iosArm64 {
binaries.framework {
baseName = "DocumentationApp"
binaryOption("bundleId", "com.juul.krayon.documentation.ios")
binaryOption("bundleShortVersionString", "1.0.0")
binaryOption("bundleVersion", "1")
}
}
js {
outputModuleName = "documentation"
browser {
commonWebpackConfig {
outputFileName = "documentation.js"
}
}
binaries.executable()
}
jvm()
macosArm64 {
binaries {
executable {
entryPoint = "com.juul.krayon.documentation.main"
}
}
}

sourceSets {
all {
languageSettings.optIn("kotlin.js.ExperimentalJsExport")
languageSettings.optIn("org.jetbrains.compose.resources.ExperimentalResourceApi")
}

commonMain.dependencies {
implementation(compose.components.resources)
implementation(compose.foundation)
implementation(compose.material)
implementation(compose.runtime)
implementation(compose.ui)
implementation(libs.coroutines.core)
implementation(libs.highlights)
implementation(libs.markdown)
implementation(libs.navigation)
implementation(libs.serialization)
implementation(projects.box)
implementation(projects.compose)
}

androidMain.dependencies {
implementation(libs.androidx.activity.compose)
implementation(libs.coroutines.android)
}

jvmMain.dependencies {
implementation(compose.desktop.currentOs)
implementation(compose.preview)
implementation(libs.coroutines.swing)
}
}
}

android {
namespace = "com.juul.krayon.documentation"
compileSdk = libs.versions.android.compile.get().toInt()

sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
sourceSets["main"].res.srcDirs("src/commonMain/composeResources")
sourceSets["main"].resources.srcDirs("src/commonMain/composeResources/files")

defaultConfig {
applicationId = "com.juul.krayon.documentation"
minSdk = libs.versions.android.min.get().toInt()
targetSdk = libs.versions.android.target.get().toInt()
versionCode = 1
versionName = "1.0"
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
buildFeatures.compose = true
}

compose {
desktop {
application {
mainClass = "com.juul.krayon.documentation.Main_jvmKt"
nativeDistributions {
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
packageName = "documentation"
packageVersion = "1.0.0"
}

buildTypes.release.proguard {
version.set("7.4.0")
configurationFiles.from(project.file("proguard-rules.pro"))
}
}
}
}
2 changes: 2 additions & 0 deletions documentation/mermaid/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
node_modules/
package*.json
25 changes: 25 additions & 0 deletions documentation/mermaid/class_structure.mermaid
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
graph LR;
Data --> Elements
subgraph Krayon
Elements
SvgKanvas
subgraph Web
HtmlKanvas
end
subgraph Android
AndroidKanvas
ComposeKanvas
end
subgraph iOS
CGContextKanvas
end
end
Elements --> HtmlKanvas
Elements --> AndroidKanvas
Elements --> SvgKanvas
Elements --> ComposeKanvas
Elements --> CGContextKanvas
style Krayon fill:#b3e5fc
style Web fill:#e8d44d
style Android fill:#9fc137
style iOS fill:#adadad
9 changes: 9 additions & 0 deletions documentation/mermaid/convert.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/usr/bin/env bash

npm install @mermaid-js/mermaid-cli
for file in *.mermaid; do
./node_modules/.bin/mmdc npx mmdc \
--backgroundColor transparent \
--input "$file" \
--output "../src/commonMain/composeResources/drawable/${file%.mermaid}.png"
done
2 changes: 2 additions & 0 deletions documentation/mermaid/data_to_dom.mermaid
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
graph LR;
Data -- D3 --> DOM;
109 changes: 109 additions & 0 deletions documentation/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
-keep class com.google.gson.reflect.TypeToken
-keep class * extends com.google.gson.reflect.TypeToken
-keep public class * implements java.lang.reflect.Type

-keep class data.io.** { *; }
-keep class base.** { *; }
-keep class kotlinx.coroutines.** { *; }

-keep class com.google.firebase.** { *; }
-keep class com.google.android.gms.** { *; }
-keep class org.koin.** { *; }
-keep class org.koin.core.** { *; }
-keep class org.koin.dsl.** { *; }
-keep class io.ktor.utils.io.** { *; }
-keep class io.ktor.utils.io.jvm.** { *; }
-keep class io.ktor.utils.io.nio.** { *; }
-keep class io.ktor.server.config.** { *; }
-keep class io.ktor.serialization.** { *; }
-keep class kotlin.reflect.jvm.internal.** { *; }
-keep class coil3.** { *; }
-keep class androidx.datastore.preferences.** { *; }
-keep class androidx.collection.** { *; }
-keep class androidx.lifecycle.** { *; }
-keep class android.graphics.drawable.Drawable { *; }
-keep class android.graphics.Bitmap { *; }
-keep class android.graphics.Canvas { *; }
-keep class android.graphics.Shader$TileMode { *; }
-keep class android.graphics.Shader { *; }
-keep class android.graphics.Paint { *; }
-keep class android.graphics.BitmapShader { *; }
-keep class android.database.** { *; }
-keep class android.os.** { *; }
-keep class android.asynclayoutinflater.view.** { *; }
-keep class androidx.core.graphics.drawable.** { *; }
-keep class androidx.core.internal.view.** { *; }
-keep class kotlin.** { *; }
-keep class org.jetbrains.skia.** { *; }
-keep class org.jetbrains.skiko.** { *; }
-keep class android.view.** { *; }
-keep class org.example.project.NavigationNode

-keepattributes SourceFile,LineNumberTable,Signature,*Annotation*

-keepclasseswithmembers public class MainKt {
public static void main(java.lang.String[]);
}

-assumenosideeffects public class androidx.compose.runtime.ComposerKt {
void sourceInformation(androidx.compose.runtime.Composer,java.lang.String);
void sourceInformationMarkerStart(androidx.compose.runtime.Composer,int,java.lang.String);
void sourceInformationMarkerEnd(androidx.compose.runtime.Composer);
}

# caused crashes on release Jvm
#-dontwarn androidx.compose.material.**
#-keep class androidx.compose.material3.** { *; }
#-keep class androidx.compose.runtime.** { *; }

# Keep `INSTANCE.serializer()` of serializable objects.
-if @kotlinx.serialization.Serializable class ** {
public static ** INSTANCE;
}
-keepclassmembers class <1> {
public static <1> INSTANCE;
kotlinx.serialization.KSerializer serializer(...);
}
# Keep `Companion` object fields of serializable classes.
# This avoids serializer lookup through `getDeclaredClasses` as done for named companion objects.
-if @kotlinx.serialization.Serializable class **
-keepclassmembers class <1> {
static <1>$Companion Companion;
}

# Keep `serializer()` on companion objects (both default and named) of serializable classes.
-if @kotlinx.serialization.Serializable class ** {
static **$* *;
}
-keepclassmembers class <2>$<3> {
kotlinx.serialization.KSerializer serializer(...);
}

# Keep `INSTANCE.serializer()` of serializable objects.
-if @kotlinx.serialization.Serializable class ** {
public static ** INSTANCE;
}
-keepclassmembers class <1> {
public static <1> INSTANCE;
kotlinx.serialization.KSerializer serializer(...);
}

# @Serializable and @Polymorphic are used at runtime for polymorphic serialization.
-keepattributes RuntimeVisibleAnnotations,AnnotationDefault

# Don't print notes about potential mistakes or omissions in the configuration for kotlinx-serialization classes
# See also https://github.com/Kotlin/kotlinx.serialization/issues/1900
-dontnote kotlinx.serialization.**

# Serialization core uses `java.lang.ClassValue` for caching inside these specified classes.
# If there is no `java.lang.ClassValue` (for example, in Android), then R8/ProGuard will print a warning.
# However, since in this case they will not be used, we can disable these warnings
-dontwarn kotlinx.serialization.internal.ClassValueReferences

# disable optimisation for descriptor field because in some versions of ProGuard, optimization generates incorrect bytecode that causes a verification error
# see https://github.com/Kotlin/kotlinx.serialization/issues/2719
-keepclassmembers public class **$$serializer {
private ** descriptor;
}

-ignorewarnings
19 changes: 19 additions & 0 deletions documentation/src/androidMain/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:label="@string/app_title"
android:theme="@android:style/Theme.Material.NoActionBar"
>

<activity
android:name=".MainActivity"
android:exported="true"
>

<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
13 changes: 13 additions & 0 deletions documentation/src/androidMain/kotlin/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.juul.krayon.documentation

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent

class MainActivity : ComponentActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent { App() }
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<resources>
<string name="app_title">Krayon: Documentation</string>
<string name="tutorial_title">Tutorial</string>
<string name="samples_title">Samples</string>
<string name="chart_sample_title">Chart Sample</string>
</resources>
Loading