瀏覽代碼

:boom: Prepare for version 11.13.0 release

New demo finally available
README.md updated

Signed-off-by: palexdev <alessandro.parisi406@gmail.com>
palexdev 3 年之前
父節點
當前提交
f43edf8ee7
共有 100 個文件被更改,包括 2749 次插入5620 次删除
  1. 44 74
      README.md
  2. 1 1
      build.gradle
  3. 4 4
      demo/build.gradle
  4. 17 54
      demo/src/main/java/io/github/palexdev/materialfx/demo/Demo.java
  5. 0 192
      demo/src/main/java/io/github/palexdev/materialfx/demo/TestDemo.java
  6. 46 0
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/ChecksRadiosToggleController.java
  7. 97 0
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/ComboBoxesController.java
  8. 0 173
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/ComboBoxesDemoController.java
  9. 0 50
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/DatePickersDemoController.java
  10. 116 273
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/DemoController.java
  11. 82 271
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/DialogsController.java
  12. 68 0
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/FontResourcesController.java
  13. 0 104
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/FontResourcesDemoController.java
  14. 0 75
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/InfoController.java
  15. 0 54
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/LabelsDemoController.java
  16. 88 0
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/ListViewsController.java
  17. 0 240
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/ListViewsDemoController.java
  18. 206 113
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/NotificationsController.java
  19. 22 0
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/PickersController.java
  20. 0 90
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/ProgressBarsDemoController.java
  21. 72 0
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/ProgressController.java
  22. 0 69
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/ProgressSpinnersDemoController.java
  23. 0 63
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/ScrollPaneDemoController.java
  24. 54 0
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/ScrollPanesController.java
  25. 22 0
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/SlidersController.java
  26. 0 40
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/SlidersDemoController.java
  27. 186 0
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/StepperController.java
  28. 0 171
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/StepperDemoController.java
  29. 86 0
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/TableViewsController.java
  30. 0 196
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/TableViewsDemoController.java
  31. 97 0
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/TextFieldsController.java
  32. 0 95
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/TextFieldsDemoController.java
  33. 0 55
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/TogglesController.java
  34. 0 189
      demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/TreeviewsDemoController.java
  35. 88 0
      demo/src/main/java/io/github/palexdev/materialfx/demo/model/Device.java
  36. 0 92
      demo/src/main/java/io/github/palexdev/materialfx/demo/model/FilterablePerson.java
  37. 0 93
      demo/src/main/java/io/github/palexdev/materialfx/demo/model/Machine.java
  38. 150 0
      demo/src/main/java/io/github/palexdev/materialfx/demo/model/Model.java
  39. 41 86
      demo/src/main/java/io/github/palexdev/materialfx/demo/model/Person.java
  40. 0 76
      demo/src/main/java/io/github/palexdev/materialfx/demo/model/SimplePerson.java
  41. 0 82
      demo/src/main/resources/io/github/palexdev/materialfx/demo/ButtonsDemo.fxml
  42. 0 84
      demo/src/main/resources/io/github/palexdev/materialfx/demo/CheckBoxesDemo.fxml
  43. 0 86
      demo/src/main/resources/io/github/palexdev/materialfx/demo/ComboBoxesDemo.fxml
  44. 0 71
      demo/src/main/resources/io/github/palexdev/materialfx/demo/DatePickersDemo.fxml
  45. 0 85
      demo/src/main/resources/io/github/palexdev/materialfx/demo/Demo.fxml
  46. 0 94
      demo/src/main/resources/io/github/palexdev/materialfx/demo/DialogsDemo.fxml
  47. 0 44
      demo/src/main/resources/io/github/palexdev/materialfx/demo/FontResourcesDemo.fxml
  48. 0 115
      demo/src/main/resources/io/github/palexdev/materialfx/demo/InfoDialog.fxml
  49. 0 53
      demo/src/main/resources/io/github/palexdev/materialfx/demo/LabelsDemo.fxml
  50. 0 108
      demo/src/main/resources/io/github/palexdev/materialfx/demo/ListViewsDemo.fxml
  51. 0 47
      demo/src/main/resources/io/github/palexdev/materialfx/demo/NotificationsDemo.fxml
  52. 0 45
      demo/src/main/resources/io/github/palexdev/materialfx/demo/ProgressBarsDemo.fxml
  53. 0 81
      demo/src/main/resources/io/github/palexdev/materialfx/demo/ProgressSpinnersDemo.fxml
  54. 0 78
      demo/src/main/resources/io/github/palexdev/materialfx/demo/RadioButtonsDemo.fxml
  55. 0 57
      demo/src/main/resources/io/github/palexdev/materialfx/demo/ScrollPanesDemo.fxml
  56. 0 113
      demo/src/main/resources/io/github/palexdev/materialfx/demo/SlidersDemo.fxml
  57. 0 37
      demo/src/main/resources/io/github/palexdev/materialfx/demo/StepperDemo.fxml
  58. 0 43
      demo/src/main/resources/io/github/palexdev/materialfx/demo/TableViewsDemo.fxml
  59. 0 59
      demo/src/main/resources/io/github/palexdev/materialfx/demo/TextFieldsDemo.fxml
  60. 0 85
      demo/src/main/resources/io/github/palexdev/materialfx/demo/ToggleButtonsDemo.fxml
  61. 0 70
      demo/src/main/resources/io/github/palexdev/materialfx/demo/TreeViewsDemo.fxml
  62. 二進制
      demo/src/main/resources/io/github/palexdev/materialfx/demo/assets/logo.png
  63. 二進制
      demo/src/main/resources/io/github/palexdev/materialfx/demo/assets/welcome1.wav
  64. 二進制
      demo/src/main/resources/io/github/palexdev/materialfx/demo/assets/welcome2.wav
  65. 55 0
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/Buttons.css
  66. 0 65
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ButtonsDemo.css
  67. 0 21
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/CheckBoxesDemo.css
  68. 129 0
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ChecksRadiosToggles.css
  69. 101 0
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ComboBoxes.css
  70. 0 24
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ComboBoxesDemo.css
  71. 19 234
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/Common.css
  72. 0 37
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/CustomDatePicker.css
  73. 0 25
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/DatePickersDemo.css
  74. 72 114
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/Demo.css
  75. 30 0
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ExampleNotification.css
  76. 8 0
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/FontResources.css
  77. 0 65
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/InfoDialog.css
  78. 72 0
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ListViews.css
  79. 0 71
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ListViewsDemo.css
  80. 17 5
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/MFXColors.css
  81. 115 0
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/Pickers.css
  82. 84 0
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/Progress.css
  83. 0 56
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ProgressBarDemo.css
  84. 0 75
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ProgressSpinnersDemo.css
  85. 0 24
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/RadioButtonsDemo.css
  86. 0 31
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ScrollPanesDemo.css
  87. 63 0
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/Sliders.css
  88. 0 57
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/SlidersDemo.css
  89. 47 0
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/Stepper.css
  90. 0 26
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/StepperDemo.css
  91. 0 29
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/TestDemo.css
  92. 64 0
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/TextFields.css
  93. 0 101
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/TextFieldsDemo.css
  94. 0 30
      demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ToggleButtonsDemo.css
  95. 286 0
      demo/src/main/resources/io/github/palexdev/materialfx/demo/fonts/Fonts.css
  96. 二進制
      demo/src/main/resources/io/github/palexdev/materialfx/demo/fonts/Varela/VarelaRound-Regular.ttf
  97. 二進制
      demo/src/main/resources/io/github/palexdev/materialfx/demo/fonts/Visby/VisbyRoundCF-Bold.ttf
  98. 二進制
      demo/src/main/resources/io/github/palexdev/materialfx/demo/fonts/Visby/VisbyRoundCF-DemiBold.ttf
  99. 二進制
      demo/src/main/resources/io/github/palexdev/materialfx/demo/fonts/Visby/VisbyRoundCF-ExtraBold.ttf
  100. 二進制
      demo/src/main/resources/io/github/palexdev/materialfx/demo/fonts/Visby/VisbyRoundCF-ExtraLight.ttf

+ 44 - 74
README.md

@@ -10,7 +10,7 @@
 <br />
 <p align="center">
   <a href="https://github.com/palexdev/MaterialFX">
-    <img src=https://imgur.com/qBOvrWD.png" alt="Logo" width="720">
+    <img src=https://imgur.com/7NdnoFl.png" alt="Logo">
   </a>
 </p>
 
@@ -18,7 +18,7 @@
 <h3 align="center">MaterialFX</h3>
 
 <p align="center">
-    MaterialFX is an open source Java library which provides material components for JavaFX
+    MaterialFX is an open source Java library which provides material design components for JavaFX
     <br />
     <a href="https://github.com/palexdev/MaterialFX/wiki"><strong>Explore the wiki »</strong></a>
     <br />
