Initial commit
All checks were successful
Gitea Actions Demo / publish (push) Successful in 14s

This commit is contained in:
david-swift 2024-10-17 18:34:21 +02:00
parent c06e2e8bad
commit 0c634e91ef
23 changed files with 167 additions and 226 deletions

View File

@ -23,4 +23,4 @@ jobs:
username: 'aproksha' username: 'aproksha'
password: ${{ secrets.password }} password: ${{ secrets.password }}
localDir: 'public' localDir: 'public'
remoteDir: '/var/www/virtual/aproksha/html/' remoteDir: '/var/www/virtual/aproksha/david.aparoksha.dev/'

View File

@ -1,5 +1,5 @@
# The Aparoksha Website # David's Website
This is the source of the [website of the Aparoksha project](https://www.aparoksha.dev). This is the source of [David's website](https://david.aparoksha.dev).
It is built using [Zola](https://www.getzola.org/) and the [Duckquill theme](https://codeberg.org/daudix/duckquill) and hosted by [Uberspace](https://uberspace.de/en/). It is built using [Zola](https://www.getzola.org/) and the [Duckquill theme](https://codeberg.org/daudix/duckquill) and hosted by [Uberspace](https://uberspace.de/en/).

View File

@ -1,8 +1,8 @@
# Zola config # Zola config
title = "Aparoksha" title = "david-swift"
base_url = "https://www.aparoksha.dev/" base_url = "https://david.aparoksha.dev/"
description = "One app, fully native on every platform" description = "A student interested in coding. Loves GNOME and Swift!"
theme = "duckquill" theme = "duckquill"
minify_html = true minify_html = true
@ -25,10 +25,10 @@ smart_punctuation = true
styles = [ styles = [
"custom.css" "custom.css"
] ]
accent_color = "#FF2D75" accent_color = "#6E7DFB"
accent_color_dark = "#FF2D75" accent_color_dark = "#6E7DFB"
issues_url = "https://git.aparoksha.dev/aparoksha/aparoksha.dev/issues" issues_url = "https://git.aparoksha.dev/david-swift/david.aparoksha.dev/issues"
source_url = "https://git.aparoksha.dev/aparoksha/aparoksha.dev" source_url = "https://git.aparoksha.dev/david-swift/david.aparoksha.dev"
show_copy_button = true show_copy_button = true
show_share_button = true show_share_button = true
@ -36,17 +36,15 @@ show_share_button = true
show_copyright = true show_copyright = true
show_powered_by = true show_powered_by = true
show_source = true show_source = true
links = [
{ url = "https://mastodon.de/@david_swift", name = "Fediverse" },
{ url = "https://ko-fi.com/david_swift", name = "Donate" }
]
[extra.nav] [extra.nav]
links = [ links = [
{ name = "Guides" , menu = [ { url = "/blog", name = "Blog" },
{ url = "@/backends/_index.md", name = "Backends" }, { url = "https://www.aparoksha.dev/", name = "Aparoksha" },
{ url = "/tutorials", name = "Tutorials" },
{ url = "/hig", name = "Human Interface Guidelines" },
{ url = "/docs", name = "Documentation" },
]},
{ url = "https://forums.aparoksha.dev/", name = "Community" },
{ url = "https://git.aparoksha.dev/aparoksha", name = "Code" },
] ]
[search] [search]

View File

@ -5,86 +5,34 @@
{{ image(url="trailer.gif" full_bleed=true) }} {{ image(url="trailer.gif" full_bleed=true) }}
---> --->
# Native. Cross-platform. <div class="logo"> Aparoksha. </div> # About Me
<div style="margin-bottom: 2em;"> <div style="margin-bottom: 2em;">
Create your next cross-platform app with Aparoksha to give it a native look on each platform. I'm David, a GNOME 👣 user enjoying the Swift programming language.
Aparoksha is easy-to-use, safe, and <i>aparoksha</i>, meaning that its reactive and declarative approach as well as the clean syntax significantly enhance the readability.
</div> </div>
<a class="inline-button" href="/tutorials/gettingstarted/">Get Started</a> <a class="inline-button" href="https://mastodon.de/@david_swift">Find Me on the Fediverse</a>
<br> <br>
## Frameworks
## Start with Simple Views I'm currently working on a declarative cross-platform UI framework,
which displays _fully_ native widgets on each supported platform.
A view is a piece of the user interface. The platform-specific backends are completely independent projects, providing widgets that are not part of the cross-platform framework.
Create your own views, such as `Avatar`, `Post`, and `Timeline`. They grow based on your feedback. [Try the frameworks.](https://www.aparoksha.dev)
Combine them into pages, windows, and apps.
<!--- - [Aparoksha](https://www.aparoksha.dev/) is the cross-platform framework displaying native widgets on each supported platform.
<aside> - [Adwaita for Swift](https://www.aparoksha.dev/backends/adwaita/) is part of the Aparoksha framework, allowing the creation of native apps for the awesome [GNOME desktop](https://www.gnome.org/).
{{ image(url="trailer.gif" transparent=true) }} - Simplifying the use of WinUI on Windows, [WinUI for Swift](https://www.aparoksha.dev/backends/winui/) feels like SwiftUI on Windows.
</aside> - The [TermKitBackend](https://www.aparoksha.dev/backends/termkit/) lets you create Terminal UIs in a declarative way.
--->
{% crt() %} Create a declarative framework on top of an imperative API yourself using the [Meta package](https://meta.aparoksha.dev/documentation/meta/).
``` Find projects [here](https://www.aparoksha.dev/backends/) and in the [Aparoksha forums](https://forums.aparoksha.dev/).
struct Timeline: View {
var posts: Posts ## Apps
var view: Body { - [Memorize](https://flathub.org/apps/io.github.david_swift.Flashcards) is an open source, native Quizlet alternative. It is only available for GNOME (at the moment 😎).
ForEach(posts) { post in
Avatar(user: post.user)
Post(post: post)
}
}
}
```
{% end %}
## The Magic of the State
Each of your views has the ability to store state throughout view updates.
Let's create a simple counter view:
<!---
<aside>
{{ image(url="trailer.gif" transparent=true) }}
</aside>
--->
{% crt() %}
```
struct SearchView: View {
@State private var count = 0
var view: Body {
Button(icon: .minus) {
count -= 1
}
Text("\(count)")
Button(icon: .plus) {
count += 1
}
}
}
```
{% end %}
## Supported Platforms
Aparoksha's goal is to enable you to bring your app to as many users as possible on completely different platforms.
Therefore, it is built in an open and extensible way.
Creating a backend for a new platform is almost as simple as creating an app!
A list of some backends is available [here](@/backends/_index.md). They can be combined with Aparoksha in a simple way.
Aparoksha itself currently supports the three major desktop platforms [GNOME](@/backends/Adwaita/index.md), [Windows](@/backends/WinUI/index.md), and [macOS](@/backends/AppKit/index.md).
What makes the Aparoksha project unique is that each backend is a fully independent project, optimized for its platform.
In a cross-platform app, you can leverage the full potential of the individual backends by writing platform-specific bits of code.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 674 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

View File

@ -1,52 +0,0 @@
+++
title = "Adwaita"
description = "Develop beautiful apps following the design guidelines of the GNOME desktop."
date = 2023-09-12
[taxonomies]
tags = ["Linux", "Aparoksha"]
[extra]
featured = true
banner = "Adwaita.png"
+++
Develop beautiful apps following the design guidelines of the GNOME desktop.
Read the <a class="external" href="https://aparokshaui.github.io/adwaita-swift">documentation</a> to get started or <a class="external" href="https://github.com/AparokshaUI/adwaita-swift">browse the code</a> on GitHub.
## The Backend
The Adwaita backend is based on the <a class="external" href="https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1-latest/">_libadwaita_</a> C API.
libadwaita is used for developing native GNOME apps.
## The Development Environment
It is recommended to develop Libadwaita apps on a Linux system.
Linux is probably available for your device and can be installed alongside Windows or macOS.
I recommend picking a Linux distribution offering a vanilla GNOME experience, such as <a class="external" href="https://fedoraproject.org/de/">Fedora</a> or <a class="external" href="https://vanillaos.org/">VanillaOS</a>.
Now, install <a class="external" href="https://apps.gnome.org/en/Builder/">GNOME Builder</a> via the GNOME Software application.
### Flatpak
<a class="external" href="https://flatpak.org/">Flatpak</a> facilitates the distribution of apps on Linux.
If you decide to use Flatpak already when developing the app, you do not have to install any dependencies on your system.
Simply clone the <a class="external" href="https://github.com/AparokshaUI/AdwaitaTemplate">template repository</a>, open in GNOME Builder, and run the template app.
Follow the instructions in the readme file to create your own app.
{{ image(url="Environment.png", alt="A native GNOME app called Tuba") }}
## The Design
This backend allows the creation of apps following the <a class="external" href="https://developer.gnome.org/hig/">GNOME Human Interface Guidelines</a>.
The following screenshot serves as an example for GNOME's design language.
{{ image(url="App.png", alt="A native GNOME app called Tuba" transparent=true) }}
## Distribution
The apps can be distributed using Flatpak. The most popular app store is <a class="external" href="https://flathub.org">Flathub</a>.
Read the <a class="external" href="https://aparokshaui.github.io/adwaita-swift/documentation/adwaita/publishingapps">instructions in the official docs</a>.
## Aparoksha Interoperability
This backend is part of the Aparoksha package. If you use default Aparoksha elements, they will render correctly on GNOME.
You can call platform-specific widgets for GNOME as well.

View File

@ -1,11 +0,0 @@
+++
title = "AppKit"
description = "Build fully native macOS apps."
date = 2024-09-13
[taxonomies]
tags = ["macOS", "Aparoksha"]
[extra]
featured = true
+++
Hello

View File

@ -1,12 +0,0 @@
+++
title = "TermKit"
description = "Create simple user interfaces for terminal applications."
date = 2024-07-10
authors = ["david-swift"]
[taxonomies]
tags = ["Linux", "macOS"]
[extra]
hot = false
+++
Hello

View File

@ -1,11 +0,0 @@
+++
title = "WinUI"
description = "Create apps for Microsoft Windows."
date = 2024-09-13
[taxonomies]
tags = ["Windows", "Aparoksha"]
[extra]
featured = true
+++
Hello

View File

@ -1,12 +0,0 @@
+++
title = "Available Backends"
sort_by = "date"
template = "article_list.html"
page_template = "article.html"
+++
The backends listed here are based on the <a class="external" href="https://github.com/AparokshaUI/Meta">Meta package</a>.
They can be used in combination with the Aparoksha package.
The backends marked with a star are part of the Aparoksha package.
This means that all the user interface elements included in the Aparoksha package will automatically render correctly with these backends.

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -0,0 +1,115 @@
+++
title = "Native Cross-Platform Apps"
description = "Develop beautiful apps following the design guidelines of the GNOME desktop."
date = 2024-09-17
[taxonomies]
tags = ["Aparoksha", "GNOME", "Swift"]
+++
In March, I had the chance to write about the _Adwaita for Swift_ project <a class="external" href="https://www.swift.org/blog/adwaita-swift/">on the official Swift blog</a>.
_Adwaita for Swift_ is a declarative interface on top of the libadwaita and GTK frameworks, allowing the creation of fully native GNOME apps.
Some months earlier, The Browser Company <a class="external" href="https://substack.com/home/post/p-138384240">published Swift bindings for WinUI 3</a>, the native UI framework on Windows.
Officially, Swift offers interoperability with C, C++, and Objective-C, but certain packages, such as <a class="external" href="https://github.com/swiftlang/swift-java">JavaKit</a> or <a class="external" href="https://github.com/pvieito/PythonKit">PythonKit</a>, add support for even more languages.
Therefore, it is possible to use a huge range of UI frameworks in Swift code.
This is an ideal basis for a cross-platform UI framework.
## Native Apps
Cross-platform UI frameworks like React Native primarily target mobile phones.
While React Native offers support for Windows and macOS, the look does not fully match that of _really_ native apps built using WinUI or SwiftUI.
Native Linux UI frameworks like libadwaita and Qt are not supported at all.
While each platform has its own native look, there are obviously many parallels.
As an example, there is a “flat navigation” pattern in each UI framework.
Furthermore, it is very common to implement flat navigation with a sidebar or a view switcher.
My goal is to create a single UI framework around those patterns, allowing the creation of apps that look native on each supported platform.
{% alert(note=true) %}
The following screenshots show a simple user interface built using the Aparoksha framework.
Note that the framework is still in an early stage of development and currently supports only two platforms.
I'll mention later in this article why I want to share my project already.
{% end %}
<div class="row">
<div class="column">
{{ image(url="GNOME.png", alt="A simple native GNOME app." transparent=true) }}
</div>
<div class="column">
{{ image(url="Windows.png", alt="A simple native WinUI app." transparent=true) }}
</div>
</div>
Especially in an early state as now, but also when the framework is more mature, there are a lot of widgets in the native frameworks that are not implemented as a cross-platform widget (yet).
Requesting new widgets is always possible via the <a class="external" href="https://forums.aparoksha.dev/t/ideas">forums</a> or the <a class="external" href="https://git.aparoksha.dev/aparoksha/aparoksha/issues">Gitea issues</a>, but certain widgets might not have an equivalent on other platforms.
This fact has influenced the modular architecture of the project.
## Architecture
The foundation of the project is the <a class="external" href="https://git.aparoksha.dev/aparoksha/meta">Meta package</a>.
It allows “converting” any imperative UI framework into a declarative framework.
Find more information about my definition of a declarative design in the <a class="external" href="https://meta.aparoksha.dev/documentation/meta/declarativedesign">Meta documentation</a>.
A declarative framework based on Meta is a backend. Currently, there are <a class="external" href="https://git.aparoksha.dev/aparoksha/adwaita-swift">adwaita-swift</a> and <a class="external" href="https://git.aparoksha.dev/aparoksha/winui-swift">winui-swift</a>, which are part of the Aparoksha framework, as well as the simple <a class="external" href="https://git.aparoksha.dev/david-swift/term-kit-backend">TermKitBackend</a>.
An up-to-date list is available <a class="external" href="https://www.aparoksha.dev/backends/">on the Aparoksha website</a>.
{% alert(note=true) %}
Some of the repositories were previously developed on GitHub.
The development will move to the <a class="external" href="https://git.aparoksha.dev/">Gitea instance</a> of the Aparoksha project.
I'm leaving GitHub because of the points mentioned <a class="external" href="https://sfconservancy.org/GiveUpGitHub/">in this article</a>.
{% end %}
<a class="external" href="https://git.aparoksha.dev/aparoksha/aparoksha">Aparoksha</a> is an umbrella backend, a backend that calls different other backends based on the detected platform or an optional environment variable.
As the backends are fully independent of the Aparoksha framework, they can provide platform-specific features that Aparoksha does not (yet) support.
If one wants to create an app exclusively for one platform, one can directly import and use a backend.
In the same way, it is possible to define certain views specifically for one platform in apps built using the cross-platform Aparoksha framework.
## Benefits for _Adwaita for Swift_
Having a separate package for the “translation” from imperative to declarative code led to numerous improvements for the _Adwaita for Swift_ framework.
Previously, it could happen that views were updated that did not actually have to be updated.
This has been fixed. The current state of a widget's property is always compared to the previous state before updating, if possible.
Furthermore, a much more simple and declarative syntax for creating widgets has been introduced.
Note that the previous syntax may still be required for very complex or special widgets.
The _Adwaita for Swift_ documentation has been updated, find a short article <a class="external" href="https://adwaita-swift.aparoksha.dev/documentation/adwaita/creatingwidgets">here</a>.
<a class="external" href="https://meta.aparoksha.dev/documentation/meta/model">Models</a> have been introduced for working with other APIs that require classes and should modify state.
Due to the modular design, it is easy to extend the Meta framework and add custom functionality.
A simple example is the <a class="external" href="https://git.aparoksha.dev/aparoksha/meta-sqlite">SQLite for Meta</a> library.
As already mentioned, backends are fully independent of the Aparoksha framework.
Using _Adwaita for Swift_ directly will always be possible.
## Why I'm Announcing the Framework So Early
The WinUI for Swift and the Aparoksha frameworks are still in early development.
So, why am I announcing those projects already?
First, I want to encourage users of _Adwaita for Swift_ to update their dependency.
The repository is now available <a class="external" href="https://git.aparoksha.dev/aparoksha/adwaita-swift">here</a>, with the documentation being hosted <a class="external" href="https://adwaita-swift.aparoksha.dev/documentation/adwaita/">here</a>.
Second, I hope to spark the interest of some people with this article.
I've decided to start the Aparoksha project with support for GNOME and Windows.
I'd love to add support for other platforms as well:
- KDE (one framework to develop native GNOME and KDE apps - wouldn't that be qt?)
- macOS
- iOS
- Android
If you have ideas for other platforms, I'm open to suggestions! Discuss them in the <a class="external" href="https://forums.aparoksha.dev/">forums</a>.
Creating a declarative UI framework yourself is not too difficult. You can find a guide <a class="external" href="https://meta.aparoksha.dev/documentation/meta/createbackend">here</a>, and I'm happy to answer questions in the forums!
It would be really cool if people who have the time and inclination to develop or contribute to a backend would take a look at the mentioned platforms.
Finding contributors is the main reason I'm publishing this article.
If you want to use the Aparoksha framework, subscribe to the RSS feed [here](/rss.xml) and wait some months for the introductory article.
Thanks in advance for any feedback and code! Don't hesitate to share your ideas, concerns, and questions.

8
content/blog/_index.md Normal file
View File

@ -0,0 +1,8 @@
+++
title = "Blog"
sort_by = "date"
template = "article_list.html"
page_template = "article.html"
+++
I announce new projects or major releases, and might write about other stuff here too.

View File

@ -1,13 +0,0 @@
+++
title = "Hi!"
+++
I'm David, the maintainer of the Aparoksha project.
You can find me on <a class="external" href="https://mastodon.de/@david_swift">Mastodon</a>,
<a class="external" href="https://git.aparoksha.dev/david-swift/">this project's Gitea instance</a>,
and on <a class="external" href="https://github.com/david-swift">GitHub</a>.
If you benefit from this project and have enough money, <a class="external" href="https://ko-fi.com/david_swift">donations</a> are appreciated to compensate the server costs.
Thank you!
Don't forget to share your projects on the Fediverse and in the <a class="external" href="https://forums.aparoksha.dev/t/projects">Aparoksha forums</a> :)

View File

@ -1,6 +0,0 @@
+++
title = "Documentation"
featured = true
[taxonomies]
tags = ["Linux", "macOS", "Windows", "Aparoksha"]
+++

View File

@ -1,6 +0,0 @@
+++
title = "Human Interface Guidelines"
featured = true
[taxonomies]
tags = ["Linux", "macOS", "Windows", "Aparoksha"]
+++

View File

@ -1,7 +0,0 @@
+++
title = "Getting Started"
description = "Learn Aparoksha following a simple path."
date = 2023-09-12
[taxonomies]
tags = ["Linux", "macOS", "Windows", "Aparoksha"]
+++

View File

@ -1,6 +0,0 @@
+++
title = "Tutorials"
sort_by = "date"
template = "article_list.html"
page_template = "article.html"
+++

View File

@ -33,6 +33,14 @@ h6 {
font-size: 0.5rem; font-size: 0.5rem;
} }
.logo { .column {
color: #EE2D75; float: left;
padding: 5px;
width: 50%;
}
.row::after {
content: "";
clear: both;
display: table;
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 71 KiB