UNPKG

@sandlada/mdc

Version:

@sandlada/mdc is an open source component library that follows the Material Design 3 design specifications.

469 lines (434 loc) 19.9 kB
import{r as e,a as o}from"../../lit-element-Ho-VPzO1.js";import{ElevatedButtonDefinition as l,FilledButtonDefinition as a,FilledTonalButtonDefinition as t,OutlinedButtonDefinition as r,TextButtonDefinition as i}from"../../component-definitions/button.definition.js";import{createWrappedTokens as n}from"../../utils/tokens/create-wrapped-tokens.js";import{overrideComponentTokens as c}from"../../utils/tokens/override-component-tokens.js";import{stringTokens as s}from"../../utils/tokens/string-tokens.js";import"../../color-CigMJnjV.js";import"../../elevation-dUQez_WX.js";import"../../shape-CrZ0CLVJ.js";import"../../state-C-haZXan.js";import"../../typescale-Bh1NLwSE.js";import"../../utils/tokens/create-logic-shape-tokens.js"; /** * @license * Copyright 2025 Kai-Orion & Sandlada * SPDX-License-Identifier: MIT */const d=n("--mdc-elevated-button",l),g=e(s(d)),v=n("--mdc-filled-button",a),b=e(s(v)),u=n("--mdc-filled-tonal-button",t),m=e(s(u)),h=n("--mdc-outlined-button",r),p=e(s(h)),_=n("--mdc-text-button",i),f=e(s(_)),x=o` .container mdc-ripple {${s(c("--mdc-ripple",{"hovered-color":"var(--_hovered-state-layer-color)","focused-color":"var(--_focused-state-layer-color)","pressed-color":"var(--_pressed-state-layer-color)","hovered-opacity":"var(--_hovered-state-layer-opacity)","focused-opacity":"var(--_focused-state-layer-opacity)","pressed-opacity":"var(--_pressed-state-layer-opacity)"}))};} .container.togglable.selected mdc-ripple {${s(c("--mdc-ripple",{"hovered-color":"var(--_hovered-state-layer-color-toggle-selected)","focused-color":"var(--_focused-state-layer-color-toggle-selected)","pressed-color":"var(--_pressed-state-layer-color-toggle-selected)"}))};} .container.togglable.unselected mdc-ripple {${s(c("--mdc-ripple",{"hovered-color":"var(--_hovered-state-layer-color-toggle-unselected)","focused-color":"var(--_focused-state-layer-color-toggle-unselected)","pressed-color":"var(--_pressed-state-layer-color-toggle-unselected)"}))};} `,z=o` .container mdc-elevation {transition-duration: 0ms;${s(c("--mdc-elevation",{level:"var(--_container-elevation)","shadow-color":"var(--_container-shadow-color)"}))};} .container.disabled mdc-elevation {transition: none;${s(c("--mdc-elevation",{level:"var(--_disabled-container-elevation)"}))};} .container:focus-within mdc-elevation {${s(c("--mdc-elevation",{level:"var(--_focused-container-elevation)"}))};} .container:active mdc-elevation {${s(c("--mdc-elevation",{level:"var(--_pressed-container-elevation)"}))};} `,$=o` :host { display: inline-flex; outline: none; vertical-align: top; cursor: pointer; -webkit-tap-highlight-color: transparent; } .container { all: unset; position: absolute; inset: 0; box-sizing: border-box; cursor: pointer; display: flex; outline: none; place-content: center; place-items: center; position: relative; z-index: 0; text-overflow: ellipsis; text-wrap: nowrap; user-select: none; -webkit-tap-highlight-color: transparent; vertical-align: top; transition-property: border-radius; transition-duration: 350ms; transition-timing-function: cubic-bezier(0.42, 1.67, 0.21, 0.9); } :host([disabled]), .container.disabled { cursor: default; pointer-events: none; } /* Root Width & Height */ .container { &.extra-small { height: var(--_extra-small-container-height); min-width: calc(64px - var(--_extra-small-leading-space) - var(--_extra-small-trailing-space)); } &.small { height: var(--_small-container-height); min-width: calc(64px - var(--_small-leading-space) - var(--_small-trailing-space)); } &.medium { height: var(--_medium-container-height); min-width: calc(64px - var(--_medium-leading-space) - var(--_medium-trailing-space)); } &.large { height: var(--_large-container-height); min-width: calc(64px - var(--_large-leading-space) - var(--_large-trailing-space)); } &.extra-large { height: var(--_extra-large-container-height); min-width: calc(64px - var(--_extra-large-leading-space) - var(--_extra-large-trailing-space)); } } /* Button Size */ .container.extra-small { padding-inline-start: var(--_extra-small-leading-space); padding-inline-end: var(--_extra-small-trailing-space); gap: var(--_extra-small-between-icon-label-space); } .container.small{ padding-inline-start: var(--_small-leading-space); padding-inline-end: var(--_small-trailing-space); gap: var(--_small-between-icon-label-space); } .container.medium{ padding-inline-start: var(--_medium-leading-space); padding-inline-end: var(--_medium-trailing-space); gap: var(--_medium-between-icon-label-space); } .container.large{ padding-inline-start: var(--_large-leading-space); padding-inline-end: var(--_large-trailing-space); gap: var(--_large-between-icon-label-space); } .container.extra-large{ padding-inline-start: var(--_extra-large-leading-space); padding-inline-end: var(--_extra-large-trailing-space); gap: var(--_extra-large-between-icon-label-space); } .container:not(.has-label) .label { display: none; } /* Label Size */ .container.extra-small .label { font-family: var(--_extra-small-label-font); font-weight: var(--_extra-small-label-weight); line-height: var(--_extra-small-label-line-height); letter-spacing: var(--_extra-small-label-tracking); font-size: var(--_extra-small-label-size); } .container.small .label { font-family: var(--_small-label-font); font-weight: var(--_small-label-weight); line-height: var(--_small-label-line-height); letter-spacing: var(--_small-label-tracking); font-size: var(--_small-label-size); } .container.medium .label { font-family: var(--_medium-label-font); font-weight: var(--_medium-label-weight); line-height: var(--_medium-label-line-height); letter-spacing: var(--_medium-label-tracking); font-size: var(--_medium-label-size); } .container.large .label { font-family: var(--_large-label-font); font-weight: var(--_large-label-weight); line-height: var(--_large-label-line-height); letter-spacing: var(--_large-label-tracking); font-size: var(--_large-label-size); } .container.extra-large .label { font-family: var(--_extra-large-label-font); font-weight: var(--_extra-large-label-weight); line-height: var(--_extra-large-label-line-height); letter-spacing: var(--_extra-large-label-tracking); font-size: var(--_extra-large-label-size); } .toggle-input { all: unset; appearance: none; position: absolute; inset: 0; height: 100%; width: 100%; margin: 0; opacity: 0; outline: none; border: none; z-index: 1; cursor: inherit; top: 50%; left: 50%; transform: translate(-50%, -50%); } /* Label Color */ .container .label { overflow: hidden; color: var(--_label-color); } .container.disabled .label, .container.disabled.togglable:is(.selected, .unselected) .label { color: var(--_disabled-label-color); opacity: var(--_disabled-label-opacity); } .container:hover .label { color: var(--_hovered-label-color); } .container:focus-within .label { color: var(--_focused-label-color); } .container:active .label { color: var(--_pressed-label-color); } .container.togglable.selected .label { color: var(--_label-color-toggle-selected); } .container.togglable.selected:hover .label { color: var(--_hovered-label-color-toggle-selected); } .container.togglable.selected:focus-within .label { color: var(--_focused-label-color-toggle-selected); } .container.togglable.selected:active .label { color: var(--_pressed-label-color-toggle-selected); } .container.togglable.unselected .label { color: var(--_label-color-toggle-unselected); } .container.togglable.unselected:hover .label { color: var(--_hovered-label-color-toggle-unselected); } .container.togglable.unselected:focus-within .label { color: var(--_focused-label-color-toggle-unselected); } .container.togglable.unselected:active .label { color: var(--_pressed-label-color-toggle-unselected); } .container .background { border-radius: inherit; inset: 0; position: absolute; z-index: -1; } .container:not(.disabled) .background { background-color: var(--_container-color); } .container.togglable.selected:not(.disabled) .background { background-color: var(--_container-color-toggle-selected); } .container.togglable.unselected:not(.disabled) .background { background-color: var(--_container-color-toggle-unselected); } .container.disabled .background { background-color: var(--_disabled-container-color); opacity: var(--_disabled-container-opacity); } :is(.container .label, .label *) { text-overflow: inherit; } @media (forced-colors: active) { .background { border: 1px solid CanvasText; } :host:is([disabled], .disabled) { --_disabled-icon-color: GrayText; --_disabled-icon-opacity: 1; --_disabled-container-opacity: 1; --_disabled-label-color: GrayText; --_disabled-label-opacity: 1; } } .touch-target { position: absolute; top: 50%; left: 50%; height: 100%; transform: translate(-50%, -50%); z-index: 1; } [touch-target='wrapper'] { margin: max(0px, (48px - var(--_container-height)) / 2) 0; } [touch-target='none'] .touch-target { display: none; } `,w=o` .container :is(::slotted([slot="icon"]), .icon) { display: inline-flex; position: relative; writing-mode: horizontal-tb; fill: currentColor; flex-shrink: 0; color: var(--_icon-color); } .container:not(.has-icon) .icon { display: none; } .container:not(.disabled):hover :is(::slotted([slot="icon"]), .icon) { color: var(--_hovered-icon-color); } .container:not(.disabled):focus-within :is(::slotted([slot="icon"]), .icon) { color: var(--_focused-icon-color); } .container:not(.disabled):active :is(::slotted([slot="icon"]), .icon) { color: var(--_pressed-icon-color); } /* Selected */ .container:not(.disabled).togglable.selected :is(::slotted([slot="icon"]), .icon) { color: var(--_icon-color-toggle-selected); } .container:not(.disabled).togglable.selected:hover :is(::slotted([slot="icon"]), .icon) { color: var(--_hovered-icon-color-toggle-selected); } .container:not(.disabled).togglable.selected:focus-within :is(::slotted([slot="icon"]), .icon) { color: var(--_focused-icon-color-toggle-selected); } .container:not(.disabled).togglable.selected:active :is(::slotted([slot="icon"]), .icon) { color: var(--_pressed-icon-color-toggle-selected); } /* Unselected */ .container:not(.disabled).togglable.unselected :is(::slotted([slot="icon"]), .icon) { color: var(--_icon-color-toggle-unselected); } .container:not(.disabled).togglable.unselected:hover :is(::slotted([slot="icon"]), .icon) { color: var(--_hovered-icon-color-toggle-unselected); } .container:not(.disabled).togglable.unselected:focus-within :is(::slotted([slot="icon"]), .icon) { color: var(--_focused-icon-color-toggle-unselected); } .container:not(.disabled).togglable.unselected:active :is(::slotted([slot="icon"]), .icon) { color: var(--_pressed-icon-color-toggle-unselected); } /* Icon Size */ .container.extra-small :is(::slotted([slot="icon"]), .icon) { font-size: var(--_extra-small-icon-size); inline-size: var(--_extra-small-icon-size); block-size: var(--_extra-small-icon-size); } .container.small :is(::slotted([slot="icon"]), .icon) { font-size: var(--_small-icon-size); inline-size: var(--_small-icon-size); block-size: var(--_small-icon-size); } .container.medium :is(::slotted([slot="icon"]), .icon) { font-size: var(--_medium-icon-size); inline-size: var(--_medium-icon-size); block-size: var(--_medium-icon-size); } .container.large :is(::slotted([slot="icon"]), .icon) { font-size: var(--_large-icon-size); inline-size: var(--_large-icon-size); block-size: var(--_large-icon-size); } .container.extra-large :is(::slotted([slot="icon"]), .icon) { font-size: var(--_extra-large-icon-size); inline-size: var(--_extra-large-icon-size); block-size: var(--_extra-large-icon-size); } /* Disabled */ .container.disabled :is(::slotted([slot="icon"]), .icon) { color: var(--_disabled-icon-color); opacity: var(--_disabled-icon-opacity); } `,y=o` .container.extra-small .outline { border-width: var(--_extra-small-outline-width); } .container.small .outline { border-width: var(--_small-outline-width); } .container.medium .outline { border-width: var(--_medium-outline-width); } .container.large .outline { border-width: var(--_large-outline-width); } .container.extra-large .outline { border-width: var(--_extra-large-outline-width); } .outline { inset: 0; border-style: solid; position: absolute; box-sizing: border-box; border-color: var(--_outline-color); border-start-start-radius: inherit; border-start-end-radius: inherit; border-end-start-radius: inherit; border-end-end-radius: inherit; z-index: -1; } .container.togglable.selected .outline { border-color: var(--_outline-color-toggle-selected); } .container.togglable.unselected .outline { border-color: var(--_outline-color-toggle-unselected); } .container.disabled .outline { border-color: var(--_disabled-outline-color); opacity: var(--_disabled-outline-opacity); } .container.disabled.togglable.selected .outline { border-color: var(--_disabled-outline-color-toggle-selected); } .container.disabled.togglable.unselected .outline { border-color: var(--_disabled-outline-color-toggle-unselected); } .container:hover .outline { border-color: var(--_hovered-outline-color); } .container.togglable.selected:hover .outline { border-color: var(--_hovered-outline-color-toggle-selected); } .container.togglable.unselected:hover .outline { border-color: var(--_hovered-outline-color-toggle-unselected); } .container:focus-within .outline { border-color: var(--_focused-outline-color); } .container.togglable.selected:focus-within .outline { border-color: var(--_focused-outline-color-toggle-selected); } .container.togglable.unselected:focus-within .outline { border-color: var(--_focused-outline-color-toggle-unselected); } .container:active .outline { border-color: var(--_pressed-outline-color); } .container.togglable.selected:active .outline { border-color: var(--_pressed-outline-color-toggle-selected); } .container.togglable.unselected:active .outline { border-color: var(--_pressed-outline-color-toggle-unselected); } @media (forced-colors: active) { .container.disabled .background { border-color: GrayText; } .container.disabled .outline { opacity: 1; } } `,k=o` :host([variant="elevated"]) {${g};} :host([variant="filled"]) {${b};} :host([variant="filled-tonal"]) {${m};} :host([variant="outlined"]) {${p};} :host([variant="text"]) {${f};} `,j=[(()=>{const l=(o,l)=>e(`\n border-start-start-radius: min(var(--_${o}-${l}-start-start), calc(var(--_${o}-container-height) / 2));\n border-start-end-radius: min(var(--_${o}-${l}-start-end), calc(var(--_${o}-container-height) / 2));\n border-end-start-radius: min(var(--_${o}-${l}-end-start), calc(var(--_${o}-container-height) / 2));\n border-end-end-radius: min(var(--_${o}-${l}-end-end), calc(var(--_${o}-container-height) / 2));\n `),a=e=>o` &.extra-small { ${l("extra-small",e)}; } &.small { ${l("small",e)}; } &.medium { ${l("medium",e)}; } &.large { ${l("large",e)}; } &.extra-large { ${l("extra-large",e)}; } `;return o` .container.round {${a("container-shape-round")};} .container.square {${a("container-shape-square")};} .container.round.togglable.selected {${a("container-shape-round-toggle-selected")};} .container.square.togglable.selected {${a("container-shape-square-toggle-selected")};} .container:not(.disable-morph, .togglable):is(.round, .square):active, .container:not(.disable-morph).togglable:is(.selected, .unselected):has(.toggle-input:active) {${a("container-shape-pressed-morph")};} `})(),(()=>{const l=(e,o)=>s(c("--mdc-focus-ring",{"shape-start-start":`min(var(--_${e}-${o}-start-start), calc(var(--_${e}-container-height) / 2))`,"shape-start-end":`min(var(--_${e}-${o}-start-end), calc(var(--_${e}-container-height) / 2))`,"shape-end-end":`min(var(--_${e}-${o}-end-end), calc(var(--_${e}-container-height) / 2))`,"shape-end-start":`min(var(--_${e}-${o}-end-start), calc(var(--_${e}-container-height) / 2))`})),a=o=>e(`\n &.extra-small mdc-focus-ring {${l("extra-small",o)};}\n &.small mdc-focus-ring {${l("small",o)};}\n &.medium mdc-focus-ring {${l("medium",o)};}\n &.large mdc-focus-ring {${l("large",o)};}\n &.extra-large mdc-focus-ring {${l("extra-large",o)};}\n `);return o` .container.round {${a("container-shape-round")};} .container.square {${a("container-shape-square")};} .container.togglable.selected.round {${a("container-shape-round-toggle-selected")};} .container.togglable.selected.square {${a("container-shape-square-toggle-selected")};} .container:not(.disable-morph, .togglable):is(.round, .square):active, .container:not(.disable-morph).togglable:is(.selected, .unselected):has(.toggle-input:active) {${a("container-shape-pressed-morph")};} `})(),o` .container.extra-small :is(::slotted([slot="icon"]), .icon) {${s(c("--mdc-icon",{size:"var(--_extra-small-icon-size)"}))};} .container.small :is(::slotted([slot="icon"]), .icon) {${s(c("--mdc-icon",{size:"var(--_small-icon-size)"}))};} .container.medium :is(::slotted([slot="icon"]), .icon) {${s(c("--mdc-icon",{size:"var(--_medium-icon-size)"}))};} .container.large :is(::slotted([slot="icon"]), .icon) {${s(c("--mdc-icon",{size:"var(--_large-icon-size)"}))};} .container.extra-large :is(::slotted([slot="icon"]), .icon) {${s(c("--mdc-icon",{size:"var(--_extra-large-icon-size)"}))};} `,x,z,$,w,y,k];export{j as buttonStyles};