{"id":6862,"date":"2026-04-30T15:54:15","date_gmt":"2026-04-30T15:54:15","guid":{"rendered":"https:\/\/notmart.org\/blog\/?p=6862"},"modified":"2026-04-30T15:54:16","modified_gmt":"2026-04-30T15:54:16","slug":"kirigami-forms-and-configurations","status":"publish","type":"post","link":"https:\/\/notmart.org\/blog\/2026\/04\/kirigami-forms-and-configurations\/","title":{"rendered":"Kirigami forms and configurations"},"content":{"rendered":"\n<p>Recently a new submodule has landed in Kirigami: \u201cForms\u201d.<\/p>\n\n\n\n<p>Until this point, Kirigami had only offered the classic \u201cFormLayout\u201d component. which is used for configuration pages throughoug systemsettings, Plasma, and some apps. It\u2019s the classical form used in desktop toolkits for decades:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"781\" height=\"573\" src=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-1.png\" alt=\"\" class=\"wp-image-6863\" srcset=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-1.png 781w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-1-300x220.png 300w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-1-768x563.png 768w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-1-624x458.png 624w\" sizes=\"auto, (max-width: 781px) 100vw, 781px\" \/><\/a><\/figure>\n\n\n\n<p>This is a fairly clean layout which however is starting to slowly become outdated, as modern toolkits are starting to use a different layout nowdays, based on &#8220;cards&#8221;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-8.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"722\" src=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-8-1024x722.png\" alt=\"\" class=\"wp-image-6870\" srcset=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-8-1024x722.png 1024w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-8-300x211.png 300w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-8-768x541.png 768w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-8-624x440.png 624w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-8.png 1047w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-9.png\"><img loading=\"lazy\" decoding=\"async\" width=\"966\" height=\"1024\" src=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-9.png\" alt=\"\" class=\"wp-image-6871\" srcset=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-9.png 966w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-9-283x300.png 283w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-9-768x814.png 768w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-9-624x661.png 624w\" sizes=\"auto, (max-width: 966px) 100vw, 966px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-10.png\"><img loading=\"lazy\" decoding=\"async\" width=\"614\" height=\"1024\" src=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-10-614x1024.png\" alt=\"\" class=\"wp-image-6872\" srcset=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-10-614x1024.png 614w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-10-180x300.png 180w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-10-624x1040.png 624w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-10.png 768w\" sizes=\"auto, (max-width: 614px) 100vw, 614px\" \/><\/a><\/figure>\n\n\n\n<p>Unfortunately FormLayout very bound to the classic layout, and it wasn\u2019t really possible to adapt it to the new look in a compatible way which didn\u2019t break existing applications in unexpected ways.<\/p>\n\n\n\n<p>This is also the reason a new approach was done provided by kirigami addons: \u201cFormCard\u201d, which is used by a lot of applications; for instance here in NeoChat:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"781\" height=\"681\" src=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-2.png\" alt=\"\" class=\"wp-image-6864\" srcset=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-2.png 781w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-2-300x262.png 300w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-2-768x670.png 768w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-2-624x544.png 624w\" sizes=\"auto, (max-width: 781px) 100vw, 781px\" \/><\/a><\/figure>\n\n\n\n<p>We wanted to have this new style of forms in the base Kirigami API, so after a review of the existing FormCard, we decided to make several changes, for two main reasons: First, FormCard is bound to the card style of form as much as FormLayout was bound to the classic flat style. Also, it tried to provide ready-made components for every kind of control; so it had its own TextField, its own RadioButton and so on \u2014 effectively becoming its own separate toolkit.<\/p>\n\n\n\n<p>So we opted instead to go down the route of having a more generic API, so the Forms module includes containers that define a semantic structure of a form, which contains all the normal controls \u2014 such as textfields, checkboxes and radiobuttons.<\/p>\n\n\n\n<p>This is a code example of the new API:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  import QtQuick.Controls as QQC\n  import org.kde.kirigami as Kirigami\n\n  Kirigami.Form {\n    Kirigami.FormGroup {\n        title: \"Global Settings\"\n        Kirigami.FormEntry {\n            contentItem: QQC.CheckBox {\n                text: \"Show Sidebar\"\n            }\n        }\n        Kirigami.FormEntry {\n            contentItem: QQC.CheckBox {\n                text: \"Auto Save\"\n            }\n        }\n    }\n    Kirigami.FormGroup {\n        title: \"Theme Options\"\n        Kirigami.FormEntry {\n            title: \"Colors:\"\n            contentItem: QQC.CheckBox {\n                text: \"Dark Theme\"\n            }\n        }\n        Kirigami.FormSeparator {}\n        Kirigami.FormEntry {\n            contentItem: QQC.CheckBox {\n                text: \"High Contrast\"\n            }\n        }\n        ...\n    }\n  }\n<\/code><\/pre>\n\n\n\n<p>which will look like this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-3.png\"><img loading=\"lazy\" decoding=\"async\" width=\"322\" height=\"328\" src=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-3.png\" alt=\"\" class=\"wp-image-6865\" srcset=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-3.png 322w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-3-295x300.png 295w\" sizes=\"auto, (max-width: 322px) 100vw, 322px\" \/><\/a><\/figure>\n\n\n\n<p>Or, in mobile mode:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-4.png\"><img loading=\"lazy\" decoding=\"async\" width=\"270\" height=\"349\" src=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-4.png\" alt=\"\" class=\"wp-image-6866\" srcset=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-4.png 270w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-4-232x300.png 232w\" sizes=\"auto, (max-width: 270px) 100vw, 270px\" \/><\/a><\/figure>\n\n\n\n<p>Semantically, a Form will contain one or more FormGroup objects, each of which will contain one or more FormEntry objects. Then a FormEntry will contain the control which represents the configuration of the particular thing. It can be a single control (like a button or a checkbox) or it can be any layout with completely custom contents.<\/p>\n\n\n\n<p>I already ported 4 modules of systemsettings to the new system: the landing page, the &#8220;workspace options&#8221; kcm, the mouse settings and the touchpad settings.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-5.png\"><img loading=\"lazy\" decoding=\"async\" width=\"690\" height=\"571\" src=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-5.png\" alt=\"\" class=\"wp-image-6867\" srcset=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-5.png 690w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-5-300x248.png 300w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-5-624x516.png 624w\" sizes=\"auto, (max-width: 690px) 100vw, 690px\" \/><\/a><\/figure>\n\n\n\n<p>But wait\u2026 this page looks <strong>exactly<\/strong> the same as before; why?<\/p>\n\n\n\n<p>A key was to do an API that was as much as separated from any appearance as possible, as we don&#8217;t know how UI design trends will evolve in the future. But this also allows us another thing: to have two separate implementations: the new one &#8220;card based&#8221; and a legacy one which looks exactly like the current FormLayout components. This is used <em>only <\/em>in systemsettings, so we can port all the kcms without introducing glaring visual inconsistencies, and when we are done, flick the switch and convert the look of everything all in one go.<\/p>\n\n\n\n<p>Since most of KDE\u2019s QML applications already use the existing card-style kirigamiaddons FormCard components, the new look will be used there.<\/p>\n\n\n\n<p>And then in the future, when trends change again, we can re-style all the settings pages in one go.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A call to action<\/h2>\n\n\n\n<p>We ideally want the whole set of systemsettings kcms to be ported as soon as possible to the new system, so we can have soon a nice visual overhaul in the whole systemsettings.<\/p>\n\n\n\n<p>In order for this to happen, we need the help of everyone, so\u2026 patches welcome \ud83d\ude42<\/p>\n\n\n\n<p>As an example, <a href=\"https:\/\/invent.kde.org\/plasma\/plasma-desktop\/-\/merge_requests\/3239\">this<\/a> is the merge request that ported the first four kcms.<\/p>\n\n\n\n<p>When porting, it\u2019s also possible to see how the kcm will look with the new system as well, to make sure it works well for when we flick the switch. If we run in a terminal:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>KDE_KIRIGAMI_FORMS_STYLE=cards systemsettings<\/code><\/pre>\n\n\n\n<p>We get systemsettings using the new style for pages already ported:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-6.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"801\" src=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-6-1024x801.png\" alt=\"\" class=\"wp-image-6868\" srcset=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-6-1024x801.png 1024w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-6-300x235.png 300w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-6-768x601.png 768w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-6-624x488.png 624w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-6.png 1334w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-7.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"801\" src=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-7-1024x801.png\" alt=\"\" class=\"wp-image-6869\" srcset=\"https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-7-1024x801.png 1024w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-7-300x235.png 300w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-7-768x601.png 768w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-7-624x488.png 624w, https:\/\/notmart.org\/blog\/wp-content\/uploads\/2026\/04\/image-7.png 1334w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Porting from FormLayout to the new Form\/FormGroup\/FormEntry system should be really straightforward; it should be possible to make good progress in little time.<\/p>\n\n\n\n<p>With your help, soon KDE\u2019s settings will benefit from greater consistency, a more modern style, and easier adaptation to future designs.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Recently a new submodule has landed in Kirigami: \u201cForms\u201d. Until this point, Kirigami had only offered the classic \u201cFormLayout\u201d component. which is used for configuration pages throughoug systemsettings, Plasma, and some apps. It\u2019s the classical form used in desktop toolkits for decades: This is a fairly clean layout which however is starting to slowly become [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,16],"tags":[197,2,159,198,27],"class_list":["post-6862","post","type-post","status-publish","format-standard","hentry","category-graphics","category-software","tag-design","tag-kde","tag-kirigami","tag-ui","tag-ux"],"_links":{"self":[{"href":"https:\/\/notmart.org\/blog\/wp-json\/wp\/v2\/posts\/6862","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/notmart.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/notmart.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/notmart.org\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/notmart.org\/blog\/wp-json\/wp\/v2\/comments?post=6862"}],"version-history":[{"count":3,"href":"https:\/\/notmart.org\/blog\/wp-json\/wp\/v2\/posts\/6862\/revisions"}],"predecessor-version":[{"id":6875,"href":"https:\/\/notmart.org\/blog\/wp-json\/wp\/v2\/posts\/6862\/revisions\/6875"}],"wp:attachment":[{"href":"https:\/\/notmart.org\/blog\/wp-json\/wp\/v2\/media?parent=6862"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/notmart.org\/blog\/wp-json\/wp\/v2\/categories?post=6862"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/notmart.org\/blog\/wp-json\/wp\/v2\/tags?post=6862"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}