import { getGradientFirstParam } from '.';
import React from 'react';
import styled from 'styled-components';
import { breakpoints } from '~/components/layout';
import { ColorType, useInputStore } from '~/components/store';
export const symbols = /[\r\n%#()<>?[\\\]^`{|}]/g;
export const rgbToString = ({ r, g, b, a }: ColorType) => `rgba(${r},${g},${b},${a})`;
const Output: React.FC = () => {
const [svgProps, cssProps, filterProps] = useInputStore((state) => [
state.svgProps,
state.cssProps,
state.filterProps,
]);
const { size, baseFrequency, numOctaves } = svgProps;
const { gradients, showTransparency } = cssProps;
const { brightness, contrast, invert } = filterProps;
const svgString = `
`;
const gradientsString = gradients
.filter((grad) => grad.isVisible)
.map(
(grad) =>
`${grad.type}-gradient(${getGradientFirstParam(grad)}, ${rgbToString(
grad.stops[0].color
)}, ${rgbToString(grad.stops[1].color)})`
);
const gradientCss = `/* css gradient: second layer */
{
width: 250px;
height: 250px;
background: ${gradientsString.join(', ')} ${showTransparency ? ', url(/checkers.png)' : ''};
/* filter: contrast(${contrast}%) brightness(${brightness}%)${invert ? ' invert(100%)' : ''}; */
}`;
const liveCss = `
width: 250px;
height: 250px;
background: ${gradientsString.join(', ')}, url("data:image/svg+xml,${svgString.replace(
symbols,
encodeURIComponent
)}");
filter: contrast(${contrast}%) brightness(${brightness}%)${invert ? ' invert(100%)' : ''};
`;
return (
);
};
export default Output;
// hacking it for essentially flex-direction: column; which does not work
const Container = styled.div`
height: 100vh;
display: flex;
overflow-y: scroll;
flex-wrap: wrap;
flex-direction: row;
justify-content: center;
align-items: center;
@media screen and (max-width: ${breakpoints.md - 1}px) {
background-color: #fff;
position: fixed;
bottom: 0;
height: 280px;
overflow-x: scroll;
flex-wrap: nowrap;
justify-content: flex-start;
width: 100vw;
border-top: 2px solid #333;
}
`;
type NoiseProps = {
size: number;
code: string;
};
// prettier-ignore
const Noise = styled.div`
width: ${(p) => p.size}px;
height: ${(p) => p.size}px;
background: url("data:image/svg+xml,${(p) => p.code.replace(symbols, encodeURIComponent)}");
box-shadow: rgb(50 50 93 / 23%) 0px 30px 60px -15px, rgb(0 0 0 / 32%) 0px 18px 36px -18px;
`;
type GradientProps = {
css: string;
};
const Gradient = styled.div`
${(p) => p.css}
box-shadow: rgb(50 50 93 / 23%) 0px 30px 60px -15px, rgb(0 0 0 / 32%) 0px 18px 36px -18px;
`;
const OutputSection = styled.div`
position: relative;
display: flex;
justify-content: center;
width: calc(100vw * 2 / 3);
margin: 10px;
@media screen and (max-width: ${breakpoints.md - 1}px) {
width: auto;
}
`;
// have to create a new layer, or the filter affects box-shadow
const FilterShadow = styled.div`
position: absolute;
top: 0;
width: 250px;
height: 250px;
box-shadow: rgb(50 50 93 / 23%) 0px 30px 60px -15px, rgb(0 0 0 / 32%) 0px 18px 36px -18px;
`;
type FilterProps = {
css: string;
};
const Filter = styled.div`
${(p) => p.css}
`;