@@ -37,10 +37,10 @@
 * [About the Project and History of JavaFX](#about-the-project-and-history-of-javafx)
 * [Some GIFs](#preview-gifs)
 * [Getting Started](#getting-started)
-    * [Build](#build)
-    * [Usage](#usage)
-        * [Gradle](#gradle)
-        * [Maven](#maven)
+  * [Build](#build)
+  * [Usage](#usage)
+    * [Gradle](#gradle)
+    * [Maven](#maven)
 * [Roadmap](#roadmap)
 * [Contributing](#contributing)
 * [License](#license)
@@ -81,97 +81,83 @@ To date MaterialFX offers not only restyled controls, but also: new and unique c
 
 ## Preview GIFs
 
-#### Imgur Link: [Gallery](https://gifyu.com/album/cU3)
+#### Imgur Link: [Gallery](https://imgur.com/a/IrDirnI)
 
 <i>
 <details>
 <summary>Buttons</summary>
 <br>
-<img src="https://s6.gifyu.com/images/Buttons.gif" alt="Buttons" border="0">
+<img src="https://imgur.com/jATdGFL.gif" alt="Buttons" border="0">
 </details>
 <p></p>
 
 <details>
-<summary>CheckBoxes</summary>
+<summary>Check Boxes, Radio Buttons and Toggles</summary>
 <br>
-<img src="https://s6.gifyu.com/images/Checkboxes.gif" alt="Checkboxes" border="0">
+<img src="https://imgur.com/ArUhH58.gif" alt="Checkboxes" border="0">
 </details>
 <p></p>
 
 <details>
-<summary>ComboBoxes</summary>
+<summary>Combo Boxes</summary>
 <br>
-<img src="https://s6.gifyu.com/images/Comboboxes.gif" alt="Comboboxes" border="0">
-</details>
-<p></p>
-
-<details>
-<summary>DatePickers</summary>
-<br>
-<img src="https://s6.gifyu.com/images/Datepickers.gif" alt="Datepickers" border="0">
+<img src="https://imgur.com/BO0twpA.gif" alt="Comboboxes" border="0">
 </details>
 <p></p>
 
 <details>
 <summary>Dialogs</summary>
 <br>
-<img src="https://s6.gifyu.com/images/Dialogs843efeb715dfd031.gif" alt="Dialogs" border="0">
+<img src="https://imgur.com/LsxGeJh.gif" alt="Dialogs" border="0">
 </details>
-<p></p>
 
-<details>
-<summary>Labels</summary>
-<br>
-<img src="https://s6.gifyu.com/images/Labels.gif" alt="Labels" border="0">
-</details>
 <p></p>
-
 <details>
-<summary>ListViews</summary>
+<summary>Fields</summary>
 <br>
-<img src="https://s6.gifyu.com/images/Listviews.gif" alt="Listviews" border="0">
+<img src="https://imgur.com/XT2iVU7.gif" alt="Fields" border="0">
 </details>
 <p></p>
 
 <details>
-<summary>Notifications</summary>
+<summary>Lists</summary>
 <br>
-<img src="https://s6.gifyu.com/images/Notifications.gif" alt="Notifications" border="0">
+<img src="https://imgur.com/4Ckdn5z.gif" alt="Listviews" border="0">
 </details>
 <p></p>
 
 <details>
-<summary>ProgressBars</summary>
+<summary>Notifications</summary>
 <br>
-<img src="https://s6.gifyu.com/images/Progressbars.gif" alt="Progressbars" border="0">
+<img src="https://imgur.com/lgex2yO.gif" alt="Notifications" border="0">
 </details>
 <p></p>
 
 <details>
-<summary>ProgressSpinners</summary>
+<summary>Pickers</summary>
 <br>
-<img src="https://s6.gifyu.com/images/Progressspinners.gif" alt="Progressspinners" border="0">
+<img src="https://imgur.com/J3v3i9w.gif" alt="Pickers" border="0">
 </details>
 <p></p>
 
 <details>
-<summary>RadioButtons</summary>
+<summary>Progress</summary>
 <br>
-<img src="https://s6.gifyu.com/images/Radiobuttons.gif" alt="Radiobuttons" border="0">
+<img src="https://imgur.com/2E6X3uJ.gif" alt="Progress" border="0">
 </details>
 <p></p>
 
 <details>
-<summary>ScrollPanes</summary>
+<summary>Scroll Panes</summary>
 <br>
-<img src="https://s6.gifyu.com/images/Scrollpanes.gif" alt="Scrollpanes" border="0">
+<img src="https://imgur.com/8Jxu3TM.gif" alt="Scrollpanes" border="0">
 </details>
 <p></p>
 
 <details>
 <summary>Sliders</summary>
 <br>
-<img src="https://s6.gifyu.com/images/Sliders.gif" alt="Sliders" border="0">
+<img src="https://imgur.com/nOrsa1n.gif" alt="Sliders" border="0">
 </details>
 <p></p>
 
@@ -179,38 +165,16 @@ To date MaterialFX offers not only restyled controls, but also: new and unique c
 <details>
 <summary>Stepper</summary>
 <br>
-<img src="https://s6.gifyu.com/images/Stepper.gif" alt="Stepper" border="0">
-</details>
-<p></p>
-
-<details>
-<summary>TableViews</summary>
-<br>
-<img src="https://s6.gifyu.com/images/Tableviews.gif" alt="Tableviews" border="0">
-</details>
-<p></p>
-
-<details>
-<summary>TextFields</summary>
-<br>
-<img src="https://s6.gifyu.com/images/Textfields.gif" alt="Textfields" border="0">
-</details>
-<p></p>
-
-<details>
-<summary>Toggles</summary>
-<br>
-<img src="https://s6.gifyu.com/images/Toggles.gif" alt="Toggles" border="0">
+<img src="https://imgur.com/nEgV9F1.gif" alt="Stepper" border="0">
 </details>
 <p></p>
 
 <details>
-<summary>FontResources</summary>
+<summary>Tables</summary>
 <br>
-<img src="https://s6.gifyu.com/images/Fontresources.gif" alt="Radiobuttons" border="0">
+<img src="https://imgur.com/nj6xhUT.gif" alt="Tableviews" border="0">
 </details>
 <p></p>
-</i>
 
 <!-- GETTING STARTED -->
 
@@ -229,7 +193,10 @@ To run the main demo, execute the following command:
 
     gradlew run
 
-**NOTE** : MaterialFX requires **Java 11** and above.
+**NOTE**: MaterialFX requires **Java 11** and above.
+  
+**NOTE**: Starting from version 11.14.0 (next major version), MaterialFX will transition to
+Java 17 and bump version to 17.x.x. What will happen to version 11 is still to be decided
 
 ### Usage
 
@@ -241,7 +208,7 @@ repositories {
 }
 
 dependencies {
-implementation 'io.github.palexdev:materialfx:11.12.0'
+implementation 'io.github.palexdev:materialfx:11.13.0'
 }
 ```
 
@@ -251,7 +218,7 @@ implementation 'io.github.palexdev:materialfx:11.12.0'
 <dependency>
   <groupId>io.github.palexdev</groupId>
   <artifactId>materialfx</artifactId>
-  <version>11.12.0</version>
+  <version>11.13.0</version>
 </dependency>
 ```
 
@@ -259,7 +226,7 @@ implementation 'io.github.palexdev:materialfx:11.12.0'
 
 ## Roadmap
 
-See the [open issues](https://github.com/palexdev/MaterialFX/issues) for a list of proposed features (and known issues).  
+See the [Open Issues](https://github.com/palexdev/MaterialFX/issues) for a list of proposed features (and known issues).  
 See the [ROADMAP](https://github.com/palexdev/MaterialFX/blob/main/ROADMAP.md) for a list of implemented and upcoming features.
 
 <!-- CONTRIBUTING -->
@@ -294,10 +261,13 @@ Project Link: [https://github.com/palexdev/MaterialFX](https://github.com/palexd
 
 #### Donation
 
-Ever since I was a kid I have always liked programming, I find it interesting and often funny too, however it can also
-be a difficult and stressful job at times. This is my first public project, and I'm dedicating a lot of time to it. This
-is an open source library of course and everyone can use it for free, but if you feel like it you can make a small
-donation here. [![Donate](https://img.shields.io/badge/$-support-green.svg?style=flat-square)](https://bit.ly/31XB8zD)
+It's been more than a year since I started developing MaterialFX. Implementing cool looking, fully functional controls,
+introducing new components and features as well as providing many utilities for JavaFX and Java is really hard,
+especially considering that developing for JavaFX also means to deal with its closeness, its bugs, its annoying
+design decisions. Many times I've honestly been on the verge of giving up because sometimes it's really too much
+stress to handle.  
+**But**, today MaterialFX is a great library, supported by many people and I'm proud of it.
+If you are using MaterialFX in your projects and feel like it, you can make a small donation here: [![Donate](https://img.shields.io/badge/$-support-green.svg?style=flat-square)](https://bit.ly/31XB8zD)
 
 <!-- SUPPORTERS -->
 
@@ -308,7 +278,7 @@ donation here. [![Donate](https://img.shields.io/badge/$-support-green.svg?style
 - Yiding He
 - Alaa Abu Zidan
 - Ultraviolet-Ninja
-- Sourabh Bhat
+- Mohammad Chaudhry (thank you very much for the huge donation, YOU are the legend)
 - Yahia Rehab
 - *Your name can be here by supporting me at this link, [Support](https://bit.ly/31XB8zD)*
 

+ 1 - 1
build.gradle

@@ -4,7 +4,7 @@ plugins {
 }
 
 group 'io.github.palexdev'
-version '11.12.0'
+version '11.13.0'
 
 repositories {
     mavenCentral()

+ 4 - 4
demo/build.gradle

@@ -15,16 +15,16 @@ dependencies {
     testImplementation "org.testfx:testfx-core:4.0.16-alpha"
     testImplementation "org.testfx:testfx-junit5:4.0.16-alpha"
 
-    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.2'
-    testImplementation 'org.junit.platform:junit-platform-suite-api:1.7.2'
-    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.2'
+    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
+    testImplementation 'org.junit.platform:junit-platform-suite-api:1.8.1'
+    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
 
     implementation name: 'scenicview'
     implementation "fr.brouillard.oss:cssfx:11.4.0"
     implementation 'org.kordamp.ikonli:ikonli-core:12.2.0'
     implementation 'org.kordamp.ikonli:ikonli-javafx:12.2.0'
     implementation 'org.kordamp.ikonli:ikonli-fontawesome5-pack:12.2.0'
-    implementation 'io.github.palexdev:virtualizedfx:11.2.1'
+    implementation 'io.github.palexdev:virtualizedfx:11.2.4'
     implementation project(':materialfx')
 }
 

+ 17 - 54
demo/src/main/java/io/github/palexdev/materialfx/demo/Demo.java

@@ -1,69 +1,32 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
 package io.github.palexdev.materialfx.demo;
 
 import fr.brouillard.oss.cssfx.CSSFX;
 import io.github.palexdev.materialfx.demo.controllers.DemoController;
 import javafx.application.Application;
 import javafx.fxml.FXMLLoader;
+import javafx.scene.Parent;
 import javafx.scene.Scene;
-import javafx.scene.layout.StackPane;
 import javafx.scene.paint.Color;
 import javafx.stage.Stage;
 import javafx.stage.StageStyle;
 import org.scenicview.ScenicView;
 
-import java.io.IOException;
-
 public class Demo extends Application {
-    private double xOffset;
-    private double yOffset;
-
-    @Override
-    public void start(Stage primaryStage) throws IOException {
-        CSSFX.start();
-
-        FXMLLoader fxmlLoader = new FXMLLoader(MFXDemoResourcesLoader.loadURL("Demo.fxml"));
-        fxmlLoader.setControllerFactory(controller -> new DemoController(primaryStage, getHostServices()));
-        StackPane demoPane = fxmlLoader.load();
-
-        demoPane.setOnMousePressed(event -> {
-            xOffset = primaryStage.getX() - event.getScreenX();
-            yOffset = primaryStage.getY() - event.getScreenY();
-        });
-        demoPane.setOnMouseDragged(event -> {
-            primaryStage.setX(event.getScreenX() + xOffset);
-            primaryStage.setY(event.getScreenY() + yOffset);
-        });
-
-        primaryStage.setTitle("MaterialFX Demo - Features Preview");
-        primaryStage.initStyle(StageStyle.TRANSPARENT);
-        Scene scene = new Scene(demoPane);
-        scene.setFill(Color.TRANSPARENT);
-        primaryStage.setScene(scene);
-        primaryStage.show();
-
-        ScenicView.show(scene);
-    }
-
-    public static void main(String[] args) {
-        launch(args);
-    }
 
+	@Override
+	public void start(Stage primaryStage) throws Exception {
+		CSSFX.start();
+
+		FXMLLoader loader = new FXMLLoader(MFXDemoResourcesLoader.loadURL("fxml/Demo.fxml"));
+		loader.setControllerFactory(c -> new DemoController(primaryStage));
+		Parent root = loader.load();
+		Scene scene = new Scene(root);
+		scene.setFill(Color.TRANSPARENT);
+		primaryStage.initStyle(StageStyle.TRANSPARENT);
+		primaryStage.setScene(scene);
+		primaryStage.setTitle("MaterialFX Demo");
+		primaryStage.show();
+
+		ScenicView.show(scene);
+	}
 }

+ 0 - 192
demo/src/main/java/io/github/palexdev/materialfx/demo/TestDemo.java

@@ -1,192 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package io.github.palexdev.materialfx.demo;
-
-import io.github.palexdev.materialfx.controls.MFXIconWrapper;
-import io.github.palexdev.materialfx.controls.MFXListView;
-import io.github.palexdev.materialfx.controls.MFXTableView;
-import io.github.palexdev.materialfx.controls.cell.MFXTableColumn;
-import io.github.palexdev.materialfx.controls.cell.MFXTableRowCell;
-import io.github.palexdev.materialfx.demo.model.FilterablePerson;
-import io.github.palexdev.materialfx.font.FontResources;
-import io.github.palexdev.materialfx.selection.SingleSelectionModel;
-import io.github.palexdev.materialfx.utils.ColorUtils;
-import javafx.application.Application;
-import javafx.collections.FXCollections;
-import javafx.collections.MapChangeListener;
-import javafx.collections.ObservableList;
-import javafx.geometry.Pos;
-import javafx.scene.Scene;
-import javafx.scene.control.ListView;
-import javafx.scene.input.MouseButton;
-import javafx.scene.input.MouseEvent;
-import javafx.scene.layout.HBox;
-import javafx.scene.layout.StackPane;
-import javafx.stage.Stage;
-import org.scenicview.ScenicView;
-
-import java.util.List;
-import java.util.Random;
-import java.util.stream.IntStream;
-
-@SuppressWarnings("All")
-public class TestDemo extends Application {
-    private final Random random = new Random(System.currentTimeMillis());
-    private boolean indexBound;
-
-
-    @Override
-    public void start(Stage primaryStage) {
-        StackPane stackPane = new StackPane();
-
-        ObservableList<String> strings = FXCollections.observableArrayList();
-        IntStream.range(0, 1000).forEach(value -> strings.add(String.valueOf(value)));
-
-        MFXListView<String> listView = new MFXListView<>(strings);
-        listView.setHideScrollBars(true);
-        ListView<String> flowlessListView = new ListView<>(strings);
-        HBox box = new HBox(50, listView, flowlessListView);
-        box.setAlignment(Pos.CENTER);
-
-        listView.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> {
-            if (event.getButton() == MouseButton.SECONDARY) {
-                strings.set(0, "90");
-            }
-        });
-
-        listView.getSelectionModel().getSelection().addListener((MapChangeListener<? super Integer, ? super String>) change -> System.out.println(change));
-
-        stackPane.getChildren().addAll(box);
-
-        Scene scene = new Scene(stackPane, 800, 600);
-        primaryStage.setScene(scene);
-        primaryStage.show();
-
-        ScenicView.show(scene);
-    }
-
-/*    @Override
-    public void start(Stage primaryStage) {
-        VBox box = new VBox(100);
-        box.setAlignment(Pos.CENTER);
-        Scene mainScene = new Scene(box, 800, 600);
-
-        mainScene.getStylesheets().clear();
-        mainScene.getStylesheets().add("/mfx/light.css");
-
-        box.getChildren().add(new Label("MFXComboBox"));
-        var nmfx = new MFXComboBox<>();
-        nmfx.getItems().add("a");
-        nmfx.getItems().add("b");
-        nmfx.getItems().add("c");
-        box.getChildren().add(nmfx);
-
-        nmfx.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> {
-            if (event.getButton() == MouseButton.SECONDARY) {
-                System.out.println(nmfx.getSelectionModel().getSelectedIndex());
-            }
-        });
-
-        MFXComboBox<String> bind = new MFXComboBox<>();
-        bind.getItems().add("a");
-        bind.getItems().add("b");
-        bind.getItems().add("c");
-        box.getChildren().add(bind);
-
-        nmfx.getSelectionModel().bind(bind.getSelectionModel().selectedItemProperty());
-        nmfx.getSelectionModel().selectedIndexProperty().addListener((observable, oldValue, newValue) -> System.out.println("I: " + newValue));
-
-
-
-        primaryStage.setScene(mainScene);
-        primaryStage.show();
-    }*/
-
-    public static void main(String[] args) {
-        launch(args);
-    }
-
-    private static boolean isInvalidCharacter(char c) {
-        if (c == 0x7F) return true;
-        if (c == 0xA) return true;
-        if (c == 0x9) return true;
-        return c < 0x20;
-    }
-
-    public MFXIconWrapper getRandomIcon(double size) {
-        FontResources[] resources = FontResources.values();
-        String desc = resources[random.nextInt(resources.length)].getDescription();
-        return new MFXIconWrapper(desc, size, ColorUtils.getRandomColor(), size * 1.5);
-    }
-
-    private void setupTable(MFXTableView<FilterablePerson> tableView) {
-        MFXTableColumn<FilterablePerson> firstName = new MFXTableColumn<>("FName");
-        MFXTableColumn<FilterablePerson> lastName = new MFXTableColumn<>("LName");
-        MFXTableColumn<FilterablePerson> address = new MFXTableColumn<>("Address");
-        MFXTableColumn<FilterablePerson> age = new MFXTableColumn<>("age");
-
-        firstName.setRowCellFunction(person -> new MFXTableRowCell(person.firstNameProperty()));
-        lastName.setRowCellFunction(person -> new MFXTableRowCell(person.lastNameProperty()));
-        address.setRowCellFunction(person -> new MFXTableRowCell(person.addressProperty()));
-        age.setRowCellFunction(person -> new MFXTableRowCell(person.ageProperty().asString()));
-
-        tableView.getTableColumns().addAll(firstName, lastName, address, age);
-        //tableView.setItems(people);
-    }
-
-    public String randStr() {
-        int leftLimit = 97; // letter 'a'
-        int rightLimit = 122; // letter 'z'
-        int targetStringLength = 30;
-        return random.ints(leftLimit, rightLimit + 1)
-                .limit(targetStringLength)
-                .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
-                .toString();
-    }
-
-    private void selectNext(SingleSelectionModel<String> selectionModel) {
-        int index = selectionModel.getSelectedIndex();
-        List<String> items = selectionModel.getUnmodifiableItems();
-        if (index >= (items.size())) {
-            return;
-        }
-
-        if (!indexBound) {
-            String item = items.get(index + 1);
-            selectionModel.selectItem(item);
-            return;
-        }
-        selectionModel.selectIndex(index + 1);
-    }
-
-    private void selectPrevious(SingleSelectionModel<String> selectionModel) {
-        int index = selectionModel.getSelectedIndex();
-        List<String> items = selectionModel.getUnmodifiableItems();
-        if (index == 0) {
-            return;
-        }
-
-        if (!indexBound) {
-            String item = items.get(index - 1);
-            selectionModel.selectItem(item);
-            return;
-        }
-        selectionModel.selectIndex(index - 1);
-    }
-}

+ 46 - 0
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/ChecksRadiosToggleController.java

@@ -0,0 +1,46 @@
+package io.github.palexdev.materialfx.demo.controllers;
+
+import io.github.palexdev.materialfx.controls.MFXRectangleToggleNode;
+import io.github.palexdev.materialfx.controls.MFXToggleButton;
+import io.github.palexdev.materialfx.font.MFXFontIcon;
+import io.github.palexdev.materialfx.utils.ColorUtils;
+import javafx.event.ActionEvent;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+import javafx.scene.paint.Color;
+
+import java.net.URL;
+import java.util.ResourceBundle;
+
+public class ChecksRadiosToggleController implements Initializable {
+
+	@FXML
+	private MFXToggleButton customToggle;
+
+	@FXML
+	private MFXRectangleToggleNode r1;
+
+	@FXML
+	private MFXRectangleToggleNode r2;
+
+	@FXML
+	private MFXRectangleToggleNode r3;
+
+	@FXML
+	private void changeColors(ActionEvent event) {
+		customToggle.setColors(ColorUtils.getRandomColor(), ColorUtils.getRandomColor());
+		customToggle.setSelected(false);
+	}
+
+	@Override
+	public void initialize(URL location, ResourceBundle resources) {
+		r1.setLabelLeadingIcon(MFXFontIcon.getRandomIcon(16, Color.BLACK));
+		r1.setLabelTrailingIcon(MFXFontIcon.getRandomIcon(16, Color.BLACK));
+
+		r2.setLabelLeadingIcon(MFXFontIcon.getRandomIcon(16, Color.BLACK));
+		r2.setLabelTrailingIcon(MFXFontIcon.getRandomIcon(16, Color.BLACK));
+
+		r3.setLabelLeadingIcon(MFXFontIcon.getRandomIcon(16, Color.BLACK));
+		r3.setLabelTrailingIcon(MFXFontIcon.getRandomIcon(16, Color.BLACK));
+	}
+}

+ 97 - 0
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/ComboBoxesController.java

@@ -0,0 +1,97 @@
+package io.github.palexdev.materialfx.demo.controllers;
+
+import io.github.palexdev.materialfx.controls.MFXComboBox;
+import io.github.palexdev.materialfx.controls.MFXFilterComboBox;
+import io.github.palexdev.materialfx.controls.MFXTooltip;
+import io.github.palexdev.materialfx.controls.legacy.MFXLegacyComboBox;
+import io.github.palexdev.materialfx.demo.model.Model;
+import io.github.palexdev.materialfx.demo.model.Person;
+import io.github.palexdev.materialfx.utils.StringUtils;
+import io.github.palexdev.materialfx.utils.others.FunctionalStringConverter;
+import javafx.collections.ObservableList;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+import javafx.util.StringConverter;
+
+import java.net.URL;
+import java.util.ResourceBundle;
+import java.util.function.Function;
+import java.util.function.Predicate;
+
+public class ComboBoxesController implements Initializable {
+
+	@FXML
+	private MFXLegacyComboBox<String> lCombo;
+
+	@FXML
+	private MFXLegacyComboBox<String> lCustCombo;
+
+	@FXML
+	private MFXComboBox<String> nBFCombo;
+
+	@FXML
+	private MFXComboBox<String> nCombo;
+
+	@FXML
+	private MFXComboBox<String> nCustCombo;
+
+	@FXML
+	private MFXComboBox<String> nEditCombo;
+
+	@FXML
+	private MFXComboBox<String> nNFCombo;
+
+	@FXML
+	private MFXFilterComboBox<Person> filterCombo;
+
+	@FXML
+	private MFXFilterComboBox<Person> custFilterCombo;
+
+	@Override
+	public void initialize(URL location, ResourceBundle resources) {
+		ObservableList<String> strings = Model.strings;
+		ObservableList<Person> people = Model.people;
+
+		lCombo.setItems(strings);
+		lCustCombo.setItems(strings);
+
+		nCombo.setItems(strings);
+		nCustCombo.setItems(strings);
+		nEditCombo.setItems(strings);
+		nBFCombo.setItems(strings);
+		nNFCombo.setItems(strings);
+
+		nEditCombo.setOnCancel(s -> nEditCombo.setText(nEditCombo.getSelectedItem()));
+		nEditCombo.setOnCommit(s -> {
+			if (!strings.contains(s)) {
+				strings.add(s);
+			}
+			nEditCombo.selectItem(s);
+		});
+
+		// TODO remake tooltips
+		MFXTooltip tooltip = new MFXTooltip(
+				"""
+					This combo box allows you to add new items to the list (no duplicates allowed) when pressing Enter.
+					It also allows to restore the previous selected item by pressing Ctrl+Shift+Z.
+					Both key strokes are default for all MFXComboBoxes but the action to perform must be configured by the user.
+					This combo box is also set to scroll to the selected item when opening the popup.
+					""",
+				nEditCombo
+		);
+		nEditCombo.setTooltip(tooltip);
+
+		StringConverter<Person> converter = FunctionalStringConverter.converter(
+				s -> {throw new UnsupportedOperationException();},
+				person -> person.getName() + " " + person.getSurname()
+		);
+		Function<String, Predicate<Person>> filterFunction = s -> person -> StringUtils.containsIgnoreCase(converter.toString(person), s);
+		filterCombo.setItems(people);
+		filterCombo.setConverter(converter);
+		filterCombo.setFilterFunction(filterFunction);
+		custFilterCombo.setItems(people);
+		custFilterCombo.setConverter(converter);
+		custFilterCombo.setFilterFunction(filterFunction);
+		custFilterCombo.setResetOnPopupHidden(false);
+	}
+}

+ 0 - 173
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/ComboBoxesDemoController.java

@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package io.github.palexdev.materialfx.demo.controllers;
-
-import io.github.palexdev.materialfx.controls.MFXCheckbox;
-import io.github.palexdev.materialfx.controls.MFXComboBox;
-import io.github.palexdev.materialfx.controls.MFXFilterComboBox;
-import io.github.palexdev.materialfx.controls.legacy.MFXLegacyComboBox;
-import io.github.palexdev.materialfx.demo.model.SimplePerson;
-import io.github.palexdev.materialfx.utils.BindingUtils;
-import javafx.collections.FXCollections;
-import javafx.collections.ObservableList;
-import javafx.fxml.FXML;
-import javafx.fxml.Initializable;
-import javafx.scene.control.Label;
-import javafx.scene.paint.Color;
-import org.kordamp.ikonli.javafx.FontIcon;
-
-import java.net.URL;
-import java.util.List;
-import java.util.ResourceBundle;
-
-public class ComboBoxesDemoController implements Initializable {
-
-    @FXML
-    private MFXLegacyComboBox<String> standard;
-
-    @FXML
-    private MFXLegacyComboBox<String> lineColors;
-
-    @FXML
-    private MFXLegacyComboBox<String> editable;
-
-    @FXML
-    private MFXLegacyComboBox<Label> labels;
-
-    @FXML
-    private MFXLegacyComboBox<String> validated;
-
-    @FXML
-    private MFXLegacyComboBox<String> customized;
-
-    @FXML
-    private MFXCheckbox checkbox;
-
-    @FXML
-    private MFXComboBox<String> style1;
-
-    @FXML
-    private MFXComboBox<String> style2;
-
-    @FXML
-    private MFXComboBox<Label> style3;
-
-    @FXML
-    private MFXComboBox<SimplePerson> validatedNew;
-
-    @FXML
-    private MFXFilterComboBox<SimplePerson> filters1;
-
-    @FXML
-    private MFXFilterComboBox<SimplePerson> filters2;
-
-    @FXML
-    private MFXFilterComboBox<String> filters3;
-
-    @FXML
-    private MFXFilterComboBox<SimplePerson> filtersValidated;
-
-    @Override
-    public void initialize(URL location, ResourceBundle resources) {
-        ObservableList<String> stringList = FXCollections.observableArrayList(List.of(
-                "String 0",
-                "String 1",
-                "String 2",
-                "String 3",
-                "String 4",
-                "String 5",
-                "String 6",
-                "String 7"
-        ));
-
-        ObservableList<SimplePerson> personList = FXCollections.observableArrayList(
-                new SimplePerson("Jack Nicholson"),
-                new SimplePerson("Marlon Brando"),
-                new SimplePerson("Robert De Niro"),
-                new SimplePerson("Al Pacino"),
-                new SimplePerson("Daniel Day-Lewis"),
-                new SimplePerson("Dustin Hoffman"),
-                new SimplePerson("Tom Hanks"),
-                new SimplePerson("Anthony Hopkins"),
-                new SimplePerson("Paul Newman"),
-                new SimplePerson("Denzel Washington"),
-                new SimplePerson("Spencer Tracy"),
-                new SimplePerson("Laurence Olivier"),
-                new SimplePerson("Jack Lemmon"),
-                new SimplePerson("Jeff Bridges"),
-                new SimplePerson("James Stewart"),
-                new SimplePerson("Sean Penn"),
-                new SimplePerson("Michael Caine"),
-                new SimplePerson("Morgan Freeman"),
-                new SimplePerson("Robert Duvall"),
-                new SimplePerson("Gene Hackman"),
-                new SimplePerson("Clint Eastwood"),
-                new SimplePerson("Gregory Peck"),
-                new SimplePerson("Robin Williams"),
-                new SimplePerson("Ben Kingsley"),
-                new SimplePerson("Philip Seymour Hoffman")
-        );
-
-        ObservableList<Label> labelsList = FXCollections.observableArrayList(List.of(
-                new Label("Label 0", createIcon("fas-home")),
-                new Label("Label 1", createIcon("fas-star")),
-                new Label("Label 2", createIcon("fas-heart")),
-                new Label("Label 3", createIcon("fas-cocktail")),
-                new Label("Label 4", createIcon("fas-anchor")),
-                new Label("Label 5", createIcon("fas-bolt")),
-                new Label("Label 6", createIcon("fas-bug")),
-                new Label("Label 7", createIcon("fas-beer"))
-        ));
-
-        standard.setItems(stringList);
-        lineColors.setItems(stringList);
-        labels.setItems(labelsList);
-        editable.setItems(stringList);
-        validated.setItems(stringList);
-        customized.setItems(stringList);
-
-        editable.setEditable(true);
-        validated.getValidator().add(checkbox.selectedProperty(), "Checkbox is not selected!");
-
-        style1.setItems(stringList);
-        style2.setItems(stringList);
-        style3.setItems(labelsList);
-        validatedNew.setItems(personList);
-        validatedNew.setValidated(true);
-        validatedNew.getValidator().add(BindingUtils.toProperty(validatedNew.getSelectionModel().selectedIndexProperty().isNotEqualTo(-1)), "A value must be selected");
-        validatedNew.getValidator().add(checkbox.selectedProperty(), "Checkbox must be selected");
-
-        filters1.setItems(personList);
-        filters2.setItems(personList);
-        filters3.setItems(stringList);
-        filtersValidated.setItems(personList);
-        filtersValidated.setValidated(true);
-        filtersValidated.getValidator().add(BindingUtils.toProperty(filtersValidated.getSelectionModel().selectedIndexProperty().isNotEqualTo(-1)), "A value must be selected");
-        filtersValidated.getValidator().add(checkbox.selectedProperty(), "Checkbox must be selected");
-
-        filters3.setForceFieldFocusOnShow(true);
-    }
-
-    private FontIcon createIcon(String s) {
-        FontIcon icon = new FontIcon(s);
-        icon.setIconColor(Color.PURPLE);
-        icon.setIconSize(13);
-        return icon;
-    }
-}

+ 0 - 50
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/DatePickersDemoController.java

@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package io.github.palexdev.materialfx.demo.controllers;
-
-import io.github.palexdev.materialfx.controls.MFXDatePicker;
-import io.github.palexdev.materialfx.demo.MFXDemoResourcesLoader;
-import javafx.fxml.FXML;
-import javafx.fxml.Initializable;
-import javafx.geometry.Insets;
-import javafx.scene.layout.StackPane;
-
-import java.net.URL;
-import java.time.LocalDate;
-import java.util.ResourceBundle;
-
-public class DatePickersDemoController implements Initializable {
-
-    @FXML
-    private MFXDatePicker customPicker;
-
-    @FXML
-    private StackPane pane;
-
-    @Override
-    public void initialize(URL location, ResourceBundle resources) {
-        String css = MFXDemoResourcesLoader.load("css/CustomDatePicker.css");
-        customPicker.getContent().getStylesheets().add(css);
-
-        MFXDatePicker initialized = new MFXDatePicker(LocalDate.now());
-        initialized.setColorText(true);
-        pane.getChildren().add(initialized);
-        StackPane.setMargin(initialized, new Insets(10, 0, 0, 0));
-    }
-}

+ 116 - 273
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/DemoController.java

@@ -1,291 +1,134 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
 package io.github.palexdev.materialfx.demo.controllers;
 
-import io.github.palexdev.materialfx.beans.MFXLoaderBean.Builder;
-import io.github.palexdev.materialfx.controls.*;
-import io.github.palexdev.materialfx.demo.MFXDemoResourcesLoader;
+import io.github.palexdev.materialfx.controls.MFXIconWrapper;
+import io.github.palexdev.materialfx.controls.MFXRectangleToggleNode;
+import io.github.palexdev.materialfx.controls.MFXScrollPane;
 import io.github.palexdev.materialfx.font.MFXFontIcon;
-import io.github.palexdev.materialfx.utils.AnimationUtils;
-import io.github.palexdev.materialfx.utils.AnimationUtils.KeyFrames;
-import io.github.palexdev.materialfx.utils.NodeUtils;
 import io.github.palexdev.materialfx.utils.ScrollUtils;
-import javafx.animation.KeyFrame;
-import javafx.animation.KeyValue;
-import javafx.animation.ParallelTransition;
-import javafx.application.HostServices;
+import io.github.palexdev.materialfx.utils.ToggleButtonsUtil;
+import io.github.palexdev.materialfx.utils.others.loader.MFXLoader;
+import io.github.palexdev.materialfx.utils.others.loader.MFXLoaderBean;
+import javafx.application.Platform;
+import javafx.css.PseudoClass;
 import javafx.fxml.FXML;
-import javafx.fxml.FXMLLoader;
 import javafx.fxml.Initializable;
-import javafx.geometry.Insets;
 import javafx.geometry.Pos;
-import javafx.scene.Scene;
-import javafx.scene.control.Label;
-import javafx.scene.image.ImageView;
-import javafx.scene.input.KeyCode;
-import javafx.scene.input.KeyEvent;
+import javafx.scene.control.ToggleButton;
+import javafx.scene.control.ToggleGroup;
 import javafx.scene.input.MouseEvent;
+import javafx.scene.layout.AnchorPane;
 import javafx.scene.layout.HBox;
-import javafx.scene.layout.Region;
 import javafx.scene.layout.StackPane;
 import javafx.scene.layout.VBox;
-import javafx.scene.media.Media;
-import javafx.scene.media.MediaPlayer;
-import javafx.scene.paint.Color;
-import javafx.scene.text.TextFlow;
-import javafx.stage.Modality;
 import javafx.stage.Stage;
-import javafx.util.Duration;
 
-import java.io.IOException;
 import java.net.URL;
+import java.util.List;
 import java.util.ResourceBundle;
 
-public class DemoController implements Initializable {
-    private final Stage primaryStage;
-    private final HostServices hostServices;
-
-    private MFXButton opNavButton;
-    private ParallelTransition openNav;
-    private ParallelTransition closeNav;
-    private boolean isNavShown = false;
-
-    private final MediaPlayer m1;
-    private final MediaPlayer m2;
-
-    @FXML
-    private StackPane demoPane;
-
-    @FXML
-    private HBox windowButtons;
-
-    @FXML
-    private StackPane navBar;
-
-    @FXML
-    private MFXScrollPane scrollPane;
-
-    @FXML
-    private MFXVLoader vLoader;
-
-    @FXML
-    private StackPane contentPane;
-
-    @FXML
-    private VBox logoPane;
-
-    @FXML
-    private ImageView logo;
-
-    @FXML
-    private Label splashLabel1;
-
-    @FXML
-    private Label splashLabel2;
-
-    @FXML
-    private Label splashLabel3;
-
-    @FXML
-    private TextFlow version;
-
-    public DemoController(Stage primaryStage, HostServices hostServices) {
-        m1 = new MediaPlayer(new Media(MFXDemoResourcesLoader.load("assets/welcome1.wav")));
-        m2 = new MediaPlayer(new Media(MFXDemoResourcesLoader.load("assets/welcome2.wav")));
-
-        m1.setVolume(0.3);
-        m2.setVolume(0.2);
-
-        this.primaryStage = primaryStage;
-        this.hostServices = hostServices;
-    }
-
-    @Override
-    public void initialize(URL location, ResourceBundle resources) {
-        // Icons
-        MFXFontIcon angleIcon = new MFXFontIcon("mfx-angle-right", 20);
-
-        // Buttons
-        MFXIconWrapper closeButton = new MFXIconWrapper("mfx-x-circle", 16, 22);
-        closeButton.setId("closeButton");
-        closeButton.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> primaryStage.close());
-
-        MFXIconWrapper minimizeButton = new MFXIconWrapper("mfx-minus-circle", 16, 22);
-        minimizeButton.setId("minimizeButton");
-        minimizeButton.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> primaryStage.setIconified(true));
-
-        MFXIconWrapper expandButton = new MFXIconWrapper("mfx-expand", 12.5, 22);
-        expandButton.setId("expandButton");
-        expandButton.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> primaryStage.setFullScreen(!primaryStage.isFullScreen()));
-
-        MFXIconWrapper infoButton = new MFXIconWrapper("mfx-info-circle", 30, Color.rgb(75, 181, 255), 30).defaultRippleGeneratorBehavior();
-        infoButton.setId("infoButton");
-        infoButton.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> showInfo());
-
-        opNavButton = new MFXButton("");
-        opNavButton.setOpacity(0.0);
-        opNavButton.setDisable(true);
-        opNavButton.setId("navButton");
-        opNavButton.setPrefSize(25, 25);
-        opNavButton.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
-        opNavButton.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> animate());
-
-        // Graphics
-        opNavButton.setGraphic(angleIcon);
-
-        // Layout and Utils
-        StackPane.setAlignment(infoButton, Pos.BOTTOM_RIGHT);
-        StackPane.setMargin(infoButton, new Insets(0, 8, 8, 0));
-        StackPane.setAlignment(opNavButton, Pos.CENTER_LEFT);
-        StackPane.setMargin(opNavButton, new Insets(0, 0, 0, 4));
-
-        NodeUtils.makeRegionCircular(closeButton);
-        NodeUtils.makeRegionCircular(minimizeButton);
-        NodeUtils.makeRegionCircular(expandButton);
-        NodeUtils.makeRegionCircular(infoButton);
-        NodeUtils.makeRegionCircular(opNavButton);
-
-        // Add all
-        windowButtons.getChildren().addAll(expandButton, minimizeButton, closeButton);
-        demoPane.getChildren().addAll(infoButton, opNavButton);
-
-        // VLoader
-        vLoader.setContentPane(contentPane);
-        vLoader.addItem("BUTTONS", Builder.build(new MFXRectangleToggleNode("BUTTONS"), MFXDemoResourcesLoader.loadURL("ButtonsDemo.fxml")).setDefaultRoot(true));
-        vLoader.addItem("CHECKBOXES", Builder.build(new MFXRectangleToggleNode("CHECKBOXES"), MFXDemoResourcesLoader.loadURL("CheckBoxesDemo.fxml")));
-        vLoader.addItem("COMBOBOXES", Builder.build(new MFXRectangleToggleNode("COMBOBOXES"), MFXDemoResourcesLoader.loadURL("ComboBoxesDemo.fxml")));
-        vLoader.addItem("DATEPICKERS", Builder.build(new MFXRectangleToggleNode("DATEPICKERS"), MFXDemoResourcesLoader.loadURL("DatePickersDemo.fxml")));
-        vLoader.addItem("DIALOGS", Builder.build(new MFXRectangleToggleNode("DIALOGS"), MFXDemoResourcesLoader.loadURL("DialogsDemo.fxml")).setControllerFactory(controller -> new DialogsController(demoPane)));
-        vLoader.addItem("LABELS", Builder.build(new MFXRectangleToggleNode("LABELS"), MFXDemoResourcesLoader.loadURL("LabelsDemo.fxml")));
-        vLoader.addItem("LISTVIEWS", Builder.build(new MFXRectangleToggleNode("LISTVIEWS"), MFXDemoResourcesLoader.loadURL("ListViewsDemo.fxml")));
-        vLoader.addItem("NOTIFICATIONS", Builder.build(new MFXRectangleToggleNode("NOTIFICATIONS"), MFXDemoResourcesLoader.loadURL("NotificationsDemo.fxml")));
-        vLoader.addItem("PROGRESS_BARS", Builder.build(new MFXRectangleToggleNode("PROGRESS BARS"), MFXDemoResourcesLoader.loadURL("ProgressBarsDemo.fxml")));
-        vLoader.addItem("PROGRESS_SPINNERS", Builder.build(new MFXRectangleToggleNode("PROGRESS SPINNERS"), MFXDemoResourcesLoader.loadURL("ProgressSpinnersDemo.fxml")));
-        vLoader.addItem("RADIOBUTTONS", Builder.build(new MFXRectangleToggleNode("RADIOBUTTONS"), MFXDemoResourcesLoader.loadURL("RadioButtonsDemo.fxml")));
-        vLoader.addItem("SCROLLPANES", Builder.build(new MFXRectangleToggleNode("SCROLLPANES"), MFXDemoResourcesLoader.loadURL("ScrollPanesDemo.fxml")));
-        vLoader.addItem("SLIDERS", Builder.build(new MFXRectangleToggleNode("SLIDERS"), MFXDemoResourcesLoader.loadURL("SlidersDemo.fxml")));
-        vLoader.addItem("STEPPER", Builder.build(new MFXRectangleToggleNode("STEPPER"), MFXDemoResourcesLoader.loadURL("StepperDemo.fxml")));
-        vLoader.addItem("TABLEVIEWS", Builder.build(new MFXRectangleToggleNode("TABLEVIEWS"), MFXDemoResourcesLoader.loadURL("TableViewsDemo.fxml")));
-        vLoader.addItem("TEXTFIELDS", Builder.build(new MFXRectangleToggleNode("TEXTFIELDS"), MFXDemoResourcesLoader.loadURL("TextFieldsDemo.fxml")));
-        vLoader.addItem("TOGGLES", Builder.build(new MFXRectangleToggleNode("TOGGLES"), MFXDemoResourcesLoader.loadURL("ToggleButtonsDemo.fxml")));
-        vLoader.addItem("TREEVIEWS", Builder.build(new MFXRectangleToggleNode("TREEVIEWS"), MFXDemoResourcesLoader.loadURL("TreeViewsDemo.fxml")));
-        vLoader.addItem("FONTRESOURCES", Builder.build(new MFXRectangleToggleNode("FONTRESOURCES"), MFXDemoResourcesLoader.loadURL("FontResourcesDemo.fxml")));
-        vLoader.start();
-
-        // Others
-        ScrollUtils.addSmoothScrolling(scrollPane, 2);
-        ScrollUtils.animateScrollBars(scrollPane, 500, 500);
-        primaryStage.sceneProperty().addListener((observable, oldValue, newValue) -> {
-            if (newValue != null) {
-                Scene scene = primaryStage.getScene();
-                scene.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
-                    if (event.getCode() == KeyCode.F11) {
-                        primaryStage.setFullScreen(!primaryStage.isFullScreen());
-                    }
-                });
-                scene.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> {
-                    if (isNavShown) {
-                        animate();
-                    }
-                });
-            }
-        });
-        navBar.setVisible(false);
-        initAnimations();
-
-        demoPane.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> demoPane.requestFocus());
-
-        primaryStage.setOnShown(event -> presentation());
-    }
-
-    private void presentation() {
-        AnimationUtils.SequentialBuilder.build()
-                .add(KeyFrames.of(Duration.ONE, event -> m1.play()))
-                .add(AnimationUtils.ParallelBuilder.build().show(1000, logo, version).getAnimation())
-                .add(AnimationUtils.TimelineBuilder.build().show(450, splashLabel1).setDelay(200).getAnimation())
-                .add(AnimationUtils.TimelineBuilder.build().show(450, splashLabel2).setDelay(50).getAnimation())
-                .add(AnimationUtils.TimelineBuilder.build().show(450, splashLabel3).setDelay(50).getAnimation())
-                .setOnFinished(event -> AnimationUtils.SequentialBuilder.build()
-                        .add(KeyFrames.of(300, end -> m2.play()))
-                        .add(AnimationUtils.TimelineBuilder.build().hide(300, logoPane).setOnFinished(end -> logoPane.setVisible(false)).getAnimation())
-                        .add(AnimationUtils.ParallelBuilder.build().show(800, contentPane, opNavButton).setOnFinished(end -> opNavButton.setDisable(false)).getAnimation())
-                        .setDelay(750)
-                        .getAnimation().play())
-                .setDelay(750)
-                .getAnimation().play();
-
-    }
-
-    private void initAnimations() {
-        openNav = (ParallelTransition) AnimationUtils.ParallelBuilder.build()
-                .show(400, navBar)
-                .add(new KeyFrame(Duration.millis(300), new KeyValue(navBar.translateXProperty(), 5)))
-                .add(new KeyFrame(Duration.millis(200), new KeyValue(opNavButton.rotateProperty(), -180)))
-                .setOnFinished(event -> isNavShown = true)
-                .getAnimation();
-
-        closeNav = (ParallelTransition) AnimationUtils.ParallelBuilder.build()
-                .hide(50, navBar)
-                .add(new KeyFrame(Duration.millis(300), new KeyValue(navBar.translateXProperty(), -240)))
-                .add(new KeyFrame(Duration.millis(200), new KeyValue(opNavButton.rotateProperty(), 0)))
-                .setOnFinished(event -> isNavShown = false)
-                .getAnimation();
-    }
-
-    private void animate() {
-        if (!isNavShown) {
-            navBar.setVisible(true);
-            openNav.play();
-        } else {
-            closeNav.play();
-        }
-    }
-
-    private void showInfo() {
-        MFXDialog infoDialog;
-        MFXStageDialog stageDialog;
-        try {
-            FXMLLoader loader = new FXMLLoader(MFXDemoResourcesLoader.loadURL("InfoDialog.fxml"));
-            loader.setControllerFactory(controller -> new InfoController(hostServices));
-            infoDialog = loader.load();
-        } catch (IOException e) {
-            e.printStackTrace();
-            return;
-        }
-
-        // Close Button
-        StackPane header = (StackPane) infoDialog.lookup("#headerNode");
-
-        MFXIconWrapper closeButton = new MFXIconWrapper("mfx-x", 8, 22).defaultRippleGeneratorBehavior();
-        closeButton.setId("closeButton");
-        StackPane.setAlignment(closeButton, Pos.TOP_RIGHT);
-        StackPane.setMargin(closeButton, new Insets(4, 4, 0, 0));
-        NodeUtils.makeRegionCircular(closeButton);
-        header.getChildren().add(closeButton);
-
-        stageDialog = new MFXStageDialog(infoDialog);
-        stageDialog.setScrimBackground(true);
-        stageDialog.setOwner(primaryStage);
-        stageDialog.setModality(Modality.APPLICATION_MODAL);
-        closeButton.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> stageDialog.close());
-        stageDialog.setCenterInOwner(true);
-        stageDialog.show();
-    }
+import static io.github.palexdev.materialfx.demo.MFXDemoResourcesLoader.loadURL;
 
+public class DemoController implements Initializable {
+	private final Stage stage;
+	private double xOffset;
+	private double yOffset;
+	private final ToggleGroup toggleGroup;
+
+	@FXML
+	private HBox windowHeader;
+
+	@FXML
+	private MFXFontIcon closeIcon;
+
+	@FXML
+	private MFXFontIcon minimizeIcon;
+
+	@FXML
+	private MFXFontIcon alwaysOnTopIcon;
+
+	@FXML
+	private AnchorPane rootPane;
+
+	@FXML
+	private MFXScrollPane scrollPane;
+
+	@FXML
+	private VBox navBar;
+
+	@FXML
+	private StackPane contentPane;
+
+	public DemoController(Stage stage) {
+		this.stage = stage;
+		this.toggleGroup = new ToggleGroup();
+		ToggleButtonsUtil.addAlwaysOneSelectedSupport(toggleGroup);
+	}
+
+	@Override
+	public void initialize(URL location, ResourceBundle resources) {
+		closeIcon.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> Platform.exit());
+		minimizeIcon.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> ((Stage) rootPane.getScene().getWindow()).setIconified(true));
+		alwaysOnTopIcon.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> {
+			boolean newVal = !stage.isAlwaysOnTop();
+			alwaysOnTopIcon.pseudoClassStateChanged(PseudoClass.getPseudoClass("always-on-top"), newVal);
+			stage.setAlwaysOnTop(newVal);
+		});
+
+		windowHeader.setOnMousePressed(event -> {
+			xOffset = stage.getX() - event.getScreenX();
+			yOffset = stage.getY() - event.getScreenY();
+		});
+		windowHeader.setOnMouseDragged(event -> {
+			stage.setX(event.getScreenX() + xOffset);
+			stage.setY(event.getScreenY() + yOffset);
+		});
+
+		initializeLoader();
+
+		ScrollUtils.addSmoothScrolling(scrollPane);
+	}
+
+	private void initializeLoader() {
+		MFXLoader loader = new MFXLoader();
+		loader.addView(MFXLoaderBean.of("BUTTONS", loadURL("fxml/Buttons.fxml")).setBeanToNodeMapper(() -> createToggle("mfx-circle-dot", "Buttons")).setDefaultRoot(true).get());
+		loader.addView(MFXLoaderBean.of("CHECKS_RADIOS_TOGGLES", loadURL("fxml/ChecksRadiosToggles.fxml")).setBeanToNodeMapper(() -> createToggle("mfx-toggle-on", "Checks, Radios, Toggles")).get());
+		loader.addView(MFXLoaderBean.of("COMBOS", loadURL("fxml/ComboBoxes.fxml")).setBeanToNodeMapper(() -> createToggle("mfx-list-dropdown", "ComboBoxes")).get());
+		loader.addView(MFXLoaderBean.of("DIALOGS", loadURL("fxml/Dialogs.fxml")).setBeanToNodeMapper(() -> createToggle("mfx-messages", "Dialogs")).setControllerFactory(c -> new DialogsController(stage)).get());
+		loader.addView(MFXLoaderBean.of("TEXT-FIELDS", loadURL("fxml/TextFields.fxml")).setBeanToNodeMapper(() -> createToggle("mfx-input-pipe-alt", "Fields")).get());
+		loader.addView(MFXLoaderBean.of("LISTS", loadURL("fxml/ListViews.fxml")).setBeanToNodeMapper(() -> createToggle("mfx-square-list", "Lists")).get());
+		loader.addView(MFXLoaderBean.of("NOTIFICATIONS", loadURL("fxml/Notifications.fxml")).setBeanToNodeMapper(() -> createToggle("mfx-bell", "Notifications")).setControllerFactory(c -> new NotificationsController(stage)).get());
+		loader.addView(MFXLoaderBean.of("PICKERS", loadURL("fxml/Pickers.fxml")).setBeanToNodeMapper(() -> createToggle("mfx-calendars", "Pickers")).get());
+		loader.addView(MFXLoaderBean.of("PROGRESS", loadURL("fxml/Progress.fxml")).setBeanToNodeMapper(() -> createToggle("mfx-progress-bars", "Progress")).get());
+		loader.addView(MFXLoaderBean.of("SCROLL-PANES", loadURL("fxml/ScrollPanes.fxml")).setBeanToNodeMapper(() -> createToggle("mfx-scroll-bar", "Scroll Panes")).get());
+		loader.addView(MFXLoaderBean.of("SLIDERS", loadURL("fxml/Sliders.fxml")).setBeanToNodeMapper(() -> createToggle("mfx-sliders", "Sliders")).get());
+		loader.addView(MFXLoaderBean.of("STEPPER", loadURL("fxml/Stepper.fxml")).setBeanToNodeMapper(() -> createToggle("mfx-stepper", "Stepper")).get());
+		loader.addView(MFXLoaderBean.of("TABLES", loadURL("fxml/TableViews.fxml")).setBeanToNodeMapper(() -> createToggle("mfx-table", "Tables")).get());
+		loader.addView(MFXLoaderBean.of("FONT-RESOURCES", loadURL("fxml/FontResources.fxml")).setBeanToNodeMapper(() -> createToggle("mfx-fonticons", "Font Resources")).get());
+		loader.setOnLoadedAction(beans -> {
+			List<ToggleButton> nodes = beans.stream()
+					.map(bean -> {
+						ToggleButton toggle = (ToggleButton) bean.getBeanToNodeMapper().get();
+						toggle.setOnAction(event -> contentPane.getChildren().setAll(bean.getRoot()));
+						if (bean.isDefaultView()) {
+							contentPane.getChildren().setAll(bean.getRoot());
+							toggle.setSelected(true);
+						}
+						return toggle;
+					})
+					.toList();
+			navBar.getChildren().setAll(nodes);
+		});
+		loader.start();
+	}
+
+	private ToggleButton createToggle(String icon, String text) {
+		MFXIconWrapper wrapper = new MFXIconWrapper(icon, 24, 32);
+
+		MFXRectangleToggleNode toggleNode = new MFXRectangleToggleNode(text, wrapper);
+		toggleNode.setAlignment(Pos.CENTER_LEFT);
+		toggleNode.setMaxWidth(Double.MAX_VALUE);
+		toggleNode.setToggleGroup(toggleGroup);
+
+		return toggleNode;
+	}
 }

+ 82 - 271
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/DialogsController.java

@@ -1,278 +1,89 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
 package io.github.palexdev.materialfx.demo.controllers;
 
 import io.github.palexdev.materialfx.controls.MFXButton;
-import io.github.palexdev.materialfx.controls.MFXStageDialog;
-import io.github.palexdev.materialfx.controls.base.AbstractMFXDialog;
-import io.github.palexdev.materialfx.effects.DepthLevel;
-import io.github.palexdev.materialfx.enums.ButtonType;
-import io.github.palexdev.materialfx.enums.DialogType;
-import io.github.palexdev.materialfx.factories.MFXAnimationFactory;
-import io.github.palexdev.materialfx.factories.MFXDialogFactory;
+import io.github.palexdev.materialfx.demo.model.Model;
+import io.github.palexdev.materialfx.dialogs.MFXGenericDialog;
+import io.github.palexdev.materialfx.dialogs.MFXGenericDialogBuilder;
+import io.github.palexdev.materialfx.dialogs.MFXStageDialog;
+import io.github.palexdev.materialfx.font.MFXFontIcon;
 import javafx.application.Platform;
+import javafx.event.ActionEvent;
 import javafx.fxml.FXML;
-import javafx.fxml.Initializable;
-import javafx.geometry.Insets;
-import javafx.geometry.Pos;
-import javafx.scene.layout.HBox;
-import javafx.scene.layout.Pane;
 import javafx.stage.Modality;
-
-import java.net.URL;
-import java.util.ResourceBundle;
-
-public class DialogsController implements Initializable {
-    private final Pane pane;
-
-    @FXML
-    private MFXButton pError;
-
-    @FXML
-    private MFXButton pWarning;
-
-    @FXML
-    private MFXButton pInfo;
-
-    @FXML
-    private MFXButton pGeneric;
-
-    @FXML
-    private MFXButton pGenericActions;
-
-    @FXML
-    private MFXButton pFade;
-
-    @FXML
-    private MFXButton pSlideLR;
-
-    @FXML
-    private MFXButton pSlideTB;
-
-    @FXML
-    private MFXButton pMix;
-
-    @FXML
-    private MFXButton sError;
-
-    @FXML
-    private MFXButton sWarning;
-
-    @FXML
-    private MFXButton sInfo;
-
-    @FXML
-    private MFXButton sGeneric;
-
-    @FXML
-    private MFXButton pDraggable;
-
-    @FXML
-    private MFXButton pOverlayClose;
-
-    @FXML
-    private MFXButton sModal;
-
-    private final AbstractMFXDialog dialog;
-    private final AbstractMFXDialog animateDialog;
-    private final String text =
-            "Lorem Ipsum is simply dummy text of the printing and typesetting industry. " +
-                    "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, " +
-                    "when an unknown printer took a galley of type and scrambled it to make a type specimen book. " +
-                    "It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. " +
-                    "It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, " +
-                    "and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.";
-
-    public DialogsController(Pane pane) {
-        this.pane = pane;
-
-        dialog = MFXDialogFactory.buildDialog(DialogType.INFO, "MFXDialog - Generic Dialog", text);
-
-        animateDialog = MFXDialogFactory.buildDialog(DialogType.INFO, "", text);
-        animateDialog.setAnimateIn(true);
-        animateDialog.setAnimateOut(true);
-
-        animateDialog.setOnBeforeOpen(event -> System.out.println("BEFORE OPEN"));
-        animateDialog.setOnOpened(event -> System.out.println("OPENED"));
-        animateDialog.setOnBeforeClose(event -> System.out.println("BEFORE CLOSING"));
-        animateDialog.setOnClosed(event -> System.out.println("CLOSED"));
-
-        Platform.runLater(() -> this.pane.getChildren().addAll(dialog, animateDialog));
-    }
-
-    @Override
-    public void initialize(URL location, ResourceBundle resources) {
-        dialog.setVisible(false);
-        animateDialog.setVisible(false);
-
-        pError.setOnAction(event -> {
-            resetDialog();
-            MFXDialogFactory.convertToSpecific(DialogType.ERROR, dialog);
-            dialog.setTitle("MFXDialog - Error Dialog");
-            dialog.show();
-        });
-
-        pWarning.setOnAction(event -> {
-            resetDialog();
-            MFXDialogFactory.convertToSpecific(DialogType.WARNING, dialog);
-            dialog.setTitle("MFXDialog - Warning Dialog");
-            dialog.show();
-        });
-
-        pInfo.setOnAction(event -> {
-            resetDialog();
-            MFXDialogFactory.convertToSpecific(DialogType.INFO, dialog);
-            dialog.setTitle("MFXDialog - Info Dialog");
-            dialog.show();
-        });
-
-        pGeneric.setOnAction(event -> {
-            AbstractMFXDialog genericDialog = MFXDialogFactory.buildGenericDialog("MFXDialog - Generic Dialog", text);
-            genericDialog.setCloseHandler(c -> {
-                genericDialog.close();
-                DialogsController.this.pane.getChildren().remove(genericDialog);
-            });
-            genericDialog.setVisible(false);
-            this.pane.getChildren().add(genericDialog);
-            genericDialog.show();
-        });
-
-        pGenericActions.setOnAction(event -> {
-            AbstractMFXDialog genericDialog = MFXDialogFactory.buildGenericDialog("MFXDialog - Generic Dialog", text);
-            genericDialog.setCloseHandler(c -> {
-                genericDialog.close();
-                DialogsController.this.pane.getChildren().remove(genericDialog);
-            });
-            genericDialog.setVisible(false);
-            this.pane.getChildren().add(genericDialog);
-            genericDialog.setActions(createActionsBar(genericDialog));
-            genericDialog.show();
-        });
-
-        pFade.setOnAction(event -> {
-            resetDialog();
-            animateDialog.setTitle("MFXDialog - Fade Dialog");
-            animateDialog.setInAnimationType(MFXAnimationFactory.FADE_IN);
-            animateDialog.setOutAnimationType(MFXAnimationFactory.FADE_OUT);
-            animateDialog.show();
-        });
-
-        pSlideLR.setOnAction(event -> {
-            resetDialog();
-            animateDialog.setTitle("MFXDialog - Slide Left/Right Dialog");
-            animateDialog.setInAnimationType(MFXAnimationFactory.SLIDE_IN_LEFT);
-            animateDialog.setOutAnimationType(MFXAnimationFactory.SLIDE_OUT_RIGHT);
-            animateDialog.show();
-        });
-
-        pSlideTB.setOnAction(event -> {
-            resetDialog();
-            animateDialog.setTitle("MFXDialog - Slide Top/Bottom Dialog");
-            animateDialog.setInAnimationType(MFXAnimationFactory.SLIDE_IN_TOP);
-            animateDialog.setOutAnimationType(MFXAnimationFactory.SLIDE_OUT_BOTTOM);
-            animateDialog.show();
-        });
-
-        pMix.setOnAction(event -> {
-            resetDialog();
-            animateDialog.setTitle("MFXDialog - Mix Animation Dialog");
-            animateDialog.setInAnimationType(MFXAnimationFactory.SLIDE_IN_TOP);
-            animateDialog.setOutAnimationType(MFXAnimationFactory.SLIDE_OUT_RIGHT);
-            animateDialog.show();
-        });
-
-        pDraggable.setOnAction(event -> {
-            resetDialog();
-            MFXDialogFactory.convertToSpecific(DialogType.INFO, dialog);
-            dialog.setTitle("MFXDialog - Draggable Dialog");
-            dialog.setIsDraggable(true);
-            dialog.show();
-        });
-
-        pOverlayClose.setOnAction(event -> {
-            resetDialog();
-            MFXDialogFactory.convertToSpecific(DialogType.INFO, dialog);
-            dialog.setTitle("MFXDialog - Overlay Close Dialog");
-            dialog.setOverlayClose(true);
-            dialog.show();
-        });
-
-        sError.setOnAction(event -> {
-            MFXStageDialog dialog = new MFXStageDialog(DialogType.ERROR, "MFXStageDialog - Error Dialog", text);
-            dialog.show();
-        });
-
-        sWarning.setOnAction(event -> {
-            MFXStageDialog dialog = new MFXStageDialog(DialogType.WARNING, "MFXStageDialog - Warning Dialog", text);
-            dialog.show();
-        });
-
-        sInfo.setOnAction(event -> {
-            MFXStageDialog dialog = new MFXStageDialog(DialogType.INFO, "MFXStageDialog - Info Dialog", text);
-            dialog.show();
-        });
-
-        sGeneric.setOnAction(event -> {
-            MFXStageDialog dialog = new MFXStageDialog(DialogType.GENERIC, "MFXStageDialog - Generic Dialog", text);
-            dialog.show();
-        });
-
-        sModal.setOnAction(event -> {
-            MFXStageDialog dialog = new MFXStageDialog(DialogType.INFO, "MFXStageDialog - Modal Dialog", text);
-            dialog.setOwner(pane.getScene().getWindow());
-            dialog.setModality(Modality.APPLICATION_MODAL);
-            dialog.setScrimBackground(true);
-            dialog.setCenterInOwner(true);
-            dialog.show();
-        });
-    }
-
-    private void resetDialog() {
-        dialog.setOverlayClose(false);
-        dialog.setIsDraggable(false);
-    }
-
-    private HBox createActionsBar(AbstractMFXDialog dialog) {
-        MFXButton action1 = new MFXButton("Perform Action 1");
-        MFXButton action2 = new MFXButton("Perform Action 2");
-        MFXButton action3 = new MFXButton("Perform Action 3");
-        MFXButton close = new MFXButton("Close");
-
-        action1.setButtonType(ButtonType.RAISED);
-        action2.setButtonType(ButtonType.RAISED);
-        action3.setButtonType(ButtonType.RAISED);
-        close.setButtonType(ButtonType.RAISED);
-
-        action1.setDepthLevel(DepthLevel.LEVEL1);
-        action2.setDepthLevel(DepthLevel.LEVEL1);
-        action3.setDepthLevel(DepthLevel.LEVEL1);
-        close.setDepthLevel(DepthLevel.LEVEL1);
-
-        // TODO remake
-/*        action1.setOnAction(event -> NotificationsManager.send(NotificationPos.BOTTOM_RIGHT, createNotification("Action 1 Performed")));
-        action2.setOnAction(event -> NotificationsManager.send(NotificationPos.BOTTOM_RIGHT, createNotification("Action 2 Performed")));
-        action3.setOnAction(event -> NotificationsManager.send(NotificationPos.BOTTOM_RIGHT, createNotification("Action 3 Performed")));*/
-        dialog.addCloseButton(close);
-
-        HBox box = new HBox(20, action1, action2, action3, close);
-        box.setAlignment(Pos.CENTER);
-        box.setPadding(new Insets(20, 5, 20, 5));
-        return box;
-    }
+import javafx.stage.Stage;
+
+import java.util.Map;
+
+public class DialogsController {
+	private MFXGenericDialog dialogContent;
+	private MFXStageDialog dialog;
+
+	public DialogsController(Stage stage) {
+
+		Platform.runLater(() -> {
+			this.dialogContent = MFXGenericDialogBuilder.build()
+					.setContentText(Model.ipsum)
+					.makeScrollable(true)
+					.get();
+			this.dialog = MFXGenericDialogBuilder.build(dialogContent)
+					.toStageDialogBuilder()
+					.initOwner(stage)
+					.initModality(Modality.APPLICATION_MODAL)
+					.setDraggable(true)
+					.setTitle("Dialogs Preview")
+					.setScrimOwner(true)
+					.get();
+
+			dialogContent.addActions(
+					Map.entry(new MFXButton("Confirm"), event -> {}),
+					Map.entry(new MFXButton("Cancel"), event -> dialog.close())
+			);
+
+			dialogContent.setMaxSize(400, 200);
+		});
+	}
+
+	@FXML
+	private void openInfo(ActionEvent event) {
+		MFXFontIcon infoIcon = new MFXFontIcon("mfx-info-circle-filled", 18);
+		dialogContent.setHeaderIcon(infoIcon);
+		dialogContent.setHeaderText("This is a generic info dialog");
+		convertDialogTo("mfx-info-dialog");
+		dialog.showDialog();
+	}
+
+	@FXML
+	private void openWarning(ActionEvent event) {
+		MFXFontIcon warnIcon = new MFXFontIcon("mfx-do-not-enter-circle", 18);
+		dialogContent.setHeaderIcon(warnIcon);
+		dialogContent.setHeaderText("This is a warning info dialog");
+		convertDialogTo("mfx-warn-dialog");
+		dialog.showDialog();
+	}
+
+	@FXML
+	private void openError(ActionEvent event) {
+		MFXFontIcon errorIcon = new MFXFontIcon("mfx-exclamation-circle-filled", 18);
+		dialogContent.setHeaderIcon(errorIcon);
+		dialogContent.setHeaderText("This is a error info dialog");
+		convertDialogTo("mfx-error-dialog");
+		dialog.showDialog();
+	}
+
+	@FXML
+	private void openGeneric(ActionEvent event) {
+		dialogContent.setHeaderIcon(null);
+		dialogContent.setHeaderText("This is a generic dialog");
+		convertDialogTo(null);
+		dialog.showDialog();
+	}
+
+	private void convertDialogTo(String styleClass) {
+		dialogContent.getStyleClass().removeIf(
+				s -> s.equals("mfx-info-dialog") || s.equals("mfx-warn-dialog") || s.equals("mfx-error-dialog")
+		);
+
+		if (styleClass != null)
+		dialogContent.getStyleClass().add(styleClass);
+	}
 }

+ 68 - 0
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/FontResourcesController.java

@@ -0,0 +1,68 @@
+package io.github.palexdev.materialfx.demo.controllers;
+
+import io.github.palexdev.materialfx.controls.MFXTableColumn;
+import io.github.palexdev.materialfx.controls.MFXTableRow;
+import io.github.palexdev.materialfx.controls.MFXTableView;
+import io.github.palexdev.materialfx.controls.cell.MFXTableRowCell;
+import io.github.palexdev.materialfx.filter.StringFilter;
+import io.github.palexdev.materialfx.font.FontResources;
+import io.github.palexdev.materialfx.font.MFXFontIcon;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+import javafx.scene.control.Label;
+
+import java.net.URL;
+import java.util.Comparator;
+import java.util.ResourceBundle;
+
+public class FontResourcesController implements Initializable {
+	private final ObservableList<FontResources> fontResources;
+
+	@FXML
+	private Label header;
+
+	@FXML
+	private MFXTableView<FontResources> tableView;
+
+	public FontResourcesController() {
+		fontResources = FXCollections.observableArrayList(FontResources.values());
+	}
+
+	@Override
+	public void initialize(URL location, ResourceBundle resources) {
+		MFXTableColumn<FontResources> iconColumn = new MFXTableColumn<>("Icon", false, Comparator.comparing(FontResources::getDescription));
+		MFXTableColumn<FontResources> descriptionColumn = new MFXTableColumn<>("Description", false, Comparator.comparing(FontResources::getDescription));
+		MFXTableColumn<FontResources> codeColumn = new MFXTableColumn<>("Code", false, Comparator.comparing(FontResources::getCode));
+
+		iconColumn.setRowCellFactory(resource -> new MFXTableRowCell<>(FontResources::getDescription) {
+			final MFXFontIcon icon = new MFXFontIcon("mfx-logo", 32);
+
+			@Override
+			public void update(FontResources item) {
+				icon.setDescription(item.getDescription());
+				setGraphic(icon);
+			}
+		});
+		descriptionColumn.setRowCellFactory(resource -> new MFXTableRowCell<>(FontResources::getDescription) {
+			@Override
+			public double computePrefWidth(double height) {
+				return 300;
+			}
+		});
+		codeColumn.setRowCellFactory(resource -> new MFXTableRowCell<>(FontResources::getCode, character -> Integer.toHexString(character | 0x10000).substring(1).toUpperCase()));
+
+		tableView.setTableRowFactory(resource -> new MFXTableRow<>(tableView, resource) {{
+			setPrefHeight(48);
+		}});
+		tableView.getTableColumns().addAll(iconColumn, descriptionColumn, codeColumn);
+		tableView.getFilters().add(new StringFilter<>("Description", FontResources::getDescription));
+		tableView.setItems(fontResources);
+		tableView.features().enableBounceEffect();
+		tableView.features().enableSmoothScrolling(0.7);
+		tableView.autosizeColumnsOnInitialization();
+
+		header.setText("MaterialFX Font Resources (" + fontResources.size() + ")");
+	}
+}

+ 0 - 104
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/FontResourcesDemoController.java

@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package io.github.palexdev.materialfx.demo.controllers;
-
-import io.github.palexdev.materialfx.controls.MFXIconWrapper;
-import io.github.palexdev.materialfx.controls.MFXLabel;
-import io.github.palexdev.materialfx.controls.MFXListView;
-import io.github.palexdev.materialfx.controls.cell.MFXListCell;
-import io.github.palexdev.materialfx.font.FontResources;
-import javafx.collections.FXCollections;
-import javafx.collections.ObservableList;
-import javafx.fxml.FXML;
-import javafx.fxml.Initializable;
-import javafx.geometry.Insets;
-import javafx.geometry.Orientation;
-import javafx.geometry.Pos;
-import javafx.scene.control.Separator;
-import javafx.scene.layout.HBox;
-import javafx.scene.paint.Color;
-
-import java.net.URL;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
-import java.util.ResourceBundle;
-import java.util.stream.Collectors;
-
-public class FontResourcesDemoController implements Initializable {
-
-    @FXML
-    private MFXListView<HBox> list;
-
-    @FXML
-    private MFXLabel count;
-
-    @Override
-    public void initialize(URL location, ResourceBundle resources) {
-        list.setCellFactory(hBox -> new MFXListCell<>(list, hBox) {
-            {
-                setPrefHeight(40);
-            }
-        });
-        list.features().enableBounceEffect();
-        list.features().enableSmoothScrolling(1);
-        populateList();
-        count.setText(list.getItems().size() + " Icons");
-    }
-
-    private void populateList() {
-        List<FontResources> fontResources = Arrays.asList(FontResources.values());
-        fontResources.sort(Comparator.comparing(FontResources::name));
-
-
-        ObservableList<HBox> resBoxes = fontResources.stream()
-                .map(this::buildNode)
-                .collect(Collectors.collectingAndThen(Collectors.toList(), FXCollections::observableArrayList));
-        list.setItems(resBoxes);
-    }
-
-    private HBox buildNode(FontResources fontResource) {
-        MFXLabel l1 = new MFXLabel();
-        l1.setLineColor(Color.TRANSPARENT);
-        l1.setUnfocusedLineColor(Color.TRANSPARENT);
-        l1.setStyle("-fx-background-color: transparent");
-        l1.setText("Description: " + fontResource.getDescription());
-        l1.setMinWidth(300);
-        l1.setAlignment(Pos.CENTER_LEFT);
-
-        MFXLabel l2 = new MFXLabel();
-        l2.setLineColor(Color.TRANSPARENT);
-        l2.setUnfocusedLineColor(Color.TRANSPARENT);
-        l2.setStyle("-fx-background-color: transparent");
-        l2.setText("Code: " + Integer.toHexString(fontResource.getCode() | 0x10000).substring(1).toUpperCase());
-        l2.setMinWidth(300);
-        l2.setAlignment(Pos.CENTER_LEFT);
-
-        Separator s1 = new Separator(Orientation.VERTICAL);
-        s1.setStyle("-fx-fill: white");
-        Separator s2 = new Separator(Orientation.VERTICAL);
-        s2.setStyle("-fx-fill: white");
-
-
-        HBox box = new HBox(10, new MFXIconWrapper(fontResource.getDescription(), 20, 24), s1, l1, s2, l2);
-        box.setPadding(new Insets(5));
-        box.setAlignment(Pos.CENTER_LEFT);
-        return box;
-    }
-}

+ 0 - 75
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/InfoController.java

@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package io.github.palexdev.materialfx.demo.controllers;
-
-import javafx.application.HostServices;
-import javafx.fxml.FXML;
-import javafx.fxml.Initializable;
-import javafx.scene.control.Hyperlink;
-import javafx.scene.control.Label;
-
-import java.net.URL;
-import java.util.ResourceBundle;
-
-public class InfoController implements Initializable {
-    private final HostServices hostServices;
-
-    @FXML
-    private Label githubL;
-
-    @FXML
-    private Hyperlink githubH;
-
-    @FXML
-    private Label mavenL;
-
-    @FXML
-    private Hyperlink mavenH;
-
-    @FXML
-    private Label contactL;
-
-    @FXML
-    private Hyperlink contactH;
-
-    @FXML
-    private Label emailL;
-
-    @FXML
-    private Hyperlink emailH;
-
-    @FXML
-    private Label paypalL;
-
-    @FXML
-    private Hyperlink paypalH;
-
-    public InfoController(HostServices hostServices) {
-        this.hostServices = hostServices;
-    }
-
-    @Override
-    public void initialize(URL location, ResourceBundle resources) {
-        githubL.getGraphic().setOnMousePressed(event -> hostServices.showDocument(githubH.getTooltip().getText()));
-        mavenL.getGraphic().setOnMousePressed(event -> hostServices.showDocument(mavenH.getTooltip().getText()));
-        contactL.getGraphic().setOnMousePressed(event -> hostServices.showDocument(contactH.getTooltip().getText()));
-        emailL.getGraphic().setOnMousePressed(event -> hostServices.showDocument(emailH.getTooltip().getText()));
-        paypalL.getGraphic().setOnMousePressed(event -> hostServices.showDocument(paypalH.getTooltip().getText()));
-    }
-}

+ 0 - 54
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/LabelsDemoController.java

@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package io.github.palexdev.materialfx.demo.controllers;
-
-import io.github.palexdev.materialfx.controls.MFXIconWrapper;
-import io.github.palexdev.materialfx.controls.MFXLabel;
-import io.github.palexdev.materialfx.effects.ripple.MFXCircleRippleGenerator;
-import io.github.palexdev.materialfx.utils.NodeUtils;
-import javafx.fxml.FXML;
-import javafx.fxml.Initializable;
-import javafx.scene.paint.Color;
-
-import java.net.URL;
-import java.util.ResourceBundle;
-
-public class LabelsDemoController implements Initializable {
-
-    @FXML
-    private MFXLabel custom;
-
-    @Override
-    public void initialize(URL location, ResourceBundle resources) {
-        MFXIconWrapper leading = new MFXIconWrapper("mfx-filter", 15, 22).defaultRippleGeneratorBehavior();
-        MFXIconWrapper trailing = new MFXIconWrapper("mfx-info-circle", 15, 22).defaultRippleGeneratorBehavior();
-
-        NodeUtils.makeRegionCircular(leading);
-        NodeUtils.makeRegionCircular(trailing);
-
-        MFXCircleRippleGenerator lrg = leading.getRippleGenerator();
-        lrg.setRippleColor(Color.web("#849ED7"));
-
-        MFXCircleRippleGenerator trg = trailing.getRippleGenerator();
-        trg.setRippleColor(Color.web("#849ED7"));
-
-        custom.setLeadingIcon(leading);
-        custom.setTrailingIcon(trailing);
-    }
-}

+ 88 - 0
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/ListViewsController.java

@@ -0,0 +1,88 @@
+package io.github.palexdev.materialfx.demo.controllers;
+
+import io.github.palexdev.materialfx.controls.MFXCheckListView;
+import io.github.palexdev.materialfx.controls.MFXListView;
+import io.github.palexdev.materialfx.controls.cell.MFXListCell;
+import io.github.palexdev.materialfx.demo.model.Model;
+import io.github.palexdev.materialfx.demo.model.Person;
+import io.github.palexdev.materialfx.effects.DepthLevel;
+import io.github.palexdev.materialfx.font.MFXFontIcon;
+import io.github.palexdev.materialfx.utils.ColorUtils;
+import io.github.palexdev.materialfx.utils.others.FunctionalStringConverter;
+import javafx.collections.ObservableList;
+import javafx.event.ActionEvent;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+import javafx.util.StringConverter;
+
+import java.net.URL;
+import java.util.ResourceBundle;
+
+public class ListViewsController implements Initializable {
+
+	@FXML
+	private MFXListView<String> list;
+
+	@FXML
+	private MFXListView<Person> custList;
+
+	@FXML
+	private MFXCheckListView<String> checkList;
+
+	@FXML
+	private MFXListView<Person> legacyList;
+
+	@Override
+	public void initialize(URL location, ResourceBundle resources) {
+		ObservableList<String> strings = Model.strings;
+		ObservableList<Person> people = Model.people;
+		StringConverter<Person> personConverter = FunctionalStringConverter.converter(
+				s -> {
+					throw new UnsupportedOperationException();
+				},
+				person -> (person == null) ? "" : person.getName() + " " + person.getSurname()
+		);
+
+		list.setItems(strings);
+		custList.setItems(people);
+		checkList.setItems(strings);
+		custList.setConverter(personConverter);
+		custList.setCellFactory(person -> new PersonCellFactory(custList, person));
+		custList.features().enableBounceEffect();
+		custList.features().enableSmoothScrolling(0.5);
+
+		legacyList.setItems(people);
+		legacyList.setConverter(personConverter);
+	}
+
+	@FXML
+	void changeColors(ActionEvent event) {
+		custList.setTrackColor(ColorUtils.getRandomColor());
+		custList.setThumbColor(ColorUtils.getRandomColor());
+		custList.setThumbHoverColor(ColorUtils.getRandomColor());
+	}
+
+	@FXML
+	void changeDepth(ActionEvent event) {
+		DepthLevel newLevel = (custList.getDepthLevel() == DepthLevel.LEVEL0) ? DepthLevel.LEVEL2 : DepthLevel.LEVEL0;
+		custList.setDepthLevel(newLevel);
+	}
+
+	private static class PersonCellFactory extends MFXListCell<Person> {
+		private final MFXFontIcon userIcon;
+
+		public PersonCellFactory(MFXListView<Person> listView, Person data) {
+			super(listView, data);
+
+			userIcon = new MFXFontIcon("mfx-user", 18);
+			userIcon.getStyleClass().add("user-icon");
+			render(data);
+		}
+
+		@Override
+		protected void render(Person data) {
+			super.render(data);
+			if (userIcon != null) getChildren().add(0, userIcon);
+		}
+	}
+}

+ 0 - 240
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/ListViewsDemoController.java

@@ -1,240 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package io.github.palexdev.materialfx.demo.controllers;
-
-import io.github.palexdev.materialfx.controls.MFXButton;
-import io.github.palexdev.materialfx.controls.MFXCheckListView;
-import io.github.palexdev.materialfx.controls.MFXLabel;
-import io.github.palexdev.materialfx.controls.MFXListView;
-import io.github.palexdev.materialfx.controls.legacy.MFXLegacyListView;
-import io.github.palexdev.materialfx.effects.DepthLevel;
-import io.github.palexdev.materialfx.utils.ColorUtils;
-import javafx.beans.property.ObjectProperty;
-import javafx.beans.property.SimpleObjectProperty;
-import javafx.collections.FXCollections;
-import javafx.collections.ObservableList;
-import javafx.fxml.FXML;
-import javafx.fxml.Initializable;
-import javafx.geometry.Insets;
-import javafx.scene.control.Label;
-import javafx.scene.input.MouseEvent;
-import javafx.scene.layout.HBox;
-import javafx.scene.paint.Color;
-import org.kordamp.ikonli.fontawesome5.FontAwesomeSolid;
-import org.kordamp.ikonli.javafx.FontIcon;
-
-import java.net.URL;
-import java.util.Random;
-import java.util.ResourceBundle;
-import java.util.stream.IntStream;
-
-public class ListViewsDemoController implements Initializable {
-    private final Random random = new Random(System.currentTimeMillis());
-
-    private enum State {
-        LEGACY, NEW
-    }
-
-    private final ObjectProperty<State> state = new SimpleObjectProperty<>(State.NEW);
-
-    @FXML
-    private HBox legacyBox;
-
-    @FXML
-    private HBox newBox;
-
-    @FXML
-    private MFXLegacyListView<String> stringView;
-
-    @FXML
-    private MFXLegacyListView<Label> labelView;
-
-    @FXML
-    private MFXLegacyListView<HBox> hBoxView;
-
-    @FXML
-    private MFXLegacyListView<String> cssView;
-
-    @FXML
-    private MFXListView<String> stringViewNew;
-
-    @FXML
-    private MFXListView<MFXLabel> labelViewNew;
-
-    @FXML
-    private MFXListView<HBox> hBoxViewNew;
-
-    @FXML
-    private MFXCheckListView<String> checkList;
-
-    @FXML
-    private MFXListView<String> cssViewNew;
-
-    @FXML
-    private MFXButton swapButton;
-
-    @FXML
-    private MFXButton depthButton;
-
-    @FXML
-    private MFXButton colorsButton;
-
-    @FXML
-    private Label mulLabel;
-
-    private ObservableList<String> stringList;
-    private ObservableList<Label> labelsList;
-    private ObservableList<HBox> hBoxesList;
-
-    private ObservableList<MFXLabel> labelsListNew;
-    private ObservableList<HBox> hBoxesListNew;
-
-    @Override
-    public void initialize(URL location, ResourceBundle resources) {
-        initLists();
-
-        state.addListener((observable, oldValue, newValue) -> {
-            if (newValue == State.NEW) {
-                mulLabel.setVisible(true);
-                legacyBox.setVisible(false);
-                newBox.setVisible(true);
-            } else {
-                mulLabel.setVisible(false);
-                legacyBox.setVisible(true);
-                newBox.setVisible(false);
-            }
-        });
-
-        //  LEGACY //
-        stringView.setItems(stringList);
-        labelView.setItems(labelsList);
-        hBoxView.setItems(hBoxesList);
-        cssView.setItems(stringList);
-
-        // NEW //
-        stringViewNew.setItems(stringList);
-        labelViewNew.setItems(labelsListNew);
-        hBoxViewNew.setItems(hBoxesListNew);
-        checkList.setItems(stringList);
-        cssViewNew.setItems(stringList);
-
-        swapButton.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> updateState());
-        depthButton.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> updateDepth());
-        colorsButton.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> updateColors());
-
-        stringViewNew.getSelectionModel().setAllowsMultipleSelection(true);
-    }
-
-    private void initLists() {
-        stringList = FXCollections.observableArrayList();
-        IntStream.rangeClosed(0, 100_000).forEach(i -> stringList.add("String " + i));
-
-        // LEGACY //
-        labelsList = FXCollections.observableArrayList();
-        IntStream.rangeClosed(0, 100).forEach(i -> labelsList.add(createLegacyLabel("Label " + i, getRandomIcon())));
-
-        hBoxesList = FXCollections.observableArrayList();
-        IntStream.rangeClosed(0, 100).forEach(i -> hBoxesList.add(createHBox(i)));
-
-        // NEW //
-        labelsListNew = FXCollections.observableArrayList();
-        IntStream.rangeClosed(0, 100).forEach(i -> labelsListNew.add(createLabel("Label " + i, getRandomIcon())));
-
-        hBoxesListNew = FXCollections.observableArrayList();
-        IntStream.rangeClosed(0, 100).forEach(i -> hBoxesListNew.add(createHBox(i)));
-    }
-
-    private MFXLabel createLabel(String text, String iconDescription) {
-        FontIcon icon = new FontIcon(iconDescription);
-        icon.setIconColor(Color.PURPLE);
-        icon.setIconSize(14);
-
-        MFXLabel label = new MFXLabel(text);
-        label.setLineColor(Color.TRANSPARENT);
-        label.setUnfocusedLineColor(Color.TRANSPARENT);
-        label.setStyle("-fx-background-color: transparent");
-        label.setLeadingIcon(icon);
-        label.setGraphicTextGap(10);
-        return label;
-    }
-
-    private Label createLegacyLabel(String text, String iconDescription) {
-        FontIcon icon = new FontIcon(iconDescription);
-        icon.setIconColor(Color.PURPLE);
-        icon.setIconSize(14);
-
-        Label label = new Label(text);
-        label.setStyle("-fx-background-color: transparent");
-        label.setGraphic(icon);
-        label.setGraphicTextGap(10);
-        return label;
-    }
-
-    private HBox createHBox(int index) {
-        HBox hBox = new HBox(20);
-        hBox.setPadding(new Insets(0, 10, 0, 10));
-
-        FontIcon city = new FontIcon("fas-city");
-        city.setIconColor(Color.GOLD);
-        city.setIconSize(12);
-        Label label1 = new Label("City " + index, city);
-
-        FontIcon people = new FontIcon("fas-users");
-        people.setIconColor(Color.GOLD);
-        people.setIconSize(12);
-        Label label2 = new Label("Count: " + random.nextInt(2000000), people);
-
-        hBox.getChildren().addAll(label1, label2);
-        return hBox;
-    }
-
-    private void updateState() {
-        State curr = state.get();
-        swapButton.setText(curr == State.LEGACY ?  "Switch to Legacy" : "Switch to New");
-        state.set(curr == State.LEGACY ? State.NEW : State.LEGACY);
-    }
-
-    private void updateDepth() {
-        if (state.get() == State.LEGACY) {
-            DepthLevel level = cssView.getDepthLevel();
-            cssView.setDepthLevel(level.equals(DepthLevel.LEVEL0) ? DepthLevel.LEVEL2 : DepthLevel.LEVEL0);
-        } else {
-            DepthLevel level = cssViewNew.getDepthLevel();
-            cssViewNew.setDepthLevel(level.equals(DepthLevel.LEVEL0) ? DepthLevel.LEVEL2 : DepthLevel.LEVEL0);
-        }
-    }
-
-    private void updateColors() {
-        if (state.get() == State.LEGACY) {
-            cssView.setTrackColor(ColorUtils.getRandomColor());
-            cssView.setThumbColor(ColorUtils.getRandomColor());
-            cssView.setThumbHoverColor(ColorUtils.getRandomColor());
-        } else {
-            cssViewNew.setTrackColor(ColorUtils.getRandomColor());
-            cssViewNew.setThumbColor(ColorUtils.getRandomColor());
-            cssViewNew.setThumbHoverColor(ColorUtils.getRandomColor());
-        }
-    }
-
-    private String getRandomIcon() {
-        FontAwesomeSolid[] resources = FontAwesomeSolid.values();
-        int random = (int) (Math.random() * resources.length);
-        return resources[random].getDescription();
-    }
-}

+ 206 - 113
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/NotificationsController.java

@@ -1,120 +1,213 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
 package io.github.palexdev.materialfx.demo.controllers;
 
+import io.github.palexdev.materialfx.controls.MFXButton;
+import io.github.palexdev.materialfx.controls.MFXIconWrapper;
+import io.github.palexdev.materialfx.controls.MFXNotificationCenter;
+import io.github.palexdev.materialfx.controls.MFXSimpleNotification;
+import io.github.palexdev.materialfx.controls.cell.MFXNotificationCell;
+import io.github.palexdev.materialfx.demo.MFXDemoResourcesLoader;
+import io.github.palexdev.materialfx.demo.model.Model;
 import io.github.palexdev.materialfx.enums.NotificationPos;
+import io.github.palexdev.materialfx.enums.NotificationState;
+import io.github.palexdev.materialfx.factories.InsetsFactory;
+import io.github.palexdev.materialfx.font.MFXFontIcon;
+import io.github.palexdev.materialfx.notifications.MFXNotificationCenterSystem;
+import io.github.palexdev.materialfx.notifications.MFXNotificationSystem;
+import io.github.palexdev.materialfx.notifications.base.INotification;
+import io.github.palexdev.materialfx.utils.RandomUtils;
+import javafx.application.Platform;
+import javafx.beans.binding.Bindings;
+import javafx.beans.property.SimpleStringProperty;
+import javafx.beans.property.StringProperty;
+import javafx.event.ActionEvent;
 import javafx.fxml.FXML;
-
-import java.util.Random;
+import javafx.geometry.Pos;
+import javafx.scene.control.Label;
+import javafx.scene.layout.BorderPane;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.Priority;
+import javafx.scene.layout.StackPane;
+import javafx.stage.Stage;
 
 public class NotificationsController {
-    private final Random random = new Random(System.currentTimeMillis());
-
-    private final String title = "MaterialFX Notification System";
-    private final String dummy =
-            "Lorem Ipsum is simply dummy text of the printing and typesetting industry. " +
-                    "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, " +
-                    "when an unknown printer took a galley of type and scrambled it to make a type specimen book. " +
-                    "It has survived not only five centuries, but also the leap into electronic typesetting, " +
-                    "remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, " +
-                    "and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.";
-
-    @FXML
-    void showTopLeft() {
-        NotificationPos pos = NotificationPos.TOP_LEFT;
-        showNotification(pos);
-    }
-
-    @FXML
-    void showTopCenter() {
-        NotificationPos pos = NotificationPos.TOP_CENTER;
-        showNotification(pos);
-    }
-
-    @FXML
-    void showTopRight() {
-        NotificationPos pos = NotificationPos.TOP_RIGHT;
-        showNotification(pos);
-    }
-
-    @FXML
-    void showBottomLeft() {
-        NotificationPos pos = NotificationPos.BOTTOM_LEFT;
-        showNotification(pos);
-    }
-
-    @FXML
-    void showBottomCenter() {
-        NotificationPos pos = NotificationPos.BOTTOM_CENTER;
-        showNotification(pos);
-    }
-
-    @FXML
-    void showBottomRight() {
-        NotificationPos pos = NotificationPos.BOTTOM_RIGHT;
-        showNotification(pos);
-    }
-
-    private void showNotification(NotificationPos pos) {
-       // TODO remake
-    }
-
-/*    private Region getRandomTemplate() {
-        final int rand = random.nextInt(4);
-
-        switch (rand) {
-            case 0:
-                FontIcon icon1 = new FontIcon("fas-info-circle");
-                icon1.setIconColor(Color.LIGHTBLUE);
-                icon1.setIconSize(15);
-                return new SimpleMFXNotificationPane(
-                        icon1,
-                        "Dummy Notification",
-                        title,
-                        dummy
-                );
-            case 1:
-                FontIcon icon2 = new FontIcon("fas-cocktail");
-                icon2.setIconColor(Color.GREEN);
-                icon2.setIconSize(15);
-                return new SimpleMFXNotificationPane(
-                        icon2,
-                        "Fast Food",
-                        title,
-                        "Hello username, your order is on the way!"
-                );
-            case 2:
-                FontIcon icon3 = new FontIcon("fab-whatsapp");
-                icon3.setIconColor(Color.GREEN);
-                icon3.setIconSize(15);
-                return new SimpleMFXNotificationPane(
-                        icon3,
-                        "Whatsapp Notification",
-                        title,
-                        "Hi Mark, it's been ages since we last spoke!\nHow are you?"
-                );
-            case 3:
-                AbstractMFXDialog dialog = MFXDialogFactory.buildDialog(DialogType.WARNING, "Warning Dialog as Notification", "Disk space is running low, better watch out...");
-                dialog.setVisible(true);
-                return dialog;
-            default:
-                return null;
-        }
-    }*/
+
+	// TODO stop auto close on hover for NotificationSystem
+	public NotificationsController(Stage stage) {
+		Platform.runLater(() -> {
+			MFXNotificationSystem.instance().initOwner(stage);
+			MFXNotificationCenterSystem.instance().initOwner(stage);
+
+			MFXNotificationCenter center = MFXNotificationCenterSystem.instance().getCenter();
+			center.setCellFactory(notification -> new MFXNotificationCell(center, notification) {
+				{
+					setPrefHeight(400);
+				}
+			});
+		});
+	}
+
+	@FXML
+	void showTopLeft(ActionEvent event) {
+		MFXNotificationSystem.instance()
+				.setPosition(NotificationPos.TOP_LEFT)
+				.publish(createNotification());
+	}
+
+	@FXML
+	void showTopCenter(ActionEvent event) {
+		MFXNotificationSystem.instance()
+				.setPosition(NotificationPos.TOP_CENTER)
+				.publish(createNotification());
+	}
+
+	@FXML
+	void showTopRight(ActionEvent event) {
+		MFXNotificationSystem.instance()
+				.setPosition(NotificationPos.TOP_RIGHT)
+				.publish(createNotification());
+	}
+
+	@FXML
+	void showBottomLeft(ActionEvent event) {
+		MFXNotificationSystem.instance()
+				.setPosition(NotificationPos.BOTTOM_LEFT)
+				.publish(createNotification());
+	}
+
+	@FXML
+	void showBottomCenter(ActionEvent event) {
+		MFXNotificationSystem.instance()
+				.setPosition(NotificationPos.BOTTOM_LEFT)
+				.publish(createNotification());
+	}
+
+	@FXML
+	void showBottomRight(ActionEvent event) {
+		MFXNotificationSystem.instance()
+				.setPosition(NotificationPos.BOTTOM_RIGHT)
+				.publish(createNotification());
+	}
+
+	@FXML
+	void showTopLeftNC(ActionEvent event) {
+		MFXNotificationCenterSystem.instance()
+				.setPosition(NotificationPos.TOP_LEFT)
+				.publish(createNotification());
+	}
+
+	@FXML
+	void showTopCenterNC(ActionEvent event) {
+		MFXNotificationCenterSystem.instance()
+				.setPosition(NotificationPos.TOP_CENTER)
+				.publish(createNotification());
+	}
+
+	@FXML
+	void showTopRightNC(ActionEvent event) {
+		MFXNotificationCenterSystem.instance()
+				.setPosition(NotificationPos.TOP_RIGHT)
+				.publish(createNotification());
+	}
+
+	@FXML
+	void showBottomLeftNC(ActionEvent event) {
+		MFXNotificationCenterSystem.instance()
+				.setPosition(NotificationPos.BOTTOM_LEFT)
+				.publish(createNotification());
+	}
+
+	@FXML
+	void showBottomCenterNC(ActionEvent event) {
+		MFXNotificationCenterSystem.instance()
+				.setPosition(NotificationPos.BOTTOM_CENTER)
+				.publish(createNotification());
+	}
+
+	@FXML
+	void showBottomRightNC(ActionEvent event) {
+		MFXNotificationCenterSystem.instance()
+				.setPosition(NotificationPos.BOTTOM_RIGHT)
+				.publish(createNotification());
+	}
+
+	private INotification createNotification() {
+		ExampleNotification notification = new ExampleNotification();
+		notification.setContentText(RandomUtils.randFromArray(Model.randomText));
+		return notification;
+	}
+
+	private static class ExampleNotification extends MFXSimpleNotification {
+		private final StringProperty headerText = new SimpleStringProperty("Notification Header");
+		private final StringProperty contentText = new SimpleStringProperty();
+
+		public ExampleNotification() {
+
+			MFXIconWrapper icon = new MFXIconWrapper(RandomUtils.randFromArray(Model.notificationsIcons).getDescription(), 16, 32);
+			Label headerLabel = new Label();
+			headerLabel.textProperty().bind(headerText);
+			MFXIconWrapper readIcon = new MFXIconWrapper("mfx-eye", 16, 32);
+			((MFXFontIcon) readIcon.getIcon()).descriptionProperty().bind(Bindings.createStringBinding(
+					() -> (getState() == NotificationState.READ) ? "mfx-eye" : "mfx-eye-slash",
+					notificationStateProperty()
+			));
+			StackPane.setAlignment(readIcon, Pos.CENTER_RIGHT);
+			StackPane placeHolder = new StackPane(readIcon);
+			placeHolder.setMaxWidth(Double.MAX_VALUE);
+			HBox.setHgrow(placeHolder, Priority.ALWAYS);
+			HBox header = new HBox(10, icon, headerLabel, placeHolder);
+			header.setAlignment(Pos.CENTER_LEFT);
+			header.setPadding(InsetsFactory.of(5, 0, 5, 0));
+			header.setMaxWidth(Double.MAX_VALUE);
+
+
+			Label contentLabel = new Label();
+			contentLabel.getStyleClass().add("content");
+			contentLabel.textProperty().bind(contentText);
+			contentLabel.setWrapText(true);
+			contentLabel.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
+			contentLabel.setAlignment(Pos.TOP_LEFT);
+
+			MFXButton action1 = new MFXButton("Action 1");
+			MFXButton action2 = new MFXButton("Action 2");
+			HBox actionsBar = new HBox(15, action1, action2);
+			actionsBar.getStyleClass().add("actions-bar");
+			actionsBar.setAlignment(Pos.CENTER_RIGHT);
+			actionsBar.setPadding(InsetsFactory.all(5));
+
+			BorderPane container = new BorderPane();
+			container.getStyleClass().add("notification");
+			container.setTop(header);
+			container.setCenter(contentLabel);
+			container.setBottom(actionsBar);
+			container.getStylesheets().add(MFXDemoResourcesLoader.load("css/ExampleNotification.css"));
+			container.setMinHeight(200);
+			container.setMaxWidth(400);
+
+			setContent(container);
+		}
+
+		public String getHeaderText() {
+			return headerText.get();
+		}
+
+		public StringProperty headerTextProperty() {
+			return headerText;
+		}
+
+		public void setHeaderText(String headerText) {
+			this.headerText.set(headerText);
+		}
+
+		public String getContentText() {
+			return contentText.get();
+		}
+
+		public StringProperty contentTextProperty() {
+			return contentText;
+		}
+
+		public void setContentText(String contentText) {
+			this.contentText.set(contentText);
+		}
+	}
 }

+ 22 - 0
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/PickersController.java

@@ -0,0 +1,22 @@
+package io.github.palexdev.materialfx.demo.controllers;
+
+import io.github.palexdev.materialfx.controls.MFXDatePicker;
+import io.github.palexdev.materialfx.utils.DateTimeUtils;
+import io.github.palexdev.materialfx.utils.others.dates.DateStringConverter;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+
+import java.net.URL;
+import java.util.ResourceBundle;
+
+public class PickersController implements Initializable {
+
+	@FXML
+	private MFXDatePicker custDatePicker;
+
+	@Override
+	public void initialize(URL location, ResourceBundle resources) {
+		custDatePicker.setGridAlgorithm(DateTimeUtils::partialIntMonthMatrix);
+		custDatePicker.setConverterSupplier(() -> new DateStringConverter("dd/MM/yyyy", custDatePicker.getLocale()));
+	}
+}

+ 0 - 90
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/ProgressBarsDemoController.java

@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package io.github.palexdev.materialfx.demo.controllers;
-
-import io.github.palexdev.materialfx.beans.NumberRange;
-import io.github.palexdev.materialfx.controls.MFXProgressBar;
-import io.github.palexdev.materialfx.factories.MFXAnimationFactory;
-import io.github.palexdev.materialfx.utils.AnimationUtils;
-import io.github.palexdev.materialfx.utils.AnimationUtils.KeyFrames;
-import javafx.animation.Animation;
-import javafx.beans.binding.Bindings;
-import javafx.fxml.FXML;
-import javafx.fxml.Initializable;
-import javafx.scene.control.Label;
-import javafx.scene.paint.Color;
-import javafx.util.Duration;
-
-import java.net.URL;
-import java.util.Formatter;
-import java.util.ResourceBundle;
-
-public class ProgressBarsDemoController implements Initializable {
-
-    @FXML
-    private MFXProgressBar determinate;
-
-    @FXML
-    private Label progressLabel;
-
-    @Override
-    public void initialize(URL location, ResourceBundle resources) {
-        progressLabel.textProperty().bind(Bindings.createStringBinding(
-                () -> new Formatter().format("%.2f", determinate.getProgress()).toString().replace(",", "."),
-                determinate.progressProperty()
-        ));
-        progressLabel.textFillProperty().bind(Bindings.createObjectBinding(
-                () -> progressLabel.getText().equals("1.00") ? Color.web("#85CB33") : Color.BLACK,
-                progressLabel.textProperty()
-        ));
-
-        Animation a1 = AnimationUtils.TimelineBuilder.build()
-                .add(
-                        KeyFrames.of(2000, determinate.progressProperty(), 0.3, MFXAnimationFactory.INTERPOLATOR_V1),
-                        KeyFrames.of(4000, determinate.progressProperty(), 0.6, MFXAnimationFactory.INTERPOLATOR_V1),
-                        KeyFrames.of(6000, determinate.progressProperty(), 1.0, MFXAnimationFactory.INTERPOLATOR_V1)
-                )
-                .getAnimation();
-
-        Animation a2 = AnimationUtils.TimelineBuilder.build()
-                .add(
-                        KeyFrames.of(1000, determinate.progressProperty(), 0, MFXAnimationFactory.INTERPOLATOR_V2)
-                )
-                .getAnimation();
-
-        a1.setOnFinished(end -> AnimationUtils.PauseBuilder.build()
-                .setDuration(Duration.seconds(1))
-                .setOnFinished(event -> a2.playFromStart())
-                .getAnimation()
-                .play()
-        );
-        a2.setOnFinished(end -> AnimationUtils.PauseBuilder.build()
-                .setDuration(Duration.seconds(1))
-                .setOnFinished(event -> a1.playFromStart())
-                .getAnimation()
-                .play()
-        );
-
-        a1.play();
-
-        determinate.getRanges1().add(NumberRange.of(0.0, 0.30));
-        determinate.getRanges2().add(NumberRange.of(0.31, 0.60));
-        determinate.getRanges3().add(NumberRange.of(0.61, 1.0));
-    }
-}

+ 72 - 0
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/ProgressController.java

@@ -0,0 +1,72 @@
+package io.github.palexdev.materialfx.demo.controllers;
+
+import io.github.palexdev.materialfx.beans.NumberRange;
+import io.github.palexdev.materialfx.controls.MFXProgressBar;
+import io.github.palexdev.materialfx.controls.MFXProgressSpinner;
+import io.github.palexdev.materialfx.effects.Interpolators;
+import io.github.palexdev.materialfx.utils.AnimationUtils.KeyFrames;
+import io.github.palexdev.materialfx.utils.AnimationUtils.PauseBuilder;
+import io.github.palexdev.materialfx.utils.AnimationUtils.TimelineBuilder;
+import javafx.animation.Animation;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+import javafx.scene.control.ProgressIndicator;
+import javafx.util.Duration;
+
+import java.net.URL;
+import java.util.ResourceBundle;
+
+public class ProgressController implements Initializable {
+
+	@FXML
+	private MFXProgressBar determinateBar;
+
+	@FXML
+	private MFXProgressSpinner determinateSpinner;
+
+
+	@Override
+	public void initialize(URL location, ResourceBundle resources) {
+		determinateBar.getRanges1().add(NumberRange.of(0.0, 0.30));
+		determinateBar.getRanges2().add(NumberRange.of(0.31, 0.60));
+		determinateBar.getRanges3().add(NumberRange.of(0.61, 1.0));
+
+		determinateSpinner.getRanges1().add(NumberRange.of(0.0, 0.30));
+		determinateSpinner.getRanges2().add(NumberRange.of(0.31, 0.60));
+		determinateSpinner.getRanges3().add(NumberRange.of(0.61, 1.0));
+
+		createAndPlayAnimation(determinateBar);
+		createAndPlayAnimation(determinateSpinner);
+	}
+	
+	private void createAndPlayAnimation(ProgressIndicator indicator) {
+		Animation a1 = TimelineBuilder.build()
+				.add(
+						KeyFrames.of(2000, indicator.progressProperty(), 0.3, Interpolators.INTERPOLATOR_V1),
+						KeyFrames.of(4000, indicator.progressProperty(), 0.6, Interpolators.INTERPOLATOR_V1),
+						KeyFrames.of(6000, indicator.progressProperty(), 1.0, Interpolators.INTERPOLATOR_V1)
+				)
+				.getAnimation();
+
+		Animation a2 = TimelineBuilder.build()
+				.add(
+						KeyFrames.of(1000, indicator.progressProperty(), 0, Interpolators.INTERPOLATOR_V2)
+				)
+				.getAnimation();
+
+		a1.setOnFinished(end -> PauseBuilder.build()
+				.setDuration(Duration.seconds(1))
+				.setOnFinished(event -> a2.playFromStart())
+				.getAnimation()
+				.play()
+		);
+		a2.setOnFinished(end -> PauseBuilder.build()
+				.setDuration(Duration.seconds(1))
+				.setOnFinished(event -> a1.playFromStart())
+				.getAnimation()
+				.play()
+		);
+
+		a1.play();
+	}
+}

+ 0 - 69
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/ProgressSpinnersDemoController.java

@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package io.github.palexdev.materialfx.demo.controllers;
-
-import io.github.palexdev.materialfx.beans.NumberRange;
-import io.github.palexdev.materialfx.controls.MFXProgressSpinner;
-import io.github.palexdev.materialfx.utils.AnimationUtils;
-import io.github.palexdev.materialfx.utils.AnimationUtils.KeyFrames;
-import javafx.animation.KeyValue;
-import javafx.animation.Timeline;
-import javafx.fxml.FXML;
-import javafx.fxml.Initializable;
-import javafx.util.Duration;
-
-import java.net.URL;
-import java.util.ResourceBundle;
-
-public class ProgressSpinnersDemoController implements Initializable {
-
-    @FXML
-    private MFXProgressSpinner progress1;
-
-    @FXML
-    private MFXProgressSpinner progress2;
-
-    @Override
-    public void initialize(URL location, ResourceBundle resources) {
-        AnimationUtils.TimelineBuilder.build()
-                .add(
-                        KeyFrames.of(
-                                Duration.ZERO,
-                                new KeyValue(progress1.progressProperty(), 0),
-                                new KeyValue(progress2.progressProperty(), 0)
-                        ),
-                        KeyFrames.of(
-                                Duration.seconds(0.5),
-                                new KeyValue(progress1.progressProperty(), 0.5)
-                        ),
-                        KeyFrames.of(
-                                Duration.seconds(2),
-                                new KeyValue(progress1.progressProperty(), 1),
-                                new KeyValue(progress2.progressProperty(), 1)
-                        )
-                )
-                .setCycleCount(Timeline.INDEFINITE)
-                .getAnimation()
-                .play();
-
-        progress1.getRanges1().add(NumberRange.of(0.0, 0.30));
-        progress1.getRanges2().add(NumberRange.of(0.31, 0.60));
-        progress1.getRanges3().add(NumberRange.of(0.61, 1.0));
-    }
-}

+ 0 - 63
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/ScrollPaneDemoController.java

@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package io.github.palexdev.materialfx.demo.controllers;
-
-
-import io.github.palexdev.materialfx.controls.MFXScrollPane;
-import io.github.palexdev.materialfx.utils.ColorUtils;
-import io.github.palexdev.materialfx.utils.ScrollUtils;
-import javafx.fxml.FXML;
-import javafx.fxml.Initializable;
-
-import java.net.URL;
-import java.util.ResourceBundle;
-
-public class ScrollPaneDemoController implements Initializable {
-
-    @FXML
-    private MFXScrollPane scrollPaneV;
-
-    @FXML
-    private MFXScrollPane scrollPaneVH;
-
-    @Override
-    public void initialize(URL location, ResourceBundle resources) {
-        ScrollUtils.addSmoothScrolling(scrollPaneV);
-        ScrollUtils.addSmoothScrolling(scrollPaneVH);
-        ScrollUtils.animateScrollBars(scrollPaneVH);
-    }
-
-    @FXML
-    void setRandomTrackColor() {
-        scrollPaneV.setTrackColor(ColorUtils.getRandomColor());
-        scrollPaneVH.setTrackColor(ColorUtils.getRandomColor());
-    }
-
-    @FXML
-    void setRandomThumbColor() {
-        scrollPaneV.setThumbColor(ColorUtils.getRandomColor());
-        scrollPaneVH.setThumbColor(ColorUtils.getRandomColor());
-    }
-
-    @FXML
-    void setRandomThumbHoverColor() {
-        scrollPaneV.setThumbHoverColor(ColorUtils.getRandomColor());
-        scrollPaneVH.setThumbHoverColor(ColorUtils.getRandomColor());
-    }
-}

+ 54 - 0
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/ScrollPanesController.java

@@ -0,0 +1,54 @@
+package io.github.palexdev.materialfx.demo.controllers;
+
+import io.github.palexdev.materialfx.controls.MFXScrollPane;
+import io.github.palexdev.materialfx.demo.model.Model;
+import io.github.palexdev.materialfx.utils.ColorUtils;
+import io.github.palexdev.materialfx.utils.ScrollUtils;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+import javafx.scene.control.Label;
+
+import java.net.URL;
+import java.util.ResourceBundle;
+
+public class ScrollPanesController implements Initializable {
+
+	@FXML
+	private MFXScrollPane scroll1;
+
+	@FXML
+	private MFXScrollPane scroll2;
+
+	@Override
+	public void initialize(URL location, ResourceBundle resources) {
+		Label l1 = new Label(Model.ipsum);
+		l1.setWrapText(true);
+		Label l2 = new Label(Model.ipsum);
+		l2.setMaxSize(400, Double.MAX_VALUE);
+		l2.setWrapText(true);
+
+		scroll1.setContent(l1);
+		scroll2.setContent(l2);
+
+		ScrollUtils.addSmoothScrolling(scroll1);
+		ScrollUtils.addSmoothScrolling(scroll2);
+	}
+
+	@FXML
+	private void setRandomTrackColor() {
+		scroll1.setTrackColor(ColorUtils.getRandomColor());
+		scroll2.setTrackColor(ColorUtils.getRandomColor());
+	}
+
+	@FXML
+	private void setRandomThumbColor() {
+		scroll1.setThumbColor(ColorUtils.getRandomColor());
+		scroll2.setThumbColor(ColorUtils.getRandomColor());
+	}
+
+	@FXML
+	private void setRandomThumbHoverColor() {
+		scroll1.setThumbHoverColor(ColorUtils.getRandomColor());
+		scroll2.setThumbHoverColor(ColorUtils.getRandomColor());
+	}
+}

+ 22 - 0
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/SlidersController.java

@@ -0,0 +1,22 @@
+package io.github.palexdev.materialfx.demo.controllers;
+
+import io.github.palexdev.materialfx.beans.NumberRange;
+import io.github.palexdev.materialfx.controls.MFXSlider;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+
+import java.net.URL;
+import java.util.ResourceBundle;
+
+public class SlidersController implements Initializable {
+
+	@FXML
+	private MFXSlider customSlider;
+
+	@Override
+	public void initialize(URL location, ResourceBundle resources) {
+		customSlider.getRanges1().add(NumberRange.of(customSlider.getMin(), 33.0));
+		customSlider.getRanges2().add(NumberRange.of(34.0, 66.0));
+		customSlider.getRanges3().add(NumberRange.of(67.0, customSlider.getMax()));
+	}
+}

+ 0 - 40
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/SlidersDemoController.java

@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package io.github.palexdev.materialfx.demo.controllers;
-
-import io.github.palexdev.materialfx.beans.NumberRange;
-import io.github.palexdev.materialfx.controls.MFXSlider;
-import javafx.fxml.FXML;
-import javafx.fxml.Initializable;
-
-import java.net.URL;
-import java.util.ResourceBundle;
-
-public class SlidersDemoController implements Initializable {
-
-    @FXML
-    private MFXSlider customSlider;
-
-    @Override
-    public void initialize(URL location, ResourceBundle resources) {
-        customSlider.getRanges1().add(NumberRange.of(customSlider.getMin(), 33.0));
-        customSlider.getRanges2().add(NumberRange.of(34.0, 66.0));
-        customSlider.getRanges3().add(NumberRange.of(67.0, customSlider.getMax()));
-    }
-}

+ 186 - 0
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/StepperController.java

@@ -0,0 +1,186 @@
+package io.github.palexdev.materialfx.demo.controllers;
+
+import io.github.palexdev.materialfx.controls.*;
+import io.github.palexdev.materialfx.controls.MFXStepper.MFXStepperEvent;
+import io.github.palexdev.materialfx.font.MFXFontIcon;
+import io.github.palexdev.materialfx.validation.Constraint;
+import io.github.palexdev.materialfx.validation.MFXValidator;
+import io.github.palexdev.materialfx.validation.Validated;
+import javafx.beans.binding.Bindings;
+import javafx.collections.FXCollections;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+import javafx.geometry.Pos;
+import javafx.scene.Node;
+import javafx.scene.control.Label;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.Region;
+import javafx.scene.layout.StackPane;
+import javafx.scene.layout.VBox;
+import javafx.scene.paint.Color;
+
+import java.net.URL;
+import java.util.List;
+import java.util.ResourceBundle;
+
+public class StepperController implements Initializable {
+	private final MFXTextField loginField;
+	private final MFXPasswordField passwordField;
+	private final MFXTextField firstNameField;
+	private final MFXTextField lastNameField;
+	private final MFXComboBox<String> genderCombo;
+	private final MFXCheckbox checkbox;
+
+	@FXML
+	private MFXButton unlock;
+
+	@FXML
+	private MFXStepper stepper;
+
+	public StepperController() {
+		loginField = new MFXTextField();
+		passwordField = new MFXPasswordField();
+		firstNameField = new MFXTextField();
+		lastNameField = new MFXTextField();
+		genderCombo = new MFXComboBox<>();
+		checkbox = new MFXCheckbox("Confirm Data?");
+	}
+
+
+	@Override
+	public void initialize(URL location, ResourceBundle resources) {
+		loginField.setPromptText("Username...");
+		loginField.getValidator().constraint("The username must be at least 6 characters long", loginField.textProperty().length().greaterThanOrEqualTo(6));
+		loginField.setLeadingIcon(new MFXIconWrapper("mfx-user", 16, Color.web("#4D4D4D"), 24));
+		passwordField.getValidator().constraint("The password must be at least 8 characters long", passwordField.textProperty().length().greaterThanOrEqualTo(8));
+		passwordField.setPromptText("Password...");
+
+		firstNameField.setPromptText("First Name...");
+		lastNameField.setPromptText("Last Name...");
+		genderCombo.setItems(FXCollections.observableArrayList("Male", "Female", "Other"));
+
+		List<MFXStepperToggle> stepperToggles = createSteps();
+		stepper.getStepperToggles().addAll(stepperToggles);
+
+		unlock.visibleProperty().bind(stepper.mouseTransparentProperty());
+		unlock.setOnAction(event -> stepper.setMouseTransparent(false));
+	}
+
+	private List<MFXStepperToggle> createSteps() {
+		MFXStepperToggle step1 = new MFXStepperToggle("Step 1", new MFXFontIcon("mfx-lock", 16, Color.web("#f1c40f")));
+		VBox step1Box = new VBox(20, wrapNodeForValidation(loginField), wrapNodeForValidation(passwordField));
+		step1Box.setAlignment(Pos.CENTER);
+		step1.setContent(step1Box);
+		step1.getValidator().dependsOn(loginField.getValidator()).dependsOn(passwordField.getValidator());
+
+		MFXStepperToggle step2 = new MFXStepperToggle("Step 2", new MFXFontIcon("mfx-user", 16, Color.web("#49a6d7")));
+		VBox step2Box = new VBox(20, firstNameField, lastNameField, genderCombo);
+		step2Box.setAlignment(Pos.CENTER);
+		step2.setContent(step2Box);
+
+		MFXStepperToggle step3 = new MFXStepperToggle("Step 3", new MFXFontIcon("mfx-variant7-mark", 16, Color.web("#85CB33")));
+		Node step3Grid = createGrid();
+		step3.setContent(step3Grid);
+		step3.getValidator().constraint("Data must be confirmed", checkbox.selectedProperty());
+
+		return List.of(step1, step2, step3);
+	}
+
+	private <T extends Node & Validated> Node wrapNodeForValidation(T node) {
+		Label errorLabel = new Label();
+		errorLabel.getStyleClass().add("error-label");
+		errorLabel.setManaged(false);
+		stepper.addEventHandler(MFXStepperEvent.VALIDATION_FAILED_EVENT, event -> {
+			MFXValidator validator = node.getValidator();
+			List<Constraint> validate = validator.validate();
+			if (!validate.isEmpty()) {
+				errorLabel.setText(validate.get(0).getMessage());
+			}
+		});
+		stepper.addEventHandler(MFXStepperEvent.NEXT_EVENT, event -> errorLabel.setText(""));
+		VBox wrap = new VBox(3, node, errorLabel) {
+			@Override
+			protected void layoutChildren() {
+				super.layoutChildren();
+
+				double x = node.getBoundsInParent().getMinX();
+				double y = node.getBoundsInParent().getMaxY() + getSpacing();
+				double width = getWidth();
+				double height = errorLabel.prefHeight(-1);
+				errorLabel.resizeRelocate(x, y, width, height);
+			}
+
+			@Override
+			protected double computePrefHeight(double width) {
+				return super.computePrefHeight(width) + errorLabel.getHeight() + getSpacing();
+			}
+		};
+		wrap.setAlignment(Pos.CENTER);
+		return wrap;
+	}
+
+	private Node createGrid() {
+		MFXTextField usernameLabel1 = createLabel("Username: ");
+		MFXTextField usernameLabel2 = createLabel("");
+		usernameLabel2.textProperty().bind(loginField.textProperty());
+
+		MFXTextField firstNameLabel1 = createLabel("First Name: ");
+		MFXTextField firstNameLabel2 = createLabel("");
+		firstNameLabel2.textProperty().bind(firstNameField.textProperty());
+
+		MFXTextField lastNameLabel1 = createLabel("Last Name: ");
+		MFXTextField lastNameLabel2 = createLabel("");
+		lastNameLabel2.textProperty().bind(lastNameField.textProperty());
+
+		MFXTextField genderLabel1 = createLabel("Gender: ");
+		MFXTextField genderLabel2 = createLabel("");
+		genderLabel2.textProperty().bind(Bindings.createStringBinding(
+				() -> genderCombo.getValue() != null ? genderCombo.getValue() : "",
+				genderCombo.valueProperty()
+		));
+
+		usernameLabel1.getStyleClass().add("header-label");
+		firstNameLabel1.getStyleClass().add("header-label");
+		lastNameLabel1.getStyleClass().add("header-label");
+		genderLabel1.getStyleClass().add("header-label");
+
+		MFXTextField completedLabel = MFXTextField.asLabel("Completed!");
+		completedLabel.getStyleClass().add("completed-label");
+
+		HBox b1 = new HBox(usernameLabel1, usernameLabel2);
+		HBox b2 = new HBox(firstNameLabel1, firstNameLabel2);
+		HBox b3 = new HBox(lastNameLabel1, lastNameLabel2);
+		HBox b4 = new HBox(genderLabel1, genderLabel2);
+
+		b1.setMaxWidth(Region.USE_PREF_SIZE);
+		b2.setMaxWidth(Region.USE_PREF_SIZE);
+		b3.setMaxWidth(Region.USE_PREF_SIZE);
+		b4.setMaxWidth(Region.USE_PREF_SIZE);
+
+		VBox box = new VBox(10, b1, b2, b3, b4, checkbox);
+		box.setAlignment(Pos.CENTER);
+		StackPane.setAlignment(box, Pos.CENTER);
+
+		stepper.setOnLastNext(event -> {
+			box.getChildren().setAll(completedLabel);
+			stepper.setMouseTransparent(true);
+		});
+		stepper.setOnBeforePrevious(event -> {
+			if (stepper.isLastToggle()) {
+				checkbox.setSelected(false);
+				box.getChildren().setAll(b1, b2, b3, b4, checkbox);
+			}
+		});
+
+		return box;
+	}
+
+	private MFXTextField createLabel(String text) {
+		MFXTextField label = MFXTextField.asLabel(text);
+		label.setAlignment(Pos.CENTER_LEFT);
+		label.setPrefWidth(200);
+		label.setMinWidth(Region.USE_PREF_SIZE);
+		label.setMaxWidth(Region.USE_PREF_SIZE);
+		return label;
+	}
+}

+ 0 - 171
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/StepperDemoController.java

@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package io.github.palexdev.materialfx.demo.controllers;
-
-import io.github.palexdev.materialfx.controls.*;
-import io.github.palexdev.materialfx.demo.MFXDemoResourcesLoader;
-import io.github.palexdev.materialfx.font.MFXFontIcon;
-import io.github.palexdev.materialfx.utils.BindingUtils;
-import javafx.beans.binding.Bindings;
-import javafx.collections.FXCollections;
-import javafx.fxml.FXML;
-import javafx.fxml.Initializable;
-import javafx.geometry.Pos;
-import javafx.scene.Node;
-import javafx.scene.layout.HBox;
-import javafx.scene.layout.Region;
-import javafx.scene.layout.StackPane;
-import javafx.scene.layout.VBox;
-import javafx.scene.paint.Color;
-import javafx.scene.text.Font;
-import org.kordamp.ikonli.javafx.FontIcon;
-
-import java.net.URL;
-import java.util.List;
-import java.util.ResourceBundle;
-
-public class StepperDemoController implements Initializable {
-    private final MFXTextField loginField;
-    private final MFXPasswordField passwordField;
-    private final MFXTextField firstNameField;
-    private final MFXTextField lastNameField;
-    private final MFXComboBox<String> genderCombo;
-    private final MFXCheckbox checkbox;
-
-    @FXML
-    private MFXStepper stepper;
-
-    @FXML
-    private MFXButton unlock;
-
-    public StepperDemoController() {
-        loginField = new MFXTextField();
-        passwordField = new MFXPasswordField();
-        firstNameField = new MFXTextField();
-        lastNameField = new MFXTextField();
-        genderCombo = new MFXComboBox<>();
-        checkbox = new MFXCheckbox("Confirm Data?");
-    }
-
-    @Override
-    public void initialize(URL location, ResourceBundle resources) {
-        loginField.setPromptText("Username...");
-        loginField.getValidator().add(BindingUtils.toProperty(loginField.textProperty().length().greaterThanOrEqualTo(6)), "The username must be at least 6 characters long");
-        loginField.setValidated(true);
-        loginField.setIcon(new MFXIconWrapper("mfx-user", 16, Color.web("#4D4D4D"), 24));
-        passwordField.setPromptText("Password...");
-        passwordField.getValidator().add(BindingUtils.toProperty(passwordField.passwordProperty().length().greaterThanOrEqualTo(8)), "The password must be at least 8 characters long");
-        passwordField.setValidated(true);
-
-        firstNameField.setPromptText("First Name...");
-        lastNameField.setPromptText("Last Name...");
-        genderCombo.setItems(FXCollections.observableArrayList("Male", "Female", "Other"));
-
-        List<MFXStepperToggle> stepperToggles = createSteps();
-        stepper.getStepperToggles().addAll(stepperToggles);
-
-        unlock.visibleProperty().bind(stepper.mouseTransparentProperty());
-        unlock.setOnAction(event -> stepper.setMouseTransparent(false));
-    }
-
-    private List<MFXStepperToggle> createSteps() {
-        FontIcon key = new FontIcon("fas-key");
-        key.setIconSize(16);
-        key.setIconColor(Color.web("#f1c40f"));
-        MFXStepperToggle step1 = new MFXStepperToggle("Step 1", key);
-        VBox step1Box = new VBox(40, loginField, passwordField);
-        step1Box.setAlignment(Pos.CENTER);
-        step1.setContent(step1Box);
-        step1.getValidator().addDependencies(loginField.getValidator(), passwordField.getValidator());
-
-        MFXStepperToggle step2 = new MFXStepperToggle("Step 2", new MFXFontIcon("mfx-user", 16, Color.web("#49a6d7")));
-        VBox step2Box = new VBox(40, firstNameField, lastNameField, genderCombo);
-        step2Box.setAlignment(Pos.CENTER);
-        step2.setContent(step2Box);
-
-        MFXStepperToggle step3 = new MFXStepperToggle("Step 3", new MFXFontIcon("mfx-variant7-mark", 16, Color.web("#85CB33")));
-        Node step3Grid = createGrid();
-        step3.setContent(step3Grid);
-        step3.getValidator().add(checkbox.selectedProperty(), "Data must be confirmed");
-
-        return List.of(step1, step2, step3);
-    }
-
-    private Node createGrid() {
-        MFXLabel usernameLabel1 = createLabel("Username: ");
-        MFXLabel usernameLabel2 = createLabel("");
-        usernameLabel2.textProperty().bind(loginField.textProperty());
-
-        MFXLabel firstNameLabel1 = createLabel("First Name: ");
-        MFXLabel firstNameLabel2 = createLabel("");
-        firstNameLabel2.textProperty().bind(firstNameField.textProperty());
-
-        MFXLabel lastNameLabel1 = createLabel("Last Name: ");
-        MFXLabel lastNameLabel2 = createLabel("");
-        lastNameLabel2.textProperty().bind(lastNameField.textProperty());
-
-        MFXLabel genderLabel1 = createLabel("Gender: ");
-        MFXLabel genderLabel2 = createLabel("");
-        genderLabel2.textProperty().bind(Bindings.createStringBinding(
-                () -> genderCombo.getSelectedValue() != null ? genderCombo.getSelectedValue() : "",
-                genderCombo.selectedValueProperty()
-        ));
-
-        MFXLabel completedLabel = new MFXLabel("Completed!!");
-        completedLabel.setFont(Font.font("Open Sans Bold", 24));
-        completedLabel.setTextFill(Color.web("#85CB33"));
-
-        HBox b1 = new HBox(usernameLabel1, usernameLabel2);
-        HBox b2 = new HBox(firstNameLabel1, firstNameLabel2);
-        HBox b3 = new HBox(lastNameLabel1, lastNameLabel2);
-        HBox b4 = new HBox(genderLabel1, genderLabel2);
-
-        b1.setMaxWidth(Region.USE_PREF_SIZE);
-        b2.setMaxWidth(Region.USE_PREF_SIZE);
-        b3.setMaxWidth(Region.USE_PREF_SIZE);
-        b4.setMaxWidth(Region.USE_PREF_SIZE);
-
-        VBox box = new VBox(10, b1, b2, b3, b4, checkbox);
-        box.getStylesheets().setAll(MFXDemoResourcesLoader.load("css/StepperDemo.css"));
-        box.setAlignment(Pos.CENTER);
-        StackPane.setAlignment(box, Pos.CENTER);
-
-        stepper.setOnLastNext(event -> {
-            box.getChildren().setAll(completedLabel);
-            stepper.setMouseTransparent(true);
-        });
-        stepper.setOnBeforePrevious(event -> {
-            if (stepper.isLastToggle()) {
-                checkbox.setSelected(false);
-                box.getChildren().setAll(b1, b2, b3, b4, checkbox);
-            }
-        });
-
-        return box;
-    }
-
-    private MFXLabel createLabel(String text) {
-        MFXLabel label = new MFXLabel(text);
-        label.setAlignment(Pos.CENTER_LEFT);
-        label.setPrefWidth(200);
-        label.setMinWidth(Region.USE_PREF_SIZE);
-        label.setMaxWidth(Region.USE_PREF_SIZE);
-        return label;
-    }
-}

+ 86 - 0
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/TableViewsController.java

@@ -0,0 +1,86 @@
+package io.github.palexdev.materialfx.demo.controllers;
+
+import io.github.palexdev.materialfx.controls.MFXPaginatedTableView;
+import io.github.palexdev.materialfx.controls.MFXTableColumn;
+import io.github.palexdev.materialfx.controls.MFXTableView;
+import io.github.palexdev.materialfx.controls.cell.MFXTableRowCell;
+import io.github.palexdev.materialfx.demo.model.Device;
+import io.github.palexdev.materialfx.demo.model.Model;
+import io.github.palexdev.materialfx.demo.model.Person;
+import io.github.palexdev.materialfx.filter.EnumFilter;
+import io.github.palexdev.materialfx.filter.IntegerFilter;
+import io.github.palexdev.materialfx.filter.StringFilter;
+import io.github.palexdev.materialfx.utils.others.observables.When;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+import javafx.geometry.Pos;
+
+import java.net.URL;
+import java.util.Comparator;
+import java.util.ResourceBundle;
+
+public class TableViewsController implements Initializable {
+
+	@FXML
+	private MFXTableView<Person> table;
+
+	@FXML
+	private MFXPaginatedTableView<Device> paginated;
+
+	@Override
+	public void initialize(URL location, ResourceBundle resources) {
+		setupTable();
+		setupPaginated();
+
+		table.autosizeColumnsOnInitialization();
+		paginated.autosizeColumnsOnInitialization();
+
+		When.onChanged(paginated.currentPageProperty())
+				.then((oldValue, newValue) -> paginated.autosizeColumns())
+				.listen();
+	}
+
+	private void setupTable() {
+		MFXTableColumn<Person> nameColumn = new MFXTableColumn<>("Name", true, Comparator.comparing(Person::getName));
+		MFXTableColumn<Person> surnameColumn = new MFXTableColumn<>("Surname", true, Comparator.comparing(Person::getSurname));
+		MFXTableColumn<Person> ageColumn = new MFXTableColumn<>("Age", true, Comparator.comparing(Person::getAge));
+
+		nameColumn.setRowCellFactory(person -> new MFXTableRowCell<>(Person::getName));
+		surnameColumn.setRowCellFactory(person -> new MFXTableRowCell<>(Person::getSurname));
+		ageColumn.setRowCellFactory(person -> new MFXTableRowCell<>(Person::getAge) {{ setAlignment(Pos.CENTER_RIGHT); }});
+		ageColumn.setAlignment(Pos.CENTER_RIGHT);
+
+		table.getTableColumns().addAll(nameColumn, surnameColumn, ageColumn);
+		table.getFilters().addAll(
+				new StringFilter<>("Name", Person::getName),
+				new StringFilter<>("Surname", Person::getSurname),
+				new IntegerFilter<>("Age", Person::getAge)
+		);
+		table.setItems(Model.people);
+	}
+
+	private void setupPaginated() {
+		MFXTableColumn<Device> idColumn = new MFXTableColumn<>("ID", false, Comparator.comparing(Device::getID));
+		MFXTableColumn<Device> nameColumn = new MFXTableColumn<>("Name", false, Comparator.comparing(Device::getName));
+		MFXTableColumn<Device> ipColumn = new MFXTableColumn<>("IP", false, Comparator.comparing(Device::getIP));
+		MFXTableColumn<Device> ownerColumn = new MFXTableColumn<>("Owner", false, Comparator.comparing(Device::getOwner));
+		MFXTableColumn<Device> stateColumn = new MFXTableColumn<>("State", false, Comparator.comparing(Device::getState));
+
+		idColumn.setRowCellFactory(device -> new MFXTableRowCell<>(Device::getID));
+		nameColumn.setRowCellFactory(device -> new MFXTableRowCell<>(Device::getName));
+		ipColumn.setRowCellFactory(device -> new MFXTableRowCell<>(Device::getIP) {{ setAlignment(Pos.CENTER_RIGHT); }});
+		ownerColumn.setRowCellFactory(device -> new MFXTableRowCell<>(Device::getOwner));
+		stateColumn.setRowCellFactory(device -> new MFXTableRowCell<>(Device::getState));
+		ipColumn.setAlignment(Pos.CENTER_RIGHT);
+
+		paginated.getTableColumns().addAll(idColumn, nameColumn, ipColumn, ownerColumn, stateColumn);
+		paginated.getFilters().addAll(
+				new IntegerFilter<>("ID", Device::getID),
+				new StringFilter<>("Name", Device::getName),
+				new StringFilter<>("IP", Device::getIP),
+				new StringFilter<>("Owner", Device::getOwner),
+				new EnumFilter<>("State", Device::getState, Device.State.class)
+		);
+		paginated.setItems(Model.devices);
+	}
+}

+ 0 - 196
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/TableViewsDemoController.java

@@ -1,196 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package io.github.palexdev.materialfx.demo.controllers;
-
-import io.github.palexdev.materialfx.controls.MFXButton;
-import io.github.palexdev.materialfx.controls.MFXTableView;
-import io.github.palexdev.materialfx.controls.cell.MFXTableColumn;
-import io.github.palexdev.materialfx.controls.cell.MFXTableRowCell;
-import io.github.palexdev.materialfx.controls.legacy.MFXLegacyTableView;
-import io.github.palexdev.materialfx.demo.model.Machine;
-import io.github.palexdev.materialfx.demo.model.Person;
-import io.github.palexdev.materialfx.font.MFXFontIcon;
-import javafx.application.Platform;
-import javafx.beans.binding.Bindings;
-import javafx.beans.property.ObjectProperty;
-import javafx.beans.property.SimpleObjectProperty;
-import javafx.collections.FXCollections;
-import javafx.collections.ObservableList;
-import javafx.fxml.FXML;
-import javafx.fxml.Initializable;
-import javafx.geometry.Insets;
-import javafx.geometry.Pos;
-import javafx.scene.Scene;
-import javafx.scene.control.TableColumn;
-import javafx.scene.input.MouseEvent;
-import javafx.scene.layout.*;
-import javafx.scene.paint.Color;
-import javafx.stage.Modality;
-import javafx.stage.Stage;
-
-import java.net.URL;
-import java.util.Comparator;
-import java.util.List;
-import java.util.ResourceBundle;
-
-import static io.github.palexdev.materialfx.demo.model.Machine.State.OFFLINE;
-import static io.github.palexdev.materialfx.demo.model.Machine.State.ONLINE;
-
-public class TableViewsDemoController implements Initializable {
-    private final ObjectProperty<Stage> tableStage = new SimpleObjectProperty<>();
-    private final MFXLegacyTableView<Person> legacyTable;
-    private final MFXTableView<Machine> tableView;
-    private final StackPane pane = new StackPane();
-    private final Scene scene = new Scene(pane, 800, 600);
-
-    @FXML
-    private MFXButton showLegacy;
-
-    @FXML
-    private MFXButton showNew;
-
-    public TableViewsDemoController() {
-        tableStage.addListener((observable, oldValue, newValue) -> {
-            getTableStage().initOwner(showLegacy.getScene().getWindow());
-            getTableStage().initModality(Modality.WINDOW_MODAL);
-        });
-
-        Platform.runLater(() -> tableStage.set(new Stage()));
-
-        legacyTable = new MFXLegacyTableView<>();
-        tableView = new MFXTableView<>();
-    }
-
-    @Override
-    public void initialize(URL location, ResourceBundle resources) {
-        showLegacy.setOnAction(event -> {
-            getTableStage().close();
-            pane.getChildren().setAll(legacyTable);
-            getTableStage().setScene(scene);
-            getTableStage().setTitle("Legacy TableView - Preview");
-            getTableStage().show();
-        });
-
-        showNew.setOnAction(event -> {
-            getTableStage().close();
-            pane.getChildren().setAll(tableView);
-            getTableStage().setScene(scene);
-            getTableStage().setTitle("New TableView - Preview");
-            getTableStage().show();
-        });
-
-        populateLegacy();
-        populateTable();
-    }
-
-    @SuppressWarnings("unchecked")
-    private void populateLegacy() {
-        ObservableList<Person> people = FXCollections.observableArrayList(
-                List.of(
-                        new Person("Shaw", "Readdie", "972 Campfire St. Hopkins, MN 55343", 24),
-                        new Person("Lonnie", "Dane", "30 Walnut St. Galloway, OH 43119", 27),
-                        new Person("Tia", "Pilgrim", "8141 N. Edgewater Street Cumberland, RI 02864", 45),
-                        new Person("Liberty", "Ward", "483 East Grand St. Stafford, VA 22554", 34),
-                        new Person("Aria", "Watkins", "85 Sunnyslope Dr. Vincentown, NJ 08088", 53),
-                        new Person("Jervis", "Kitchens", "813 Oklahoma Street West Roxbury, MA 02132", 77),
-                        new Person("Dominick", "Church", "99 E. Alton Ave. Canfield, OH 44406", 29),
-                        new Person("Forrest", "Davis", "840 Pilgrim Street Lake Villa, IL 60046", 67),
-                        new Person("Nathaniel", "Crewe", "9407 South 10th Road Wenatchee, WA 98801", 19)
-                )
-        );
-
-        TableColumn<Person, String> firstNameColumn = new TableColumn<>("First Name");
-        firstNameColumn.setCellValueFactory(fName -> fName.getValue().firstNameProperty());
-        TableColumn<Person, String> lastNameColumn = new TableColumn<>("Last Name");
-        lastNameColumn.setCellValueFactory(lName -> lName.getValue().lastNameProperty());
-        TableColumn<Person, String> addressColumn = new TableColumn<>("Address");
-        addressColumn.setCellValueFactory(addr -> addr.getValue().addressProperty());
-        TableColumn<Person, Number> ageColumn = new TableColumn<>("Age");
-        ageColumn.setCellValueFactory(age -> age.getValue().ageProperty());
-
-        legacyTable.setItems(people);
-        legacyTable.getColumns().addAll(firstNameColumn, lastNameColumn, addressColumn, ageColumn);
-    }
-
-    @SuppressWarnings("unchecked")
-    private void populateTable() {
-        ObservableList<Machine> people = FXCollections.observableArrayList(
-                List.of(
-                        new Machine("MainPC", "192.144.1.5", "Me", ONLINE),
-                        new Machine("SecondaryPC", "192.144.1.6", "Me", OFFLINE),
-                        new Machine("GamingLaptop", "192.144.1.44", "My Sons", OFFLINE),
-                        new Machine("OfficeLaptop", "192.144.1.98", "Me", ONLINE),
-                        new Machine("OfficeNAS", "192.144.1.2", "Me", ONLINE),
-                        new Machine("OfficeAlexa", "192.144.1.34", "", ONLINE),
-                        new Machine("OfficeSmartTV", "192.144.1.72", "", OFFLINE),
-                        new Machine("KidsTablet", "192.144.1.11", "My Sons", OFFLINE),
-                        new Machine("WifeKindle", "192.144.1.35", "My Wife", OFFLINE),
-                        new Machine("SmartWasher", "192.144.1.78", "", ONLINE),
-                        new Machine("SmartWatch", "192.144.1.18", "", ONLINE),
-                        new Machine("GenericSmartphone", "192.144.54", "Me", ONLINE)
-                )
-        );
-
-        MFXTableColumn<Machine> nameColumn = new MFXTableColumn<>("Name", Comparator.comparing(Machine::getName));
-        MFXTableColumn<Machine> ipColumn = new MFXTableColumn<>("IP", Comparator.comparing(Machine::getIp));
-        MFXTableColumn<Machine> ownerColumn = new MFXTableColumn<>("Owner", Comparator.comparing(Machine::getOwner));
-        MFXTableColumn<Machine> stateColumn = new MFXTableColumn<>("State", Comparator.comparing(Machine::getState));
-
-        nameColumn.setRowCellFunction(machine -> new MFXTableRowCell(machine.nameProperty()));
-        ipColumn.setRowCellFunction(machine -> {
-            MFXTableRowCell cell = new MFXTableRowCell(machine.ipProperty());
-            cell.setRowAlignment(Pos.CENTER_RIGHT);
-            return cell;
-        });
-        ownerColumn.setRowCellFunction(machine -> new MFXTableRowCell(machine.ownerProperty()));
-        stateColumn.setRowCellFunction(machine -> {
-            MFXTableRowCell rowCell = new MFXTableRowCell(machine.stateProperty().asString().concat(" - Click Me"));
-            rowCell.setGraphicTextGap(4);
-            MFXFontIcon icon = new MFXFontIcon("mfx-circle", 6);
-            icon.colorProperty().bind(Bindings.createObjectBinding(
-                    () -> machine.getState() == ONLINE ? Color.LIMEGREEN : Color.SALMON,
-                    machine.stateProperty())
-            );
-            rowCell.setLeadingGraphic(icon);
-            rowCell.borderProperty().bind(Bindings.createObjectBinding(
-                    () -> {
-                        Color borderColor = machine.getState() == ONLINE ? Color.LIMEGREEN : Color.SALMON;
-                        return new Border(new BorderStroke(borderColor, BorderStrokeStyle.SOLID, new CornerRadii(5), new BorderWidths(1)));
-                    }, machine.stateProperty()
-            ));
-            rowCell.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> machine.setState(machine.getState() == ONLINE ? OFFLINE : ONLINE));
-            rowCell.setPadding(new Insets(0, 5, 0, 5));
-            return rowCell;
-        });
-
-        ipColumn.setColumnAlignment(Pos.CENTER_RIGHT);
-
-        tableView.setItems(people);
-        tableView.getTableColumns().addAll(nameColumn, ipColumn, ownerColumn, stateColumn);
-    }
-
-    public Stage getTableStage() {
-        return tableStage.get();
-    }
-
-    public void setTableStage(Stage tableStage) {
-        this.tableStage.set(tableStage);
-    }
-}
-

+ 97 - 0
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/TextFieldsController.java

@@ -0,0 +1,97 @@
+package io.github.palexdev.materialfx.demo.controllers;
+
+import io.github.palexdev.materialfx.controls.MFXPasswordField;
+import io.github.palexdev.materialfx.controls.MFXTextField;
+import io.github.palexdev.materialfx.validation.Constraint;
+import io.github.palexdev.materialfx.validation.Severity;
+import javafx.beans.binding.Bindings;
+import javafx.css.PseudoClass;
+import javafx.fxml.FXML;
+import javafx.fxml.Initializable;
+import javafx.scene.control.Label;
+
+import java.net.URL;
+import java.util.List;
+import java.util.ResourceBundle;
+
+import static io.github.palexdev.materialfx.utils.StringUtils.containsAny;
+
+public class TextFieldsController implements Initializable {
+	private static final PseudoClass INVALID_PSEUDO_CLASS = PseudoClass.getPseudoClass("invalid");
+	// Because fuck regex, stupid shit
+	private static final String[] upperChar = "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z".split(" ");
+	private static final String[] lowerChar = "a b c d e f g h i j k l m n o p q r s t u v w x y z".split(" ");
+	private static final String[] digits = "0 1 2 3 4 5 6 7 8 9".split(" ");
+	private static final String[] specialCharacters = "! @ # & ( ) – [ { } ]: ; ' , ? / * ~ $ ^ + = < > -".split(" ");
+
+	@FXML
+	private MFXTextField textField;
+
+	@FXML
+	private MFXPasswordField passwordField;
+
+	@FXML
+	private Label validationLabel;
+
+	@Override
+	public void initialize(URL location, ResourceBundle resources) {
+		textField.setTextLimit(10);
+
+		Constraint lengthConstraint = Constraint.Builder.build()
+				.setSeverity(Severity.ERROR)
+				.setMessage("Password must be at least 8 characters long")
+				.setCondition(passwordField.textProperty().length().greaterThanOrEqualTo(8))
+				.get();
+
+		Constraint digitConstraint = Constraint.Builder.build()
+				.setSeverity(Severity.ERROR)
+				.setMessage("Password must contain at least one digit")
+				.setCondition(Bindings.createBooleanBinding(
+						() -> containsAny(passwordField.getText(), "", digits),
+						passwordField.textProperty()
+				))
+				.get();
+
+		Constraint charactersConstraint = Constraint.Builder.build()
+				.setSeverity(Severity.ERROR)
+				.setMessage("Password must contain at least one lowercase and one uppercase characters")
+				.setCondition(Bindings.createBooleanBinding(
+						() -> containsAny(passwordField.getText(), "", upperChar) && containsAny(passwordField.getText(), "", lowerChar),
+						passwordField.textProperty()
+				))
+				.get();
+
+		Constraint specialCharactersConstraint = Constraint.Builder.build()
+				.setSeverity(Severity.ERROR)
+				.setMessage("Password must contain at least one special character")
+				.setCondition(Bindings.createBooleanBinding(
+						() -> containsAny(passwordField.getText(), "", specialCharacters),
+						passwordField.textProperty()
+				))
+				.get();
+
+		passwordField.getValidator()
+				.constraint(digitConstraint)
+				.constraint(charactersConstraint)
+				.constraint(specialCharactersConstraint)
+				.constraint(lengthConstraint);
+
+		passwordField.getValidator().validProperty().addListener((observable, oldValue, newValue) -> {
+			if (newValue) {
+				validationLabel.setVisible(false);
+				passwordField.pseudoClassStateChanged(INVALID_PSEUDO_CLASS, false);
+			}
+		});
+
+		passwordField.delegateFocusedProperty().addListener((observable, oldValue, newValue) -> {
+			if (oldValue && !newValue) {
+				List<Constraint> constraints = passwordField.validate();
+				if (!constraints.isEmpty()) {
+					passwordField.pseudoClassStateChanged(INVALID_PSEUDO_CLASS, true);
+					validationLabel.setText(constraints.get(0).getMessage());
+					validationLabel.setVisible(true);
+				}
+			}
+		});
+	}
+}

+ 0 - 95
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/TextFieldsDemoController.java

@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package io.github.palexdev.materialfx.demo.controllers;
-
-import io.github.palexdev.materialfx.controls.MFXCheckbox;
-import io.github.palexdev.materialfx.controls.MFXDatePicker;
-import io.github.palexdev.materialfx.controls.MFXPasswordField;
-import io.github.palexdev.materialfx.controls.MFXTextField;
-import io.github.palexdev.materialfx.font.MFXFontIcon;
-import io.github.palexdev.materialfx.utils.BindingUtils;
-import io.github.palexdev.materialfx.utils.StringUtils;
-import javafx.beans.binding.Bindings;
-import javafx.beans.property.BooleanProperty;
-import javafx.fxml.FXML;
-import javafx.fxml.Initializable;
-import javafx.scene.paint.Color;
-
-import java.net.URL;
-import java.time.LocalDate;
-import java.time.Month;
-import java.util.ResourceBundle;
-
-public class TextFieldsDemoController implements Initializable {
-
-    @FXML
-    private MFXTextField validated;
-
-    @FXML
-    private MFXCheckbox checkbox;
-
-    @FXML
-    private MFXDatePicker picker;
-
-    @FXML
-    private MFXPasswordField passwordValidated;
-
-    @Override
-    public void initialize(URL location, ResourceBundle resources) {
-        BooleanProperty checkboxValidation = BindingUtils.toProperty(
-                Bindings.createBooleanBinding(
-                        () -> checkbox.isSelected(),
-                        checkbox.selectedProperty()
-                )
-        );
-        BooleanProperty datePickerValidation = BindingUtils.toProperty(
-                Bindings.createBooleanBinding(
-                        () -> {
-                            LocalDate value = picker.getDatePicker().getValue();
-                            if (value != null) {
-                                return value.equals(LocalDate.of(1911, Month.OCTOBER, 3));
-                            } else {
-                                return false;
-                            }
-                        },
-                        picker.getDatePicker().valueProperty()
-                )
-        );
-        validated.getValidator().add(checkboxValidation, "Checkbox must be selected");
-        validated.getValidator().add(datePickerValidation, "Selected date must be 03/10/1911");
-        validated.setValidated(true);
-        validated.setIcon(new MFXFontIcon("mfx-variant7-mark", 16, Color.web("#8FF7A7")));
-        validated.getIcon().visibleProperty().bind(validated.getValidator().validProperty());
-
-        passwordValidated.setValidated(true);
-        passwordValidated.getValidator().add(
-                BindingUtils.toProperty(passwordValidated.passwordProperty().length().greaterThanOrEqualTo(8)),
-                "Must be at least 8 characters long"
-        );
-        passwordValidated.getValidator().add(BindingUtils.toProperty(
-                Bindings.createBooleanBinding(() -> passwordValidated.getPassword().matches(".*\\d.*"), passwordValidated.passwordProperty())),
-                "Must contain at least one digit"
-        );
-        passwordValidated.getValidator().add(BindingUtils.toProperty(
-                Bindings.createBooleanBinding(() -> StringUtils.containsAny(passwordValidated.getPassword(), "", "?", "!", "@", "(", ")", "[", "]", "{", "}", "-", "_"), passwordValidated.passwordProperty())),
-                "Must contain at least one among these: ?!@()[]{}-_"
-        );
-        passwordValidated.setPassword("A Password");
-    }
-}

+ 0 - 55
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/TogglesController.java

@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package io.github.palexdev.materialfx.demo.controllers;
-
-import io.github.palexdev.materialfx.controls.MFXRectangleToggleNode;
-import io.github.palexdev.materialfx.controls.MFXToggleButton;
-import io.github.palexdev.materialfx.font.MFXFontIcon;
-import io.github.palexdev.materialfx.utils.ColorUtils;
-import javafx.fxml.FXML;
-import javafx.fxml.Initializable;
-
-import java.net.URL;
-import java.util.ResourceBundle;
-
-public class TogglesController implements Initializable {
-
-    @FXML
-    private MFXToggleButton toggleButton;
-
-    @FXML
-    private MFXRectangleToggleNode rec1;
-
-    @FXML
-    private MFXRectangleToggleNode rec2;
-
-    @Override
-    public void initialize(URL location, ResourceBundle resources) {
-        rec1.setLabelLeadingIcon(MFXFontIcon.getRandomIcon(16, ColorUtils.getRandomColor()));
-        rec1.setLabelTrailingIcon(MFXFontIcon.getRandomIcon(16, ColorUtils.getRandomColor()));
-        rec2.setLabelLeadingIcon(MFXFontIcon.getRandomIcon(16, ColorUtils.getRandomColor()));
-        rec2.setLabelTrailingIcon(MFXFontIcon.getRandomIcon(16, ColorUtils.getRandomColor()));
-    }
-
-    @FXML
-    private void handleButtonClick() {
-        toggleButton.setMainColor(ColorUtils.getRandomColor());
-        toggleButton.setSelected(false);
-    }
-}

+ 0 - 189
demo/src/main/java/io/github/palexdev/materialfx/demo/controllers/TreeviewsDemoController.java

@@ -1,189 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package io.github.palexdev.materialfx.demo.controllers;
-
-import io.github.palexdev.materialfx.controls.MFXCheckTreeItem;
-import io.github.palexdev.materialfx.controls.MFXCheckTreeView;
-import io.github.palexdev.materialfx.controls.MFXTreeItem;
-import io.github.palexdev.materialfx.controls.MFXTreeView;
-import io.github.palexdev.materialfx.font.MFXFontIcon;
-import io.github.palexdev.materialfx.utils.ColorUtils;
-import io.github.palexdev.materialfx.utils.ScrollUtils;
-import javafx.fxml.FXML;
-import javafx.fxml.Initializable;
-import javafx.geometry.Pos;
-import javafx.scene.control.Label;
-import javafx.scene.layout.HBox;
-import javafx.scene.text.Text;
-
-import java.net.URL;
-import java.util.List;
-import java.util.ResourceBundle;
-
-public class TreeviewsDemoController implements Initializable {
-
-    @FXML
-    private MFXTreeView<String> treeView;
-
-    @FXML
-    private MFXTreeView<HBox> treeViewHide;
-
-    @FXML
-    private MFXCheckTreeView<String> checkTreeView;
-
-    @FXML
-    private Text text1;
-
-    @FXML
-    private Text text2;
-
-    @FXML
-    private Text text3;
-
-    @Override
-    public void initialize(URL location, ResourceBundle resources) {
-        treeView.setRoot(createRoot());
-
-        treeViewHide.setRoot(createNodeRoot());
-        treeViewHide.setShowRoot(false);
-
-        checkTreeView.setRoot(createCheckRoot());
-
-        ScrollUtils.addSmoothScrolling(treeView);
-        ScrollUtils.addSmoothScrolling(treeViewHide);
-        ScrollUtils.addSmoothScrolling(checkTreeView);
-
-        treeView.getSelectionModel().getSelectedItems().addListener(
-                (observable, oldValue, newValue) -> text1.setText("Selected Items Count: " + treeView.getSelectionModel().getSelectedItems().size()));
-        treeViewHide.getSelectionModel().getSelectedItems().addListener(
-                (observable, oldValue, newValue) -> text2.setText("Selected Items Count: " + newValue.size()));
-        checkTreeView.getCheckModel().getCheckedItems().addListener(
-                (observable, oldValue, newValue) -> text3.setText("Checked Items Count: " + newValue.size()));
-    }
-
-    public MFXTreeItem<String> createRoot() {
-        MFXTreeItem<String> root = new MFXTreeItem<>("Tree View Root");
-
-        MFXTreeItem<String> item1 = new MFXTreeItem<>("ITEM1");
-        item1.getItems().addAll(List.of(
-                new MFXTreeItem<>("ITEM1-Sub1"),
-                new MFXTreeItem<>("ITEM1-Sub2")
-                )
-        );
-
-        MFXTreeItem<String> item2 = new MFXTreeItem<>("ITEM2");
-        item2.getItems().addAll(List.of(
-                new MFXTreeItem<>("ITEM2-Sub1"),
-                new MFXTreeItem<>("ITEM2-Sub2"),
-                new MFXTreeItem<>("ITEM2-Sub3"),
-                new MFXTreeItem<>("ITEM2-Sub4")
-                )
-        );
-
-        MFXTreeItem<String> item3 = new MFXTreeItem<>("ITEM3");
-
-        MFXTreeItem<String> item4 = new MFXTreeItem<>("ITEM4");
-        item2.getItems().add(
-                new MFXTreeItem<>("ITEM4-Sub1")
-        );
-
-        MFXTreeItem<String> item5 = new MFXTreeItem<>("ITEM5");
-        item2.getItems().addAll(List.of(
-                new MFXTreeItem<>("ITEM5-Sub1"),
-                new MFXTreeItem<>("ITEM5-Sub2"),
-                new MFXTreeItem<>("ITEM5-Sub3")
-                )
-        );
-
-        root.getItems().addAll(List.of(item1, item2, item3, item4, item5));
-        return root;
-    }
-
-    public MFXTreeItem<HBox> createNodeRoot() {
-        MFXTreeItem<HBox> root = new MFXTreeItem<>(createBox("mfx-google", "Google Root"));
-
-        MFXTreeItem<HBox> item1 = new MFXTreeItem<>(createBox("mfx-google", "ITEM1"));
-        item1.getItems().addAll(List.of(
-                new MFXTreeItem<>(createBox("mfx-google", "ITEM1-Sub1")),
-                new MFXTreeItem<>(createBox("mfx-google", "ITEM1-Sub2"))
-                )
-        );
-
-        MFXTreeItem<HBox> item2 = new MFXTreeItem<>(createBox("mfx-calendar-black", "ITEM2"));
-        item2.getItems().addAll(List.of(
-                new MFXTreeItem<>(createBox("mfx-calendar-black", "ITEM2-Sub1")),
-                new MFXTreeItem<>(createBox("mfx-calendar-black", "ITEM2-Sub2")),
-                new MFXTreeItem<>(createBox("mfx-calendar-black", "ITEM2-Sub3")),
-                new MFXTreeItem<>(createBox("mfx-calendar-black", "ITEM2-Sub4"))
-                )
-        );
-
-        MFXTreeItem<HBox> item3 = new MFXTreeItem<>(createBox("mfx-exclamation-triangle", "ITEM3"));
-
-        MFXTreeItem<HBox> item4 = new MFXTreeItem<>(createBox("mfx-circle", "ITEM4"));
-        item4.getItems().add(
-                new MFXTreeItem<>(createBox("mfx-info-circle", "ITEM4-Sub1"))
-        );
-
-        MFXTreeItem<HBox> item5 = new MFXTreeItem<>(createBox("mfx-circle", "ITEM5"));
-        item5.getItems().addAll(List.of(
-                new MFXTreeItem<>(createBox("mfx-circle", "ITEM5-Sub1")),
-                new MFXTreeItem<>(createBox("mfx-circle", "ITEM5-Sub2")),
-                new MFXTreeItem<>(createBox("mfx-circle", "ITEM5-Sub3"))
-                )
-        );
-
-        root.getItems().addAll(List.of(item1, item2, item3, item4, item5));
-        return root;
-    }
-
-    public MFXCheckTreeItem<String> createCheckRoot() {
-        MFXCheckTreeItem<String> root = new MFXCheckTreeItem<>("ROOT");
-
-        MFXCheckTreeItem<String> i1 = new MFXCheckTreeItem<>("I1");
-        MFXCheckTreeItem<String> i1a = new MFXCheckTreeItem<>("I1A");
-        i1a.getItems().add(new MFXCheckTreeItem<>("I11A"));
-
-        MFXCheckTreeItem<String> i1b = new MFXCheckTreeItem<>("I1B");
-        i1.getItems().addAll(List.of(i1a, i1b));
-
-        MFXCheckTreeItem<String> i2 = new MFXCheckTreeItem<>("I2");
-        MFXCheckTreeItem<String> i2a = new MFXCheckTreeItem<>("I2A");
-        i2.getItems().add(i2a);
-
-        MFXCheckTreeItem<String> i3 = new MFXCheckTreeItem<>("I3");
-        MFXCheckTreeItem<String> i3a = new MFXCheckTreeItem<>("I3A");
-        MFXCheckTreeItem<String> i3b = new MFXCheckTreeItem<>("I3B");
-        i3.getItems().addAll(List.of(i3a, i3b));
-
-        MFXCheckTreeItem<String> i4 = new MFXCheckTreeItem<>("I4");
-        MFXCheckTreeItem<String> i4a = new MFXCheckTreeItem<>("I4A");
-        i4.getItems().add(i4a);
-
-        root.getItems().addAll(List.of(i1, i2, i3, i4));
-        return root;
-    }
-
-    private HBox createBox(String iconDescription, String text) {
-        MFXFontIcon icon = new MFXFontIcon(iconDescription, ColorUtils.getRandomColor());
-        HBox hBox = new HBox(10, icon, new Label(text));
-        hBox.setAlignment(Pos.CENTER_LEFT);
-        return hBox;
-    }
-}

+ 88 - 0
demo/src/main/java/io/github/palexdev/materialfx/demo/model/Device.java

@@ -0,0 +1,88 @@
+package io.github.palexdev.materialfx.demo.model;
+
+import io.github.palexdev.materialfx.utils.RandomUtils;
+import javafx.beans.property.*;
+
+public class Device {
+	public enum State {
+		ONLINE, OFFLINE
+	}
+
+	private final IntegerProperty id = new SimpleIntegerProperty();
+	private final StringProperty name = new SimpleStringProperty("");
+	private final StringProperty ip = new SimpleStringProperty("");
+	private final StringProperty owner = new SimpleStringProperty("");
+	private final ObjectProperty<State> state = new SimpleObjectProperty<>();
+
+	public Device(int id, String name, String ip, String owner, State state) {
+		setID(id);
+		setName(name);
+		setIP(ip);
+		setOwner(owner);
+		setState(state);
+	}
+
+	public int getID() {
+		return id.get();
+	}
+
+	public IntegerProperty idProperty() {
+		return id;
+	}
+
+	public void setID(int id) {
+		this.id.set(id);
+	}
+
+	public String getName() {
+		return name.get();
+	}
+
+	public StringProperty nameProperty() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name.set(name);
+	}
+
+	public String getIP() {
+		return ip.get();
+	}
+
+	public StringProperty ipProperty() {
+		return ip;
+	}
+
+	public void setIP(String ip) {
+		this.ip.set(ip);
+	}
+
+	public String getOwner() {
+		return owner.get();
+	}
+
+	public StringProperty ownerProperty() {
+		return owner;
+	}
+
+	public void setOwner(String owner) {
+		this.owner.set(owner);
+	}
+
+	public State getState() {
+		return state.get();
+	}
+
+	public ObjectProperty<State> stateProperty() {
+		return state;
+	}
+
+	public void setState(State state) {
+		this.state.set(state);
+	}
+
+	public static int randomID() {
+		return RandomUtils.random.nextInt(100000, 1000000);
+	}
+}

+ 0 - 92
demo/src/main/java/io/github/palexdev/materialfx/demo/model/FilterablePerson.java

@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package io.github.palexdev.materialfx.demo.model;
-
-import javafx.beans.property.IntegerProperty;
-import javafx.beans.property.SimpleIntegerProperty;
-import javafx.beans.property.SimpleStringProperty;
-import javafx.beans.property.StringProperty;
-
-// TODO remove?
-public class FilterablePerson {
-    private final StringProperty firstName = new SimpleStringProperty();
-    private final StringProperty lastName = new SimpleStringProperty();
-    private final StringProperty address = new SimpleStringProperty();
-    private final IntegerProperty age = new SimpleIntegerProperty();
-
-    public FilterablePerson(String firstName, String lastName, String address, Integer age) {
-        setFirstName(firstName);
-        setLastName(lastName);
-        setAddress(address);
-        setAge(age);
-    }
-
-    public String getFirstName() {
-        return firstName.get();
-    }
-
-    public StringProperty firstNameProperty() {
-        return firstName;
-    }
-
-    public void setFirstName(String firstName) {
-        this.firstName.set(firstName);
-    }
-
-    public String getLastName() {
-        return lastName.get();
-    }
-
-    public StringProperty lastNameProperty() {
-        return lastName;
-    }
-
-    public void setLastName(String lastName) {
-        this.lastName.set(lastName);
-    }
-
-    public String getAddress() {
-        return address.get();
-    }
-
-    public StringProperty addressProperty() {
-        return address;
-    }
-
-    public void setAddress(String address) {
-        this.address.set(address);
-    }
-
-    public int getAge() {
-        return age.get();
-    }
-
-    public IntegerProperty ageProperty() {
-        return age;
-    }
-
-    public void setAge(int age) {
-        this.age.set(age);
-    }
-
-    @Override
-    public String toString() {
-        return getFirstName() + " " + getLastName();
-    }
-}

+ 0 - 93
demo/src/main/java/io/github/palexdev/materialfx/demo/model/Machine.java

@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package io.github.palexdev.materialfx.demo.model;
-
-import javafx.beans.property.ObjectProperty;
-import javafx.beans.property.SimpleObjectProperty;
-import javafx.beans.property.SimpleStringProperty;
-import javafx.beans.property.StringProperty;
-
-
-// TODO review?
-public class Machine {
-
-    public enum State {
-        ONLINE, OFFLINE
-    }
-
-    private final StringProperty name = new SimpleStringProperty("");
-    private final StringProperty ip = new SimpleStringProperty("");
-    private final StringProperty owner = new SimpleStringProperty("");
-    private final ObjectProperty<State> state = new SimpleObjectProperty<>();
-
-    public Machine(String name, String ip, String owner, State state) {
-        setName(name);
-        setIp(ip);
-        setOwner(owner);
-        setState(state);
-    }
-
-    public String getName() {
-        return name.get();
-    }
-
-    public StringProperty nameProperty() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name.set(name);
-    }
-
-    public String getIp() {
-        return ip.get();
-    }
-
-    public StringProperty ipProperty() {
-        return ip;
-    }
-
-    public void setIp(String ip) {
-        this.ip.set(ip);
-    }
-
-    public String getOwner() {
-        return owner.get();
-    }
-
-    public StringProperty ownerProperty() {
-        return owner;
-    }
-
-    public void setOwner(String owner) {
-        this.owner.set(owner);
-    }
-
-    public State getState() {
-        return state.get();
-    }
-
-    public ObjectProperty<State> stateProperty() {
-        return state;
-    }
-
-    public void setState(State state) {
-        this.state.set(state);
-    }
-}

+ 150 - 0
demo/src/main/java/io/github/palexdev/materialfx/demo/model/Model.java

@@ -0,0 +1,150 @@
+package io.github.palexdev.materialfx.demo.model;
+
+import io.github.palexdev.materialfx.font.FontResources;
+import io.github.palexdev.materialfx.utils.FXCollectors;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+
+import java.util.stream.IntStream;
+
+import static io.github.palexdev.materialfx.demo.model.Device.State.OFFLINE;
+import static io.github.palexdev.materialfx.demo.model.Device.State.ONLINE;
+import static io.github.palexdev.materialfx.demo.model.Device.randomID;
+
+public class Model {
+	public static final String ipsum =
+			"""
+					Lorem Ipsum is simply dummy text of the printing and typesetting industry.
+					Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.
+					It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.
+					It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
+					""";
+	public static final FontResources[] notificationsIcons;
+	public static final String[] randomText;
+	public static final ObservableList<String> strings;
+	public static final ObservableList<Person> people;
+	public static final ObservableList<Device> devices;
+
+	static {
+		notificationsIcons = new FontResources[]{
+				FontResources.BELL, FontResources.BELL_ALT,
+				FontResources.CALENDAR_ALT_DARK, FontResources.CALENDAR_ALT_SEMI_DARK,
+				FontResources.CHART_PIE, FontResources.CIRCLE, FontResources.CIRCLE_EMPTY,
+				FontResources.EXCLAMATION_CIRCLE, FontResources.EXCLAMATION_TRIANGLE,
+				FontResources.GEAR, FontResources.GOOGLE_DRIVE, FontResources.HOME,
+				FontResources.INFO_CIRCLE, FontResources.MUSIC,
+				FontResources.USER, FontResources.USERS, FontResources.VIDEO,
+				FontResources.X_CIRCLE
+		};
+
+		randomText = new String[]{
+				"""
+				In the United States there are about 350 spoken languages. But coding has us beat with over 700 coding languages in use today! Only two countries speak more languages, Papua New Guinea (836) and Indonesia (710).
+				Some programming languages, like Java, Python, and HTML, are more common, but others, like Rust and Kotlin, are used in very specific situations.
+				The good news for coders? Once you learn the big ones, the more niche languages come easily.
+				""",
+				"""
+				Have you ever encountered a computer bug? How about a real bug in your computer? In 1947 a technician at Harvard had an issue with the performance of their Mark II computer.
+				Once they investigated, they discovered that a moth had gotten into a relay – an actual real live bug. In the logbook, it was noted as “First actual case of bug being found.”
+				While it is oft-repeated that this is where the term “bug” came to refer to errors that impacted the performance of programs, this is not the case.
+				The term “bug” was already in fairly widespread use in technical circles in 1947. Thomas Edison used it in 1869 to describe problems in his own inventions.
+				""",
+				"""
+				Coding and STEM fields may seem like it’s built for boys, but the first person to write our modern understanding of a program was Ada Lovelace.
+				Being the only legitimate daughter of the poet, Lord Byron, Ada’s mother feared her daughter would suffer the same madness as her father.
+				To stave off the madness as long as possible, she dedicated her daughter to studying math and science.
+				While working with a peer on a mechanical general-purpose computer known as the Analytical Engine, she recognized that the machine could go way beyond simple and pure calculations, publishing then the first algorithm intended to be carried out by a machine like this one.
+				""",
+				"""
+				The idea of a computer virus was published in the essay “Theory of self-reproducing automata” by John von Neumann in 1949, but the first replicating computer program was not written until 1971.
+				The program was not actively malicious software as it caused no damage to data,
+				the only effect being a message it output to the teletype reading “I’M THE CREEPER; CATCH ME IF YOU CAN”.
+				""",
+				"""
+				You may be fluent in Javascript or C++ but what NASA engineers really need to know is ADA and HAL/S.
+				Up through 2005, NASA was still using a computer language from 1973 specifically designed for their needs called HAL/S (or High-order Assembly Language/Shuttle).
+				Although HAL/S is designed primarily for programming on-board computers, it is general enough for almost any application and is used widely across NASA’s projects.
+				Newer projects, such as the International Space Station, operate on a programming language called ADA, developed in 1980 and accepted as an international standard programming language in 1995.
+				""",
+				"""
+				In 1972, Steve Wozniak and Steve Jobs collaborated on an arcade game, Breakout, for Atari.
+				In 2018, Apple Inc became the first US Trillion dollar company. There’s no doubt, there is big money to be had in coding. And by big money, we mean billions.
+				The average salary of a data scientist is up to $100,000. Enjoy computer games? Markus Persson, a Swedish programmer, created and launched the computer game Minecraft in 2009.
+				By 2014, Microsoft bought it for $2.5 billion.
+				""",
+				"""
+				Computers operate on what is called a “binary code.” All of the software that runs them is written using only 0’s and 1’s,
+				and there are infinite combinations of these two digits. That’s why new software can be written all the time.
+				""",
+				"""
+				As of the end of 2020, 70% of coding jobs are in career fields not connected with technology.
+				Those who learn to code early and well will have a choice of many careers in almost every industry imaginable.
+				""",
+				"""
+				The first-ever computer game made zero profit for its team of creators.
+				The game, titled Spacewar, was built from the ground up by Steve Russel, a young computer programmer, and his passionate team of fellow developers.
+				Incredibly, Steve and his team chose not to charge people to play Spacewar, and instead, happily shared their creation with anyone who wanted to try it out.
+				"""
+		};
+
+		strings = IntStream.rangeClosed(1, 25)
+				.mapToObj(i -> "String " + i)
+				.collect(FXCollectors.toList());
+
+		people = FXCollections.observableArrayList(
+				Person.ofSplit("Turner Romero", " ").randomAge(),
+				Person.ofSplit("Harley Hays", " ").randomAge(),
+				Person.ofSplit("Jeffrey Cannon", " ").randomAge(),
+				Person.ofSplit("Simeon Huang", " ").randomAge(),
+				Person.ofSplit("Jennifer Donovan", " ").randomAge(),
+				Person.ofSplit("Hezekiah Stout", " ").randomAge(),
+				Person.ofSplit("Roberto Evans", " ").randomAge(),
+				Person.ofSplit("Braxton Watts", " ").randomAge(),
+				Person.ofSplit("Jayvon Wilkinson", " ").randomAge(),
+				Person.ofSplit("Anabelle Chang", " ").randomAge(),
+				Person.ofSplit("Abigayle Christensen", " ").randomAge(),
+				Person.ofSplit("Fletcher May", " ").randomAge(),
+				Person.ofSplit("Marisol Morris", " ").randomAge(),
+				Person.ofSplit("Grant Wilson", " ").randomAge(),
+				Person.ofSplit("Hayden Baldwin", " ").randomAge(),
+				Person.ofSplit("Markus Davidson", " ").randomAge(),
+				Person.ofSplit("Madelyn Farmer", " ").randomAge(),
+				Person.ofSplit("Deandre Crosby", " ").randomAge(),
+				Person.ofSplit("Casey Hardy", " ").randomAge(),
+				Person.ofSplit("Carmelo Velazquez", " ").randomAge(),
+				Person.ofSplit("Phillip Hays", " ").randomAge(),
+				Person.ofSplit("Damari Mcfarland", " ").randomAge(),
+				Person.ofSplit("Selina Norton", " ").randomAge(),
+				Person.ofSplit("Lukas Vaughan", " ").randomAge(),
+				Person.ofSplit("Charlie Carney", " ").randomAge()
+		);
+
+		devices = FXCollections.observableArrayList(
+				new Device(randomID(), "HP Gaming Laptop", "144.156.1.1", "Me", ONLINE),
+				new Device(randomID(), "Own Gaming Desktop", "", "Me", OFFLINE),
+				new Device(randomID(), "Pear fPhone X", "144.156.1.98", "Me", ONLINE),
+				new Device(randomID(), "Alexa Echo Dot", "144.156.1.71", "Me", ONLINE),
+				new Device(randomID(), "Surface Pro", "", "Wife", OFFLINE),
+				new Device(randomID(), "Pear sPhone S", "144.156.1.70", "Wife", ONLINE),
+				new Device(randomID(), "Chromebook", "", "Wife", OFFLINE),
+				new Device(randomID(), "Wife Gaming Desktop", "144.156.1.69", "Wife", ONLINE),
+				new Device(randomID(), "Chromecast", "", "", OFFLINE),
+				new Device(randomID(), "Smart Dishwasher", "144.156.1.7", "", ONLINE),
+				new Device(randomID(), "Samsung Smart TV", "", "", OFFLINE),
+				new Device(randomID(), "Google Home Mini", "144.156.1.58", "", ONLINE),
+				new Device(randomID(), "Roomba Killer 2000", "144.156.1.42", "", ONLINE),
+				new Device(randomID(), "Smart WC", "144.156.1.99", "", ONLINE),
+				new Device(randomID(), "Kids Gaming Desktop", "144.156.1.127", "Kids", ONLINE),
+				new Device(randomID(), "Kids Gaming Laptop", "144.156.1.153", "Kids", ONLINE),
+				new Device(randomID(), "XBox 360 No Scope Edition", "", "Kids", OFFLINE),
+				new Device(randomID(), "PS5", "", "Kids", OFFLINE),
+				new Device(randomID(), "PS6", "", "My cousin", OFFLINE),
+				new Device(randomID(), "Smart Watch", "144.156.1.155", "Kids", ONLINE),
+				new Device(randomID(), "Smart Watch", "144.156.1.154", "Kids", ONLINE),
+				new Device(randomID(), "Kids' Smartphone", "144.156.1.221", "Kids", ONLINE),
+				new Device(randomID(), "Kids Smartphone", "", "Kids", OFFLINE),
+				new Device(randomID(), "Home Lights Controller", "144.156.1.91", "", ONLINE),
+				new Device(randomID(), "WiFi Extender", "144.156.1.10", "", ONLINE)
+		);
+	}
+}

+ 41 - 86
demo/src/main/java/io/github/palexdev/materialfx/demo/model/Person.java

@@ -1,91 +1,46 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
 package io.github.palexdev.materialfx.demo.model;
 
-import javafx.beans.property.IntegerProperty;
-import javafx.beans.property.SimpleIntegerProperty;
-import javafx.beans.property.SimpleStringProperty;
-import javafx.beans.property.StringProperty;
+import io.github.palexdev.materialfx.utils.RandomUtils;
 
 public class Person {
-    private final StringProperty firstName = new SimpleStringProperty();
-    private final StringProperty lastName = new SimpleStringProperty();
-    private final StringProperty address = new SimpleStringProperty();
-    private final IntegerProperty age = new SimpleIntegerProperty();
-
-    public Person(String firstName, String lastName, String address, Integer age) {
-        setFirstName(firstName);
-        setLastName(lastName);
-        setAddress(address);
-        setAge(age);
-    }
-
-    public String getFirstName() {
-        return firstName.get();
-    }
-
-    public StringProperty firstNameProperty() {
-        return firstName;
-    }
-
-    public void setFirstName(String firstName) {
-        this.firstName.set(firstName);
-    }
-
-    public String getLastName() {
-        return lastName.get();
-    }
-
-    public StringProperty lastNameProperty() {
-        return lastName;
-    }
-
-    public void setLastName(String lastName) {
-        this.lastName.set(lastName);
-    }
-
-    public String getAddress() {
-        return address.get();
-    }
-
-    public StringProperty addressProperty() {
-        return address;
-    }
-
-    public void setAddress(String address) {
-        this.address.set(address);
-    }
-
-    public int getAge() {
-        return age.get();
-    }
-
-    public IntegerProperty ageProperty() {
-        return age;
-    }
-
-    public void setAge(int age) {
-        this.age.set(age);
-    }
-
-    @Override
-    public String toString() {
-        return getFirstName() + " " + getLastName();
-    }
+	private final String name;
+	private final String surname;
+	private int age;
+
+	public Person(String name, String surname) {
+		this.name = name;
+		this.surname = surname;
+	}
+
+	public Person(String name, String surname, int age) {
+		this.name = name;
+		this.surname = surname;
+		this.age = age;
+	}
+
+	public static Person ofSplit(String fullName, String split) {
+		String[] fNameArray = fullName.split(split);
+		return new Person(fNameArray[0], fNameArray[1]);
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public String getSurname() {
+		return surname;
+	}
+
+	public int getAge() {
+		return age;
+	}
+
+	public void setAge(int age) {
+		this.age = age;
+	}
+
+	public Person randomAge() {
+		setAge(RandomUtils.random.nextInt(18, 81));
+		return this;
+	}
 }

+ 0 - 76
demo/src/main/java/io/github/palexdev/materialfx/demo/model/SimplePerson.java

@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package io.github.palexdev.materialfx.demo.model;
-
-import io.github.palexdev.materialfx.beans.properties.synced.SynchronizedIntegerProperty;
-import io.github.palexdev.materialfx.beans.properties.synced.SynchronizedObjectProperty;
-import io.github.palexdev.materialfx.bindings.BindingHelper;
-import io.github.palexdev.materialfx.selection.SingleSelectionModel;
-import javafx.beans.property.SimpleObjectProperty;
-import javafx.beans.value.ObservableValue;
-import javafx.collections.FXCollections;
-
-import java.util.Objects;
-import java.util.function.Function;
-
-public class SimplePerson {
-    private final String name;
-
-    public SimplePerson(String name) {
-        this.name = name;
-
-        SingleSelectionModel<String> sm = new SingleSelectionModel<>(new SimpleObjectProperty<>(FXCollections.observableArrayList())) {
-            @Override
-            public void bindIndex(ObservableValue<? extends Number> source, Function<Integer, String> indexConverter) {
-                SynchronizedIntegerProperty selectedIndex = selectionManager.selectedIndexProperty();
-                SynchronizedObjectProperty<String> selectedItem = selectionManager.selectedItemProperty();
-                selectedIndex.provideHelperFactory(property -> new BindingHelper<>() {
-                    @Override
-                    protected void updateBound(Number newValue) {
-                        String item = indexConverter.apply(newValue.intValue());
-                        selectedIndex.setAndWait(newValue.intValue(), selectedItem);
-                        selectedItem.set(item);
-                    }
-                });
-            }
-        };
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-        SimplePerson that = (SimplePerson) o;
-        return name.equals(that.name);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(name);
-    }
-
-    @Override
-    public String toString() {
-        return name;
-    }
-}

+ 0 - 82
demo/src/main/resources/io/github/palexdev/materialfx/demo/ButtonsDemo.fxml

@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.*?>
-<?import javafx.geometry.*?>
-<?import javafx.scene.control.Label?>
-<?import javafx.scene.layout.*?>
-<?import javafx.scene.text.Font?>
-<StackPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0"
-           prefWidth="600.0" stylesheets="@css/ButtonsDemo.css" xmlns="http://javafx.com/javafx/11.0.1">
-    <MFXButton rippleRadius="40.0" styleClass="flat-button" StackPane.alignment="TOP_CENTER">
-        <font>
-            <Font name="Comic Sans MS" size="14.0" />
-        </font>
-        <StackPane.margin>
-            <Insets right="180.0" top="65.0" />
-        </StackPane.margin>
-    </MFXButton>
-    <MFXButton rippleColor="#d5d5d5" rippleRadius="40.0" styleClass="raised-button" text="Button" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-            <Insets right="180.0" top="165.0" />
-        </StackPane.margin>
-    </MFXButton>
-    <MFXButton rippleRadius="40.0" styleClass="flat-button" textFill="#d400ff" StackPane.alignment="TOP_CENTER">
-        <font>
-            <Font name="Comic Sans MS" size="14.0" />
-        </font>
-        <StackPane.margin>
-            <Insets top="65.0" />
-        </StackPane.margin>
-    </MFXButton>
-    <MFXButton id="colored-raised" prefHeight="26.0" prefWidth="55.0" rippleColor="#d5d5d5" rippleRadius="40.0" styleClass="raised-button" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-            <Insets top="165.0" />
-        </StackPane.margin>
-    </MFXButton>
-    <MFXButton disable="true" rippleRadius="40.0" styleClass="flat-button" StackPane.alignment="TOP_CENTER">
-        <font>
-            <Font name="Comic Sans MS" size="14.0" />
-        </font>
-        <StackPane.margin>
-            <Insets left="180.0" top="65.0" />
-        </StackPane.margin>
-    </MFXButton>
-    <MFXButton disable="true" rippleColor="#d5d5d5" rippleRadius="40.0" styleClass="raised-button" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-            <Insets left="180.0" top="165.0" />
-        </StackPane.margin>
-    </MFXButton>
-    <MFXButton id="custom-ripple" prefHeight="26.0" prefWidth="150.0" rippleRadius="50.0" styleClass="raised-button" text="Custom Ripple" StackPane.alignment="CENTER">
-        <StackPane.margin>
-            <Insets top="60.0" />
-        </StackPane.margin>
-    </MFXButton>
-    <Label id="customLabel" alignment="CENTER" prefHeight="26.0" prefWidth="266.0" text="Flat buttons" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-            <Insets top="20.0" />
-        </StackPane.margin>
-    </Label>
-    <Label id="customLabel" alignment="CENTER" prefHeight="26.0" prefWidth="266.0" text="Raised buttons" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-            <Insets top="120.0" />
-        </StackPane.margin>
-    </Label>
-</StackPane>

+ 0 - 84
demo/src/main/resources/io/github/palexdev/materialfx/demo/CheckBoxesDemo.fxml

@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.*?>
-<?import javafx.geometry.*?>
-<?import javafx.scene.control.Label?>
-<?import javafx.scene.layout.*?>
-<StackPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0"
-           prefWidth="600.0" stylesheets="@css/CheckBoxesDemo.css" xmlns="http://javafx.com/javafx/16">
-    <Label id="customLabel" alignment="CENTER" prefHeight="26.0" prefWidth="266.0" text="Checkboxes" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-            <Insets top="20.0" />
-        </StackPane.margin>
-    </Label>
-    <MFXCheckbox allowIndeterminate="true" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-            <Insets right="200.0" top="65.0" />
-        </StackPane.margin>
-    </MFXCheckbox>
-    <MFXCheckbox allowIndeterminate="true" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-            <Insets top="65.0"/>
-        </StackPane.margin>
-    </MFXCheckbox>
-    <MFXCheckbox allowIndeterminate="true" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-            <Insets left="200.0" top="65.0"/>
-        </StackPane.margin>
-    </MFXCheckbox>
-    <MFXCheckbox id="custom-ripple" prefHeight="30.0" prefWidth="164.0" text="CheckBox Custom Ripple" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-            <Insets top="110.0" />
-        </StackPane.margin>
-        <opaqueInsets>
-            <Insets />
-        </opaqueInsets>
-    </MFXCheckbox>
-    <Label id="customLabel" alignment="CENTER" prefHeight="26.0" prefWidth="266.0" text="Checkboxes Mark Types" />
-    <GridPane hgap="25.0" maxHeight="-Infinity" maxWidth="-Infinity" vgap="10.0">
-        <columnConstraints>
-            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" />
-            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" />
-            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" />
-            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0"/>
-        </columnConstraints>
-        <rowConstraints>
-            <RowConstraints minHeight="10.0" vgrow="SOMETIMES"/>
-            <RowConstraints minHeight="10.0" vgrow="SOMETIMES"/>
-            <RowConstraints minHeight="10.0" vgrow="SOMETIMES"/>
-        </rowConstraints>
-        <StackPane.margin>
-            <Insets top="180.0"/>
-        </StackPane.margin>
-        <MFXCheckbox text="Caspian"/>
-        <MFXCheckbox text="Modena" GridPane.columnIndex="1"/>
-        <MFXCheckbox text="Variant 3" GridPane.columnIndex="2"/>
-        <MFXCheckbox text="Variant 4" GridPane.columnIndex="3"/>
-        <MFXCheckbox text="Variant 5" GridPane.rowIndex="1"/>
-        <MFXCheckbox text="Variant 6" GridPane.columnIndex="1" GridPane.rowIndex="1"/>
-        <MFXCheckbox text="Variant 7" GridPane.columnIndex="2" GridPane.rowIndex="1"/>
-        <MFXCheckbox text="Variant 8" GridPane.columnIndex="3" GridPane.rowIndex="1"/>
-        <MFXCheckbox text="Variant 9" GridPane.rowIndex="2"/>
-        <MFXCheckbox text="Variant 10" GridPane.columnIndex="1" GridPane.rowIndex="2"/>
-        <MFXCheckbox text="Variant 11" GridPane.columnIndex="2" GridPane.rowIndex="2"/>
-        <MFXCheckbox text="Variant 12" GridPane.columnIndex="3" GridPane.rowIndex="2"/>
-    </GridPane>
-</StackPane>

+ 0 - 86
demo/src/main/resources/io/github/palexdev/materialfx/demo/ComboBoxesDemo.fxml

@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.legacy.*?>
-<?import io.github.palexdev.materialfx.controls.*?>
-<?import javafx.geometry.Insets?>
-<?import javafx.scene.control.Label?>
-<?import javafx.scene.layout.*?>
-<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="550.0"
-            prefWidth="850.0" stylesheets="@css/ComboBoxesDemo.css" xmlns="http://javafx.com/javafx/16"
-            xmlns:fx="http://javafx.com/fxml/1"
-            fx:controller="io.github.palexdev.materialfx.demo.controllers.ComboBoxesDemoController">
-   <Label id="customLabel" alignment="CENTER" layoutX="292.0" layoutY="14.0" prefHeight="26.0" prefWidth="266.0"
-          text="Legacy Combo Boxes" AnchorPane.leftAnchor="292.0" AnchorPane.rightAnchor="292.0"
-          AnchorPane.topAnchor="20.0"/>
-   <HBox alignment="CENTER" layoutX="325.0" layoutY="46.0" spacing="100.0" AnchorPane.leftAnchor="20.0"
-         AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="60.0">
-      <padding>
-         <Insets bottom="20.0" top="20.0"/>
-      </padding>
-      <MFXLegacyComboBox fx:id="standard" animateLines="false" prefHeight="23.0" prefWidth="90.0"
-                         promptText="Standard"/>
-      <MFXLegacyComboBox fx:id="lineColors" animateLines="false" lineColor="#58d726" prefHeight="23.0"
-                         prefWidth="90.0" promptText="Lines Colors" unfocusedLineColor="#b91212"/>
-      <MFXLegacyComboBox disable="true" prefHeight="23.0" prefWidth="90.0" promptText="Disabled"/>
-   </HBox>
-   <Label id="customLabel" alignment="CENTER" layoutX="292.0" layoutY="143.0" prefHeight="26.0" prefWidth="266.0"
-          text="Customization" AnchorPane.leftAnchor="292.0" AnchorPane.rightAnchor="292.0"
-          AnchorPane.topAnchor="140.0"/>
-   <HBox alignment="CENTER" layoutX="325.0" layoutY="186.0" spacing="100.0" AnchorPane.leftAnchor="20.0"
-         AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="180.0">
-      <padding>
-         <Insets bottom="20.0" top="20.0"/>
-      </padding>
-      <MFXLegacyComboBox fx:id="labels" prefHeight="23.0" prefWidth="90.0" promptText="Labels"/>
-      <MFXLegacyComboBox fx:id="editable" prefHeight="23.0" prefWidth="90.0" promptText="Editable"/>
-      <MFXLegacyComboBox fx:id="validated" lineColor="#52db32" prefHeight="23.0" prefWidth="90.0"
-                         promptText="Validated" validated="true"/>
-      <MFXLegacyComboBox id="custom" fx:id="customized" prefHeight="23.0" prefWidth="90.0" promptText="CSS"/>
-   </HBox>
-   <Label id="customLabel" alignment="CENTER" layoutX="292.0" layoutY="250.0" prefHeight="26.0" prefWidth="266.0"
-          text="New Combo Boxes" AnchorPane.leftAnchor="292.0" AnchorPane.rightAnchor="292.0"
-          AnchorPane.topAnchor="270.0"/>
-   <HBox alignment="CENTER" layoutX="325.0" layoutY="296.0" spacing="100.0" AnchorPane.leftAnchor="20.0"
-         AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="310.0">
-      <padding>
-         <Insets bottom="20.0" top="20.0"/>
-      </padding>
-      <MFXComboBox fx:id="style1" comboStyle="STYLE1" promptText="Style 1"/>
-      <MFXComboBox fx:id="style2" comboStyle="STYLE2" promptText="Style 2"/>
-      <MFXComboBox fx:id="style3" prefHeight="29.0" prefWidth="125.0" promptText="Style 3 (default)"/>
-      <MFXComboBox fx:id="validatedNew" lineColor="#52db32" promptText="Validated"/>
-   </HBox>
-   <Label id="customLabel" alignment="CENTER" layoutX="292.0" layoutY="379.0" prefHeight="26.0" prefWidth="266.0"
-          text="Filter Combo Box" AnchorPane.leftAnchor="292.0" AnchorPane.rightAnchor="292.0"
-          AnchorPane.topAnchor="390.0"/>
-   <HBox alignment="CENTER" layoutX="20.0" layoutY="436.0" spacing="30.0" AnchorPane.leftAnchor="20.0"
-         AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="430.0">
-      <padding>
-         <Insets bottom="20.0" top="20.0"/>
-      </padding>
-      <MFXFilterComboBox fx:id="filters1" comboStyle="STYLE1" prefWidth="170.0" promptText="Style 1"/>
-      <MFXFilterComboBox fx:id="filters2" comboStyle="STYLE2" prefWidth="170.0" promptText="Style 2"/>
-      <MFXFilterComboBox fx:id="filters3" prefWidth="170.0" promptText="Style 3 (default)"/>
-      <MFXFilterComboBox fx:id="filtersValidated" prefWidth="170.0" promptText="Validated"/>
-   </HBox>
-   <MFXCheckbox fx:id="checkbox" layoutX="14.0" layoutY="505.0" text="Validation!" AnchorPane.bottomAnchor="10.0"
-                AnchorPane.leftAnchor="10.0"/>
-</AnchorPane>

+ 0 - 71
demo/src/main/resources/io/github/palexdev/materialfx/demo/DatePickersDemo.fxml

@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.*?>
-<?import javafx.geometry.*?>
-<?import javafx.scene.control.Label?>
-<?import javafx.scene.layout.*?>
-<StackPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" stylesheets="@css/DatePickersDemo.css" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="io.github.palexdev.materialfx.demo.controllers.DatePickersDemoController">
-   <Label id="customLabel" alignment="CENTER" prefHeight="26.0" prefWidth="266.0" text="Date Pickers" StackPane.alignment="TOP_CENTER">
-      <StackPane.margin>
-         <Insets top="20.0" />
-      </StackPane.margin>
-   </Label>
-   <MFXDatePicker StackPane.alignment="TOP_CENTER">
-      <StackPane.margin>
-         <Insets right="300.0" top="70.0" />
-      </StackPane.margin>
-   </MFXDatePicker>
-   <MFXDatePicker closeOnDaySelected="false" closeOnEnter="true" colorText="true" StackPane.alignment="TOP_CENTER">
-      <StackPane.margin>
-         <Insets top="70.0" />
-      </StackPane.margin>
-   </MFXDatePicker>
-   <MFXDatePicker disable="true" StackPane.alignment="TOP_CENTER">
-      <StackPane.margin>
-         <Insets left="300.0" top="70.0" />
-      </StackPane.margin>
-   </MFXDatePicker>
-   <Label id="customLabel" alignment="CENTER" prefHeight="26.0" prefWidth="266.0" text="Customization" StackPane.alignment="TOP_CENTER">
-      <StackPane.margin>
-         <Insets top="130.0" />
-      </StackPane.margin>
-   </Label>
-   <MFXDatePicker lineColor="#ff9000b2" pickerColor="#17c500">
-      <StackPane.margin>
-         <Insets right="150.0" />
-      </StackPane.margin>
-   </MFXDatePicker>
-   <MFXDatePicker id="customPicker" fx:id="customPicker">
-      <StackPane.margin>
-         <Insets left="150.0" />
-      </StackPane.margin>
-   </MFXDatePicker>
-   <Label id="customLabel" alignment="CENTER" prefHeight="26.0" prefWidth="266.0" text="Initialized">
-      <StackPane.margin>
-         <Insets top="110.0" />
-      </StackPane.margin>
-   </Label>
-   <StackPane fx:id="pane" alignment="TOP_CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="110.0" prefWidth="250.0" StackPane.alignment="BOTTOM_CENTER">
-      <StackPane.margin>
-         <Insets bottom="10.0" />
-      </StackPane.margin>
-   </StackPane>
-</StackPane>

+ 0 - 85
demo/src/main/resources/io/github/palexdev/materialfx/demo/Demo.fxml

@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.MFXScrollPane?>
-<?import io.github.palexdev.materialfx.controls.MFXVLoader?>
-<?import javafx.geometry.*?>
-<?import javafx.scene.control.Label?>
-<?import javafx.scene.image.Image?>
-<?import javafx.scene.image.ImageView?>
-<?import javafx.scene.layout.*?>
-<?import javafx.scene.text.Text?>
-<?import javafx.scene.text.TextFlow?>
-<StackPane id="demoPane" fx:id="demoPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="550.0" prefWidth="960.0" stylesheets="@css/Demo.css" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="io.github.palexdev.materialfx.demo.controllers.DemoController">
-   <StackPane id="contentPane" fx:id="contentPane" opacity="0.0" prefHeight="500.0" prefWidth="441.0">
-      <StackPane.margin>
-         <Insets bottom="15.0" left="20.0" right="20.0" top="15.0" />
-      </StackPane.margin>
-   </StackPane>
-   <StackPane id="navBar" fx:id="navBar" maxWidth="-Infinity" prefWidth="200.0" style="-fx-background-radius: 10; -fx-background-color: white;" translateX="-240.0" StackPane.alignment="CENTER_LEFT">
-      <StackPane.margin>
-         <Insets bottom="15.0" left="15.0" top="15.0" />
-      </StackPane.margin>
-      <MFXScrollPane id="loaderScroll" fx:id="scrollPane" fitToWidth="true" hbarPolicy="NEVER" prefWidth="150.0">
-         <StackPane.margin>
-            <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
-         </StackPane.margin>
-         <MFXVLoader fx:id="vLoader" alignment="TOP_CENTER" prefHeight="360.0" prefWidth="150.0" spacing="20.0">
-            <padding>
-               <Insets bottom="10.0" left="5.0" right="5.0" top="10.0" />
-            </padding>
-         </MFXVLoader>
-      </MFXScrollPane>
-   </StackPane>
-   <HBox fx:id="windowButtons" alignment="TOP_CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="30.0" prefWidth="120.0" spacing="7.0" StackPane.alignment="TOP_RIGHT">
-      <StackPane.margin>
-         <Insets />
-      </StackPane.margin>
-      <padding>
-         <Insets left="10.0" right="-10.0" top="5.0" />
-      </padding>
-   </HBox>
-   <VBox fx:id="logoPane" alignment="CENTER" prefHeight="200.0" prefWidth="100.0">
-      <ImageView fx:id="logo" cache="true" cacheHint="QUALITY" opacity="0.0" pickOnBounds="true" preserveRatio="true">
-         <Image url="@assets/logo.png" />
-      </ImageView>
-      <HBox alignment="CENTER" prefHeight="100.0" spacing="50.0">
-         <Label id="splashLabel" fx:id="splashLabel1" text="Simple.">
-            <padding>
-               <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
-            </padding>
-         </Label>
-         <Label id="splashLabel" fx:id="splashLabel2" text="Efficient.">
-            <padding>
-               <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
-            </padding>
-         </Label>
-         <Label id="splashLabel" fx:id="splashLabel3" text="Material.">
-            <padding>
-               <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
-            </padding>
-         </Label>
-      </HBox>
-      <TextFlow fx:id="version" maxWidth="-Infinity" minWidth="-Infinity" opacity="0.0" prefWidth="960.0" textAlignment="CENTER" translateY="75.0">
-         <Text id="textVer1" strokeType="OUTSIDE" strokeWidth="0.0" text="ver." translateX="-3.0" />
-         <Text id="textVer2" strokeType="OUTSIDE" strokeWidth="0.0" text="12.2.0" />
-      </TextFlow>
-   </VBox>
-</StackPane>

+ 0 - 94
demo/src/main/resources/io/github/palexdev/materialfx/demo/DialogsDemo.fxml

@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.*?>
-<?import javafx.geometry.Insets?>
-<?import javafx.scene.control.Label?>
-<?import javafx.scene.layout.*?>
-<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="450.0"
-            prefWidth="650.0" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1"
-            fx:controller="io.github.palexdev.materialfx.demo.controllers.DialogsController">
-   <Label id="customLabel" alignment="CENTER" layoutX="192.0" layoutY="14.0" prefHeight="26.0" prefWidth="266.0"
-          text="Pane Dialogs/Alerts" AnchorPane.leftAnchor="192.0" AnchorPane.rightAnchor="192.0"
-          AnchorPane.topAnchor="20.0"/>
-   <HBox alignment="CENTER" layoutX="20.0" layoutY="46.0" prefWidth="200.0" spacing="40.0" AnchorPane.leftAnchor="20.0"
-         AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="50.0">
-      <padding>
-         <Insets bottom="20.0" top="20.0"/>
-      </padding>
-      <MFXButton fx:id="pError" buttonType="RAISED" depthLevel="LEVEL1" prefWidth="80.0" rippleColor="LIGHTGRAY"
-                 rippleRadius="20.0" text="ERROR"/>
-      <MFXButton fx:id="pWarning" buttonType="RAISED" depthLevel="LEVEL1" prefWidth="80.0" rippleColor="LIGHTGRAY"
-                 rippleRadius="20.0" text="WARNING"/>
-      <MFXButton fx:id="pInfo" buttonType="RAISED" depthLevel="LEVEL1" prefWidth="80.0" rippleColor="LIGHTGRAY"
-                 rippleRadius="20.0" text="INFO"/>
-      <MFXButton fx:id="pGeneric" buttonType="RAISED" depthLevel="LEVEL1" prefWidth="80.0" rippleColor="LIGHTGRAY"
-                 rippleRadius="20.0" text="GENERIC"/>
-      <MFXButton fx:id="pGenericActions" buttonType="RAISED" depthLevel="LEVEL1" prefWidth="80.0"
-                 rippleColor="LIGHTGRAY" rippleRadius="20.0" text="ACTIONS"/>
-   </HBox>
-   <HBox alignment="CENTER" layoutX="105.0" layoutY="151.0" spacing="40.0" AnchorPane.leftAnchor="20.0"
-         AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="160.0">
-      <padding>
-         <Insets bottom="20.0" top="20.0"/>
-      </padding>
-      <MFXButton fx:id="pFade" buttonType="RAISED" depthLevel="LEVEL1" prefWidth="80.0" rippleColor="LIGHTGRAY"
-                 rippleRadius="20.0" text="FADE"/>
-      <MFXButton fx:id="pSlideLR" buttonType="RAISED" depthLevel="LEVEL1" prefWidth="80.0" rippleColor="LIGHTGRAY"
-                 rippleRadius="20.0" text="SLIDE L/R"/>
-      <MFXButton fx:id="pSlideTB" buttonType="RAISED" depthLevel="LEVEL1" prefWidth="80.0" rippleColor="LIGHTGRAY"
-                 rippleRadius="20.0" text="SLIDE T/B"/>
-      <MFXButton fx:id="pMix" buttonType="RAISED" depthLevel="LEVEL1" prefWidth="80.0" rippleColor="LIGHTGRAY"
-                 rippleRadius="20.0" text="MIX"/>
-   </HBox>
-   <Label id="customLabel" alignment="CENTER" layoutX="192.0" layoutY="125.0" prefHeight="26.0" prefWidth="266.0"
-          text="Animated"/>
-   <Label id="customLabel" alignment="CENTER" layoutX="192.0" layoutY="225.0" prefHeight="26.0" prefWidth="266.0"
-          text="Stage Dialogs/Alerts"/>
-   <HBox alignment="CENTER" layoutX="105.0" layoutY="251.0" spacing="40.0" AnchorPane.leftAnchor="20.0"
-         AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="260.0">
-      <padding>
-         <Insets bottom="20.0" top="20.0"/>
-      </padding>
-      <MFXButton fx:id="sError" buttonType="RAISED" depthLevel="LEVEL1" prefWidth="80.0" rippleColor="#cc74da"
-                 rippleRadius="20.0" text="ERROR"/>
-      <MFXButton fx:id="sWarning" buttonType="RAISED" depthLevel="LEVEL1" prefWidth="80.0" rippleColor="#cc74da"
-                 rippleRadius="20.0" text="WARNING"/>
-      <MFXButton fx:id="sInfo" buttonType="RAISED" depthLevel="LEVEL1" prefWidth="80.0" rippleColor="#cc74da"
-                 rippleRadius="20.0" text="INFO"/>
-      <MFXButton fx:id="sGeneric" buttonType="RAISED" depthLevel="LEVEL1" prefWidth="80.0" rippleColor="#cc74da"
-                 rippleRadius="20.0" text="GENERIC"/>
-   </HBox>
-   <Label id="customLabel" alignment="CENTER" layoutX="192.0" layoutY="325.0" prefHeight="26.0" prefWidth="266.0"
-          text="Options" textAlignment="CENTER"/>
-   <HBox alignment="CENTER" layoutX="105.0" layoutY="351.0" spacing="40.0" AnchorPane.leftAnchor="20.0"
-         AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="360.0">
-      <padding>
-         <Insets bottom="20.0" top="20.0"/>
-      </padding>
-      <MFXButton fx:id="pDraggable" buttonType="RAISED" depthLevel="LEVEL1" prefWidth="150.0" rippleColor="#cc74da"
-                 rippleRadius="20.0" text="Draggable (Pane)"/>
-      <MFXButton fx:id="pOverlayClose" buttonType="RAISED" depthLevel="LEVEL1" prefWidth="150.0"
-                 rippleColor="#cc74da" rippleRadius="20.0" text="Overlay Close (Pane)"/>
-      <MFXButton fx:id="sModal" buttonType="RAISED" depthLevel="LEVEL1" prefWidth="150.0" rippleColor="#cc74da"
-                 rippleRadius="20.0" text="Modal (Stage)"/>
-   </HBox>
-</AnchorPane>

+ 0 - 44
demo/src/main/resources/io/github/palexdev/materialfx/demo/FontResourcesDemo.fxml

@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.MFXLabel?>
-<?import io.github.palexdev.materialfx.controls.MFXListView?>
-<?import javafx.geometry.Insets?>
-<?import javafx.scene.layout.*?>
-<?import javafx.scene.paint.Color?>
-<?import javafx.scene.text.Font?>
-<StackPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="500.0" prefWidth="900.0" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="io.github.palexdev.materialfx.demo.controllers.FontResourcesDemoController">
-   <MFXListView fx:id="list" depthLevel="LEVEL1" maxHeight="-Infinity" prefHeight="420.0" prefWidth="860.0" StackPane.alignment="BOTTOM_CENTER">
-      <StackPane.margin>
-         <Insets bottom="10.0" left="20.0" right="20.0" />
-      </StackPane.margin>
-   </MFXListView>
-   <MFXLabel fx:id="count" labelStyle="STYLE2" maxWidth="-Infinity" prefHeight="27.0" prefWidth="860.0" promptText="" style="-fx-border-color: #5200ed;" text="69 Icons" unfocusedLineColor="#5200ed" StackPane.alignment="TOP_CENTER">
-      <StackPane.margin>
-         <Insets left="20.0" right="20.0" top="20.0" />
-      </StackPane.margin>
-      <font>
-         <Font name="Open Sans SemiBold" size="14.0" />
-      </font>
-      <textFill>
-         <Color red="0.3019607961177826" green="0.3019607961177826" blue="0.3019607961177826" />
-      </textFill>
-   </MFXLabel>
-</StackPane>

+ 0 - 115
demo/src/main/resources/io/github/palexdev/materialfx/demo/InfoDialog.fxml

@@ -1,115 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.MFXDialog?>
-<?import javafx.geometry.*?>
-<?import javafx.scene.control.*?>
-<?import javafx.scene.layout.*?>
-<?import javafx.scene.text.TextFlow?>
-<MFXDialog maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" stylesheets="@css/InfoDialog.css" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="io.github.palexdev.materialfx.demo.controllers.InfoController">
-   <top>
-      <StackPane id="headerNode" prefHeight="80.0" prefWidth="600.0" BorderPane.alignment="CENTER">
-         <Label id="materialfxLabel" alignment="CENTER" maxHeight="1.7976931348623157E308"
-                maxWidth="1.7976931348623157E308" text="MATERIALFX" textAlignment="CENTER">
-            <StackPane.margin>
-               <Insets left="11.0" right="11.0" top="11.0"/>
-            </StackPane.margin>
-         </Label>
-      </StackPane>
-   </top>
-   <center>
-      <StackPane id="contentNode" prefHeight="150.0" prefWidth="200.0" BorderPane.alignment="CENTER">
-         <Label id="titleLabel" alignment="CENTER" prefHeight="30.0" prefWidth="550.0"
-                text="MaterialFX Demo - Features Preview" StackPane.alignment="TOP_CENTER">
-            <StackPane.margin>
-               <Insets top="5.0"/>
-            </StackPane.margin>
-         </Label>
-         <Label alignment="CENTER" prefHeight="30.0" prefWidth="550.0" text="Author:  Parisi Alessandro"
-                StackPane.alignment="TOP_CENTER">
-            <StackPane.margin>
-               <Insets top="30.0"/>
-            </StackPane.margin>
-         </Label>
-         <FlowPane alignment="TOP_CENTER" columnHalignment="CENTER" prefHeight="200.0" prefWidth="200.0"
-                   prefWrapLength="5000.0" vgap="15.0" StackPane.alignment="TOP_CENTER">
-            <StackPane.margin>
-               <Insets top="70.0"/>
-            </StackPane.margin>
-            <Label fx:id="githubL" alignment="CENTER" contentDisplay="RIGHT" prefHeight="30.0" prefWidth="200.0"
-                   text="Project Page:  ">
-               <graphic>
-                  <Hyperlink fx:id="githubH" text="Github">
-                     <tooltip>
-                        <Tooltip text="https://github.com/palexdev/MaterialFX"/>
-                     </tooltip>
-                     <padding>
-                        <Insets top="1.0"/>
-                     </padding>
-                  </Hyperlink>
-               </graphic>
-            </Label>
-            <Label fx:id="mavenL" alignment="CENTER" contentDisplay="RIGHT" prefHeight="30.0" prefWidth="550.0"
-                   text="Project Repository:  ">
-               <graphic>
-                  <Hyperlink fx:id="mavenH" text="Maven Central">
-                     <tooltip>
-                        <Tooltip text="https://search.maven.org/artifact/io.github.palexdev/materialfx"/>
-                     </tooltip>
-                  </Hyperlink>
-               </graphic>
-            </Label>
-            <TextFlow maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" prefHeight="34.0"
-                      prefWidth="250.0">
-               <Label fx:id="contactL" alignment="CENTER" contentDisplay="RIGHT" prefHeight="30.0"
-                      prefWidth="200.0" text="Contacts:  ">
-                  <graphic>
-                     <Hyperlink fx:id="contactH" text="Info on Github">
-                        <tooltip>
-                           <Tooltip text="https://github.com/palexdev/MaterialFX"/>
-                        </tooltip>
-                     </Hyperlink>
-                  </graphic>
-               </Label>
-               <Label fx:id="emailL" alignment="CENTER" contentDisplay="RIGHT" prefHeight="30.0" prefWidth="30.0"
-                      text="or  ">
-                  <graphic>
-                     <Hyperlink fx:id="emailH" text="eMail">
-                        <tooltip>
-                           <Tooltip text="mailto:alessandro.parisi406@gmail.com"/>
-                        </tooltip>
-                     </Hyperlink>
-                  </graphic>
-               </Label>
-            </TextFlow>
-            <Label fx:id="paypalL" alignment="CENTER" contentDisplay="RIGHT" prefHeight="30.0" prefWidth="550.0"
-                   text="Donation:  ">
-               <graphic>
-                  <Hyperlink fx:id="paypalH" text="Paypal">
-                     <tooltip>
-                        <Tooltip text="https://bit.ly/31XB8zD"/>
-                     </tooltip>
-                  </Hyperlink>
-               </graphic>
-            </Label>
-         </FlowPane>
-      </StackPane>
-   </center>
-</MFXDialog>

+ 0 - 53
demo/src/main/resources/io/github/palexdev/materialfx/demo/LabelsDemo.fxml

@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.*?>
-<?import javafx.geometry.*?>
-<?import javafx.scene.control.Label?>
-<?import javafx.scene.layout.*?>
-<StackPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="io.github.palexdev.materialfx.demo.controllers.LabelsDemoController">
-   <Label id="customLabel" alignment="CENTER" prefHeight="26.0" prefWidth="266.0" text="Labels" StackPane.alignment="TOP_CENTER">
-      <StackPane.margin>
-         <Insets top="20.0" />
-      </StackPane.margin>
-   </Label>
-   <HBox maxHeight="-Infinity" maxWidth="-Infinity" spacing="50.0" StackPane.alignment="TOP_CENTER">
-      <StackPane.margin>
-         <Insets top="60.0" />
-      </StackPane.margin>
-      <padding>
-         <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
-      </padding>
-      <MFXLabel promptText="Prompt Text" />
-      <MFXLabel text="Style 1" />
-      <MFXLabel labelStyle="STYLE2" text="Style 2" />
-      <MFXLabel text="Style 3" />
-   </HBox>
-   <HBox maxHeight="-Infinity" maxWidth="-Infinity" spacing="50.0" StackPane.alignment="TOP_CENTER">
-      <padding>
-         <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
-      </padding>
-      <StackPane.margin>
-         <Insets top="120.0" />
-      </StackPane.margin>
-      <MFXLabel editable="true" promptText="Double Click Me!!" />
-      <MFXLabel fx:id="custom" editable="true" lineColor="#eb4400" promptText="Double Click Me!! Custom" unfocusedLineColor="#0caf00" />
-   </HBox>
-</StackPane>

+ 0 - 108
demo/src/main/resources/io/github/palexdev/materialfx/demo/ListViewsDemo.fxml

@@ -1,108 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.legacy.MFXLegacyListView?>
-<?import io.github.palexdev.materialfx.controls.*?>
-<?import javafx.geometry.*?>
-<?import javafx.scene.control.*?>
-<?import javafx.scene.layout.*?>
-<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="500.0" prefWidth="920.0" stylesheets="@css/ListViewsDemo.css" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="io.github.palexdev.materialfx.demo.controllers.ListViewsDemoController">
-   <Label id="customLabel" alignment="CENTER" layoutX="327.0" layoutY="14.0" prefHeight="26.0" prefWidth="266.0" text="ListViews" AnchorPane.leftAnchor="327.0" AnchorPane.rightAnchor="327.0" AnchorPane.topAnchor="15.0" />
-   <HBox fx:id="legacyBox" alignment="CENTER" layoutX="5.0" layoutY="68.0" spacing="10.0" visible="false" AnchorPane.bottomAnchor="100.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="60.0">
-      <VBox alignment="TOP_CENTER" spacing="10.0">
-         <Label id="label" alignment="CENTER" prefHeight="25.0" prefWidth="110.0" text="Standard">
-            <VBox.margin>
-               <Insets top="10.0" />
-            </VBox.margin>
-         </Label>
-         <MFXLegacyListView fx:id="stringView" depthLevel="LEVEL0" prefHeight="200.0" />
-      </VBox>
-      <VBox alignment="TOP_CENTER" spacing="10.0">
-         <Label id="label" alignment="CENTER" prefHeight="25.0" prefWidth="110.0" text="Labels">
-            <VBox.margin>
-               <Insets top="10.0" />
-            </VBox.margin>
-         </Label>
-         <MFXLegacyListView fx:id="labelView" depthLevel="LEVEL0" prefHeight="200.0" />
-      </VBox>
-      <VBox alignment="TOP_CENTER" spacing="10.0">
-         <Label id="label" alignment="CENTER" prefHeight="25.0" prefWidth="110.0" text="HBoxes">
-            <VBox.margin>
-               <Insets top="10.0" />
-            </VBox.margin>
-         </Label>
-         <MFXLegacyListView fx:id="hBoxView" depthLevel="LEVEL0" prefHeight="200.0" prefWidth="250.0" />
-      </VBox>
-      <VBox alignment="TOP_CENTER" spacing="10.0">
-         <Label id="label" alignment="CENTER" prefHeight="25.0" prefWidth="110.0" text="Customized and CSS">
-            <VBox.margin>
-               <Insets top="10.0" />
-            </VBox.margin>
-         </Label>
-         <MFXLegacyListView id="customView" fx:id="cssView" depthLevel="LEVEL0" prefHeight="200.0" />
-      </VBox>
-   </HBox>
-   <HBox fx:id="newBox" alignment="CENTER" layoutX="-5.0" layoutY="58.0" spacing="10.0" AnchorPane.bottomAnchor="100.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="60.0">
-      <VBox alignment="TOP_CENTER" spacing="10.0">
-         <Label id="label" alignment="CENTER" prefHeight="25.0" prefWidth="110.0" text="Standard">
-            <VBox.margin>
-               <Insets top="10.0" />
-            </VBox.margin>
-         </Label>
-         <MFXListView fx:id="stringViewNew" prefHeight="250.0" prefWidth="150.0" />
-         <Label fx:id="mulLabel" text="Multiple Selection On" />
-      </VBox>
-      <VBox alignment="TOP_CENTER" spacing="10.0">
-         <Label id="label" alignment="CENTER" prefHeight="25.0" prefWidth="110.0" text="Labels">
-            <VBox.margin>
-               <Insets top="10.0" />
-            </VBox.margin>
-         </Label>
-         <MFXListView fx:id="labelViewNew" prefHeight="250.0" prefWidth="150.0" />
-      </VBox>
-      <VBox alignment="TOP_CENTER" spacing="10.0">
-         <Label id="label" alignment="CENTER" prefHeight="25.0" prefWidth="110.0" text="HBoxes">
-            <VBox.margin>
-               <Insets top="10.0" />
-            </VBox.margin>
-         </Label>
-         <MFXListView fx:id="hBoxViewNew" prefHeight="250.0" prefWidth="300.0" />
-      </VBox>
-      <VBox alignment="TOP_CENTER" spacing="10.0">
-         <Label id="label" alignment="CENTER" prefHeight="25.0" prefWidth="110.0" text="CheckListView">
-            <VBox.margin>
-               <Insets top="10.0" />
-            </VBox.margin>
-         </Label>
-         <MFXCheckListView fx:id="checkList" minHeight="250.0" prefHeight="250.0" prefWidth="150.0" />
-      </VBox>
-      <VBox alignment="TOP_CENTER" spacing="10.0">
-         <Label id="label" alignment="CENTER" prefHeight="25.0" prefWidth="110.0" text="Customized and CSS">
-            <VBox.margin>
-               <Insets top="10.0" />
-            </VBox.margin>
-         </Label>
-         <MFXListView fx:id="cssViewNew" prefHeight="250.0" prefWidth="150.0" />
-      </VBox>
-   </HBox>
-   <MFXButton fx:id="swapButton" buttonType="RAISED" depthLevel="LEVEL1" layoutX="385.0" layoutY="461.0" prefWidth="150.0" text="Swap" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="385.0" AnchorPane.rightAnchor="385.0" />
-   <MFXButton fx:id="depthButton" buttonType="RAISED" depthLevel="LEVEL1" layoutX="774.0" layoutY="440.0" text="3D On/Off" AnchorPane.bottomAnchor="50.0" />
-   <MFXButton fx:id="colorsButton" buttonType="RAISED" depthLevel="LEVEL1" layoutX="753.0" layoutY="475.0" text="Change Bar Colors" AnchorPane.bottomAnchor="10.0" />
-</AnchorPane>

+ 0 - 47
demo/src/main/resources/io/github/palexdev/materialfx/demo/NotificationsDemo.fxml

@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.*?>
-<?import javafx.geometry.Insets?>
-<?import javafx.scene.control.Label?>
-<?import javafx.scene.layout.*?>
-<StackPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="io.github.palexdev.materialfx.demo.controllers.NotificationsController">
-   <Label id="customLabel" alignment="CENTER" prefHeight="26.0" prefWidth="266.0" text="Notifications Positions" StackPane.alignment="TOP_CENTER">
-      <StackPane.margin>
-         <Insets top="16.0" />
-      </StackPane.margin>
-   </Label>
-   <HBox alignment="CENTER" maxHeight="-Infinity" maxWidth="1.7976931348623157E308" prefHeight="50.0" prefWidth="200.0" spacing="35.0" StackPane.alignment="TOP_CENTER">
-      <StackPane.margin>
-         <Insets top="60.0" />
-      </StackPane.margin>
-      <MFXButton buttonType="RAISED" onAction="#showTopLeft" rippleColor="#c8c8c8" rippleRadius="30.0" text="TOP LEFT" />
-      <MFXButton buttonType="RAISED" onAction="#showTopCenter" rippleColor="#c8c8c8" rippleRadius="30.0" text="TOP CENTER" />
-      <MFXButton buttonType="RAISED" onAction="#showTopRight" rippleColor="#c8c8c8" rippleRadius="30.0" text="TOP RIGHT" />
-   </HBox>
-   <HBox alignment="CENTER" maxHeight="-Infinity" prefHeight="50.0" prefWidth="200.0" spacing="35.0" StackPane.alignment="TOP_CENTER">
-      <StackPane.margin>
-         <Insets top="120.0" />
-      </StackPane.margin>
-      <MFXButton buttonType="RAISED" onAction="#showBottomLeft" rippleColor="#c8c8c8" rippleRadius="35.0" text="BOTTOM LEFT" />
-      <MFXButton buttonType="RAISED" onAction="#showBottomCenter" rippleColor="#c8c8c8" rippleRadius="35.0" text="BOTTOM CENTER" />
-      <MFXButton buttonType="RAISED" onAction="#showBottomRight" rippleColor="#c8c8c8" rippleRadius="35.0" text="BOTTOM RIGHT" />
-   </HBox>
-</StackPane>

+ 0 - 45
demo/src/main/resources/io/github/palexdev/materialfx/demo/ProgressBarsDemo.fxml

@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.MFXProgressBar?>
-<?import javafx.geometry.Insets?>
-<?import javafx.scene.control.*?>
-<?import javafx.scene.layout.*?>
-<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" stylesheets="@css/ProgressBarDemo.css" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="io.github.palexdev.materialfx.demo.controllers.ProgressBarsDemoController">
-   <Label id="customLabel" alignment="CENTER" layoutX="167.0" layoutY="14.0" prefHeight="26.0" prefWidth="266.0" text="Progress Bars" AnchorPane.leftAnchor="167.0" AnchorPane.rightAnchor="167.0" AnchorPane.topAnchor="20.0" />
-   <VBox alignment="TOP_CENTER" layoutX="250.0" layoutY="46.0" prefHeight="200.0" prefWidth="100.0" spacing="30.0" AnchorPane.bottomAnchor="20.0" AnchorPane.leftAnchor="20.0" AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="80.0">
-      <padding>
-         <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
-      </padding>
-      <HBox alignment="CENTER_LEFT" spacing="20.0">
-         <Label maxWidth="-Infinity" prefHeight="17.0" prefWidth="80.0" text="Indeterminate" HBox.hgrow="ALWAYS" />
-         <MFXProgressBar prefWidth="300.0" />
-      </HBox>
-      <HBox alignment="CENTER_LEFT" spacing="20.0">
-         <Label maxWidth="-Infinity" prefHeight="17.0" prefWidth="80.0" text="Determinate" HBox.hgrow="ALWAYS" />
-         <MFXProgressBar id="determinate" fx:id="determinate" prefWidth="300.0" progress="0.0" />
-         <Label fx:id="progressLabel" />
-      </HBox>
-      <HBox alignment="CENTER_LEFT" spacing="20.0">
-         <Label maxWidth="-Infinity" prefHeight="17.0" prefWidth="80.0" text="Customized" HBox.hgrow="ALWAYS" />
-         <MFXProgressBar id="custom" prefWidth="300.0" />
-      </HBox>
-   </VBox>
-</AnchorPane>

+ 0 - 81
demo/src/main/resources/io/github/palexdev/materialfx/demo/ProgressSpinnersDemo.fxml

@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.*?>
-<?import javafx.geometry.*?>
-<?import javafx.scene.control.Label?>
-<?import javafx.scene.layout.*?>
-<StackPane prefHeight="400.0" prefWidth="600.0" stylesheets="@css/ProgressSpinnersDemo.css" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="io.github.palexdev.materialfx.demo.controllers.ProgressSpinnersDemoController">
-    <Label id="customLabel" alignment="CENTER" prefHeight="26.0" prefWidth="266.0" text="Progress Spinners" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-          <Insets top="20.0" />
-        </StackPane.margin>
-    </Label>
-    <MFXProgressSpinner maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="50.0" startingAngle="-40.0" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-          <Insets right="350.0" top="155.0" />
-        </StackPane.margin>
-    </MFXProgressSpinner>
-    <MFXProgressSpinner maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="50.0" startingAngle="-60.0" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-          <Insets right="120.0" top="155.0" />
-        </StackPane.margin>
-    </MFXProgressSpinner>
-    <MFXProgressSpinner maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="50.0" startingAngle="-120.0" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-          <Insets left="120.0" top="155.0" />
-        </StackPane.margin>
-    </MFXProgressSpinner>
-    <MFXProgressSpinner maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="50.0" startingAngle="-210.0" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-          <Insets left="350.0" top="155.0" />
-        </StackPane.margin>
-    </MFXProgressSpinner>
-    <Label id="customLabel" alignment="CENTER" prefHeight="26.0" prefWidth="266.0" text="Spinning" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-          <Insets top="100.0" />
-        </StackPane.margin>
-    </Label>
-    <Label id="customLabel" alignment="CENTER" prefHeight="26.0" prefWidth="266.0" text="Progress and CSS">
-        <StackPane.margin>
-          <Insets top="100.0" />
-        </StackPane.margin>
-    </Label>
-    <MFXProgressSpinner id="determinate" fx:id="progress1" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="50.0" progress="0.0" startingAngle="-40.0">
-        <StackPane.margin>
-          <Insets right="350.0" top="225.0" />
-        </StackPane.margin>
-    </MFXProgressSpinner>
-    <MFXProgressSpinner fx:id="progress2" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="50.0" progress="0.0" startingAngle="-60.0" styleClass="progress2">
-        <StackPane.margin>
-          <Insets right="120.0" top="225.0" />
-        </StackPane.margin>
-    </MFXProgressSpinner>
-    <MFXProgressSpinner id="cssSpinner1" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="50.0" startingAngle="-120.0">
-        <StackPane.margin>
-          <Insets left="120.0" top="225.0" />
-        </StackPane.margin>
-    </MFXProgressSpinner>
-    <MFXProgressSpinner id="cssSpinner2" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="50.0" startingAngle="-210.0">
-        <StackPane.margin>
-          <Insets left="350.0" top="225.0" />
-        </StackPane.margin>
-    </MFXProgressSpinner>
-</StackPane>

+ 0 - 78
demo/src/main/resources/io/github/palexdev/materialfx/demo/RadioButtonsDemo.fxml

@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.*?>
-<?import javafx.geometry.*?>
-<?import javafx.scene.control.Label?>
-<?import javafx.scene.layout.*?>
-<StackPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0"
-           prefWidth="600.0" stylesheets="@css/RadioButtonsDemo.css" xmlns="http://javafx.com/javafx/11.0.1">
-    <Label id="customLabel" alignment="CENTER" prefHeight="26.0" prefWidth="266.0" text="Radio Buttons"
-           StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-            <Insets top="16.0"/>
-        </StackPane.margin>
-    </Label>
-    <MFXRadioButton text="Standard" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-            <Insets right="100.0" top="60.0"/>
-        </StackPane.margin>
-    </MFXRadioButton>
-    <MFXRadioButton disable="true" text="Disabled" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-            <Insets left="100.0" top="60.0"/>
-        </StackPane.margin>
-    </MFXRadioButton>
-    <Label id="customLabel" alignment="CENTER" prefHeight="26.0" prefWidth="266.0" text="Customization"
-           StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-            <Insets top="100.0"/>
-        </StackPane.margin>
-    </Label>
-    <MFXRadioButton text="Colors 1"
-                    StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-            <Insets right="350.0" top="145.0"/>
-        </StackPane.margin>
-    </MFXRadioButton>
-    <MFXRadioButton text="Colors 2"
-                    StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-            <Insets right="180.0" top="145.0"/>
-        </StackPane.margin>
-    </MFXRadioButton>
-    <MFXRadioButton text="Colors 3"
-                    StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-            <Insets top="145.0"/>
-        </StackPane.margin>
-    </MFXRadioButton>
-    <MFXRadioButton text="Colors 4"
-                    StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-            <Insets left="180.0" top="145.0"/>
-        </StackPane.margin>
-    </MFXRadioButton>
-    <MFXRadioButton id="cssButton" text="CSS" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-            <Insets left="350.0" top="145.0"/>
-        </StackPane.margin>
-    </MFXRadioButton>
-</StackPane>

+ 0 - 57
demo/src/main/resources/io/github/palexdev/materialfx/demo/ScrollPanesDemo.fxml

@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.*?>
-<?import javafx.geometry.*?>
-<?import javafx.scene.control.Label?>
-<?import javafx.scene.layout.*?>
-<StackPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" stylesheets="@css/ScrollPanesDemo.css" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="io.github.palexdev.materialfx.demo.controllers.ScrollPaneDemoController">
-   <Label id="customLabel" alignment="CENTER" prefHeight="26.0" prefWidth="266.0" stylesheets="@css/Common.css" text="ScrollPane Preview" StackPane.alignment="TOP_CENTER">
-      <StackPane.margin>
-         <Insets top="16.0" />
-      </StackPane.margin>
-   </Label>
-   <MFXScrollPane fx:id="scrollPaneV" fitToWidth="true" maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="290.0" prefWidth="290.0" styleClass="mfx-scroll-pane" StackPane.alignment="CENTER_LEFT">
-      <StackPane.margin>
-         <Insets left="5.0" top="5.0" />
-      </StackPane.margin>
-      <padding>
-         <Insets bottom="8.0" left="8.0" right="8.0" top="8.0" />
-      </padding>
-      <Label text="Sometimes there isn't a good answer. No matter how you try to rationalize the outcome, it doesn't make sense. And instead of an answer, you are simply left with a question. Why?He took a sip of the drink. He wasn't sure whether he liked it or not, but at this moment it didn't matter. She had made it especially for him so he would have forced it down even if he had absolutely hated it. That's simply the way things worked. She made him a new-fangled drink each day and he took a sip of it and smiled, saying it was excellent.According to the caption on the bronze marker placed by the Multnomah Chapter of the Daughters of the American Revolution on May 12, 1939, “College Hall (is) the oldest building in continuous use for Educational purposes west of the Rocky Mountains. Here were educated men and women who have won recognition throughout the world in all the learned professions.”He heard the loud impact before he ever saw the result. It had been so loud that it had actually made him jump back in his seat. As soon as he recovered from the surprise, he saw the crack in the windshield. It seemed to be an analogy of the current condition of his life.There was something special about this little creature. Donna couldn't quite pinpoint what it was, but she knew with all her heart that it was true. It wasn't a matter of if she was going to try and save it, but a matter of how she was going to save it. She went back to the car to get a blanket and when she returned the creature was gone." wrapText="true" />
-   </MFXScrollPane>
-   <MFXScrollPane fx:id="scrollPaneVH" maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="290.0" prefWidth="290.0" styleClass="mfx-scroll-pane" StackPane.alignment="CENTER_RIGHT">
-      <padding>
-         <Insets bottom="8.0" left="8.0" right="8.0" top="8.0" />
-      </padding>
-      <StackPane.margin>
-         <Insets right="5.0" top="5.0" />
-      </StackPane.margin>
-      <Label prefWidth="400.0" text="Sometimes there isn't a good answer. No matter how you try to rationalize the outcome, it doesn't make sense. And instead of an answer, you are simply left with a question. Why?He took a sip of the drink. He wasn't sure whether he liked it or not, but at this moment it didn't matter. She had made it especially for him so he would have forced it down even if he had absolutely hated it. That's simply the way things worked. She made him a new-fangled drink each day and he took a sip of it and smiled, saying it was excellent.According to the caption on the bronze marker placed by the Multnomah Chapter of the Daughters of the American Revolution on May 12, 1939, “College Hall (is) the oldest building in continuous use for Educational purposes west of the Rocky Mountains. Here were educated men and women who have won recognition throughout the world in all the learned professions.”He heard the loud impact before he ever saw the result. It had been so loud that it had actually made him jump back in his seat. As soon as he recovered from the surprise, he saw the crack in the windshield. It seemed to be an analogy of the current condition of his life.There was something special about this little creature. Donna couldn't quite pinpoint what it was, but she knew with all her heart that it was true. It wasn't a matter of if she was going to try and save it, but a matter of how she was going to save it. She went back to the car to get a blanket and when she returned the creature was gone." wrapText="true" />
-   </MFXScrollPane>
-   <HBox alignment="CENTER" maxHeight="-Infinity" maxWidth="1.7976931348623157E308" prefHeight="34.0" prefWidth="200.0" spacing="20.0" StackPane.alignment="BOTTOM_CENTER">
-      <StackPane.margin>
-         <Insets bottom="10.0" />
-      </StackPane.margin>
-      <MFXButton buttonType="RAISED" onAction="#setRandomTrackColor" text="Random Track Color" />
-      <MFXButton buttonType="RAISED" onAction="#setRandomThumbColor" text="Random Thumb Color" />
-      <MFXButton buttonType="RAISED" onAction="#setRandomThumbHoverColor" text="Random Thumb Hover Color" />
-   </HBox>
-</StackPane>

+ 0 - 113
demo/src/main/resources/io/github/palexdev/materialfx/demo/SlidersDemo.fxml

@@ -1,113 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.*?>
-<?import javafx.geometry.*?>
-<?import javafx.scene.control.*?>
-<?import javafx.scene.layout.*?>
-<AnchorPane prefHeight="400.0" prefWidth="750.0" stylesheets="@css/SlidersDemo.css" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="io.github.palexdev.materialfx.demo.controllers.SlidersDemoController">
-    <Label id="customLabel" alignment="CENTER" layoutX="177.0" layoutY="24.0" prefHeight="26.0" prefWidth="266.0" text="Sliders" AnchorPane.leftAnchor="167.0" AnchorPane.rightAnchor="167.0" AnchorPane.topAnchor="20.0" />
-    <HBox alignment="CENTER" layoutX="14.0" layoutY="60.0" prefHeight="207.0" prefWidth="100.0" AnchorPane.bottomAnchor="15.0" AnchorPane.leftAnchor="15.0" AnchorPane.rightAnchor="15.0" AnchorPane.topAnchor="60.0">
-        <VBox alignment="CENTER" prefHeight="325.0" prefWidth="250.0" spacing="50.0">
-            <VBox alignment="CENTER" spacing="20.0">
-                <padding>
-                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
-                </padding>
-                <Label id="customLabel" alignment="CENTER" minWidth="150.0" text="Default">
-               <padding>
-                  <Insets bottom="2.0" left="5.0" right="5.0" top="2.0" />
-               </padding></Label>
-                <MFXSlider prefWidth="150.0" />
-            </VBox>
-            <VBox id="customSlider" alignment="CENTER" spacing="20.0">
-                <padding>
-                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
-                </padding>
-                <Label id="customLabel" alignment="CENTER" minWidth="150.0" text="Custom 1">
-               <padding>
-                  <Insets bottom="2.0" left="5.0" right="5.0" top="2.0" />
-               </padding></Label>
-                <MFXSlider id="customSlider" fx:id="customSlider" popupSide="OTHER_SIDE" prefWidth="150.0" />
-            </VBox>
-            <VBox id="customSlider" alignment="CENTER" spacing="20.0">
-                <padding>
-                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
-                </padding>
-                <Label id="customLabel" alignment="CENTER" minWidth="150.0" text="Custom 2">
-               <padding>
-                  <Insets bottom="2.0" left="5.0" right="5.0" top="2.0" />
-               </padding></Label>
-                <MFXSlider id="customSlider2" popupSide="OTHER_SIDE" prefWidth="150.0" />
-            </VBox>
-            <VBox alignment="CENTER" spacing="20.0">
-                <padding>
-                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
-                </padding>
-                <Label id="customLabel" alignment="CENTER" minWidth="150.0" text="Disabled">
-               <padding>
-                  <Insets bottom="2.0" left="5.0" right="5.0" top="2.0" />
-               </padding></Label>
-                <MFXSlider disable="true" prefWidth="150.0" />
-            </VBox>
-        </VBox>
-        <VBox alignment="CENTER" prefHeight="325.0" prefWidth="250.0" spacing="50.0">
-            <VBox alignment="CENTER" spacing="20.0">
-                <padding>
-                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
-                </padding>
-                <Label id="customLabel" alignment="CENTER" minWidth="150.0" text="Bidirectional">
-               <padding>
-                  <Insets bottom="2.0" left="5.0" right="5.0" top="2.0" />
-               </padding></Label>
-                <MFXSlider min="-50.0" prefWidth="150.0" />
-            </VBox>
-            <VBox alignment="CENTER" spacing="20.0">
-                <padding>
-                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
-                </padding>
-                <Label id="customLabel" alignment="CENTER" minWidth="150.0" text="Ticks and Snap To Ticks">
-               <padding>
-                  <Insets bottom="2.0" left="5.0" right="5.0" top="2.0" />
-               </padding></Label>
-                <MFXSlider minorTicksCount="4" prefWidth="150.0" showMajorTicks="true" showMinorTicks="true" sliderMode="SNAP_TO_TICKS" tickUnit="20.0" />
-            </VBox>
-            <VBox alignment="CENTER" spacing="20.0">
-                <padding>
-                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
-                </padding>
-                <Label id="customLabel" alignment="CENTER" minWidth="150.0" text="Decimal Precision of 2">
-               <padding>
-                  <Insets bottom="2.0" left="5.0" right="5.0" top="2.0" />
-               </padding></Label>
-                <MFXSlider decimalPrecision="2" prefWidth="150.0" />
-            </VBox>
-        </VBox>
-        <AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="250.0" prefWidth="250.0">
-            <MFXSlider layoutX="-33.0" layoutY="160.0" min="-100.0" orientation="VERTICAL" prefWidth="150.0" AnchorPane.leftAnchor="-50.0" />
-            <MFXSlider disable="true" layoutX="128.0" layoutY="160.0" orientation="VERTICAL" prefWidth="150.0" AnchorPane.rightAnchor="-50.0" />
-            <MFXSlider layoutX="35.0" layoutY="160.0" maxWidth="-Infinity" minWidth="-Infinity" orientation="VERTICAL" popupSide="OTHER_SIDE" prefWidth="150.0" AnchorPane.leftAnchor="50.0" AnchorPane.rightAnchor="50.0" />
-            <Label id="customLabel" alignment="CENTER" layoutX="114.0" layoutY="14.0" text="Vertical Sliders" AnchorPane.leftAnchor="50.0" AnchorPane.rightAnchor="50.0" AnchorPane.topAnchor="25.0">
-                <padding>
-                    <Insets bottom="2.0" left="5.0" right="5.0" top="2.0" />
-                </padding>
-            </Label>
-        </AnchorPane>
-    </HBox>
-</AnchorPane>

+ 0 - 37
demo/src/main/resources/io/github/palexdev/materialfx/demo/StepperDemo.fxml

@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.MFXButton?>
-<?import io.github.palexdev.materialfx.controls.MFXStepper?>
-<?import javafx.scene.control.Label?>
-<?import javafx.scene.layout.*?>
-<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="520.0"
-            prefWidth="720.0" stylesheets="@css/StepperDemo.css" xmlns="http://javafx.com/javafx/16"
-            xmlns:fx="http://javafx.com/fxml/1"
-            fx:controller="io.github.palexdev.materialfx.demo.controllers.StepperDemoController">
-   <MFXStepper fx:id="stepper" extraSpacing="128.0" layoutX="36.0" layoutY="72.0" minHeight="-Infinity"
-               prefHeight="400.0" prefWidth="580.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0"
-               AnchorPane.topAnchor="90.0"/>
-   <Label id="customLabel" alignment="CENTER" layoutX="167.0" layoutY="14.0" prefHeight="26.0" prefWidth="266.0"
-          text="Stepper" AnchorPane.leftAnchor="167.0" AnchorPane.rightAnchor="167.0" AnchorPane.topAnchor="20.0"/>
-   <MFXButton fx:id="unlock" buttonType="RAISED" depthLevel="LEVEL1" layoutX="300.0" layoutY="65.0" prefWidth="120.0"
-              text="Unlock Mouse" visible="false" AnchorPane.leftAnchor="300.0" AnchorPane.rightAnchor="300.0"
-              AnchorPane.topAnchor="70.0"/>
-</AnchorPane>

+ 0 - 43
demo/src/main/resources/io/github/palexdev/materialfx/demo/TableViewsDemo.fxml

@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.MFXButton?>
-<?import javafx.geometry.Insets?>
-<?import javafx.scene.control.Label?>
-<?import javafx.scene.layout.*?>
-<StackPane prefHeight="180.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="io.github.palexdev.materialfx.demo.controllers.TableViewsDemoController">
-    <Label id="customLabel" alignment="CENTER" prefHeight="26.0" prefWidth="266.0" text="Table Views" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-          <Insets top="20.0" />
-        </StackPane.margin>
-    </Label>
-    <HBox maxHeight="-Infinity" maxWidth="-Infinity" spacing="50.0" StackPane.alignment="TOP_CENTER">
-        <StackPane.margin>
-            <Insets top="75.0"/>
-        </StackPane.margin>
-        <padding>
-            <Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/>
-        </padding>
-        <MFXButton fx:id="showLegacy" buttonType="RAISED" depthLevel="LEVEL1" prefHeight="32.0" prefWidth="120.0"
-                   text="Show Legacy"/>
-        <MFXButton fx:id="showNew" buttonType="RAISED" depthLevel="LEVEL1" prefHeight="32.0" prefWidth="120.0"
-                   text="Show New"/>
-    </HBox>
-</StackPane>

+ 0 - 59
demo/src/main/resources/io/github/palexdev/materialfx/demo/TextFieldsDemo.fxml

@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.*?>
-<?import javafx.geometry.Insets?>
-<?import javafx.scene.control.Label?>
-<?import javafx.scene.layout.*?>
-<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="450.0" prefWidth="650.0" stylesheets="@css/TextFieldsDemo.css" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="io.github.palexdev.materialfx.demo.controllers.TextFieldsDemoController">
-   <Label id="customLabel" alignment="CENTER" layoutX="167.0" layoutY="14.0" prefHeight="26.0" prefWidth="266.0" text="TextFields" AnchorPane.leftAnchor="167.0" AnchorPane.rightAnchor="167.0" AnchorPane.topAnchor="20.0" />
-   <HBox alignment="CENTER" layoutX="200.0" layoutY="46.0" prefWidth="200.0" spacing="60.0" AnchorPane.leftAnchor="20.0" AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="60.0">
-      <padding>
-         <Insets bottom="20.0" top="20.0" />
-      </padding>
-      <MFXTextField alignment="CENTER" maxWidth="-Infinity" prefWidth="120.0" text="MFXTextField" />
-      <MFXTextField alignment="CENTER" maxWidth="-Infinity" prefWidth="120.0" promptText="Text Limit" textLimit="5" />
-      <MFXTextField alignment="CENTER" disable="true" maxWidth="-Infinity" prefWidth="120.0" text="Disabled" />
-   </HBox>
-   <Label id="customLabel" alignment="CENTER" layoutX="167.0" layoutY="125.0" prefHeight="26.0" prefWidth="266.0" text="Customization" AnchorPane.leftAnchor="167.0" AnchorPane.rightAnchor="167.0" AnchorPane.topAnchor="130.0" />
-   <HBox alignment="CENTER" layoutX="60.0" layoutY="156.0" prefWidth="200.0" spacing="120.0" AnchorPane.leftAnchor="20.0" AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="170.0">
-      <padding>
-         <Insets bottom="20.0" top="20.0" />
-      </padding>
-      <MFXTextField id="colors" alignment="CENTER" maxWidth="-Infinity" prefWidth="120.0" promptText="Colors" />
-      <MFXTextField fx:id="validated" lineColor="#a600ff" maxWidth="-Infinity" prefWidth="120.0" text="Validation" unfocusedLineColor="#00dfff" />
-   </HBox>
-   <HBox layoutX="15.0" layoutY="348.0" spacing="50.0" AnchorPane.bottomAnchor="15.0" AnchorPane.leftAnchor="15.0">
-      <padding>
-         <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
-      </padding>
-      <MFXCheckbox fx:id="checkbox" checkedColor="#00e240" markSize="9.0" markType="mfx-variant9-mark" text="CheckBox Validation" />
-      <MFXDatePicker fx:id="picker" colorText="true" lineColor="#00c133b2" maxHeight="-Infinity" maxWidth="-Infinity" pickerColor="#00c133" prefHeight="30.0" prefWidth="120.0" />
-   </HBox>
-   <Label id="customLabel" alignment="CENTER" layoutX="167.0" layoutY="235.0" prefHeight="26.0" prefWidth="266.0" text="PasswordFields" AnchorPane.leftAnchor="167.0" AnchorPane.rightAnchor="167.0" AnchorPane.topAnchor="260.0" />
-   <HBox alignment="CENTER" layoutX="120.0" layoutY="266.0" prefWidth="200.0" spacing="60.0" AnchorPane.leftAnchor="20.0" AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="290.0">
-      <padding>
-         <Insets bottom="20.0" top="20.0" />
-      </padding>
-      <MFXPasswordField promptText="Prompt Text" />
-      <MFXPasswordField id="customPassword" promptText="Custom, Prompt Text" />
-      <MFXPasswordField fx:id="passwordValidated" promptText="Enter Password..." showPassword="true" />
-   </HBox>
-</AnchorPane>

+ 0 - 85
demo/src/main/resources/io/github/palexdev/materialfx/demo/ToggleButtonsDemo.fxml

@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.*?>
-<?import javafx.geometry.*?>
-<?import javafx.scene.control.Label?>
-<?import javafx.scene.layout.*?>
-<?import org.kordamp.ikonli.javafx.FontIcon?>
-<StackPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="450.0" prefWidth="600.0" stylesheets="@css/ToggleButtonsDemo.css" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="io.github.palexdev.materialfx.demo.controllers.TogglesController">
-   <Label id="customLabel" alignment="CENTER" maxWidth="266.0" prefHeight="26.0" text="Toggle Buttons" StackPane.alignment="TOP_CENTER">
-      <StackPane.margin>
-         <Insets top="20.0" />
-      </StackPane.margin>
-   </Label>
-   <HBox alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" spacing="30.0" StackPane.alignment="TOP_CENTER">
-      <StackPane.margin>
-         <Insets top="50.0"/>
-      </StackPane.margin>
-      <MFXToggleButton/>
-      <MFXToggleButton/>
-      <MFXToggleButton/>
-   </HBox>
-   <HBox alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" spacing="15.0" StackPane.alignment="TOP_CENTER">
-      <StackPane.margin>
-         <Insets top="120.0"/>
-      </StackPane.margin>
-      <MFXButton buttonType="RAISED" depthLevel="LEVEL1" onAction="#handleButtonClick" rippleColor="#0096ed"
-                 rippleRadius="30.0" text="Change color"/>
-      <MFXToggleButton fx:id="toggleButton" text="Automatic Colors"/>
-      <MFXToggleButton id="customRippleRadius" text="RippleRadiusCss"/>
-      <MFXToggleButton id="customRippleRadius" disable="true" text="Disabled"/>
-   </HBox>
-   <Label id="customLabel" alignment="CENTER" maxWidth="266.0" prefHeight="26.0" text="Toggle Nodes">
-      <StackPane.margin>
-         <Insets bottom="45.0" />
-      </StackPane.margin>
-   </Label>
-   <FlowPane alignment="TOP_CENTER" columnHalignment="CENTER" hgap="50.0" maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="200.0" prefWidth="400.0" vgap="50.0" StackPane.alignment="BOTTOM_CENTER">
-      <StackPane.margin>
-         <Insets bottom="20.0" left="10.0" right="10.0" />
-      </StackPane.margin>
-      <MFXCircleToggleNode text="Hearth">
-         <graphic>
-            <FontIcon iconColor="RED" iconLiteral="fas-heart" iconSize="40" translateY="2.0" />
-         </graphic>
-      </MFXCircleToggleNode>
-      <MFXCircleToggleNode text="Key">
-         <graphic>
-            <FontIcon iconColor="#f1c40f" iconLiteral="fas-key" iconSize="40" />
-         </graphic>
-      </MFXCircleToggleNode>
-      <MFXCircleToggleNode text="Home">
-         <graphic>
-            <FontIcon iconColor="#49a6d7" iconLiteral="fas-home" iconSize="40" />
-         </graphic>
-      </MFXCircleToggleNode>
-      <MFXRectangleToggleNode fx:id="rec1" labelTextGap="20.0" prefWidth="160.0" text="Hello">
-         <FlowPane.margin>
-            <Insets />
-         </FlowPane.margin>
-      </MFXRectangleToggleNode>
-      <MFXRectangleToggleNode fx:id="rec2" labelTextGap="20.0" prefWidth="160.0" text="There">
-         <FlowPane.margin>
-            <Insets />
-         </FlowPane.margin>
-      </MFXRectangleToggleNode>
-   </FlowPane>
-</StackPane>

+ 0 - 70
demo/src/main/resources/io/github/palexdev/materialfx/demo/TreeViewsDemo.fxml

@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-
-<!--
-  ~ Copyright (C) 2021 Parisi Alessandro
-  ~ This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
-  ~
-  ~ MaterialFX is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ MaterialFX is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<?import io.github.palexdev.materialfx.controls.MFXCheckTreeView?>
-<?import io.github.palexdev.materialfx.controls.MFXTreeView?>
-<?import javafx.geometry.*?>
-<?import javafx.scene.control.Label?>
-<?import javafx.scene.layout.*?>
-<?import javafx.scene.text.Text?>
-<StackPane prefHeight="520.0" prefWidth="720.0" xmlns="http://javafx.com/javafx/15.0.1"
-           xmlns:fx="http://javafx.com/fxml/1"
-           fx:controller="io.github.palexdev.materialfx.demo.controllers.TreeviewsDemoController">
-   <Label id="customLabel" alignment="CENTER" prefHeight="26.0" prefWidth="266.0" text="Tree Views"
-          StackPane.alignment="TOP_CENTER">
-      <StackPane.margin>
-         <Insets top="20.0"/>
-      </StackPane.margin>
-   </Label>
-   <MFXTreeView fx:id="treeView" prefHeight="300.0" prefWidth="200.0" StackPane.alignment="TOP_CENTER">
-      <StackPane.margin>
-         <Insets right="500.0" top="60.0"/>
-      </StackPane.margin>
-   </MFXTreeView>
-   <MFXTreeView fx:id="treeViewHide" prefHeight="300.0" prefWidth="200.0" StackPane.alignment="TOP_CENTER">
-      <StackPane.margin>
-         <Insets top="60.0"/>
-      </StackPane.margin>
-   </MFXTreeView>
-   <MFXCheckTreeView fx:id="checkTreeView" prefHeight="300.0" prefWidth="200.0" StackPane.alignment="TOP_CENTER">
-      <StackPane.margin>
-         <Insets left="500.0" top="60.0"/>
-      </StackPane.margin>
-   </MFXCheckTreeView>
-   <Text fx:id="text1" strokeType="OUTSIDE" strokeWidth="0.0" textAlignment="CENTER" wrappingWidth="200.0"
-         StackPane.alignment="BOTTOM_CENTER">
-      <StackPane.margin>
-         <Insets bottom="20.0" right="500.0" top="250.0"/>
-      </StackPane.margin>
-   </Text>
-   <Text fx:id="text2" strokeType="OUTSIDE" strokeWidth="0.0" textAlignment="CENTER" wrappingWidth="200.0"
-         StackPane.alignment="BOTTOM_CENTER">
-      <StackPane.margin>
-         <Insets bottom="20.0" top="250.0"/>
-      </StackPane.margin>
-   </Text>
-   <Text fx:id="text3" strokeType="OUTSIDE" strokeWidth="0.0" textAlignment="CENTER" wrappingWidth="200.0"
-         StackPane.alignment="BOTTOM_CENTER">
-      <StackPane.margin>
-         <Insets bottom="20.0" left="500.0" top="250.0"/>
-      </StackPane.margin>
-   </Text>
-</StackPane>

二進制
demo/src/main/resources/io/github/palexdev/materialfx/demo/assets/logo.png


二進制
demo/src/main/resources/io/github/palexdev/materialfx/demo/assets/welcome1.wav


二進制
demo/src/main/resources/io/github/palexdev/materialfx/demo/assets/welcome2.wav


+ 55 - 0
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/Buttons.css

@@ -0,0 +1,55 @@
+@import '../fonts/Fonts.css';
+@import 'Common.css';
+@import 'MFXColors.css';
+
+.mfx-button {
+    -fx-font-family: 'Visby Round CF Medium';
+    -fx-text-fill: -mfx-text-he;
+}
+
+.mfx-button .mfx-ripple-generator {
+    -mfx-ripple-radius: 40;
+    -mfx-auto-clip: true;
+}
+
+.mfx-button .text {
+    -fx-font-smoothing-type: lcd;
+}
+
+#custom {
+    -fx-background-color: -mfx-purple;
+    -fx-text-fill: white
+}
+
+.outline-button {
+    -fx-background-color: transparent;
+    -fx-border-color: -mfx-purple;
+    -fx-border-radius: 3;
+
+    -fx-text-fill: -mfx-purple;
+}
+
+.outline-button:hover,
+.outline-button:focused {
+    -fx-background-color: -mfx-purple;
+    -fx-text-fill: white;
+}
+
+
+.link-button {
+    -fx-background-color: transparent;
+    -fx-border-radius: 3;
+    -fx-text-fill: #0096FF;
+    -fx-underline: true;
+    -fx-cursor: hand;
+}
+
+.link-button:armed,
+.link-button:focused {
+    -fx-border-color: #006BFF;
+    -fx-text-fill: #006BFF;
+}
+
+.link-button .mfx-ripple-generator {
+    -mfx-ripple-color: #D9E9FF;
+}

+ 0 - 65
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ButtonsDemo.css

@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-.flat-button {
-    -fx-background-color: transparent;
-}
-
-.flat-button .mfx-ripple-generator {
-    -mfx-ripple-color: #E1E1E1;
-}
-
-.flat-button .text {
-    -fx-font-family: Comfortaa-SemiBold;
-    -fx-font-size: 12;
-    -fx-font-weight: bold;
-}
-
-.raised-button {
-    -fx-background-color: white;
-    -mfx-button-type: raised;
-}
-
-.raised-button .mfx-ripple-generator {
-    -mfx-ripple-color: #E1E1E1;
-}
-
-.raised-button .text {
-    -fx-font-family: Comfortaa-SemiBold;
-    -fx-font-size: 12;
-    -fx-font-weight: bold;
-}
-
-#colored-raised {
-    -fx-background-color: #b700ff;
-    -fx-text-fill: white;
-}
-
-#colored-raised .mfx-ripple-generator {
-    -mfx-ripple-color: rgba(255, 255, 255, 0.4);
-}
-
-#custom-ripple {
-    -fx-background-color: #55bbff;
-    -fx-text-fill: white;
-}
-
-#custom-ripple .mfx-ripple-generator {
-    -mfx-animation-speed: 1.5;
-    -mfx-ripple-color: #1900ff;
-}

+ 0 - 21
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/CheckBoxesDemo.css

@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#custom-ripple .ripple-container .mfx-ripple-generator {
-    -mfx-ripple-color: rgb(60, 255, 45);
-}

+ 129 - 0
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ChecksRadiosToggles.css

@@ -0,0 +1,129 @@
+@import '../fonts/Fonts.css';
+@import 'Common.css';
+@import 'MFXColors.css';
+
+
+/**************************************************
+ * Checkboxes
+**************************************************/
+.mfx-checkbox {
+	-fx-font-family: 'Visby Round CF Medium';
+	-fx-text-fill: -mfx-text-he;
+}
+
+.mfx-checkbox .text {
+	-fx-font-smoothing-type: lcd;
+}
+
+#customCheck {
+	-mfx-main: -common-gradient;
+	-mfx-gray: #5E0BA8;
+	-fx-text-fill: #5E0BA8;
+}
+
+#customCheck .box .mark {
+	-mfx-description: "mfx-x-alt";
+}
+
+#customCheck:indeterminate .box .mark {
+	-mfx-description:  "mfx-hyphen";
+} 
+
+#customCheck .mfx-ripple-generator {
+	-mfx-ripple-color: -common-gradient;
+	-fx-opacity: 0.4;
+}
+
+/**************************************************
+ * Radios
+**************************************************/
+.mfx-radio-button {
+	-fx-font-family: 'Visby Round CF Medium';
+	-fx-text-fill: -mfx-text-he;
+}
+
+.mfx-radio-button .text {
+	-fx-font-smoothing-type: lcd;
+}
+
+#customRadio {
+	-mfx-main: -common-gradient;
+	-mfx-gray: #5E0BA8;
+	-fx-text-fill: #5E0BA8;
+}
+
+#customRadio .mfx-ripple-generator {
+	-mfx-ripple-color: -common-gradient;
+	-fx-opacity: 0.5;
+}
+
+/**************************************************
+ * Toggle Buttons
+**************************************************/
+.mfx-toggle-button {
+	-fx-font-family: 'Visby Round CF Medium';
+	-fx-text-fill: -mfx-text-he;
+}
+
+.mfx-toggle-button .text {
+	-fx-font-smoothing-type: lcd;
+}
+
+#customToggleButton {
+	-mfx-main: -common-gradient;
+	-mfx-secondary: #5E0BA8;
+	-fx-text-fill: #5E0BA8;
+}
+
+#customToggleButton .mfx-ripple-generator {
+	-mfx-ripple-color: -common-gradient;
+	-fx-opacity: 0.5;
+}
+
+/**************************************************
+ * Toggle Nodes
+**************************************************/
+.mfx-circle-toggle-node {
+	-fx-font-family: 'Visby Round CF Medium';
+	-fx-text-fill: -mfx-text-he;
+
+}
+
+.mfx-rectangle-toggle-node {
+	-fx-font-family: 'Visby Round CF Medium';
+	-fx-text-fill: -mfx-text-he;
+	-fx-min-height: 40;
+}
+
+#customCircle,
+#customRectangle {
+	-mfx-selected-color: -common-gradient;
+	-mfx-selected-border-color: transparent;
+	-fx-text-fill: #5E0BA8;
+}
+
+#customCircle:selected .mfx-font-icon,
+#customRectangle:selected .mfx-font-icon {
+	-mfx-color: white;
+}
+
+#customCircle:selected .mfx-ripple-generator,
+#customRectangle:selected .mfx-ripple-generator {
+	-mfx-paused: true;
+}
+
+#customRectangle:selected {
+	-fx-text-fill: white;
+}
+
+/**************************************************
+ * Others
+**************************************************/
+.mfx-button {
+	-fx-font-family: 'Visby Round CF Medium';
+    -fx-text-fill: -mfx-text-he;
+}
+
+.mfx-button .text {
+	-fx-font-smoothing-type: lcd;
+}

