Primitive

CTA Button

Auto-emitted from DSKintsugiCatalog.ctabutton. Tier atom.

Live Preview
Surface

Dark

Default · hero · burgundy pricing · CTAButton(role:.primary)
primary .ds-cta-primary Action principale — sigma red bg + gold halo on hover
secondary .ds-cta-secondary Companion to primary — gold halo on hover (dark surface)
secondary · red .ds-cta-secondary-red Opt-in red accent — used when no red primary is nearby

rest

Thème

hover

Thème

pressed

Thème

disabled

Thème
Surface

Light (in nav scope)

Cream warm-pro nav · navy hover anchor
primary .ds-cta-primary Action principale — red stays red on light

rest

Démo

hover

Démo

pressed

Démo

disabled

Démo
secondary .ds-cta-secondary Navy halo on hover (gold-on-cream poor contrast)

rest

Connexion

hover

Connexion

pressed

Connexion

disabled

Connexion
secondary · red .ds-cta-secondary-red Red accent stays red on light surface too

rest

Thème

hover

Thème

pressed

Thème

disabled

Thème
Native · macOS
macOS SwiftUI render of CTA Button
DSL usage
// Source of truth — Swift, SwiftUI-like (KatagamiCore)
struct CTAButton: ShikkiView {
    let label: String
    let role: Role
    let action: ActionKey
    let isDisabled: Bool

    func body(context: RenderContext) -> ViewNode {
        ViewNode.button(
            label: .text(label, style: .body),
            action: action,
            style: ButtonStyle(variant: role.buttonVariant)
        )
    }
}

// Renderers consume the SAME tree :
// • KatagamiSwiftUI → native SwiftUI Button
// • KatagamiWeb     → <a class="ds-cta-primary">Demander une démo</a>
// • KatagamiTypst   → rounded box + ink color
//
// The storybook entry's previewHTML is COMPUTED, not hand-rolled :
//   CTAButton(label: "Démo", role: .primary, action: .submit).emittedHTML
Attributes
NameTypeDefaultDescription
role CTAButton.Role Semantic role: .primary | .secondary | .secondaryRed
label String Button label text
action ActionKey Action key consumed by KatagamiSwiftUI; href on web
isDisabled Bool false Adds is-disabled / aria-disabled / SwiftUI .disabled(true)
Used in
sigma-analytics obyw-one shikki.io (W4 follow-up)