forked from tsai/budibase
2 changed files with 68 additions and 0 deletions
@ -0,0 +1,64 @@ |
|||||
|
export const gradient = (node, config = {}) => { |
||||
|
const defaultConfig = { |
||||
|
points: 10, |
||||
|
saturation: 0.8, |
||||
|
lightness: 0.75, |
||||
|
softness: 0.8, |
||||
|
} |
||||
|
|
||||
|
// Applies a gradient background
|
||||
|
const createGradient = config => { |
||||
|
config = { |
||||
|
...defaultConfig, |
||||
|
...config, |
||||
|
} |
||||
|
const { saturation, lightness, softness, points } = config |
||||
|
|
||||
|
// Generates a random number between min and max
|
||||
|
const rand = (min, max) => { |
||||
|
return Math.round(min + Math.random() * (max - min)) |
||||
|
} |
||||
|
|
||||
|
// Generates a random HSL colour using the options specified
|
||||
|
const randomHSL = () => { |
||||
|
const lowerSaturation = Math.min(100, saturation * 100) |
||||
|
const upperSaturation = Math.min(100, (saturation + 0.2) * 100) |
||||
|
const lowerLightness = Math.min(100, lightness * 100) |
||||
|
const upperLightness = Math.min(100, (lightness + 0.2) * 100) |
||||
|
const hue = rand(0, 360) |
||||
|
const sat = `${rand(lowerSaturation, upperSaturation)}%` |
||||
|
const light = `${rand(lowerLightness, upperLightness)}%` |
||||
|
return `hsl(${hue},${sat},${light})` |
||||
|
} |
||||
|
|
||||
|
// Generates a radial gradient stop point
|
||||
|
const randomGradientPoint = () => { |
||||
|
const lowerTransparency = Math.min(100, softness * 100) |
||||
|
const upperTransparency = Math.min(100, (softness + 0.2) * 100) |
||||
|
const transparency = rand(lowerTransparency, upperTransparency) |
||||
|
return ( |
||||
|
`radial-gradient(` + |
||||
|
`at ${rand(10, 90)}% ${rand(10, 90)}%,` + |
||||
|
`${randomHSL()} 0,` + |
||||
|
`transparent ${transparency}%)` |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
let css = `opacity:0.9;background-color:${randomHSL()};background-image:` |
||||
|
for (let i = 0; i < points - 1; i++) { |
||||
|
css += `${randomGradientPoint()},` |
||||
|
} |
||||
|
css += `${randomGradientPoint()};` |
||||
|
node.style = css |
||||
|
} |
||||
|
|
||||
|
// Apply the initial gradient
|
||||
|
createGradient(config) |
||||
|
|
||||
|
return { |
||||
|
// Apply a new gradient
|
||||
|
update: config => { |
||||
|
createGradient(config) |
||||
|
}, |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue