Skip to content

Commit 33e2608

Browse files
jverkoeyclaude
andauthored
Implement Tailwind visibility View modifier (#259)
Add support for Tailwind CSS visibility utilities (visible, invisible, collapse) as a View modifier. This allows controlling element visibility while maintaining layout space for hidden elements. - Add Visibility enum with three cases: visible, invisible, collapse - Implement visibility() View modifier with optional condition support - Add comprehensive test coverage for all visibility modes and conditions Part of #51 --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 742d2fe commit 33e2608

4 files changed

Lines changed: 85 additions & 0 deletions

File tree

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Visibility
2+
3+
Utilities for controlling the visibility of an element.
4+
5+
## Topics
6+
7+
### Modifiers
8+
9+
- ``View/visibility(_:condition:)``
10+
11+
### Supporting types
12+
13+
- ``Visibility``

Sources/Slipstream/Documentation.docc/TailwindCSS/TailwindCSS-Utilities.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Slipstream implementations of Tailwind CSS's utility classes.
1212
- <doc:Layout-Overflow>
1313
- <doc:Layout-Position>
1414
- <doc:Layout-Placement>
15+
- <doc:Layout-Visibility>
1516

1617
### Flexbox & Grid
1718

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import Foundation
2+
3+
/// Utilities for controlling the visibility of an element.
4+
///
5+
/// - SeeAlso: Tailwind CSS [visibility](https://tailwindcss.com/docs/visibility)
6+
@available(iOS 17.0, macOS 14.0, *)
7+
public enum Visibility: String {
8+
/// Sets `visibility: visible` - makes the element visible.
9+
case visible
10+
11+
/// Sets `visibility: hidden` - hides the element but still takes up space in the layout.
12+
case invisible
13+
14+
/// Sets `visibility: collapse` - collapses the element (primarily for table rows/columns).
15+
case collapse
16+
}
17+
18+
@available(iOS 17.0, macOS 14.0, *)
19+
extension View {
20+
/// Sets the visibility of an element.
21+
///
22+
/// - Parameters:
23+
/// - visibility: The visibility mode to apply.
24+
/// - condition: An optional condition that controls when this modifier is applied.
25+
///
26+
/// ```swift
27+
/// Div {
28+
/// Text("This is visible")
29+
/// }
30+
/// .visibility(.visible)
31+
/// ```
32+
///
33+
/// - SeeAlso: Tailwind CSS [visibility](https://tailwindcss.com/docs/visibility)
34+
public func visibility(_ visibility: Visibility, condition: Condition? = nil) -> some View {
35+
return modifier(TailwindClassModifier(add: visibility.rawValue, condition: condition))
36+
}
37+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import Testing
2+
import Slipstream
3+
4+
struct VisibilityTests {
5+
@Test func visible() throws {
6+
try #expect(renderHTML(Div {}.visibility(.visible)) == #"<div class="visible"></div>"#)
7+
}
8+
9+
@Test func invisible() throws {
10+
try #expect(renderHTML(Div {}.visibility(.invisible)) == #"<div class="invisible"></div>"#)
11+
}
12+
13+
@Test func collapse() throws {
14+
try #expect(renderHTML(Div {}.visibility(.collapse)) == #"<div class="collapse"></div>"#)
15+
}
16+
17+
@Test func condition() throws {
18+
try #expect(
19+
renderHTML(
20+
Div {}.visibility(.invisible, condition: .init(startingAt: .medium))
21+
) == #"<div class="md:invisible"></div>"#
22+
)
23+
}
24+
25+
@Test func multipleConditions() throws {
26+
try #expect(
27+
renderHTML(
28+
Div {}
29+
.visibility(.invisible, condition: .init(startingAt: .medium))
30+
.visibility(.visible, condition: .init(startingAt: .large))
31+
) == #"<div class="md:invisible lg:visible"></div>"#
32+
)
33+
}
34+
}

0 commit comments

Comments
 (0)