() {
+ private val self = boundComponent
+
+ init {
+ self.apply {
+ height = 100.vh
+ styles["overflow"] = "auto"
+ infiniteScroll {
+ height = 100.percent
+ val canvas = div {
+ maxWidth = 600.px
+ classNames + "is-canvas"
+ }
+ var index = 0
+ onScroll {
+ if (index > 40) {
+ isCompleted = true
+ update()
+ return@onScroll
+ }
+ for (i in 0..<8) {
+ canvas.add(Item())
+ }
+ index += 8
+ update()
+ }
+ }
+ }
+ }
+
+}
+
diff --git a/src/main/kotlin/com/webforj/samples/views/ininitescroll/InfiniteScrollLoadingKotlinView.kt b/src/main/kotlin/com/webforj/samples/views/ininitescroll/InfiniteScrollLoadingKotlinView.kt
new file mode 100644
index 000000000..1c2620fcc
--- /dev/null
+++ b/src/main/kotlin/com/webforj/samples/views/ininitescroll/InfiniteScrollLoadingKotlinView.kt
@@ -0,0 +1,55 @@
+package com.webforj.samples.views.ininitescroll
+
+import com.webforj.annotation.StyleSheet
+import com.webforj.component.Composite
+import com.webforj.component.html.elements.Div
+import com.webforj.component.icons.TablerIcon
+import com.webforj.kotlin.dsl.component.html.elements.div
+import com.webforj.kotlin.dsl.component.infiniitescroll.infiniteScroll
+import com.webforj.kotlin.extension.classNames
+import com.webforj.kotlin.extension.percent
+import com.webforj.kotlin.extension.plus
+import com.webforj.kotlin.extension.px
+import com.webforj.kotlin.extension.set
+import com.webforj.kotlin.extension.styles
+import com.webforj.kotlin.extension.vh
+import com.webforj.router.annotation.FrameTitle
+import com.webforj.router.annotation.Route
+
+@Route
+@FrameTitle("Custom Loading Indicator")
+@StyleSheet("ws://css/infinitescroll/infinitescroll.css")
+class InfiniteScrollLoadingKotlinView: Composite
() {
+ private val self = boundComponent
+
+ init {
+ self.apply {
+ height = 100.vh
+ styles["overflow"] = "auto"
+ infiniteScroll("Fetching more records...") {
+ classNames + "is"
+ height = 100.percent
+ val canvas = div {
+ maxWidth = 600.px
+ classNames + "is-canvas"
+ }
+ setIcon(TablerIcon.create("cloud-download"))
+ var index = 0
+ onScroll {
+ if (index > 40) {
+ isCompleted = true
+ update()
+ return@onScroll
+ }
+
+ for (i in 0..<8) {
+ canvas.add(Item())
+ }
+
+ index += 8
+ update()
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/kotlin/com/webforj/samples/views/ininitescroll/Item.kt b/src/main/kotlin/com/webforj/samples/views/ininitescroll/Item.kt
new file mode 100644
index 000000000..c5fee378b
--- /dev/null
+++ b/src/main/kotlin/com/webforj/samples/views/ininitescroll/Item.kt
@@ -0,0 +1,50 @@
+package com.webforj.samples.views.ininitescroll
+
+import com.webforj.component.Composite
+import com.webforj.component.html.elements.Div
+import com.webforj.component.icons.FeatherIcon
+import com.webforj.component.layout.flexlayout.FlexAlignment
+import com.webforj.component.layout.flexlayout.FlexJustifyContent
+import com.webforj.kotlin.dsl.component.html.elements.div
+import com.webforj.kotlin.dsl.component.icons.featherIcon
+import com.webforj.kotlin.dsl.component.layout.flexlayout.flexLayout
+import com.webforj.kotlin.dsl.component.layout.flexlayout.horizontal
+import com.webforj.kotlin.dsl.component.layout.flexlayout.vertical
+import com.webforj.kotlin.extension.classNames
+import com.webforj.kotlin.extension.minSize
+import com.webforj.kotlin.extension.plus
+import com.webforj.kotlin.extension.px
+import kotlin.random.Random
+
+class Item: Composite
() {
+ private val self = boundComponent
+ private val random = Random.Default
+ private val names = arrayOf(
+ "John", "Jane", "Alice", "Bob", "Charlie", "Diana",
+ "Ethan", "Fiona", "George", "Hannah", "Ian", "Jill"
+ );
+
+ init {
+ self.apply {
+ flexLayout {
+ horizontal()
+ justifyContent = FlexJustifyContent.BETWEEN
+ alignment = FlexAlignment.CENTER
+ flexLayout {
+ vertical()
+ div(names.random()) {
+ classNames + "item-name"
+ }
+ div {
+ classNames + "item-excerpt"
+ text = ("Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
+ + "Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.")
+ }
+ }
+ featherIcon(FeatherIcon.ARROW_RIGHT) {
+ minSize = 24.px to 24.px
+ }
+ }
+ }
+ }
+}