+ 101 - 0
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ComboBoxes.css

@@ -0,0 +1,101 @@
+@import '../fonts/Fonts.css';
+@import 'Common.css';
+@import 'MFXColors.css';
+
+/**************************************************
+ * Legacy Combos
+**************************************************/
+.mfx-legacy-combo-box {
+	-fx-min-width: 120;
+}
+
+/**************************************************
+ * New Combos
+**************************************************/
+.mfx-combo-box {
+	-fx-min-width: 150;
+	-fx-font-family: 'Visby Round CF Medium';
+}
+
+.mfx-combo-box .floating-text {
+	-fx-font-family: 'Visby Round CF Demi Bold';
+}
+
+#customNCombo {
+	-fx-border-color: transparent;
+	-fx-border-radius: 0;
+	-fx-background-color: -mfx-purple;
+	-fx-background-radius: 30;
+	-fx-text-fill: white;
+
+	-fx-padding: 3 3 3 6;
+	-fx-background-insets: 0 0 0 -3;
+}
+
+#customNCombo .floating-text {
+	-fx-background-color: transparent;
+	-fx-text-fill: white;
+}
+
+#customNCombo .caret .mfx-font-icon {
+	-mfx-color: white;
+}
+
+#customNCombo .caret .mfx-ripple-generator {
+	-mfx-ripple-color: rgba(255, 255, 255, 0.5);
+}
+
+#customNCombo2 {
+	-fx-border-color: transparent transparent gray transparent;
+	-fx-border-radius: 0;
+	-fx-padding: 3 -3 0 3;
+}
+
+#customNCombo2:focused {
+	-fx-border-color: transparent transparent -common-gradient transparent;
+}
+
+#customNCombo2:focused .caret .mfx-font-icon {
+	-mfx-color: #ff5d53;
+}
+
+#customNCombo2 .virtual-flow {
+	-track-color: derive(#ff5d53, 90%);
+    -thumb-color: derive(#ff5d53, 50%);
+    -thumb-hover-color: derive(#ff5d53, 25%);
+}
+
+#customNCombo2 .virtual-flow .mfx-combo-box-cell:hover {
+	-fx-background-color: derive(#ff5d53, 90%);
+}
+
+/**************************************************
+ * Filter Combos
+**************************************************/
+#customFilter {
+	-fx-border-color: transparent;
+	-fx-border-radius: 0;
+	-fx-background-color: #007BF6;
+	-fx-text-fill: white;
+
+	-fx-padding: 4;
+	-fx-background-insets: 0;
+}
+
+#customFilter .text-field {
+	-fx-prompt-text-fill: white;
+}
+
+#customFilter .combo-popup .text-field {
+	-fx-prompt-text-fill: -mfx-text-me;
+}
+
+#customFilter .caret .mfx-font-icon {
+	-mfx-color: #FF794B;
+	-mfx-description: "mfx-angle-down";
+	-mfx-size: 16;
+}
+
+#customFilter .caret .mfx-ripple-generator {
+	-mfx-ripple-color: rgba(255, 255, 255, 0.5);
+}

