rybitten
Version:
A color space conversion library for transforming between RGB and RYB colors.
734 lines (627 loc) • 12.2 kB
CSS
:root {
--white: #fff;
--black: #000;
background: var(--white);
color: var(--black);
font-size: calc(0.65em + 1vmin);
--size-illu: calc(10 * 1.6em);
}
body,
html,
:root {
margin: 0;
padding: 0;
font-family: "Apple Garamond Light", sans-serif;
-webkit-font-smoothing: subpixel-antialiased;
/*font-family: 'Lustria', serif;*/
}
::selection {
background: var(--yellow);
color: color-mix(in lab, var(--black) 50%, var(--yellow));
}
a:link {
color: var(--blue);
}
a:hover {
text-decoration: none;
}
a:visited {
color: var(--pink);
}
.nav {
position: fixed;
width: 20vw;
top: 0;
bottom: 0;
right: 0;
box-shadow: 0 0 0 0.15em var(--white);
z-index: 10;
background: var(--white);
padding-left: 5vw;
transform: translateX(20vw);
transition: 200ms transform cubic-bezier(0.3, 0.7, 0, 1);
ul,
li {
list-style: none;
padding: 0;
margin: 0;
}
ul {
box-shadow: inset 0 0 0 0.05em var(--black);
flex: 0 0 calc(100vh - 20vw);
overflow-y: auto;
}
li + li {
border-top: 0.05em solid var(--black);
}
input {
display: none;
}
label {
display: flex;
cursor: pointer;
padding: 0.25rem;
font-size: 0.8em;
div {
margin-left: 0.5em;
}
}
label:has(input:checked) {
background: var(--black);
color: var(--white);
}
strong {
display: block;
border-top: 0.05em solid var(--black);
}
h3 {
margin: 0;
span {
position: relative;
display: inline-block;
top: -0.25em;
font-size: 0.6em;
}
}
}
.nav:hover {
transform: translateX(0);
}
.nav__inner {
display: flex;
flex-direction: column;
}
.navcube {
height: 25vw;
flex: 0 0 25vw;
background: var(--white);
}
.nav::before {
content: "";
position: absolute;
top: 0;
left: 0;
bottom: 0;
width: 5vw;
background: linear-gradient(0deg, var(--gradient)),
linear-gradient(0deg, var(--gradientHard));
background-size:
calc(1px + 50%) 100%,
50% 100%;
background-repeat: no-repeat;
background-position:
0 0,
100% 0;
}
.main {
position: relative;
}
.block {
display: flex;
gap: 4rem;
padding: 6vmin 6rem;
}
.block--vertical {
flex-direction: column;
gap: 0rem;
.block__text p {
max-width: 70ch;
}
}
.block__text {
font-size: 0.8em;
line-height: 1.4;
h1,
h2 {
margin-left: -0.1ex;
}
h1 + p,
h2 + p {
margin-top: 1.5em;
}
p {
max-width: 50ch;
}
}
.intro {
flex-direction: column;
width: max-content;
margin-top: 20vmin;
margin-left: calc(var(--size-illu) + 4em);
align-items: center;
p {
max-width: 35ch;
}
}
.intro-text {
font-size: 0.8em;
line-height: 1.4;
h1 + p {
margin-top: 0;
max-width: 35ch;
}
}
h1,
h2,
h3 {
font-family: "Apple Garamond Light", sans-serif;
font-weight: 100;
line-height: 1;
}
h1 {
font-size: 5rem;
margin: 0;
margin-bottom: 0.25ex;
}
h2 {
font-size: 2.5rem;
margin: 0.5em 0 0;
margin-bottom: 0.25ex;
}
/* itten color wheel */
.c {
position: relative;
width: var(--size-illu);
flex: 0 0 var(--size-illu);
aspect-ratio: 1;
background: conic-gradient(
from calc(360deg / 48 / -2) at 50% 50%,
var(--stops-48)
);
border-radius: 50%;
box-shadow: 0 0 0 0.15em var(--white);
}
.c::before {
content: "";
position: absolute;
background: var(--white);
inset: -0.2em;
border-radius: 50%;
transition: 400ms transform cubic-bezier(0.3, 0.7, 0, 1);
transform: scale(1);
}
.c:hover::before {
transform: scale(0.76);
}
.c .c {
margin-left: 0;
position: absolute;
inset: 1.5em;
width: auto;
background: conic-gradient(
from calc(360deg / 24 / -2) at 50% 50%,
var(--stops-24)
);
}
.c .c .c {
background: conic-gradient(
from calc(360deg / 12 / -2) at 50% 50%,
var(--stops-12)
);
}
.c .c .c::before {
display: none;
content: "";
position: absolute;
background: var(--w);
inset: 1.5em;
border-radius: 50%;
}
.c .c .c .c {
background: conic-gradient(var(--stops-6));
}
.c .c .c .c::before {
display: none;
}
.c .c .c .c .c {
background: conic-gradient(
from calc(360deg / 3 / -2) at 50% 50%,
var(--stops-3)
);
-webkit-clip-path: polygon(50% 0%, 6% 75%, 94% 75%);
clip-path: polygon(50% 0%, 6% 75%, 94% 75%);
inset: 0;
}
/* color cube */
.edges {
--w: calc(var(--size-illu) - 4em);
--padding-top: 3%;
--padding-left: 33%;
--padding-right: 7%;
--height: 60%;
--width: 60%;
--padding-top-front: 30%;
--padding-left-front: 6%;
margin: 2em;
position: relative;
width: var(--w);
height: var(--w);
flex: 0 0 var(--w);
input {
appearance: none;
padding: 0;
border: 0;
opacity: 0;
cursor: pointer;
}
span {
display: block;
background: var(--c);
background: var(--white);
width: 0.5rem;
height: 0.5rem;
border-radius: 50%;
box-shadow:
0 0 0 0.05em var(--black),
0 0 0 0.1em var(--white),
0 0 0 0.2em var(--c),
0 0 0 0.3em var(--white);
transition:
300ms box-shadow cubic-bezier(0.3, 0.7, 0, 1) 150ms,
200ms background linear;
}
}
.edges label {
position: absolute;
transform: translate(-50%, -50%);
cursor: pointer;
}
.edges label:hover span {
background: var(--c);
box-shadow:
0 0 0 0.1em var(--black),
0 0 0 0.1em var(--white),
0 0 0 0.2em var(--white),
0 0 0 0.3em var(--c);
}
.edges b {
position: absolute;
left: 100%;
top: 50%;
transform: translate(0.2rem, 0.2rem);
line-height: 1;
font-size: 0.8em;
}
.edges .g {
left: var(--padding-left);
top: var(--padding-top);
}
.edges .b {
left: var(--padding-left);
top: calc(var(--padding-top) + var(--height));
}
.edges .v {
left: calc(var(--padding-left) + var(--width));
top: calc(var(--padding-top) + var(--height));
}
.edges .black {
left: calc(var(--padding-left) + var(--width));
top: var(--padding-top);
}
.edges .y {
left: var(--padding-left-front);
top: var(--padding-top-front);
}
.edges .w {
left: var(--padding-left-front);
top: calc(var(--padding-top-front) + var(--height));
}
.edges .r {
left: calc(var(--padding-left-front) + var(--width));
top: calc(var(--padding-top-front) + var(--height));
}
.edges .o {
left: calc(var(--padding-left-front) + var(--width));
top: var(--padding-top-front);
}
.cube {
display: block;
}
.cube g {
stroke: currentColor;
stroke-width: 0.5;
fill: none;
}
.cube__front {
fill: var(--white);
}
.cube__coverline {
fill: none;
stroke: var(--black);
stroke-dasharray: 1.5 1.5;
}
.gradient {
position: relative;
width: var(--size-illu);
flex: 0 0 var(--size-illu);
height: calc(var(--size-illu) / 2);
background-image: var(--g);
background-size: 100% calc(100% / var(--gs) + 1px);
background-position: var(--gp);
background-repeat: no-repeat;
}
.hsl-wheel {
--w: calc(var(--size-illu) - 2em);
margin-top: 2em;
margin-bottom: 2em;
margin-right: 2em;
position: relative;
width: var(--w);
height: var(--w);
flex: 0 0 var(--w);
}
.hsl-wheel::before {
content: "";
position: absolute;
inset: 0.37em;
border-radius: 50%;
box-shadow: inset 0 0 0 0.03em var(--black);
}
.hsl-wheel__rim {
position: absolute;
inset: 0;
border-radius: 50%;
transform: scale(calc(0.2 + var(--i) * 0.6));
}
.hsl-wheel__rim--0 {
background: conic-gradient(var(--gradient-l0));
}
.hsl-wheel__rim--0::before {
content: "";
position: absolute;
inset: 0;
background: var(--white);
border-radius: 50%;
transform: scale(0.5);
}
.hsl-wheel__rim--1 {
background: conic-gradient(var(--gradient-l1));
}
.hsl-wheel__rim--2 {
background: conic-gradient(var(--gradient-l2));
}
.hsl-wheel__rim--3 {
background: conic-gradient(var(--gradient-l3));
}
.hsl-wheel__rim--4 {
background: conic-gradient(var(--gradient-l4));
}
.hsl-wheel__rim--5 {
background: conic-gradient(var(--gradient-l5));
}
.hsl-wheel__rim--6 {
background: conic-gradient(var(--gradient-l6));
}
.hsl-wheel__rim--7 {
background: conic-gradient(var(--gradient-l7));
}
.hsl-wheel__rim--8 {
background: conic-gradient(var(--gradient-l8));
}
.hsl-wheel__rim--9 {
background: conic-gradient(var(--gradient-l9));
}
.hsl-wheel__label {
position: absolute;
width: 100%;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) rotate(calc(var(--i) * 360deg - 90deg));
font-size: 0.6em;
line-height: 1;
}
.hsl-wheel__label b {
position: absolute;
left: 100%;
top: 50%;
transform: translateY(-50%) translateX(1em);
font-style: normal;
}
.hsl-wheel__label b::after {
content: "";
position: absolute;
height: 1px;
width: 0.5em;
background: var(--black);
top: 50%;
right: 100%;
transform: translateX(-0.5em);
display: none;
}
.hsl-wheel__label b::before {
content: "";
position: absolute;
width: 0.8em;
height: 0.8em;
background: var(--c);
border-radius: 50%;
top: 50%;
right: 100%;
transform: translateX(-1.25em) translateY(-50%);
box-shadow:
0 0 0 0.05em var(--c),
0 0 0 0.2em var(--white),
inset 0 0 0 0.1em var(--white);
}
.ramp-list {
display: flex;
gap: 10%;
flex-wrap: wrap;
max-width: 40rem;
}
.ramp {
flex: 0 0 calc(25% - 10%);
}
.ramp__step {
position: relative;
transform: rotate(calc(var(--rnd) * 5deg))
translateX(calc(var(--rnd) * 0.5em));
height: calc(0.5rem + var(--rnd2) * 1.5rem);
transition: 400ms height cubic-bezier(0.3, 0.7, 0, 1) 100ms;
}
.ramp__step + .ramp__step {
margin-top: -0.25em;
}
.ramp__inner {
position: absolute;
height: min(100%, 6.5rem);
width: 100%;
background: var(--c);
box-shadow: 0 0 0 0.05em var(--white);
overflow: hidden;
transform: rotate(0) scale(0.8);
transition: 400ms transform cubic-bezier(0.3, 0.7, 0, 1) 350ms;
}
.ramp__label {
position: absolute;
top: 6.5rem;
left: 1px;
right: 1px;
transform: translateY(0);
font-size: 0.6em;
background: var(--white);
padding: 0.25em 0.5em;
transition: 200ms transform ease-out 400ms;
span {
display: block;
}
span + span {
opacity: 0;
transition: 200ms opacity ease-out 600ms;
}
}
.ramp__step--active,
.ramp__step:hover {
height: 7rem;
.ramp__label {
transform: translateY(calc(-100% - 1px));
span {
opacity: 1;
}
}
.ramp__inner {
transform: rotate(calc(var(--rnd) * -5deg)) scale(1);
}
}
.ramp:has(:hover) .ramp__step--active:not(:hover) {
height: calc(0.5rem + var(--rnd2) * 1.5rem);
.ramp__label {
transform: translateY(0);
span {
opacity: 0;
}
}
.ramp__inner {
transform: rotate(0) scale(0.8);
}
}
.ramp-list h2 {
text-align: center;
margin-bottom: 0.5em;
margin-top: 1em;
}
.select {
position: fixed;
bottom: 2rem;
right: 5rem;
background: var(--white);
color: var(--black);
font: inherit;
padding: 0.5em 1em;
}
.converter {
--w: calc(var(--size-illu) - 4em);
width: var(--w);
margin: 2em;
position: relative;
aspect-ratio: 1;
}
.swatch {
position: absolute;
display: block;
box-shadow: 0 0 0 0.05rem var(--black);
padding: 0.3rem;
padding-bottom: 0;
width: 6rem;
background: var(--white);
}
label.swatch {
cursor: pointer;
}
.swatch--ryb {
top: 0;
right: 0;
}
.swatch--rgb {
left: 2em;
bottom: 0;
background: #fff;
}
.swatch__color {
width: 100%;
aspect-ratio: 1;
background: var(--c, var(--black));
}
.swatch__input {
position: absolute;
top: 0;
opacity: 0;
}
.swatch__value,
.swatch__name {
display: block;
font-size: 0.8em;
line-height: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.swatch__name {
padding-bottom: 0.25rem;
}
.swatch__value {
font-size: 1rem;
}
.swatch__label {
padding: 0.25em 0 0;
}
.smoothwheel {
width: 60vw;
aspect-ratio: 1;
/*
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%) translateY(50%);
z-index: -1;
opacity: 0.5;
*/
background: radial-gradient(
closest-side,
var(--black),
rgba(0, 0, 0, 0),
var(--white) 80%
),
conic-gradient(from 0deg, var(--gradient));
display: none;
}