ElementaryPines
v0.1.100 · 17 components · 11 colors · 35 icons
Under heavy development · early stages

Pines UI rendered from Swift

A type-safe Swift package that renders Pines UI components through Elementary, the HTML renderer for Swift server-side frameworks including Vapor and Hummingbird.

ProductPage.swift
import ElementaryPines

pinesCard {
    div(.class("p-7")) {
        h2 { "Featured" }
        p  { "Rendered server-side." }
        button { "Add to cart" }
            .pinesButtonStyle(.solid, color: .blue)
        span { "New" }
            .pinesBadgeStyle(.light, color: .green)
        pinesProgress(75, color: .blue)
    }
}

Category

Primitives

Building blocks — buttons, badges, icons, cards, progress, quotes, banners, and alerts. Every variant, every color.

Button

button { "..." }.pinesButtonStyle(_:color:)

3 styles × 11 colors
Style
Color
import ElementaryPines

button {  }
    .pinesButtonStyle(., color: .)

Badge

span { "..." }.pinesBadgeStyle(_:color:)

5 styles × 11 colors
Style
Color
import ElementaryPines

span {  }
    .pinesBadgeStyle(., color: .)

Icon

pinesIcon(_:size:color:)

35 icons × 5 sizes × 11 colors
Size
Color
import ElementaryPines

pinesIcon(., size: ., color: .)

Card

pinesCard(_:image:content:)

4 variants
Variant
import ElementaryPines

pinesCard(., image: "photo.jpg") {
    // user content
}

Progress

pinesProgress(_:of:color:size:)

3 sizes × 11 colors
Size
Color
import ElementaryPines

pinesProgress(, color: ., size: .)

Quote

pinesQuote(_:avatar:content:)

2 variants

“This is a great quote.”

Variant
import ElementaryPines

pinesQuote(., avatar: "avatar.jpg") {
    blockquote { p { "“This is a great quote.”" } }
    figcaption { "— Author Name, Role" }
}

Banner

pinesBanner(icon:dismissible:content:)

4 icon presets × dismissible
Icon
Dismissible
Dismiss
import ElementaryPines

pinesBanner(icon: .kind(.), dismissible: true) {
    p {  }
}

Alert

pinesAlert(_:icon:content:)

4 variants
Variant
import ElementaryPines

pinesAlert(.) {
    h5 {  }
    div(.class("text-sm opacity-70")) {
        
    }
}

Category

Forms & controls

Inputs, selects, switches, sliders, ratings. Interactive pieces include Alpine.js state for the preview.

Input

pinesInput(type:color:placeholder:name:value:id:disabled:)

11 colors
Color
Disabled
Disabled
import ElementaryPines

pinesInput(color: ., placeholder: , disabled: true)

Textarea

pinesTextarea(color:placeholder:name:id:rows:disabled:)

11 colors
Color
import ElementaryPines

pinesTextarea(color: ., placeholder: , rows: )

Select

pinesSelect(items:placeholder:width:)

Alpine.js · 11 colors
Color
import ElementaryPines

pinesSelect(items: [
    PinesSelectItem(title: "Apple",  value: "apple"),
    PinesSelectItem(title: "Banana", value: "banana"),
    PinesSelectItem(title: "Cherry", value: "cherry"),
    PinesSelectItem(title: "Date",   value: "date", disabled: true),
], placeholder: "Select a fruit")

Checkbox

pinesCheckbox(checked:color:name:variant:labelClasses:)

3 variants
Variant
Color
Checked
Checked
import ElementaryPines

pinesCheckbox(
    checked: ,
    color: .,
    variant: .
)

Switch

pinesSwitch(color:size:name:)

2 sizes × 11 colors
Size
Color
On
On
import ElementaryPines

pinesSwitch(color: ., size: .small)

RadioGroup

pinesRadioGroup(options:name:disabled:)

Disabled-item support
import ElementaryPines

pinesRadioGroup(options: [
    PinesRadioOption(title: "Free",  value: "free"),
    PinesRadioOption(title: "Pro",   value: "pro"),
    PinesRadioOption(title: "Team",  value: "team", disabled: true),
], name: )

RangeSlider

pinesRangeSlider(color:name:id:min:max:value:)

11 colors
0100
Color
import ElementaryPines

pinesRangeSlider(color: ., value: )

Rating

pinesRating(variant:icon:color:emptyStyle:max:disabled:)

2 variants × 2 icons × 2 empty styles
Rated Stars
Rated
Variant
Icon
Color
Empty style
Disabled
Disabled
import ElementaryPines

pinesRating(variant: ., icon: ., color: ., emptyStyle: .)