+ 0 - 24
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ComboBoxesDemo.css

@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#custom {
-    -mfx-line-color: #7F0FFF;
-    -mfx-unfocused-line-color: #E2CAFF;
-    -mfx-line-stroke-width: 1px;
-    -mfx-animate-lines: false;
-}

+ 19 - 234
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/Common.css

@@ -1,246 +1,31 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
+@import '../fonts/Fonts.css';
+@import 'MFXColors.css';
 
-@font-face {
-    font-family: 'Comfortaa Bold';
-    font-weight: bold;
-    font-style: normal;
-    font-display: swap;
-    src: url('../fonts/Comfortaa/Comfortaa-Bold.ttf') format('truetype');
+.header-label {
+    -fx-font-family: 'Visby Round CF Bold';
+    -fx-font-size: 14;
+    -fx-text-fill: -mfx-text-he;
 }
 
-@font-face {
-    font-family: 'Comfortaa Light';
-    font-weight: 300px;
-    font-style: normal;
-    font-display: swap;
-    src: url('../fonts/Comfortaa/Comfortaa-Light.ttf') format('truetype');
+.header-label .text {
+    -fx-font-smoothing-type: lcd;
 }
 
-@font-face {
-    font-family: 'Comfortaa Medium';
-    font-weight: 500px;
-    font-style: normal;
-    font-display: swap;
-    src: url('../fonts/Comfortaa/Comfortaa-Medium.ttf') format('truetype');
+.sub-header-label {
+    -fx-font-family: 'Visby Round CF Demi Bold';
+    -fx-text-fill: -mfx-text-he;
 }
 
-@font-face {
-    font-family: 'Comfortaa Regular';
-    font-weight: normal;
-    font-style: normal;
-    font-display: swap;
-    src: url('../fonts/Comfortaa/Comfortaa-Regular.ttf') format('truetype');
+.sub-header-label .text {
+    -fx-font-smoothing-type: lcd;
 }
 
-@font-face {
-    font-family: 'Comfortaa SemiBold';
-    font-weight: 600px;
-    font-style: normal;
-    font-display: swap;
-    src: url('../fonts/Comfortaa/Comfortaa-SemiBold.ttf') format('truetype');
+.grid-pane {
+    -fx-background-color: transparent;
 }
 
-@font-face {
-    font-family: 'Open Sans Bold';
-    font-weight: bold;
-    font-style: normal;
-    font-display: swap;
-    src: url('../fonts/OpenSans/OpenSans-Bold.ttf') format('truetype');
+.grid-background {
+    -fx-background-color: white;
+    -fx-background-radius: 10;
+    -fx-effect: dropshadow(gaussian, rgba(0, 0, 0, 0.2), 10, 0.12, -1.0, 2.0);
 }
-
-@font-face {
-    font-family: 'Open Sans BoldItalic';
-    font-weight: bold;
-    font-style: italic;
-    font-display: swap;
-    src: url('../fonts/OpenSans/OpenSans-BoldItalic.ttf') format('truetype');
-}
-
-@font-face {
-    font-family: 'Open Sans ExtraBold';
-    font-weight: 800px;
-    font-style: normal;
-    font-display: swap;
-    src: url('../fonts/OpenSans/OpenSans-ExtraBold.ttf') format('truetype');
-}
-
-@font-face {
-    font-family: 'Open Sans ExtraBoldItalic';
-    font-weight: 800px;
-    font-style: italic;
-    font-display: swap;
-    src: url('../fonts/OpenSans/OpenSans-ExtraBoldItalic.ttf') format('truetype');
-}
-
-@font-face {
-    font-family: 'Open Sans Light';
-    font-weight: 300px;
-    font-style: normal;
-    font-display: swap;
-    src: url('../fonts/OpenSans/OpenSans-Light.ttf') format('truetype');
-}
-
-@font-face {
-    font-family: 'Open Sans LightItalic';
-    font-weight: 300px;
-    font-style: italic;
-    font-display: swap;
-    src: url('../fonts/OpenSans/OpenSans-LightItalic.ttf') format('truetype');
-}
-
-@font-face {
-    font-family: 'Open Sans Italic';
-    font-weight: normal;
-    font-style: italic;
-    font-display: swap;
-    src: url('../fonts/OpenSans/OpenSans-Italic.ttf') format('truetype');
-}
-
-@font-face {
-    font-family: 'Open Sans SemiBold';
-    font-weight: 600px;
-    font-style: normal;
-    font-display: swap;
-    src: url('../fonts/OpenSans/OpenSans-SemiBold.ttf') format('truetype');
-}
-
-@font-face {
-    font-family: 'Open Sans Regular';
-    font-weight: normal;
-    font-style: normal;
-    font-display: swap;
-    src: url('../fonts/OpenSans/OpenSans-Regular.ttf') format('truetype');
-}
-
-@font-face {
-    font-family: 'Open Sans SemiBoldItalic';
-    font-weight: 600px;
-    font-style: italic;
-    font-display: swap;
-    src: url('../fonts/OpenSans/OpenSans-SemiBoldItalic.ttf') format('truetype');
-}
-
-@font-face {
-    font-family: 'Roboto Black';
-    font-weight: 900px;
-    font-style: normal;
-    font-display: swap;
-    src: url('../fonts/Roboto/Roboto-Black.ttf') format('truetype');
-}
-
-@font-face {
-    font-family: 'Roboto BlackItalic';
-    font-weight: 900px;
-    font-style: italic;
-    font-display: swap;
-    src: url('../fonts/Roboto/Roboto-BlackItalic.ttf') format('truetype');
-}
-
-@font-face {
-    font-family: 'Roboto Bold';
-    font-weight: bold;
-    font-style: normal;
-    font-display: swap;
-    src: url('../fonts/Roboto/Roboto-Bold.ttf') format('truetype');
-}
-
-@font-face {
-    font-family: 'Roboto BoldItalic';
-    font-weight: bold;
-    font-style: italic;
-    font-display: swap;
-    src: url('../fonts/Roboto/Roboto-BoldItalic.ttf') format('truetype');
-}
-
-@font-face {
-    font-family: 'Roboto Light';
-    font-weight: 300px;
-    font-style: normal;
-    font-display: swap;
-    src: url('../fonts/Roboto/Roboto-Light.ttf') format('truetype');
-}
-
-@font-face {
-    font-family: 'Roboto Italic';
-    font-weight: normal;
-    font-style: italic;
-    font-display: swap;
-    src: url('../fonts/Roboto/Roboto-Italic.ttf') format('truetype');
-}
-
-@font-face {
-    font-family: 'Roboto LightItalic';
-    font-weight: 300px;
-    font-style: italic;
-    font-display: swap;
-    src: url('../fonts/Roboto/Roboto-LightItalic.ttf') format('truetype');
-}
-
-@font-face {
-    font-family: 'Roboto Medium';
-    font-weight: 500px;
-    font-style: normal;
-    font-display: swap;
-    src: url('../fonts/Roboto/Roboto-Medium.ttf') format('truetype');
-}
-
-@font-face {
-    font-family: 'Roboto MediumItalic';
-    font-weight: 500px;
-    font-style: italic;
-    font-display: swap;
-    src: url('../fonts/Roboto/Roboto-MediumItalic.ttf') format('truetype');
-}
-
-@font-face {
-    font-family: 'Roboto Regular';
-    font-weight: normal;
-    font-style: normal;
-    font-display: swap;
-    src: url('../fonts/Roboto/Roboto-Regular.ttf') format('truetype');
-}
-
-@font-face {
-    font-family: 'Roboto ThinItalic';
-    font-weight: 100px;
-    font-style: italic;
-    font-display: swap;
-    src: url('../fonts/Roboto/Roboto-ThinItalic.ttf') format('truetype');
-}
-
-@font-face {
-    font-family: 'Roboto Thin';
-    font-weight: 100px;
-    font-style: normal;
-    font-display: swap;
-    src: url('../fonts/Roboto/Roboto-Thin.ttf') format('truetype');
-}
-
-#customLabel {
-    -fx-background-color: linear-gradient(to bottom right, #C01ADD 0%, #6A6AF8 100%);
-    -fx-background-radius: 6;
-    -fx-border-color: transparent;
-}
-
-#customLabel .text {
-    -fx-font-smoothing-type: gray;
-    -fx-font-family: "Open Sans Bold";
-    -fx-font-size: 12.5;
-    -fx-fill: white;
-}

+ 0 - 37
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/CustomDatePicker.css

@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-.years-button .mfx-ripple-generator {
-    -mfx-ripple-color: #ff4100;
-}
-
-.month-back-button .mfx-ripple-generator {
-    -mfx-ripple-color: #ff4100;
-}
-
-.month-forward-button .mfx-ripple-generator {
-    -mfx-ripple-color: #ff4100;
-}
-
-.day-cell .mfx-ripple-generator {
-    -mfx-ripple-color: #ff4100;
-}
-
-.year-cell .mfx-ripple-generator {
-    -mfx-ripple-color: #ff4100;
-}

+ 0 - 25
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/DatePickersDemo.css

@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#customPicker {
-    -mfx-main-color: salmon;
-    -mfx-line-color: salmon;
-    -mfx-color-text: true;
-    -mfx-close-on-day-selected: false;
-    -mfx-animate-calendar: false;
-}

+ 72 - 114
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/Demo.css

@@ -1,156 +1,114 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-@import "Common.css";
-
-#demoPane {
-    -fx-background-color: #FAFAFA;
+@import '../fonts/Fonts.css';
+@import 'MFXColors.css';
+
+/**************************************************
+ * Root
+**************************************************/
+.rootPane {
+    -fx-background-color: white;
     -fx-background-radius: 10;
+    -fx-border-color: #ebebeb;
     -fx-border-radius: 10;
 }
 
-#closeButton:hover {
-    -fx-background-color: #ffdcdc;
-}
-
-#minimizeButton:hover {
-    -fx-background-color: #dce2ff;
-}
-
-#expandButton:hover {
-    -fx-background-color: #fff3cc;
-}
-
-#infoButton {
-    -fx-background-radius: 16.4, 15;
-    -fx-background-insets: -1.4, 0;
-    -fx-border-radius: 15;
-    -fx-border-width: 2;
-    -fx-border-color: rgb(75, 181, 255);
-}
-
-#infoButton .mfx-ripple-generator {
-    -mfx-ripple-radius: 15px;
-    -mfx-ripple-color: #d3d8ff;
+/**************************************************
+ * Window Header
+**************************************************/
+.rootPane .close-icon {
+    -mfx-color: -mfx-red;
+    -fx-opacity: 0.5;
 }
 
