@Tutorial {
    @Intro(title: "Declarative programming") {
        The declarative programming paradigm focuses on the _what_ rather than the _how_, meaning you focus on the outcome and less on the steps to achieve it.
    }

    @Section(title: "Array example") {
        @ContentAndMedia {
            Define an array in a more and a less declarative way.
            If you're not familiar with collection types, you might want to take a look at the [language guide's article](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/collectiontypes/) first.
        }

        @Steps {
            @Step {
                You can see how creating an array in Swift with the content `[5, 10, 2, 3]` is done.
                @Code(name: "main.swift", file: "Array1D.swift")
            }
            @Step {
                Let's assume Swift wouldn't offer this convenient syntax - how would you create the same array starting from an empty array?
                @Code(name: "main.swift", file: "Array2D.swift")
            }
            @Step {
                The `append(_:)` function could be used for example.

                In this code, it gets clearer _how_ the result of having the array in the memory is accomplished, but one would have to mentally follow the commands to construct the _what_.
                Therefore, this code is more on the imperative side compared to the initial code example being rather on the declarative side.
                @Code(name: "main.swift", file: "Array3D.swift")
            }
        }
    }

    @Section(title: "Declarative definition of user interfaces") {
        @ContentAndMedia {
            In this tutorial, the focus will be on user interfaces.
            Let's take a look at how declarative definitions of user interfaces look like in _Adwaita for Swift_.
        }

        @Steps {
            @Step {
                We'll start with the imperative way for comparison.

                Follow the code and find out how the UI will look like.
                You can actually create UIs in this way using the [CAdw library](https://github.com/AparokshaUI/adwaita-swift/blob/a4b565723b39ba36dad5553e495c71b248a90b87/Package.swift#L22) in the _Adwaita for Swift_ package, and use the documentation [here](https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1-latest/index.html) as a reference.
                @Code(name: "main.swift", file: "HelloWorld1.swift")
            }
            @Step {
                In the preview image, you can see how the UI actually looks like.

                The process of understanding the code might feel very similar to constructing the array by simulating the `append(_:)` function in one's head.
                It's easier to answer _how_ the UI is constructed than _what_ the UI will look like.
                @Code(name: "main.swift", file: "HelloWorld1.swift") {
                    @Image(source: "HelloWorld1.png", alt: "The example window.")
                }
            }
            @Step {
                Now, the same UI but written using the ``Adwaita`` library of _Adwaita for Swift_ instead of _CAdw_. In this tutorial, we won't touch `CAdw` and use ``Adwaita`` only.

                This feels much more like the declarative declaration of an array, right?
                We cannot answer the _how_ by looking at the code, in fact, _CAdw_ is used behind the scenes, but it's easier to answer the _what_.
                @Code(name: "main.swift", file: "HelloWorld2.swift") {
                    @Image(source: "HelloWorld1.png", alt: "The example window.")
                }
            }
        }
    }
}
