diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..d157fc1 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,6 @@ +## Contributing + +Contributions are highly welcome. + +If you find a bug or would like have some feature implemented, file an issue. +You can also create a pull request if you have working solution for some issue. diff --git a/README.md b/README.md new file mode 100644 index 0000000..5477512 --- /dev/null +++ b/README.md @@ -0,0 +1,151 @@ +# Uranium + +[ ![Download](https://api.bintray.com/packages/karol202/uranium/uranium-core/images/download.svg) ]( +https://bintray.com/karol202/uranium/uranium-core/_latestVersion +) +[ ![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg) ]( +https://opensource.org/licenses/MIT +) + +Uranium is an universal, declarative UI library for Kotlin Multiplatform inspired by architecture of React.js. +It allows you to create applications for various platforms using beautiful DSL in component-based manner. + +## Contents +- [How to use?](#how-to-use) +- [Why uranium?](#why-uranium) +- [How does it work?](#how-does-it-work) +- [Contributing](#contributing) + +## How to use? + +This project acts only as a platform-agnostic core of the uranium library, +and you probably don't want to use it directly (unless contributing to uranium) +as it does not provide any useful platform implementation. + +Instead, you can use one of the below uranium libraries: +- [uranium-swing](https://github.com/karol-202/uranium-swing) - +uranium implementation allowing creating cross-platform (run in JVM) Swing-based desktop apps +- [uranium-arkade](https://github.com/karol-202/uranium-arkade/) - +uranium implementation for creating 2D games, currently supports HTML5 canvas +- more implementations are planned + +However, if you would like to use uranium-core directly, +for example in order to create your own platform implementation, +you can gather it from [jCenter](https://bintray.com/karol202/uranium/uranium-core). + +Gradle (Kotlin DSL): +```kotlin +dependencies { + implementation("pl.karol202.uranium:uranium-core-jvm:0.2-2") +} +``` + +Gradle (Groovy): +```groovy +dependencies { + implementation "pl.karol202.uranium:uranium-core-jvm:0.2-2" +} +``` + +Maven: +```xml + + pl.karol202.uranium + uranium-core-jvm + 0.2-2 + +``` + +uranium-core comes in a few variants: +- `uranium-core` - common artifact, +useful when using in Kotlin Multiplatform project +- `uranium-core-jvm` - JVM artifact +- `uranium-core-js` - JS (browser) artifact +- `uranium-core-wasm32` - Kotlin/Native WebAssembly artifact + +Support for more platforms is planned, feel free to create an issue in case of need. + +## Why uranium? + +React is undoubtedly a nice way to create web or mobile applications. +It is liked for its architecture allowing one to create component-based apps with in simple way. +However, it has one big drawback - the language. +Javascript, in addition to many other flaws, +is not a language that fits well into platforms other than web, +because, due to its interpreted nature, it's simply slow +(take example of React Native or Electron, +that despite being an interesting cross-platform alternatives, +are noticeably less responsive than native apps). + +There have been ports of React to Kotlin/JS for those wanting to +combine advantages of both the library and the language. +Although it resolved many of the JS language flaws related to writing app itself, +it was only a partial solution, because it was only designed for React for web pages. +Still, other downsides (such as the performance one) were making it +impossible or impractical to use it on mobile, desktop or to create high-performance games. + +So why not to create a React-like library from scratch in Kotlin? +Kotlin can be compiled to many targets (JVM, JS, Windows, Linux, +macOS, WASM, etc.), so as a language it fits perfectly for such a library to be written in. +In addition, it is type safe, concise and interoperable with other languages. +That's why I created uranium. + +uranium aims to combine the advantages of React, such as being declarative, +component-based, unidirectional and simple with qualities of Kotlin, while +being fully universal and possible to use on every platform without performance issues. + +## How does it work? + +Every piece of layout in Uranium is a component. +Components have their own lifecycle managed internally by uranium. +The only thing necessary to create component is a `render` method, +that you can use to build complex hierarchies using other components. + +```kotlin +class HelloComponent(props: BasicProps) : SwingAbstractAppComponent(props) +{ + override fun SwingRenderScope.render() = boxLayout(axis = BoxAxis.Y) { + + label().text("Hello") + + label().text("world") + } +} +``` + +Every component receives props as input from parent component. +Additionally, you can define state if you want your component to be stateful. +State changes automatically make affected components rerender, +so there's no need for updating everything manually in the imperative way. + +```kotlin +class NameComponent(props: Props) : SwingAbstractAppComponent(props), + UStateful +{ + data class Props(override val key: Any, + val initialName: String) : UProps + + data class State(val name: String) : UState + + override var state by state(State(props.initialName)) + + override fun SwingRenderScope.render() = boxLayout(axis = BoxAxis.Y) { + + textField() + .text(state.name) + .onTextChange(::setName) + + label() + .text("Hello, ${state.name}") + } + + private fun setName(text: String) = setState { copy(name = text) } +} +``` + +Above is a simple Swing component containing a text field and a label displaying value from the text field. + +For more details on how uranium works, go to the [wiki](https://github.com/karol-202/uranium/wiki). + +## Contributing + +Contributions are highly welcome. + +If you find a bug or would like have some feature implemented, file an issue. +You can also create a pull request if you have working solution for some issue. diff --git a/uranium-core/build.gradle.kts b/uranium-core/build.gradle.kts index c90eb07..4e65985 100644 --- a/uranium-core/build.gradle.kts +++ b/uranium-core/build.gradle.kts @@ -2,8 +2,8 @@ import com.jfrog.bintray.gradle.BintrayExtension.PackageConfig plugins { kotlin("multiplatform") version "1.3.72" - `maven-publish` id("com.jfrog.bintray") version "1.8.5" + `maven-publish` } kotlin {