-#contentPane {
-    -fx-background-color: #FAFAFA;
-    -fx-background-insets: 0 2 2 2;
-    -fx-background-radius: 10;
+.rootPane .close-icon:hover {
+    -fx-opacity: 1.0;
 }
 
-#navButton {
-    -fx-background-color: white, white;
-    -fx-background-radius: 16.4, 15;
-    -fx-background-insets: -1.4, 0;
-    -fx-border-radius: 15;
-    -fx-border-width: 1.2;
-    -fx-border-color: rgba(127, 15, 255, 0.35);
-    -fx-padding: 0;
-    -fx-font-size: 0;
+.rootPane .minimize-icon {
+    -mfx-color: #ffbf37;
+    -fx-opacity: 0.5;
 }
 
-#navButton .mfx-ripple-generator {
-    -mfx-ripple-color: #e2caff;
+.rootPane .minimize-icon:hover {
+    -fx-opacity: 1.0;
 }
 
-#navButton .mfx-font-icon {
-    -mfx-color: #6e0ede;
+.rootPane .always-on-top-icon {
+    -mfx-color: -mfx-purple;
     -fx-opacity: 0.5;
 }
 
-#navButton .mfx-font-icon:hover {
-    -mfx-color: #6e0ede;
+.rootPane .always-on-top-icon:hover {
     -fx-opacity: 1.0;
 }
 
