Badge
Theme-aware, responsive badge component.
Usage
Components are auto-discovered. Use the component directly in any .wrn view:
<Badge
label="Badge"
size="md"
color="primary"
variant="solid"
shape="pill"
/>Legacy mount name: data-component="Badge".
Props and attributes
| Prop | Type | Requirement | Default |
|---|---|---|---|
label | string | Optional | "Badge" |
size | string | Optional | "md" |
color | string | Optional | "primary" |
variant | string | Optional | "solid" |
shape | string | Optional | "pill" |
class | string | Optional | "" |
icon | string | Optional | "" |
iconPosition | string | Optional | "start" |
dot | boolean | Optional | false |
dotOnly | boolean | Optional | false |
dotLabel | string | Optional | "Status" |
animated | boolean | Optional | false |
avatarSrc | string | Optional | "" |
avatarAlt | string | Optional | "" |
dismissible | boolean | Optional | false |
dismissLabel | string | Optional | "Remove badge" |
truncate | boolean | Optional | false |
maxWidth | string | Optional | "12rem" |
anchorLabel | string | Optional | "" |
anchorIcon | string | Optional | "" |
placement | string | Optional | "inline" |
anchorLabelText | string | Optional | "Badge anchor" |
Slots
This component does not declare a slot.
Events
dismiss
Source contract
Installed source: components/Badge.wrn
component Badge {
props {
label = "Badge"
size = "md"
color = "primary"
variant = "solid"
shape = "pill"
class = ""
icon = ""
iconPosition = "start"
dot = false
dotOnly = false
dotLabel = "Status"
animated = false
avatarSrc = ""
avatarAlt = ""
dismissible = false
dismissLabel = "Remove badge"
truncate = false
maxWidth = "12rem"
anchorLabel = ""
anchorIcon = ""
placement = "inline"
anchorLabelText = "Badge anchor"
@event dismiss = function
}
state visible = true
functions {
function dismissBadge(sourceEvent, root, customEvent) {
visible = false
root = sourceEvent.currentTarget.closest("[data-wrn-badge]")
customEvent = document.createEvent("CustomEvent")
customEvent.initCustomEvent("dismiss", true, false, {
component: "Badge",
label: label
})
root.dispatchEvent(customEvent)
}
}
view {
<span
{...attrs}
class="wire-next wire-next--badge-root {anchorLabel || anchorIcon ? 'wire-next--badge-anchored' : ''} {class}"
data-wrn-badge
data-placement="{placement}"
data-show="visible"
aria-hidden="{visible ? 'false' : 'true'}"
>
{#if anchorLabel || anchorIcon}
<button type="button" class="wire-next__badge-anchor" aria-label="{anchorLabelText}">
{#if anchorIcon}<span class="{anchorIcon}" aria-hidden="true">
</span>{/if}
{#if anchorLabel}<span>{anchorLabel}</span>{/if}
</button>
{/if}
<span
class="wire-next__badge"
data-size="{size}"
data-color="{color}"
data-variant="{variant}"
data-shape="{shape}"
data-animated="{animated ? 'true' : 'false'}"
style="--wire-badge-max-width:{maxWidth}"
role="{dotOnly ? 'status' : ''}"
aria-label="{dotOnly ? dotLabel : ''}"
>
{#if animated}
<span class="wire-next__badge-ping" aria-hidden="true">
</span>
{/if}
{#if avatarSrc}
<img class="wire-next__badge-avatar" src="{avatarSrc}" alt="{avatarAlt}" loading="lazy" />
{/if}
{#if dot || dotOnly}
<span class="wire-next__badge-dot" aria-hidden="true">
</span>
{/if}
{#if icon && iconPosition === "start"}
<span class="wire-next__badge-icon {icon}" aria-hidden="true">
</span>
{/if}
{#if !dotOnly}
<span class="wire-next__badge-label {truncate ? 'wire-next__badge-label--truncate' : ''}">
{label}
</span>
{/if}
{#if icon && iconPosition === "end"}
<span class="wire-next__badge-icon {icon}" aria-hidden="true">
</span>
{/if}
{#if dismissible}
<button type="button" class="wire-next__badge-dismiss" aria-label="{dismissLabel}" @click="dismissBadge(event)">
<span class="icon-[lucide--x]" aria-hidden="true">
</span>
</button>
{/if}
</span>
</span>
}
}