UNPKG

open-props

Version:
626 lines (534 loc) 13 kB
@keyframes drop-zone { from { box-shadow: 0 0 0 0 oklch(70% 100% var(--palette-hue) / 80%); } to { box-shadow: 0 0 0 25pxoklch (70% 100% var(--palette-hue) / 0%); } } /* preload icons that switch upon editing, so they dont flash blank */ :where(body)::after { content: var(--icon-tel-editing) var(--icon-password-editing) var(--icon-user-editing) var(--icon-arrow-up); opacity: 0; position: absolute; z-index: -1; } /* fieldset counts errors and places required dots */ :where(fieldset) { max-inline-size: max-content; display: grid; gap: var(--size-2); counter-reset: errors; border-color: var(--surface-2); box-shadow: var(--shadow-3); padding-inline: var(--size-4); padding-block: var(--size-2) var(--size-3); transition: box-shadow 0.4s var(--ease-out-4); &:where(:focus-within) { box-shadow: var(--shadow-6); } &:where(:focus-within) > :where(legend) { color: var(--link); } & > :where( div:has( :placeholder-shown:required, :not(:placeholder-shown):invalid, :not([placeholder]):required ) ) > label { position: relative; &::after { content: 'required'; position: absolute; margin-block-start: 0.5ex; margin-inline-start: 1ex; text-indent: -200vw; inline-size: 6px; block-size: 6px; border-radius: var(--radius-round); background-color: var(--red-4, #ff8787); box-shadow: 0 0 var(--size-2) var(--red-4, #ff8787); } } &:where(:has(:not(:placeholder-shown):invalid)) :where(legend)::after { text-transform: initial; color: var(--red-5, #ff6b6b); content: ' (' counter(errors) ' errors)'; } &:where(:has(:not(:placeholder-shown):invalid)) { counter-increment: errors; } & > :where(div) { display: grid; grid-auto-columns: 1fr; gap: var(--size-2) var(--size-3); align-items: center; @media (width > 720px) { grid-template-columns: var(--size-content-1) auto; } & > :where(label) { justify-self: start; } } & > :where(footer) { display: flex; flex-wrap: wrap; justify-content: space-between; gap: var(--size-3); margin-block-start: var(--size-6); & > :where(menu:only-child) { margin-inline-start: auto; } } & > :where(ul) { padding: 0; margin: 0; list-style-type: none; display: grid; gap: var(--size-2); & > :where(li) { padding: 0; & > :where(label) { display: inline-flex; align-items: baseline; gap: var(--size-4); max-inline-size: var(--size-content-1); & > :where(input) { margin-inline-start: 0; flex-shrink: 0; } } } } } :where(legend) { display: inline-flex; gap: var(--size-2); align-items: center; min-block-size: 3ch; border: 1px solid var(--surface-2); padding-inline: 1.5ch; border-radius: var(--radius-round); text-transform: uppercase; letter-spacing: var(--font-letterspacing-3); font-size: var(--font-size-0); font-weight: var(--font-weight-6); margin-inline-start: -2px; color: var(--text-2); @media (prefers-color-scheme: light) { background: var(--surface-1); } } :where( input:not( button, [type='button'], [type='file'], [type='number'], [type='range'], [type='color'], [type='checkbox'], [type='radio'] ) ) { /* todo: touch-callout */ line-height: 2.5; padding-block: 0; padding-inline: 1.75ch; transition: background-color 0.5s var(--ease-3), outline-offset 145ms var(--ease-2); &:where(:placeholder-shown) { text-overflow: ellipsis; } @media (prefers-reduced-motion: no-preference) { &:where(:not(:placeholder-shown)):where(:invalid:not(:focus)) { animation: var(--animation-shake-x); animation-duration: 0.4s; } } } :where( input:not( button, input[type='button'], input[type='range'], input[type='color'], input[type='checkbox'], input[type='radio'] ), textarea ) { box-shadow: var(--inner-shadow-1); @media (prefers-color-scheme: dark) { box-shadow: var(--inner-shadow-2); } } :where( input:is([type='password'], [type='url'], [type='email'], [type='tel']) ) { padding-inline-end: 3.5ch; } :where( input:is( [type='text'], [type='password'], [type='url'], [type='email'], [type='tel'], [type='search'] ) ) { flex-shrink: 1; min-inline-size: 5ch; max-inline-size: 100%; } :where(input, textarea) { background-color: var(--well-1); } :where([readonly]:focus) { outline: none; } :where( input:not( button, [disabled], [readonly], [type='file'], [type='button'], [type='submit'], [type='reset'], [type='checkbox'], [type='radio'] ), textarea, select ) { color: var(--text-1); &:where(:hover, :focus-within) { @media (prefers-color-scheme: dark) { background-color: var(--well-2); } } &:where(:not(:placeholder-shown, :not([placeholder])):invalid) { background-image: var(--icon-error); background-position: calc(100% - 1.5ch) center; } &:where(:not(:focus-within):not(:placeholder-shown):invalid) { text-decoration: underline wavy var(--red-6, #fa5252); @media (prefers-color-scheme: dark) { text-decoration: underline wavy var(--red-4, #ff8787); } } } :where(input[readonly], input[disabled]) { cursor: not-allowed; } :where([disabled]) { opacity: 0.5; box-shadow: none; cursor: auto; } :where(input[type='file']) { @media (prefers-color-scheme: light) { box-shadow: none; } &:where(.dropping) { outline: 2px dashed oklch(70% 100% var(--palette-hue)); @media (prefers-reduced-motion: no-preference) { animation: drop-zone 1.5s var(--ease-out-5) infinite; } } } :where(input[type='file'])::-webkit-file-upload-button, :where(input[type='file'])::file-selector-button { margin: var(--size-3); } @media (prefers-color-scheme: dark) { :where(input[type='file'])::-webkit-file-upload-button, :where(input[type='file'])::file-selector-button { border-color: transparent; } } :where(input[type='number']) { padding-block: 0.75ch; padding-inline: 1.75ch 0.75ch; min-inline-size: 10ch; } ::placeholder { color: var(--text-2); font-style: italic; } ::-moz-placeholder { opacity: 1; } :where(search) { & > :where(form) { display: grid; gap: var(--size-3); grid-template-columns: minmax(20ch, 1fr) auto; & > :where(label) { grid-column: span 2; } } } :where(input[type='search']) { background-image: var(--icon-search); background-position: 1.5ch center; padding-inline: 4ch 1.25ch; border-radius: var(--radius-round); &::-webkit-search-cancel-button { margin-right: -16px; /* size of the list-icon */ } &::-webkit-calendar-picker-indicator { color: transparent; } &:where([list]):placeholder-shown { background-image: var(--icon-search), var(--icon-arrow-down); background-position: 1.5ch center, calc(100% - 1.25ch) center; background-size: auto, 2.25ch; &:focus { background-image: var(--icon-search), var(--icon-arrow-up); } } } :where(input[type='text'][list]) { background-image: var(--icon-arrow-down); background-position: calc(100% - 1.25ch) center; background-size: 2.25ch; &:focus { background-image: var(--icon-arrow-up); } &::-webkit-calendar-picker-indicator { color: transparent; } } :where(input[type='password']) { background-image: var(--icon-password); background-position: calc(100% - 1.5ch) center; &:focus { background-image: var(--icon-password-editing); } } :where(input[type='email']) { background-image: var(--icon-email); background-position: calc(100% - 1.5ch) center; } :where(input[readonly]) { background-image: var(--icon-no-edit); background-position: calc(100% - 1.5ch) center; } :where(input[type='url']) { background-image: var(--icon-url); background-position: calc(100% - 1.5ch) center; } :where(input[type='tel']) { background-image: var(--icon-tel); background-position: calc(100% - 1.5ch) center; &:focus { background-image: var(--icon-tel-editing); } } :where(input:where([name*='username'], [id*='username'])) { background-image: var(--icon-user); background-position: calc(100% - 1.5ch) center; background-size: 1.75ch; &:focus { background-image: var(--icon-user-editing); } } :where(input[type='color']) { appearance: none; background: none; border: none; padding: 0; inline-size: var(--size-8); block-size: var(--size-8); border-radius: var(--radius-round); overflow: hidden; box-shadow: var(--shadow-5); &::-webkit-color-swatch { border: none; } &::-webkit-color-swatch-wrapper { padding: 0; } } :where(textarea) { transition: background-color 0.5s var(--ease-3); } :where(select) { background-color: var(--surface-3); box-shadow: var(--shadow-3), 0 1px var(--surface-3); appearance: none; background-image: var(--icon-arrow-down); background-position: calc(100% - 1ch) center; background-size: 3ex; padding-block: 0.75ch; padding-inline: 1.75ch 3ch; line-height: 1.5; &:where(:hover, :focus) { /* add button hover */ background-color: var(--surface-1); background-image: var(--icon-arrow-up); } } :where(input[type='checkbox'], input[type='radio']) { aspect-ratio: 1; box-shadow: var(--shadow-6); transform-style: preserve-3d; cursor: pointer; --isLTR: 1; --isRTL: -1; &:dir(rtl) { --isLTR: -1; --isRTL: 1; } &:hover::before { --thumb-scale: 1; } @media (hover: none) { inline-size: 1.5rem; block-size: 1.5rem; } &::before { --thumb-scale: 0.01; --thumb-highlight-size: 225%; content: ''; inline-size: var(--thumb-highlight-size); block-size: var(--thumb-highlight-size); clip-path: circle(50%); position: absolute; inset-block-start: 50%; inset-inline-start: 50%; background: hsl(0 0% 50% / 20%); transform-origin: center center; transform: translateX(calc(var(--isRTL) * 50%)) translateY(-50%) translateZ(-1px) scale(var(--thumb-scale)); will-change: transform; @media (prefers-reduced-motion: no-preference) { transition: transform 0.2s ease; } } } input[type='range'] { --track-height: 0.5ex; --track-fill: 0%; /* --_track-fill: calc(100% * attr(value number, 0) / attr(max number, 100)); */ --track-color: var(--well-1); --thumb-size: 3ex; --thumb-offset: -1.25ex; --thumb-highlight-color: oklch(70% 100% var(--palette-hue) / 20%); --thumb-highlight-size: 0px; display: block; inline-size: 100%; margin: 1ex 0; appearance: none; background: transparent; outline-offset: 5px; @media (hover: none) { --thumb-size: 30px; --thumb-offset: -14px; } &::-webkit-slider-runnable-track { appearance: none; block-size: var(--track-height); border-radius: 5ex; box-shadow: var(--inner-shadow-2); background: linear-gradient( to right, transparent var(--track-fill), var(--track-color) 0% ), var(--link); } &::-moz-range-track { appearance: none; block-size: var(--track-height); border-radius: 5ex; box-shadow: var(--inner-shadow-2); background: linear-gradient( to right, transparent var(--track-fill), var(--track-color) 0% ), var(--link); } &::-webkit-slider-thumb { appearance: none; cursor: ew-resize; border: 3px solid var(--surface-1); block-size: var(--thumb-size); inline-size: var(--thumb-size); margin-block-start: var(--thumb-offset); border-radius: 50%; background: var(--link); box-shadow: 0 0 0 var(--thumb-highlight-size) var(--thumb-highlight-color); @media (prefers-reduced-motion: no-preference) { & { transition: box-shadow 0.1s ease; } } .fieldset-item:focus-within & { border-color: var(--surface-2); } } &::-moz-range-thumb { appearance: none; cursor: ew-resize; border: 3px solid var(--surface-1); block-size: var(--thumb-size); inline-size: var(--thumb-size); margin-block-start: var(--thumb-offset); border-radius: 50%; background: var(--link); box-shadow: 0 0 0 var(--thumb-highlight-size) var(--thumb-highlight-color); @media (prefers-reduced-motion: no-preference) { & { transition: box-shadow 0.1s ease; } } .fieldset-item:focus-within & { border-color: var(--surface-2); } } &:where(:hover, :active) { --thumb-highlight-size: 10px; } } @media (pointer: coarse) { :where(input[type='checkbox'], input[type='radio']) { inline-size: var(--size-4); block-size: var(--size-4); } } :where(input):-webkit-autofill, :where(input):-webkit-autofill:hover, :where(input):-webkit-autofill:focus, :where(textarea):-webkit-autofill, :where(textarea):-webkit-autofill:hover, :where(textarea):-webkit-autofill:focus, :where(select):-webkit-autofill, :where(select):-webkit-autofill:hover, :where(select):-webkit-autofill:focus, :where(input):autofill, :where(input):autofill:hover, :where(input):autofill:focus, :where(textarea):autofill, :where(textarea):autofill:hover, :where(textarea):autofill:focus, :where(select):autofill, :where(select):autofill:hover, :where(select):autofill:focus { -webkit-text-fill-color: var(--text-1); -webkit-box-shadow: 0 0 0px 1e5px var(--well-1) inset; transition: background-color 5000s ease-in-out 0s; }