@fluid-topics/ft-button
Version:
A generic Fluid Topics tag
174 lines (149 loc) • 7.73 kB
JavaScript
import { css, } from "lit";
import { designSystemVariables, FtCssVariableFactory, noTextSelect, setVariable } from "@fluid-topics/ft-wc-utils";
import { FtRippleCssVariables } from "@fluid-topics/ft-ripple/build/ft-ripple.styles";
import { FtTypographyButtonCssVariables } from "@fluid-topics/ft-typography/build/ft-typography.styles";
import { FtLoaderCssVariables } from "@fluid-topics/ft-loader/build/ft-loader.styles";
import { FtIconCssVariables } from "@fluid-topics/ft-icon/build/ft-icon.styles";
const buttonColor = FtCssVariableFactory.extend("--ft-button-color", "", designSystemVariables.colorPrimary);
export const FtButtonCssVariables = {
backgroundColor: FtCssVariableFactory.extend("--ft-button-background-color", "", designSystemVariables.colorSurface),
borderRadius: FtCssVariableFactory.extend("--ft-button-border-radius", "", designSystemVariables.borderRadiusL),
color: buttonColor,
fontSize: FtCssVariableFactory.extend("--ft-button-font-size", "", FtTypographyButtonCssVariables.fontSize),
iconSize: FtCssVariableFactory.create("--ft-button-icon-size", "", "SIZE", "24px"),
rippleColor: FtCssVariableFactory.extend("--ft-button-ripple-color", "", buttonColor),
verticalPadding: FtCssVariableFactory.create("--ft-button-vertical-padding", "", "SIZE", "6px"),
horizontalPadding: FtCssVariableFactory.create("--ft-button-horizontal-padding", "", "SIZE", "8px"),
iconPadding: FtCssVariableFactory.create("--ft-button-icon-padding", "", "SIZE", "8px"),
opacityDisabled: FtCssVariableFactory.external(designSystemVariables.colorOpacityDisabled, "Design system")
};
const buttonPrimaryColor = FtCssVariableFactory.extend("--ft-button-primary-color", "", FtCssVariableFactory.extend("--ft-button-color", "", designSystemVariables.colorOnPrimary));
export const FtButtonPrimaryCssVariables = {
backgroundColor: FtCssVariableFactory.extend("--ft-button-primary-background-color", "", FtCssVariableFactory.extend("--ft-button-background-color", "", designSystemVariables.colorPrimary)),
color: buttonPrimaryColor,
rippleColor: FtCssVariableFactory.extend("--ft-button-primary-ripple-color", "", buttonPrimaryColor),
};
export const FtButtonDenseCssVariables = {
borderRadius: FtCssVariableFactory.extend("--ft-button-dense-border-radius", "", FtCssVariableFactory.extend("--ft-button-border-radius", "", designSystemVariables.borderRadiusM)),
verticalPadding: FtCssVariableFactory.create("--ft-button-dense-vertical-padding", "", "SIZE", "2px"),
horizontalPadding: FtCssVariableFactory.create("--ft-button-dense-horizontal-padding", "", "SIZE", "4px"),
iconPadding: FtCssVariableFactory.create("--ft-button-dense-icon-padding", "", "SIZE", "4px"),
};
//language=css
export const classicStyles = [
css `
:host {
display: inline-block;
max-width: 100%;
pointer-events: none;
}
.ft-button {
box-shadow: 0px 0px 0px transparent;
border: 0px solid transparent;
text-shadow: 0px 0px 0px transparent;
font-size: ${FtButtonCssVariables.fontSize};
text-decoration: none;
}
.ft-button:hover {
box-shadow: 0px 0px 0px transparent;
border: 0px solid transparent;
text-shadow: 0px 0px 0px transparent;
}
.ft-button:active {
outline: none;
border: none;
}
.ft-button:focus {
outline: 0;
}
.ft-button {
position: relative;
display: flex;
justify-content: center;
align-items: center;
width: 100%;
overflow: hidden;
box-sizing: border-box;
border: none;
pointer-events: auto;
--ft-button-internal-line-height: max(calc(${FtButtonCssVariables.fontSize} + 2px), ${FtButtonCssVariables.iconSize});
--ft-button-internal-color: ${FtButtonCssVariables.color};
${setVariable(FtIconCssVariables.size, FtButtonCssVariables.iconSize)};
${setVariable(FtRippleCssVariables.color, FtButtonCssVariables.rippleColor)};
border-radius: ${FtButtonCssVariables.borderRadius};
padding: ${FtButtonCssVariables.verticalPadding} ${FtButtonCssVariables.horizontalPadding};
background-color: ${FtButtonCssVariables.backgroundColor};
color: var(--ft-button-internal-color);
-webkit-mask-image: radial-gradient(white, black);
}
.ft-button.ft-button--outlined {
border: 1px solid var(--ft-button-internal-color);
padding: calc(${FtButtonCssVariables.verticalPadding} - 1px) calc(${FtButtonCssVariables.horizontalPadding} - 1px);
}
.ft-button.ft-button--dense {
padding: ${FtButtonDenseCssVariables.verticalPadding} ${FtButtonDenseCssVariables.horizontalPadding};
border-radius: ${FtButtonDenseCssVariables.borderRadius};
gap: ${FtButtonDenseCssVariables.iconPadding};
}
.ft-button.ft-button--dense.ft-button--outlined {
padding: calc(${FtButtonDenseCssVariables.verticalPadding} - 1px) calc(${FtButtonDenseCssVariables.horizontalPadding} - 1px);
}
.ft-button:not([disabled]):hover {
cursor: pointer;
}
.ft-button--round {
border-radius: calc(var(--ft-button-internal-line-height) / 2 + ${FtButtonCssVariables.verticalPadding});
}
.ft-button--round.ft-button--dense {
border-radius: calc(var(--ft-button-internal-line-height) / 2 + ${FtButtonDenseCssVariables.verticalPadding});
}
.ft-button[disabled] {
filter: grayscale(1);
opacity: ${FtButtonCssVariables.opacityDisabled};
}
.ft-button.ft-button--primary {
background-color: ${FtButtonPrimaryCssVariables.backgroundColor};
--ft-button-internal-color: ${FtButtonPrimaryCssVariables.color};
${setVariable(FtRippleCssVariables.color, FtButtonPrimaryCssVariables.rippleColor)};
}
.ft-button:focus {
outline: none;
}
.ft-button--label {
position: relative;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
display: block;
margin: 0 ${FtButtonCssVariables.iconPadding};
${setVariable(FtTypographyButtonCssVariables.fontSize, "1em")};
${setVariable(FtTypographyButtonCssVariables.lineHeight, "var(--ft-button-internal-line-height)")};
}
.ft-button--dense .ft-button--label {
margin: 0 ${FtButtonDenseCssVariables.iconPadding};
}
.ft-button--label[hidden] {
display: none;
}
[part="icon"] {
flex-shrink: 0;
position: relative;
}
.ft-button--label[hidden] + [part="icon"] {
margin: 0 calc(${FtButtonCssVariables.horizontalPadding} * -1);
padding: 0 ${FtButtonCssVariables.verticalPadding};
}
.ft-button--dense .ft-button--label[hidden] + [part="icon"] {
margin: 0 calc(${FtButtonDenseCssVariables.horizontalPadding} * -1);
padding: 0 ${FtButtonDenseCssVariables.verticalPadding};
}
.ft-button:not(.ft-button--trailing-icon) [part="label"]{
order: 2;
}
ft-loader {
${setVariable(FtLoaderCssVariables.size, FtButtonCssVariables.iconSize)};
${setVariable(FtLoaderCssVariables.color, "var(--ft-button-internal-color)")};
}
`,
noTextSelect
];