Ashwanikuma/ChipView
A lightweight, zero-dependency SwiftUI package that gives you a **flow-wrapping chip container** — use it exactly like `HStack` or `VStack`, just drop your views inside.
Requirements
| Platform | Minimum | |----------|---------| | iOS | 16.0+ | | macOS | 13.0+ | | watchOS | 9.0+ | | tvOS | 16.0+ |
Swift 5.9 · Xcode 15+
Installation
Swift Package Manager
In Xcode: File → Add Package Dependencies and paste the repo URL.
Or add it to Package.swift:
dependencies: [
.package(url: "https://github.com/YOUR_USERNAME/ChipView.git", from: "1.0.0")
],
targets: [
.target(name: "YourTarget", dependencies: ["ChipView"])
]Usage
Basic — drop any views inside
import ChipView
ChipView {
ForEach(tags, id: \.id) { tag in
Text(tag.name)
.chipStyle() // built-in convenience modifier
}
}Custom spacing and alignment
ChipView(hSpacing: 10, vSpacing: 14, alignment: .center) {
ForEach(items, id: \.self) { item in
Text(item)
.chipStyle(background: .purple, foreground: .white)
}
}| Parameter | Type | Default | Description | |-------------|-----------------------|------------|------------------------------------| | hSpacing | CGFloat | 8 | Gap between chips on the same row | | vSpacing | CGFloat | 8 | Gap between rows | | alignment | HorizontalAlignment | .leading | .leading / .center / .trailing |
Selectable chips (multi-select example)
ChipView(hSpacing: 8, vSpacing: 10) {
ForEach(viewModel.concerns, id: \.id) { tag in
let isSelected = viewModel.selectedConcerns.contains(tag.name)
Text(tag.name)
.chipStyle(
background: isSelected ? Color.purple : Color(.systemGray6),
foreground: isSelected ? .white : .primary
)
.onTapGesture {
if isSelected {
viewModel.selectedConcerns.removeAll { $0 == tag.name }
} else {
viewModel.selectedConcerns.append(tag.name)
}
}
}
}Outlined chips
ChipView {
ForEach(filters, id: \.self) { filter in
Text(filter)
.outlinedChipStyle(borderColor: .teal, foreground: .teal)
}
}Any content — not just Text
Because ChipView works like HStack, you can put any SwiftUI view inside:
ChipView(hSpacing: 12, vSpacing: 12) {
ForEach(skills, id: \.self) { skill in
HStack(spacing: 4) {
Image(systemName: skill.icon)
Text(skill.name)
}
.chipStyle(background: .blue.opacity(0.12), foreground: .blue)
}
}Overflow handling
If a chip's content is wider than the available container width (e.g. a very long string), ChipView clamps the chip to the container width and passes that width as the layout proposal — so Text automatically truncates with ….
You do not need to do anything special. Optionally add .lineLimit(1) on your Text if you want to guarantee single-line truncation:
Text(veryLongString)
.lineLimit(1) // optional — already implied by chipStyle()
.chipStyle()Using `FlowLayout` directly
FlowLayout is also public if you need a raw flow container without the ChipView wrapper:
FlowLayout(hSpacing: 8, vSpacing: 12, alignment: .trailing) {
// any subviews
}Built-in style modifiers
| Modifier | Description | |----------------------|------------------------------------------| | .chipStyle(...) | Filled background with rounded corners | | .outlinedChipStyle(...) | Transparent with a border stroke |
Both modifiers accept full customisation: background, foreground, cornerRadius, verticalPadding, horizontalPadding.
License
MIT
Package Metadata
Repository: Ashwanikuma/ChipView
Stars: 1
Forks: 0
Open issues: 0
Default branch: master
Primary language: swift
README: README.md