From 27b43246efb0e61ab6d62135d828344b6123bab9 Mon Sep 17 00:00:00 2001 From: mkpaz Date: Sun, 11 Sep 2022 17:32:18 +0400 Subject: [PATCH] Update README --- .screenshots/logo.jpg | Bin 0 -> 21519 bytes README.md | 78 ++++++++++++++---------------------------- 2 files changed, 25 insertions(+), 53 deletions(-) create mode 100644 .screenshots/logo.jpg diff --git a/.screenshots/logo.jpg b/.screenshots/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9ecc624f4d2047a41a452e198c2db6878c73cbf5 GIT binary patch literal 21519 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 HcILq!Nhf86 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 7921a8a..e58d9c3 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# AtlantaFX +![logo](./.screenshots/logo.jpg) -![alt](./.screenshots/demo.gif) +**[📙 Docs](https://mkpaz.github.io/atlantafx/) | [📸 Screenshots](https://github.com/mkpaz/atlantafx/tree/master/.screenshots)** -Features: +JavaFX CSS theme collection with additional controls. * Modern flat interface inspired by the variety of Web component frameworks. * CSS first. It works with existing JavaFX controls. @@ -13,17 +13,21 @@ Features: * Custom themes support. Compile your own theme from existing SASS sources. * Additional controls that essential for modern GUI development. * Sampler app: - * play with themes and fonts - * test every feature of each existing control and check source code directly in the app to learn how to implement it - * check color palette and modify theme color contrast - * hot reload; play with control styles without restarting the whole app - * showcases that demonstrate real-world project usage + * Play with themes and fonts. + * Test every feature of each existing control and check source code directly in the app to learn how to implement it. + * Check color palette and modify theme color contrast. + * Hot reload. Play with control styles without restarting the whole app. + * Showcases that demonstrate real-world project usage included. + +![alt](./.screenshots/demo.gif) ## Try it out Grab a **[self-updating download of the Sampler app](https://downloads.hydraulic.dev/atlantafx/sampler/download.html)** for Windows, macOS and Linux, packaged with [Conveyor](https://www.hydraulic.software). -## Installing +Or download the latest build on the [releases page](https://github.com/mkpaz/atlantafx/releases). + +## Getting started **Requirements:** JavaFX 17+ (because of `data-url` support). @@ -43,70 +47,38 @@ Application.setUserAgentStylesheet(new PrimerDark().getUserAgentStylesheet()); // ... find more themes in 'atlantafx.base.theme' package ``` -## Build - -You can either use CLI or create run configuration in your favorite IDE. - -```sh -# compile SASS into styles/dist directory, -# you can stop here and use compiled CSS files just like that -mvn install -pl styles - -# compile additional controls, it will also copy previously compiled CSS files -# into the module classpath -mvn install -pl base -``` - -After building module dependencies you can play with the sampler application. If you just want the demo, run: - -```sh -mvn javafx:run -pl sampler -``` - -If you want to use hot reload (update CSS without restarting sampler) you have to start app in development mode. There's [ATLANTAFX_MODE](https://github.com/mkpaz/atlantafx/blob/master/sampler/src/main/java/atlantafx/sampler/Launcher.java#L45) variable for this. In that mode app won't use CSS from `base` module classpath, but from the `sampler/target/classes/atlantafx/sampler/theme-test` directory. Use `-Pdev` to compile CSS files into that destination. - -```sh -# run sampler app in dev mode -mvn javafx:run -pl sampler -Pdev - -# run hot reload sass -mvn compile -pl styles -Pdev -``` - -More details can be found in the source code: - -* See [github worklow](https://github.com/mkpaz/atlantafx/blob/master/.github/workflows/tagged-release.yml) for install instructions. +Check the [docs](https://mkpaz.github.io/atlantafx/) for more information. ## Motivation **Goals**: -- SASS +* SASS - JavaFX standard themes, namely Modena and Caspian, maintained as a huge single CSS file, which is an overwhelmingly hard task. This alone makes creating a new JavaFX theme from scratch hardly possible. Also JavaFX styling is based on CSS v2.1 specification which does not provide nor variables, nor mixins, nor modules nor any other goodies that are default for modern frontend development. AtlantaFX themes are written on SASS with each component in a separate module and use recent [Dart SASS](https://sass-lang.com/dart-sass) implementation for CSS compilation. It also follows [Github Primer](https://primer.style/design/foundations/color) color system to make creating new themes more simple. + JavaFX standard themes, namely Modena and Caspian, maintained as a huge single CSS file, which is an overwhelmingly hard task. This alone makes creating a new JavaFX theme from scratch hardly possible. Also, JavaFX styling is based on CSS v2.1 specification which does not provide, nor variables, nor mixins, nor modules nor any other goodies that are default for modern front-end development. AtlantaFX themes are written in SASS with each component in a separate module and use recent [Dart SASS](https://sass-lang.com/dart-sass) implementation for CSS compilation. It also follows [Github Primer](https://primer.style/design/foundations/color) color system to make creating new themes more simple. -- Additional controls +* Additional controls - JavaFX 2.0 was started in 2011, and it introduced no additional controls since then. Some JavaFX controls are obsolete, some can be found in popular third-party libraries like [ControlsFX](https://github.com/controlsfx/controlsfx). The problem with the latter is that it provides much more than some missing controls. It provides many things that can be called a widget. That's why AtlantaFX borrows some existing controls from ControlsFX instead of supporting it directly. The rule of the thumb is to not re-invent any existing control from `javafx-controls` and to avoid widgets and everything that requires i18n support. + JavaFX 2.0 was started in 2011, and it introduced no additional controls since then. Some JavaFX controls are obsolete, some can be found in popular third-party libraries like [ControlsFX](https://github.com/controlsfx/controlsfx). The problem with the latter is that it provides much more than some missing controls. It provides many things that can be called a widget. That's why AtlantaFX borrows some existing controls from ControlsFX instead of supporting it directly. The rule of the thumb is to not re-invent any existing control from `javafx-controls` and to avoid widgets as well as everything that requires i18n support. -- Sampler application +* Sampler application Theme development is not possible without some kind of demo application where you can test each control under every angle. That's what the Sampler application is. It supports hot reload, thanks to [cssfx](https://github.com/McFoggy/cssfx), and you can observe the scene graph via [Scenic View](https://github.com/JonathanGiles/scenic-view). -- Distribution and flexibility +* Distribution and flexibility - AtlantaFX is also distributed as a collection of CSS files. So, if you don't need additional controls, you can just download only CSS and use it via `Application.setUserAgentStylesheet()` method. If your application is only need a subset of controls, you can compile your own theme by just removing unnecessary components from SASS. + AtlantaFX is also distributed as a collection of CSS files. So, if you don't need additional controls, you can just download only CSS and use it via `Application.setUserAgentStylesheet()` method. If your application is only needs a subset of controls, you can compile your own theme by just removing unnecessary components from SASS. **Non-goals**: -- Replacing `javafx-controls` or standard JavaFX themes +* Replacing `javafx-controls` or standard JavaFX themes - It's not a goal to re-invent any existing `javafx-controls` component or replace standard JavaFX themes. Libraries come and gone, but committing into the core project benefits all the community. + It's not a goal to re-invent any existing `javafx-controls` component or replace standard JavaFX themes. Libraries come and gone, but committing to the core project benefits all the community. -- Mobile support +* Mobile support This is a tremendous amount of work. Just use [Gluon Mobile](https://gluonhq.com/products/mobile/). -- Providing theme API +* Providing theme API AtlantaFX provides the Theme interface, which is nothing but a simple wrapper around the stylesheet path. [PR](https://github.com/openjdk/jfx/pull/511) is on its way, let's hope it will ever be merged.