-#navBar {
-    -fx-background-radius: 10;
-    -fx-border-color: #7F0FFF;
-    -fx-border-width: 0.2;
-    -fx-border-radius: 10;
+.rootPane .always-on-top-icon:always-on-top {
+	-fx-opacity: 1.0;
 }
 
-#vLoader .mfx-toggle-node {
-    -fx-background-color: white;
-    -fx-background-radius: 6;
-    -fx-background-insets: -1;
-    -fx-border-color: #7F0FFF;
-    -fx-border-radius: 6;
-    -fx-border-insets: -1;
-    -fx-pref-width: 160;
+/**************************************************
+ * Sidebar
+**************************************************/
+.rootPane .sidebar {
+    -fx-background-color: -mfx-purple;
+    -fx-background-insets: -1 -5 -1 -1;
+    -fx-background-radius: 0 20 20 0;
 }
 
-#vLoader .mfx-toggle-node .mfx-label {
-    -mfx-font-family: 'Open Sans Bold';
-    -mfx-text-fill: #7F0FFF;
-    -mfx-font-size: 13px;
-    -fx-opacity: 0.7;
+.rootPane .sidebar .header {
+    -fx-font-family: 'Visby Round CF Heavy';
+    -fx-font-size: 24;
+    -fx-text-fill: white;
 }
 
