ui-lit
Version:
UI Elements on LIT
186 lines (178 loc) • 4.96 kB
JavaScript
import { css } from 'lit';
import { makeCSSProxy, makeCSSNameProxy } from '../helpers/cssproxy';
const defaultFilled = "hsl(264, 100%, 60%)";
export const RangeCSSVars = {
size: {
name: "thumb-size",
default: "16px"
},
outlineFocus: {
name: "outline-focus",
default: "1px dashed rgba(0,0,0,0.5)"
},
trackBackground: {
name: "track-background",
default: "#eee"
},
trackBackgroundHover: {
name: "track-background-hover",
default: "#ddd"
},
trackOutline: {
name: "track-outline",
default: "1px solid #999"
},
thumbBackground: {
name: "thumb-background",
default: "hsl(264, 10%, 40%)"
},
thumbBackgroundHover: {
name: "thumb-background-hover",
default: "hsl(264, 10%, 20%)"
},
thumbBackgroundPressed: {
name: "thumb-background-pressed",
default: defaultFilled
},
thumbOutline: {
name: "thumb-outline",
default: "2px solid hsl(264, 100%, 99%)"
},
thumbOutlineFullfiled: {
name: "thumb-fillfiled-outline",
default: "var(thumb-outline, 2px solid hsl(264, 100%, 99%))"
},
thumbShadow: {
name: "thumb-shadow",
default: "0 1px 3px hsl(264, 100%, 20%)"
},
pointBackground: {
name: "points-background",
default: "#bbb"
},
filled: {
name: "filled",
default: defaultFilled
},
filledHover: {
name: "filled-hover",
default: "hsl(264, 100%, 50%)"
},
};
const _v = makeCSSProxy(RangeCSSVars, "--lit-range-");
export const rangeCSSNames = makeCSSNameProxy(RangeCSSVars, "--lit-range-");
export const rangeStyles = css `
:host{
display: inline-block;
--size: ${_v.size};
--pointer: 8px;
--pointer-border: 2px;
--poiner-width: calc(var(--pointer) + var(--pointer-border));
--line-height: 4px;
--to-middle: calc((var(--size) - var(--pointer)) / 2);
--top-margin: 8px;
--padding: 12px;
--default-filled: hsl(264, 100%, 60%);
--percent: 0;
--thumb-border-size: 2;
padding: 1px;
box-sizing: border-box;
contain: content;
}
:host([showPercent]) .wrapper{
padding-bottom: 17px;
}
.wrapper:focus{
outline: ${_v.outlineFocus};
}
.wrapper{
min-width: 100px;
position: relative;
box-sizing: border-box;
padding: 5px var(--padding);
box-sizing: border-box;
}
.percent{
opacity: 1;
text-align: center;
left: 0;
position: absolute;
text-align: center;
transform-origin: center;
font-size: 12px;
will-change: transform;
bottom: 0;
left: calc(var(--size) / 2 * -1 + 4px);
}
.percent.hidden{
opacity: 0;
}
.track{
display: flex;
position: relative;
width: 100%;
border-radius: 5px;
box-sizing: border-box;
position: relative;
cursor: pointer;
}
:host([hover]) .track-line{
background: linear-gradient(to right, ${_v.filledHover} var(--percent), ${_v.trackBackgroundHover} var(--percent));
}
.track-line{
width: 100%;
height: var(--line-height);
margin: var(--top-margin) auto;
border-radius: 5px;
outline: ${_v.trackOutline};
background: linear-gradient(to right, ${_v.filled} var(--percent), ${_v.trackBackground} var(--percent));
}
.thumb-wrapper{
position: absolute;
z-index: 3;
left: calc(var(--size) / 2 * -1);
top: calc(var(--top-margin) - var(--size) / 2 + var(--line-height) / 2 - var(--thumb-border-size));
width: var(--size, 14px);
height: var(--size, 14px);
}
.thumb.fullfiled{
background-color: ${_v.filled};
border: ${_v.thumbOutlineFullfiled};
}
:host([hover]) .thumb{
background-color: ${_v.thumbBackgroundHover};
}
:host([pressed]) .thumb{
background-color: ${_v.thumbBackgroundPressed};
}
.thumb{
border-radius: 100%;
width: 100%;
height: 100%;
background-color: ${_v.thumbBackground};
border: ${_v.thumbOutline};
box-shadow: ${_v.thumbShadow};
}
.point{
position: absolute;
top: calc(var(--top-margin) - var(--pointer) / 2 + var(--line-height) / 2 - var(--pointer-border));
width: var(--pointer);
height: var(--pointer);
border-radius: var(--pointer);
background-color: ${_v.pointBackground};
border: var(--pointer-border) solid ${_v.trackBackground};
transform: translate(-50%, 0);
z-index: 1;
}
.point.filled{
border: var(--pointer-border) solid ${_v.filled};
background-color: ${_v.filled};
}
:host([hover]) .point.filled{
border: var(--pointer-border) solid ${_v.filledHover};
background-color: ${_v.filledHover};
}
:host([hover]) .point:not(.filled){
border: var(--pointer-border) solid ${_v.trackBackgroundHover};
}
`;