<a class="toggle" aria-pressed="true" data-toggle-type="internal" href="#">
<span class="toggle__indicator"></span>
<span class="toggle__text u-underline">A toggle button</span>
</a>
{% set link = link | default(null) %}
{% set showInternal = showInternal ?? false %}
{% set linkType = linkType ??? link_type(link) %}
{% set icon = icon ?? link_icon(link=link, type=linkType, showInternal=showInternal) %}
{% set iconPosition = iconPosition ?? 'before' %}
{% set tag = link ? 'a' : 'button' -%}
<{{ tag }} {{ html_attributes({
id: id ?? false,
class: {
'toggle': true,
'u-overlay-link': overlay ?? false,
},
type: not link ? (type ??? 'button'),
title: title ?? false,
disabled: disabled ?? false,
'aria-pressed': active|default ? 'true' : 'false',
'data-toggle-type': linkType,
}, link_attributes(link, type=linkType), attrs ?? {}) }}>
<span class="toggle__indicator"></span>
{% if icon and iconPosition == 'before' %}
<span class="toggle__icon">
{% include '@icon' with { icon: icon } only %}
</span>
{% endif %}
{% if text|default %}
<span class="toggle__text u-underline">
{{- text -}}
</span>
{% endif %}
{% if icon and iconPosition == 'after' %}
<span class="toggle__icon">
{% include '@icon' with { icon: icon } only %}
</span>
{% endif %}
</{{ tag }}>
{
"link": "#",
"text": "A toggle button",
"active": true
}
.toggle {
--_toggle-size: var(--toggle-size, 2.8rem);
--_toggle-inner-padding: var(--toggle-inner-padding, 0.5rem);
--_toggle-bullet-size: calc(var(--_toggle-size) - var(--_toggle-inner-padding) * 2);
--_toggle-active: 0;
--_toggle-background-color: var(--toggle-background-color, var(--color-gray-200));
--_toggle-foreground-color: var(--toggle-foreground-color, var(--color-gray-600));
align-items: center;
color: var(--toggle-color, inherit);
cursor: pointer;
display: inline-flex;
font-size: var(--toggle-font-size, inherit);
gap: 0.5em;
inline-size: var(--toggle-width, auto);
text-align: start;
user-select: none;
&:is([aria-pressed='true']) {
--_toggle-active: 1;
--_toggle-background-color: var(--_toggle-background-color--active, var(--color-green-100));
--_toggle-foreground-color: var(--_toggle-foreground-color--active, var(--color-green-700));
}
}
.toggle__indicator {
background-color: var(--_toggle-background-color);
block-size: var(--_toggle-size);
border-radius: calc(var(--_toggle-size) / 2);
cursor: pointer;
display: block;
flex-shrink: 0;
inline-size: calc(var(--_toggle-bullet-size) * 2 + var(--_toggle-inner-padding) * 2);
margin-inline-end: 0.5em;
position: relative;
transition-property: background-color;
&::before {
background-color: var(--_toggle-foreground-color);
block-size: var(--_toggle-bullet-size);
border-radius: 50%;
content: '';
inline-size: var(--_toggle-bullet-size);
inset-block-start: var(--_toggle-inner-padding);
inset-inline-start: var(--_toggle-inner-padding);
position: absolute;
transition-property: background-color, translate;
translate: calc(var(--_toggle-active) * 100%) 0;
}
}
.toggle__text {
line-height: var(--line-height-default);
}
No notes defined.