-#vLoader .mfx-toggle-node:hover,
-#vLoader .mfx-toggle-node:hover .mfx-label {
-    -fx-opacity: 1.0;
+.rootPane .sidebar .header .mfx-font-icon {
+    -mfx-color: white;
 }
 
-#vLoader .mfx-toggle-node:selected {
-    -fx-background-color: derive(#7F0FFF, 150%);
-    -fx-opacity: 1;
-}
+.rootPane .sidebar .mfx-scroll-pane {
+    -fx-background-color: transparent;
 
-#vLoader .mfx-toggle-node:selected .text {
-    -fx-opacity: 1.0;
+    -track-color: rgba(255, 255, 255, 0.3);
+    -thumb-color: white;
+    -thumb-hover-color: white;
 }
 
-#vLoader .mfx-toggle-node .mfx-ripple-generator {
-    -mfx-ripple-radius: 40px;
-    -mfx-ripple-color: #e2caff;
-    -mfx-animate-background: true;
+.rootPane .sidebar .menu-label {
+    -fx-font-family: 'Visby Round CF Bold';
+    -fx-font-size: 14;
+    -fx-text-fill: white;
 }
 
-#loaderScroll {
-    -mfx-track-color: #e6d7ff;
-    -mfx-thumb-color: #b885ff;
-    -mfx-thumb-hover-color: #9e47ff;
+.rootPane .sidebar .navbar .mfx-rectangle-toggle-node {
+    -fx-background-color: transparent;
+    -fx-background-radius: 0;
+    -fx-border-color: transparent;
+    -fx-border-radius: 0;
+    -fx-pref-height: 40;
+
+    -fx-font-family: 'Visby Round CF Demi Bold';
+    -fx-font-size: 13;
+    -fx-text-fill: white;
 }
 
