LubaUI / SwiftUI design system

Open source · 0.3.0

Shared foundations.
Distinct products.

A library for the interface decisions that repeat. Themes, components, and behaviors that leave room for what makes each product useful.

Inside the showcase
LubaUI 0.3.0 / native captures

One composition. Room for your identity.

The same card, progress, chips, and toggle in Sage, Ocean, and dark mode. Change the theme; the components follow.

Shared roles → a different visual identity
@LubaEnvironment private var luba
.foregroundStyle(luba.colors.accent)
Open full-size capture
LubaUI native showcase: SageSage

Sage · Select a screen or swipe

Actual showcase captures · LubaUI 0.3.0 · 15 October 2026. Run the showcase · Capture notes

The product decision

Decide what should
be shared.

In Wirkraum, the important questions concern places, sources, and what a result can tell you. Buttons, form states, and spacing still need care, but solving them again on every screen takes attention from those questions.

LubaUI gives those recurring decisions a home. The goal is to make consistency easier to maintain while keeping product-specific work in the app. A shared library adds maintenance of its own; its scope has to earn that cost.

Identity

Share the rules. Let the theme change.

Components read roles such as accent, surface, and primary text. A theme can change colors, fonts, spacing, and radii throughout a view hierarchy. A palette override changes colors without replacing the surrounding layout and type choices.

Scope

Keep the foundation smaller than the product.

Core and Components are separate products in 0.3.0. Apps can take the foundation without the ready-made views. Chart wrappers were removed; chart implementation stays with Swift Charts in the application.

Adoption

Make the conventions easy to use.

Working examples show the composition. Versioned documentation and MCP tools make the same vocabulary available to coding agents. Existing non-chart import LubaUI usage remains supported.

Try the components

A small interface.
Several shared decisions.

Change the palette and shape. Edit the name, toggle updates, and save. The card brings fields, feedback, and actions together; the Swift example shows how those pieces fit. This is an interactive web interpretation of the native components.

LubaCard

Your workspace

A few preferences. One shared theme.

Try an empty name to see validation.

Web interpretation · changes stay in this demo.
Corner controls illustrate theme radii; the code below focuses on palette and composition.

Preferences.swiftOcean / updates on
import SwiftUIimport LubaUI struct Preferences: View {    @LubaEnvironment private var luba    @State private var name = ""    @State private var updates = true     var body: some View {        LubaCard {            VStack(spacing: luba.spacing.lg) {                LubaTextField("Name", text: $name)                LubaToggle(isOn: $updates,                           label: "Project updates")                LubaButton("Save") {                    // Validate and save in your app.                }            }        }        .lubaTheme(colors: .accented(.indigo))    }}

Give ordinary views useful behaviors.

Press, expand, swipe, load, or hold. These web demos approximate the SwiftUI modifiers; native controls still provide activation and accessibility semantics.

.lubaPressable()

Press to feel the response. Activate to save.

.lubaExpandable()

Reveal detail without leaving the view.

.lubaSwipeable()

Swipe left, or tap the row, to reveal actions.

.lubaShimmerable()
Project notesReady to review

Keep the layout in place while content loads.

.lubaLongPressable()

Hold for 0.8 seconds. Keyboard: hold Space.

Explore the component catalog

Controls

Button · IconButton · TextField · TextArea · SearchBar · Checkbox · Radio · Toggle · Slider · Stepper · Rating · Tabs

Structure & display

Card · Sheet · Divider · Avatar · Icon · CircledIcon · Chip · Link · Menu

Feedback

Toast · Alert · ProgressBar · CircularProgress · Spinner · Badge · Tooltip · Skeleton

Component names use the Luba prefix. Other primitives include .lubaGlass(). Read the API reference

From library to application

The system supports
the product’s own work.

Wirkraum is an offline field tool for exploring Natura 2000 areas and their sources. Its lists, dense detail, and source warnings show LubaUI beyond a component showcase. Geography, content, and navigation remain application code.

Wirkraum / LubaUI 0.2.0 / example data

A list that stays readable.

Cards and badges create a repeatable structure for results. The application supplies the places, distances, and meaning of each status.

Shared by LubaUI
LubaCard · LubaBadge
Theme roles, spacing & type
Owned by the app
Geographic results & source interpretation
Open full-size capture ↗
Wirkraum example data: Repeated content

Wirkraum captures · LubaUI 0.2.0 · bundled example data · 15 October 2026. These demonstrate application use, not the changes in 0.3.0. Capture notes

Across ShopOfLuba, the work follows an idea through its interface and the systems behind it. LubaUI focuses on the reusable interface layer; PMX explores how product intent becomes reviewed engineering work. Both make decisions explicit enough for people and agents to work with.

Use the library

Start with the layer
you need.

LubaUI 0.3.0 offers three package products. Add the package in Xcode or Swift Package Manager, then select a product for your target. Swift 5.9+ · MIT licensed.

Foundation

LubaCore

Tokens, themes, and interaction primitives for your own views.

import LubaCore
Ready-made views

LubaComponents

Reusable controls, containers, and feedback, built on Core.

import LubaComponents
Complete library

LubaUI

Core and Components together, through the familiar import.

import LubaUI
Package.swift / dependency
.package(url: "https://github.com/ermanakar/LubaUI.git", from: "0.3.0")

Existing non-chart import LubaUI usage remains supported. For chart removals and product selection, see the migration guide.

For coding agents

Give the agent the same reference.

MCP tools look up components and tokens, validate spacing and radii, and help plan a migration. MCP 1.4.0 documents LubaUI 0.3.0; they have separate version numbers.

Read the standalone llms.txt reference ↗
Claude Code / terminal
claude mcp add lubaui -- npx -y lubaui-mcp@1.4.0

Using another MCP client? See the setup guide.

What can the server answer?

Token and component lookup, primitive lookup, spacing and radius validation, color palettes, token suggestions, and migration planning. Ten tools cover these tasks.

Explore the source

Declared targets: iOS 16+, macOS 13+, watchOS 9+, tvOS 16+, visionOS 1+.
CI covers macOS tests and an iOS Simulator library build. Validate each platform you ship.

What else changed in 0.3.0?

Buttons and cards inherit configured defaults; explicit choices still win. Haptics respect the nearest configuration. Chips separate selection and dismissal, text fields grow with larger type, and clear actions honor configured touch targets. Read the release notes.