UNPKG

rybitten

Version:

A color space conversion library for transforming between RGB and RYB colors.

734 lines (627 loc) 12.2 kB
: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; }