-#splashLabel {
-    -fx-font-family: "Open Sans Bold";
-    -fx-font-size: 36;
-    -fx-text-fill: #6314A8;
+.rootPane .sidebar .navbar .mfx-rectangle-toggle-node .mfx-ripple-generator {
+    -mfx-paused: true;
 }
 
-#splashLabel .text {
-    -fx-font-smoothing-type: gray;
+.rootPane .sidebar .navbar .mfx-rectangle-toggle-node .mfx-icon-wrapper .mfx-font-icon {
+    -mfx-color: white;
 }
 
-#textVer1,
-#textVer2 {
-    -fx-font-smoothing-type: gray;
-    -fx-font-family: "Open Sans Bold";
-    -fx-fill: #6314A8;
+.rootPane .sidebar .navbar .mfx-rectangle-toggle-node:selected {
+    -fx-background-color: white;
+    -fx-background-radius: 5;
+    -fx-text-fill: #601cbe;
 }
 
-#textVer1 {
-    -fx-font-size: 12;
+.rootPane .sidebar .navbar .mfx-rectangle-toggle-node:selected .selection-rectangle {
+    -fx-stroke: transparent;
+    -fx-fill: #601cbe;
 }
 
-#textVer2 {
-    -fx-font-size: 24;
+.rootPane .sidebar .navbar .mfx-rectangle-toggle-node:selected .mfx-icon-wrapper .mfx-font-icon {
+    -mfx-color: #601cbe;
 }

+ 30 - 0
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ExampleNotification.css

@@ -0,0 +1,30 @@
+@import 'MFXColors.css';
+
+.notification {
+	-fx-background-color: white;
+	-fx-background-radius: 5;
+	-fx-border-color: #ebebeb;
+	-fx-border-radius: 5;
+}
+
+.notification .label {
+	-fx-font-family: 'Visby Round CF Bold';
+	-fx-text-fill: -mfx-text-he;
+}
+
+.notification .content {
+	-fx-padding: 10;
+	-fx-font-family: 'Visby Round CF Medium';
+}
+
+.notification .mfx-button {
+	-fx-min-height: 27;
+	-fx-border-color: -mfx-purple;
+	-fx-border-radius: 3;
+	-fx-text-fill: -mfx-purple;
+}
+
+.notification .mfx-button .mfx-ripple-generator {
+	-mfx-auto-clip: true;
+	-mfx-ripple-color: derive(#7a0ed9, 125%);
+}

+ 8 - 0
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/FontResources.css

@@ -0,0 +1,8 @@
+.mfx-table-view .virtual-flow .mfx-table-row:hover,
+.mfx-table-view .virtual-flow .mfx-table-row:selected {
+	-fx-background-color: transparent;
+}
+
+.mfx-table-view .virtual-flow .mfx-table-row .mfx-ripple-generator {
+	-mfx-paused: true;
+}

+ 0 - 65
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/InfoDialog.css

@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-.mfx-dialog {
-    -fx-background-color: transparent;
-    -fx-border-color: transparent;
-}
-
-.label .text {
-    -fx-font-family: "Comfortaa Regular";
-}
-
-#materialfxLabel {
-    -fx-background-color: #7F0FFF;
-    -fx-background-radius: 6px;
-}
-
-#materialfxLabel .text {
-    -fx-font-family: "Comfortaa Bold";
-    -fx-font-size: 40px;
-    -fx-fill: white;
-}
-
-#titleLabel .text {
-    -fx-font-family: "Comfortaa Bold";
-    -fx-font-size: 15px;
-}
-
-
-.mfx-icon-wrapper {
-    -fx-background-color: white;
-    -fx-background-radius: 16.4, 15;
-    -fx-border-radius: 15;
-    -fx-border-width: 2;
-    -fx-border-color: rgba(127, 15, 255, 0.55);
-}
-
-.mfx-icon-wrapper .mfx-ripple-generator {
-    -mfx-ripple-color: #c4acff;
-}
-
-#contentNode {
-    -fx-background-color: white;
-    -fx-background-radius: 5px;
-    -fx-background-insets: 0px 11px 11px 11px;
-    -fx-border-color: #7F0FFF;
-    -fx-border-radius: 5px;
-    -fx-border-insets: 0px 11px 11px 11px;
-    -fx-border-width: 2px;
-}

+ 72 - 0
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ListViews.css

@@ -0,0 +1,72 @@
+@import '../fonts/Fonts.css';
+@import 'Common.css';
+@import 'MFXColors.css';
+
+.mfx-list-view .virtual-flow .mfx-list-cell .data-label {
+	-fx-font-family: 'Visby Round CF Medium';
+}
+
+.mfx-list-view .virtual-flow .mfx-list-cell:selected .data-label {
+	-fx-font-family: 'Visby Round CF Demi Bold';
+}
+
+.mfx-check-list-view .virtual-flow .mfx-check-list-cell .data-label {
+	-fx-font-family: 'Visby Round CF Medium';
+}
+
+.mfx-check-list-view .virtual-flow .mfx-check-list-cell:selected .data-label {
+	-fx-font-family: 'Visby Round CF Demi Bold';
+}
+
+#custList {
+	-fx-background-color: -mfx-purple;
+	-fx-background-radius: 10;
+	-fx-border-color: -mfx-purple;
+	-fx-border-radius: 10;
+	-fx-padding: 4;
+}
+
+#custList .virtual-flow {
+	-fx-background-color: transparent;
+}
+
+#custList:focused {
+	-fx-border-color: -mfx-purple;
+}
+
+#custList .virtual-flow .mfx-list-cell {
+	-fx-background-color: transparent;
+	-fx-border-color: transparent;
+	-fx-background-radius: 10;
+	-fx-border-radius: 10;
+}
+
+#custList .virtual-flow .mfx-list-cell .data-label {
+	-fx-text-fill: white;
+}
+
+#custList .virtual-flow .mfx-list-cell .user-icon {
+	-mfx-color: white;
+}
+
+#custList .virtual-flow .mfx-list-cell:hover,
+#custList .virtual-flow .mfx-list-cell:selected {
+	-fx-background-color: rgba(255, 255, 255, 0.3);
+}
+
+#custList .virtual-flow .mfx-list-cell .mfx-ripple-generator {
+	-mfx-auto-clip: true;
+}
+
+#custList .virtual-flow .mfx-list-cell:selected .mfx-ripple-generator {
+	-mfx-paused: true;
+}
+
+.mfx-button {
+	-fx-background-color: -mfx-purple;
+	-fx-border-color: -mfx-purple;
+	-fx-border-radius: 3;
+	-fx-text-fill: white;
+	-fx-font-family: 'Visby Round CF Demi Bold';
+	-fx-font-size: 14;
+}

+ 0 - 71
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ListViewsDemo.css

@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#customView {
-    -mfx-hide-scrollbars: true;
-
-    -mfx-track-color: transparent;
-    -mfx-thumb-color: derive(salmon, 30%);
-    -mfx-thumb-hover-color: red;
-}
-
-#customView .mfx-list-cell {
-    -mfx-selected-color: salmon;
-    -mfx-hover-color: derive(salmon, 70%);
-}
-
-#customView .mfx-list-cell .mfx-ripple-generator {
-    -mfx-ripple-color: #f55c49;
-}
-
-#customViewNew {
-    -mfx-hide-scrollbars: true;
-
-    -mfx-track-color: transparent;
-    -mfx-thumb-color: derive(salmon, 30%);
-    -mfx-thumb-hover-color: red;
-}
-
-#customViewNew .mfx-list-cell:hover {
-    -fx-background-color: derive(salmon, 70%);
-    -fx-border-color: derive(salmon, 70%);
-}
-
-#customViewNew .mfx-list-cell:selected {
-    -fx-background-color: salmon;
-    -fx-border-color: salmon;
-}
-
-#customViewNew .mfx-list-cell .mfx-ripple-generator {
-    -mfx-ripple-color: #f55c49;
-}
-
-#label {
-    -fx-background-color: linear-gradient(to bottom right, #C01ADD 0%, #6A6AF8 100%);
-    -fx-background-radius: 7;
-    -fx-border-color: #7F0FFF;
-    -fx-border-radius: 5;
-    -fx-border-width: 2;
-    -fx-min-height: 32;
-}
-
-#label .text {
-    -fx-font-family: "Open Sans Bold";
-    -fx-font-size: 10;
-    -fx-fill: white;
-}

+ 17 - 5
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/MFXColors.css

@@ -17,9 +17,21 @@
  */
 
 * {
-    -mfx-blue: #2196f3;
-    -mfx-charcoal: #445055;
-    -mfx-green: #4caf50;
-    -mfx-purple: #673AB7;
-    -mfx-red: #EF6E6B;
+	-mfx-blue: #2196f3;
+	-mfx-charcoal: #445055;
+	-mfx-green: #4caf50;
+	-mfx-onyx: #353935;
+	-mfx-orange: #ff9800;
+	-mfx-purple: #7a0ed9;
+	-mfx-red: #EF6E6B;
+	-mfx-yellow: #FFEA00;
+
+
+    /* TODO must use everywhere*/
+	-mfx-text-he: rgba(0, 0, 0, 0.87); /* High Emphasis */
+	-mfx-text-me: rgba(0, 0, 0, 0.60); /* Medium Emphasis*/
+	-mfx-text-disabled: rgba(0, 0, 0, 0.38); /* Disabled */
+
+    -common-gradient: linear-gradient(to right bottom, #c4008b, #d00085, #dc007f, #e60b79, #ef1872, #f5276b, #fa3564, #fe415e, #ff5158, #ff5f52, #ff6c4e, #ff794b);
+    -secondary-gradient: linear-gradient(to right bottom, #1ec400, #00bd3a, #00b654, #00ae67, #00a574, #00a280, #009e8a, #009a91, #009b9d, #009ba8, #009bb2, #009abb);
 }

+ 115 - 0
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/Pickers.css

@@ -0,0 +1,115 @@
+@import '../fonts/Fonts.css';
+@import 'Common.css';
+@import 'MFXColors.css';
+
+/**************************************************
+ * Date Pickers
+**************************************************/
+#custDatePicker {
+	-fx-background-color: #007BF6;
+	-fx-border-color: transparent;
+	-fx-border-radius: 0;
+
+	-fx-font-family: "Visby Round CF Medium";
+	-fx-text-fill: white;
+}
+
+#custDatePicker .floating-text {
+	-fx-background-color: transparent;
+
+	-fx-font-family: "Visby Round CF Demi Bold";
+	-fx-text-fill: white;
+}
+
+#custDatePicker .icon {
+	-mfx-color: white;
+}
+
+#custDatePicker .date-picker-popup .content {
+	-fx-background-color: #007BF6;
+	-fx-border-color: transparent;
+	-fx-border-radius: 0;
+}
+
+#custDatePicker .date-picker-popup .left-arrow:disabled,
+#custDatePicker .date-picker-popup .right-arrow:disabled {
+	-fx-opacity: 0.8;
+}
+
+#custDatePicker .date-picker-popup .left-arrow .mfx-font-icon,
+#custDatePicker .date-picker-popup .right-arrow .mfx-font-icon {
+	-mfx-color: white;
+}
+
+#custDatePicker .date-picker-popup .months-combo,
+#custDatePicker .date-picker-popup .years-combo {
+	-fx-border-color: transparent;
+	-fx-border-radius: 0;
+	-fx-background-color: white;
+	-fx-text-fill: -mfx-text-he;
+
+	-fx-padding: 4;
+	-fx-background-insets: 0;
+	-fx-font-family: "Visby Round CF Medium";
+}
+
+#custDatePicker .date-picker-popup .months-combo:focused,
+#custDatePicker .date-picker-popup .years-combo:focused {
+	-fx-text-fill: #007BF6;
+}
+
+#custDatePicker .date-picker-popup .months-combo:focused .caret .mfx-font-icon,
+#custDatePicker .date-picker-popup .years-combo:focused .caret .mfx-font-icon {
+	-mfx-color: #007BF6;
+}
+
+#custDatePicker .date-picker-popup .months-combo .virtual-flow,
+#custDatePicker .date-picker-popup .years-combo .virtual-flow {
+	-track-color: derive(#007BF6, 100%);
+    -thumb-color: derive(#007BF6, 70%);
+    -thumb-hover-color: derive(#007BF6, 45%);
+}
+
+#custDatePicker .date-picker-popup .months-combo .virtual-flow .mfx-combo-box-cell,
+#custDatePicker .date-picker-popup .years-combo .virtual-flow .mfx-combo-box-cell {
+	-fx-font-family: 'Visby Round CF Medium';
+}
+
+#custDatePicker .date-picker-popup .months-combo .virtual-flow .mfx-combo-box-cell:selected .label,
+#custDatePicker .date-picker-popup .years-combo .virtual-flow .mfx-combo-box-cell:selected .label {
+	-fx-text-fill: #007BF6;
+}
+
+#custDatePicker .date-picker-popup .months-combo .virtual-flow .mfx-combo-box-cell:hover,
+#custDatePicker .date-picker-popup .years-combo .virtual-flow .mfx-combo-box-cell:hover,
+#custDatePicker .date-picker-popup .months-combo .virtual-flow .mfx-combo-box-cell:selected,
+#custDatePicker .date-picker-popup .years-combo .virtual-flow .mfx-combo-box-cell:selected {
+	-fx-background-color: derive(#007BF6, 130%);
+}
+
+#custDatePicker .date-picker-popup .week-day {
+	-fx-font-family: 'Visby Round CF Bold';
+	-fx-text-fill: white;
+}
+
+#custDatePicker .date-picker-popup .mfx-date-cell {
+	-fx-font-family: 'Visby Round CF Medium';
+	-fx-text-fill: white;
+}
+
+#custDatePicker .date-picker-popup .mfx-date-cell:extra {
+	-fx-text-fill: rgba(255, 255, 255, 0.5);
+}
+
+#custDatePicker .date-picker-popup .mfx-date-cell:current {
+	-fx-background-color: transparent;
+	-fx-border-color: white;
+	-fx-border-width: 2;
+	-fx-font-family: 'Visby Round CF Demi Bold';
+}
+
+#custDatePicker .date-picker-popup .mfx-date-cell:selected {
+	-fx-background-color: white;
+	-fx-font-family: 'Visby Round CF Bold';
+	-fx-text-fill: #007BF6;
+}

+ 84 - 0
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/Progress.css

@@ -0,0 +1,84 @@
+@import '../fonts/Fonts.css';
+@import 'Common.css';
+@import 'MFXColors.css';
+
+/**************************************************
+ * Progress Bars
+**************************************************/
+#customBar1 .bar1 {
+	-fx-fill: -common-gradient;
+}
+
+#customBar1 .bar2 {
+	-fx-fill: -secondary-gradient;
+}
+
+#customBar2 .track {
+	-fx-fill: -mfx-purple;
+	-fx-stroke: -mfx-purple;
+	-fx-stroke-width: 2;
+}
+
+#customBar2 .bar1,
+#customBar2 .bar2 {
+	-fx-stroke: -mfx-purple;
+	-fx-stroke-width: 1;
+	-fx-fill: white;
+}
+
+#determinateBar:range1 .bar1 {
+    -fx-fill: -mfx-red;
+}
+
+#determinateBar:range1 .track {
+    -fx-fill: derive(-mfx-red, 85%)
+}
+
+#determinateBar:range2 .bar1 {
+    -fx-fill: -mfx-blue;
+}
+
+#determinateBar:range2 .track {
+    -fx-fill: derive(-mfx-blue, 85%)
+}
+
+#determinateBar:range3 .bar1 {
+    -fx-fill: -mfx-green;
+}
+
+#determinateBar:range3 .track {
+    -fx-fill: derive(-mfx-green, 85%);
+}
+
+
+/**************************************************
+ * Progress Spinners
+**************************************************/
+#customSpinner1 {
+	-mfx-color1: #7A0ED9;
+	-mfx-color2: #EB00A6;
+	-mfx-color3: #FF1471;
+	-mfx-color4: #FF7C4A;
+}
+
+#customSpinner1 .track {
+	-fx-stroke: #ebebeb;
+}
+
+#determinateSpinner .text {
+	-fx-font-family: 'Visby Round CF Demi Bold';
+	-fx-font-size: 18;
+	-fx-fill: black;
+}
+
+#determinateSpinner:range1 .arc {
+    -fx-fill: #FF6088;
+}
+
+#determinateSpinner:range2 .arc {
+    -fx-fill: #00BCFF;
+}
+
+#determinateSpinner:range3 .arc {
+    -fx-fill: #1EC400;
+}

+ 0 - 56
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ProgressBarDemo.css

@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-@import "MFXColors.css";
-
-#custom .track {
-    -fx-fill: derive(salmon, 70%);
-}
-
-#custom .bar1,
-#custom:indeterminate .bar1 {
-    -fx-fill: linear-gradient(to bottom right, #6A6AF8 0%, #C850C0 30%, darkorange 100%);
-}
-
-#custom:indeterminate .bar2 {
-    -fx-fill: linear-gradient(to bottom right, #F4D03F 0%, #10d7b4 100%);
-}
-
-#determinate:range1 .bar1 {
-    -fx-fill: -mfx-red;
-}
-
-#determinate:range1 .track {
-    -fx-fill: derive(-mfx-red, 85%)
-}
-
-#determinate:range2 .bar1 {
-    -fx-fill: -mfx-blue;
-}
-
-#determinate:range2 .track {
-    -fx-fill: derive(-mfx-blue, 85%)
-}
-
-#determinate:range3 .bar1 {
-    -fx-fill: -mfx-green;
-}
-
-#determinate:range3 .track {
-    -fx-fill: derive(-mfx-green, 85%);
-}

+ 0 - 75
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ProgressSpinnersDemo.css

@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-@import "MFXColors.css";
-
-.progress2 .text {
-    visibility: false;
-}
-
-.progress2 .arc {
-    -fx-stroke: orange;
-}
-
-#cssSpinner1 {
-    -fx-stroke: #4285f4;
-}
-
-#cssSpinner1 .track {
-    -fx-stroke: #d0d0d0;
-}
-
-#cssSpinner2 .track {
-    -fx-stroke: #ffccc5;
-}
-
-#determinate:range1 .text {
-    -fx-fill: -mfx-red;
-}
-
-#determinate:range1 .arc{
-    -fx-stroke: -mfx-red;
-}
-
-#determinate:range1 .track{
-    -fx-stroke: derive(-mfx-red, 85%);
-}
-
-#determinate:range2 .text {
-    -fx-fill: -mfx-blue;
-}
-
-#determinate:range2 .arc{
-    -fx-stroke: -mfx-blue;
-}
-
-#determinate:range2 .track{
-    -fx-stroke: derive(-mfx-blue, 85%);
-}
-
-#determinate:range3 .text {
-    -fx-fill: -mfx-green;
-}
-
-#determinate:range3 .arc{
-    -fx-stroke: -mfx-green;
-}
-
-#determinate:range3 .track{
-    -fx-stroke: derive(-mfx-green, 85%);
-}

+ 0 - 24
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/RadioButtonsDemo.css

@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#cssButton {
-    -mfx-selected-color: green;
-    -mfx-unselected-color: darkred;
-    -mfx-selected-text-color: blue;
-    -mfx-unselected-text-color: darkred;
-}

+ 0 - 31
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ScrollPanesDemo.css

@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-.label {
-    -fx-background-color: white;
-    -fx-background-radius: 0;
-    -fx-border-color: transparent;
-    -fx-border-radius: 0;
-    -fx-border-width: 0;
-}
-
-.label .text {
-    -fx-font-family: "Open Sans";
-    -fx-font-size: 12;
-    -fx-fill: black;
-}

+ 63 - 0
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/Sliders.css

@@ -0,0 +1,63 @@
+@import '../fonts/Fonts.css';
+@import 'Common.css';
+@import 'MFXColors.css';
+
+#customSlider:range1 .thumb,
+#customSlider:range1 .track {
+    -mfx-color: -mfx-red;
+    -fx-fill: derive(-mfx-red, 85%)
+}
+
+#customSlider:range1 .bar {
+    -fx-fill: -mfx-red;
+}
+
+#customSlider:range2 .thumb,
+#customSlider:range2 .track {
+    -mfx-color: -mfx-blue;
+    -fx-fill: derive(-mfx-blue, 85%)
+}
+
+#customSlider:range2 .bar {
+    -fx-fill: -mfx-blue;
+}
+
+#customSlider:range3 .bar,
+#customSlider:range3 .thumb {
+    -mfx-color: -mfx-green;
+    -fx-fill: -mfx-green;
+}
+
+#customSlider:range3 .track {
+    -fx-fill: derive(-mfx-green, 85%);
+}
+
+#customSlider:range1 .thumb-container:hover .thumb-radius,
+#customSlider:range1 .thumb-container:pressed .thumb-radius {
+    -mfx-color: derive(-mfx-red, 85%);
+    -fx-opacity: 0.5;
+}
+
+#customSlider:range2 .thumb-container:hover .thumb-radius,
+#customSlider:range2 .thumb-container:pressed .thumb-radius {
+    -mfx-color: derive(-mfx-blue, 85%);
+    -fx-opacity: 0.5;
+}
+
+#customSlider:range3 .thumb-container:hover .thumb-radius,
+#customSlider:range3 .thumb-container:pressed .thumb-radius {
+    -mfx-color: derive(-mfx-green, 70%);
+    -fx-opacity: 0.5;
+}
+
+#customSlider:range1 .thumb-container .mfx-ripple-generator {
+    -mfx-ripple-color: -mfx-red;
+}
+
+#customSlider:range2 .thumb-container .mfx-ripple-generator {
+    -mfx-ripple-color: -mfx-blue;
+}
+
+#customSlider:range3 .thumb-container .mfx-ripple-generator {
+    -mfx-ripple-color: -mfx-green;
+}

+ 0 - 57
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/SlidersDemo.css

@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-@import "MFXColors.css";
-
-#customSlider2 .track {
-    -fx-fill: linear-gradient(to bottom right, #6A6AF8 0%, #C850C0 30%, darkorange 100%);
-}
-
-#customSlider2 .bar {
-    -fx-fill: linear-gradient(to bottom right, #F4D03F 0%, #10d7b4 100%);
-}
-
-#customSlider:range1 .thumb,
-#customSlider:range1 .track {
-    -mfx-color: -mfx-red;
-    -fx-fill: derive(-mfx-red, 85%)
-}
-
-#customSlider:range1 .bar {
-    -fx-fill: -mfx-red;
-}
-
-#customSlider:range2 .thumb,
-#customSlider:range2 .track {
-    -mfx-color: -mfx-blue;
-    -fx-fill: derive(-mfx-blue, 85%)
-}
-
-#customSlider:range2 .bar {
-    -fx-fill: -mfx-blue;
-}
-
-#customSlider:range3 .bar,
-#customSlider:range3 .thumb {
-    -mfx-color: -mfx-green;
-    -fx-fill: -mfx-green;
-}
-
-#customSlider:range3 .track {
-    -fx-fill: derive(-mfx-green, 85%);
-}

+ 47 - 0
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/Stepper.css

@@ -0,0 +1,47 @@
+@import '../fonts/Fonts.css';
+@import 'Common.css';
+@import 'MFXColors.css';
+
+.mfx-stepper .mfx-text-field {
+	-mfx-float-mode: disabled;
+	-fx-font-family: 'Visby Round CF Medium';
+	-fx-pref-width: 200;
+}
+
+.mfx-stepper .mfx-stepper-toggle .mfx-text-field {
+	-fx-border-color: transparent;
+	-fx-font-family: 'Visby Round CF Bold';
+	-fx-pref-width: 1;
+}
+
+.mfx-stepper .error-label {
+	-fx-font-family: 'Visby Round CF Medium';
+	-fx-text-fill: -mfx-red;
+}
+
+.mfx-stepper .header-label {
+	-fx-border-color: transparent;
+	-fx-font-family: 'Visby Round CF Demi Bold';
+}
+
+.mfx-stepper .completed-label {
+	-fx-border-color: transparent;
+	-fx-font-family: 'Visby Round CF Bold';
+	-fx-font-size: 24;
+	-fx-alignment: center;
+	-fx-text-fill: -mfx-green;
+}
+
+.outline-button {
+    -fx-background-color: transparent;
+    -fx-border-color: -mfx-purple;
+    -fx-border-radius: 3;
+
+    -fx-text-fill: -mfx-purple;
+}
+
+.outline-button:hover,
+.outline-button:focused {
+    -fx-background-color: -mfx-purple;
+    -fx-text-fill: white;
+}

+ 0 - 26
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/StepperDemo.css

@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-.mfx-label {
-    -mfx-line-color: transparent;
-    -mfx-unfocused-line-color: transparent;
-}
-
-.mfx-stepper {
-    -mfx-bar-background: #EFEFEF;
-}

+ 0 - 29
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/TestDemo.css

@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-.mfx-slider:range1 .track {
-    -fx-fill: red;
-}
-
-.mfx-slider:range2 .track {
-    -fx-fill: gold;
-}
-
-.mfx-slider:range3 .bar {
-    -fx-fill: green;
-}

+ 64 - 0
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/TextFields.css

@@ -0,0 +1,64 @@
+@import '../fonts/Fonts.css';
+@import 'Common.css';
+@import 'MFXColors.css';
+
+/**************************************************
+ * Text Fields
+**************************************************/
+.mfx-text-field {
+	-fx-min-width: 130;
+    -fx-font-family: 'Visby Round CF Medium';
+}
+
+.mfx-text-field .floating-text {
+    -fx-font-family: 'Visby Round CF Medium';
+}
+
+
+#customField {
+    -fx-border-color: -common-gradient;
+}
+
+#customField .floating-text {
+    -fx-text-fill: -mfx-red;
+}
+
+/**************************************************
+ * Password Fields
+**************************************************/
+#customPassword {
+    -fx-border-color: -secondary-gradient;
+}
+
+#customPassword:masked {
+    -fx-text-fill: -mfx-blue;
+}
+
+#customPassword .mfx-font-icon {
+    -mfx-color: -mfx-blue;
+}
+
+#customPassword .floating-text {
+    -fx-text-fill: -mfx-blue;
+}
+
+#validatedField {
+    -mfx-hide-character: '?';
+}
+
+#validatedField:invalid {
+    -fx-border-color: -mfx-red;
+}
+
+#validatedField:invalid .floating-text {
+    -fx-text-fill: -mfx-red;
+}
+
+#validatedField:invalid .mfx-font-icon {
+    -mfx-color: -mfx-red;
+}
+
+#validationLabel {
+    -fx-font-family: 'Visby Round CF Demi Bold';
+    -fx-font-size: 11;
+}

+ 0 - 101
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/TextFieldsDemo.css

@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-@import "MFXColors.css";
-
-.mfx-text-field {
-    -fx-font-family: "Open Sans Regular";
-}
-
-.label {
-    -fx-font-family: "Open Sans SemiBold";
-}
-
-#colors {
-    -fx-prompt-text-fill: #000e8b;
-    -fx-text-fill: #000e8b;
-    -mfx-unfocused-line-color: #000e8b;
-    -mfx-line-color: darkorange;
-
-    -mfx-text-limit: 10;
-}
-
-#colors:focused {
-    -fx-prompt-text-fill: darkorange;
-    -fx-text-fill: darkorange;
-}
-
-#customPassword {
-    -fx-prompt-text-fill: -mfx-purple;
-    -fx-text-fill: -mfx-purple;
-    -mfx-unfocused-line-color: -mfx-purple;
-    -mfx-line-color: darkorange;
-}
-
-#customPassword:focused {
-    -fx-prompt-text-fill: darkorange;
-    -fx-text-fill: darkorange;
-}
-
-#customPassword .mfx-icon-wrapper .mfx-font-icon {
-    -mfx-color: -mfx-purple;
-}
-
-#customPassword:focused .mfx-icon-wrapper .mfx-font-icon {
-    -mfx-color: darkorange
-}
-
-#customPassword {
-    -fx-prompt-text-fill: -mfx-purple;
-    -fx-text-fill: -mfx-purple;
-    -mfx-unfocused-line-color: -mfx-purple;
-    -mfx-line-color: darkorange;
-}
-
-#customPassword:focused {
-    -fx-prompt-text-fill: darkorange;
-    -fx-text-fill: darkorange;
-}
-
-#customPassword .mfx-icon-wrapper .mfx-font-icon {
-    -mfx-color: -mfx-purple;
-}
-
-#customPassword:focused .mfx-icon-wrapper .mfx-font-icon {
-    -mfx-color: darkorange
-}
-
-#customPassword {
-    -fx-prompt-text-fill: -mfx-purple;
-    -fx-text-fill: -mfx-purple;
-    -mfx-unfocused-line-color: linear-gradient(to bottom right, #C01ADD 0%, #6A6AF8 100%);
-    -mfx-line-color: linear-gradient(to bottom right, #6A6AF8 0%, #C850C0 46%, darkorange 100%);
-}
-
-#customPassword:focused {
-    -fx-prompt-text-fill: darkorange;
-    -fx-text-fill: darkorange;
-}
-
-#customPassword .mfx-icon-wrapper .mfx-font-icon {
-    -mfx-color: -mfx-purple;
-}
-
-#customPassword:focused .mfx-icon-wrapper .mfx-font-icon {
-    -mfx-color: darkorange
-}

+ 0 - 30
demo/src/main/resources/io/github/palexdev/materialfx/demo/css/ToggleButtonsDemo.css

@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2021 Parisi Alessandro
- * This file is part of MaterialFX (https://github.com/palexdev/MaterialFX).
- *
- * MaterialFX is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MaterialFX is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with MaterialFX.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#customRippleRadius .container .mfx-ripple-generator {
-    -mfx-ripple-radius: 15px;
-}
-
-.mfx-toggle-node {
-    -mfx-shape: circle;
-}
-
-.mfx-toggle-node .mfx-ripple-generator {
-    -mfx-ripple-radius: 15px;
-    -mfx-ripple-color: #b3b3b3;
-}

+ 286 - 0
demo/src/main/resources/io/github/palexdev/materialfx/demo/fonts/Fonts.css

@@ -0,0 +1,286 @@
+@font-face {
+    font-family: 'Comfortaa Bold';
+    font-weight: bold;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/Comfortaa/Comfortaa-Bold.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Comfortaa Light';
+    font-weight: 300px;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/Comfortaa/Comfortaa-Light.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Comfortaa Medium';
+    font-weight: 500px;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/Comfortaa/Comfortaa-Medium.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Comfortaa Regular';
+    font-weight: normal;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/Comfortaa/Comfortaa-Regular.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Comfortaa SemiBold';
+    font-weight: 600px;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/Comfortaa/Comfortaa-SemiBold.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Open Sans Bold';
+    font-weight: bold;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/OpenSans/OpenSans-Bold.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Open Sans BoldItalic';
+    font-weight: bold;
+    font-style: italic;
+    font-display: swap;
+    src: url('../fonts/OpenSans/OpenSans-BoldItalic.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Open Sans ExtraBold';
+    font-weight: 800px;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/OpenSans/OpenSans-ExtraBold.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Open Sans ExtraBoldItalic';
+    font-weight: 800px;
+    font-style: italic;
+    font-display: swap;
+    src: url('../fonts/OpenSans/OpenSans-ExtraBoldItalic.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Open Sans Light';
+    font-weight: 300px;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/OpenSans/OpenSans-Light.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Open Sans LightItalic';
+    font-weight: 300px;
+    font-style: italic;
+    font-display: swap;
+    src: url('../fonts/OpenSans/OpenSans-LightItalic.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Open Sans Italic';
+    font-weight: normal;
+    font-style: italic;
+    font-display: swap;
+    src: url('../fonts/OpenSans/OpenSans-Italic.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Open Sans SemiBold';
+    font-weight: 600px;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/OpenSans/OpenSans-SemiBold.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Open Sans Regular';
+    font-weight: normal;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/OpenSans/OpenSans-Regular.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Open Sans SemiBoldItalic';
+    font-weight: 600px;
+    font-style: italic;
+    font-display: swap;
+    src: url('../fonts/OpenSans/OpenSans-SemiBoldItalic.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Roboto Black';
+    font-weight: 900px;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/Roboto/Roboto-Black.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Roboto BlackItalic';
+    font-weight: 900px;
+    font-style: italic;
+    font-display: swap;
+    src: url('../fonts/Roboto/Roboto-BlackItalic.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Roboto Bold';
+    font-weight: bold;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/Roboto/Roboto-Bold.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Roboto BoldItalic';
+    font-weight: bold;
+    font-style: italic;
+    font-display: swap;
+    src: url('../fonts/Roboto/Roboto-BoldItalic.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Roboto Light';
+    font-weight: 300px;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/Roboto/Roboto-Light.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Roboto Italic';
+    font-weight: normal;
+    font-style: italic;
+    font-display: swap;
+    src: url('../fonts/Roboto/Roboto-Italic.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Roboto LightItalic';
+    font-weight: 300px;
+    font-style: italic;
+    font-display: swap;
+    src: url('../fonts/Roboto/Roboto-LightItalic.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Roboto Medium';
+    font-weight: 500px;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/Roboto/Roboto-Medium.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Roboto MediumItalic';
+    font-weight: 500px;
+    font-style: italic;
+    font-display: swap;
+    src: url('../fonts/Roboto/Roboto-MediumItalic.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Roboto Regular';
+    font-weight: normal;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/Roboto/Roboto-Regular.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Roboto ThinItalic';
+    font-weight: 100px;
+    font-style: italic;
+    font-display: swap;
+    src: url('../fonts/Roboto/Roboto-ThinItalic.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Roboto Thin';
+    font-weight: 100px;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/Roboto/Roboto-Thin.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Varela Round';
+    font-weight: normal;
+    font-display: swap;
+    src: url('../fonts/Varela/VarelaRound-Regular.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Visby Round CF Demi';
+    font-weight: 600;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/Visby/VisbyRoundCF-DemiBold.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Visby Round CF Extra';
+    font-weight: bold;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/Visby/VisbyRoundCF-ExtraBold.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Visby Round CF';
+    font-weight: bold;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/Visby/VisbyRoundCF-Bold.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Visby Round CF';
+    font-weight: 900;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/Visby/VisbyRoundCF-Heavy.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Visby Round CF Extra';
+    font-weight: 200;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/Visby/VisbyRoundCF-ExtraLight.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Visby Round CF';
+    font-weight: 300;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/Visby/VisbyRoundCF-Light.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Visby Round CF';
+    font-weight: 500;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/Visby/VisbyRoundCF-Medium.ttf') format('truetype');
+}
+
+@font-face {
+    font-family: 'Visby Round CF';
+    font-weight: normal;
+    font-style: normal;
+    font-display: swap;
+    src: url('../fonts/Visby/VisbyRoundCF-Regular.ttf') format('truetype');
+}

二進制
demo/src/main/resources/io/github/palexdev/materialfx/demo/fonts/Varela/VarelaRound-Regular.ttf


二進制
demo/src/main/resources/io/github/palexdev/materialfx/demo/fonts/Visby/VisbyRoundCF-Bold.ttf


二進制
demo/src/main/resources/io/github/palexdev/materialfx/demo/fonts/Visby/VisbyRoundCF-DemiBold.ttf


二進制
demo/src/main/resources/io/github/palexdev/materialfx/demo/fonts/Visby/VisbyRoundCF-ExtraBold.ttf


二進制
demo/src/main/resources/io/github/palexdev/materialfx/demo/fonts/Visby/VisbyRoundCF-ExtraLight.ttf


部分文件因文件數量過多而無法顯示