@fylgja/base
Version:
Base provides a streamlined starting point for any web project. It’s a collection of class-less solutions, allowing you to focus on building your site.
231 lines (210 loc) • 6.99 kB
CSS
/**
* Fylgja (https://fylgja.dev)
* Licensed under MIT Open Source
*/
:where(input:not([type=range], [type=button], [type=reset], [type=submit]), textarea, select) {
appearance: none;
margin: 0;
padding-block: var(--form-py, 0.4375rem);
padding-inline: var(--form-px, 0.8rem);
border-width: var(--form-border-width, 1px);
border-color: var(--form-stroke);
border-radius: var(--form-radius, 0.35rem);
background: var(--form-bg, var(--root-bg));
color: var(--form-color, var(--root-fg));
transition: color 250ms, background-color 250ms, border-color 250ms, box-shadow 250ms;
}
:where(input:not([type=range], [type=button], [type=reset], [type=submit]), textarea, select):placeholder-shown {
text-overflow: ellipsis;
}
:where(input:not([type=range], [type=button], [type=reset], [type=submit]), textarea, select):focus-visible {
border-color: var(--form-active-color);
}
:where(input:not([type=range], [type=button], [type=reset], [type=submit]), textarea, select):disabled {
box-shadow: none;
cursor: not-allowed;
}
:where(input:not([type=checkbox], [type=radio], [type=range], [type=button], [type=reset], [type=submit]), textarea, select) {
--outline-size: 1px;
--outline-offset: calc(
(var(--form-border-width, 1px) + 1px) * -1
);
display: block;
max-inline-size: 100%;
inline-size: 100%;
}
:where(input:not([type=checkbox], [type=radio], [type=range], [type=button], [type=reset], [type=submit]), textarea, select):is(:disabled, [readonly]:not(:focus)) {
border-style: var(--form-disabled-border-style, dashed);
}
:where(input[type=checkbox], input[type=radio]) {
--_gap: var(--icon-gap, 2px);
block-size: var(--control-size, 1.25em);
inline-size: var(--control-size, 1.25em);
border-radius: var(--control-radius, 0.35rem);
border-width: var(--control-border-width, 2px);
padding: var(--_gap);
user-select: none;
}
:where(input[type=checkbox], input[type=radio]):not(:disabled) {
cursor: pointer;
}
:where(input[type=checkbox], input[type=radio])::after {
content: "";
display: block;
block-size: 100%;
inline-size: 100%;
border-radius: inherit;
background-color: var(--icon-color, currentcolor);
scale: var(--_show-icon, 0);
opacity: var(--_show-icon, 0);
transition: translate 0.15s, scale 0.15s, opacity 0.15s;
forced-color-adjust: none;
-webkit-mask: var(--_icon) center/contain no-repeat;
mask: var(--_icon) center/contain no-repeat;
}
:where(input[type=checkbox], input[type=radio]):checked {
--_show-icon: 1;
outline-color: var(--control-checked-stroke, var(--root-fg));
border-color: var(--control-checked-stroke, var(--root-fg));
background-color: var(--control-checked-bg, var(--root-fg));
color: var(--control-checked-color, var(--root-bg));
}
:where(input[type=radio]) {
--_gap: 3px;
--control-radius: 50%;
}
:where(input[type=checkbox]:not([role=switch])) {
--_gap: 1px;
--_icon: url("#");
--checked-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='4'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E %3C/svg%3E");
--indeterminate-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='4'%3E%3Cpath d='M5 12h14'/%3E%3C/svg%3E");
}
:where(input[type=checkbox]:not([role=switch])):indeterminate {
--_show-icon: 1;
--_icon: var(--indeterminate-icon);
}
:where(input[type=checkbox]:not([role=switch])):checked {
--_icon: var(--checked-icon);
}
:where(input[type=checkbox][role=switch]) {
--_show-icon: 1;
--control-radius: 1.25em;
inline-size: var(--switch-size, 2em);
}
:where(input[type=checkbox][role=switch])::after {
inline-size: auto;
aspect-ratio: 1;
}
:where(input[type=checkbox][role=switch]):checked {
--_offset-x: calc(
var(--switch-size, 2em) -
var(--control-size, 1.25em)
);
}
:where(input[type=checkbox][role=switch]):checked::after {
translate: var(--_offset-x) 0%;
}
:where(input[type=checkbox][role=switch]):checked:dir(rtl)::after {
translate: calc(var(--_offset-x) / -1) 0%;
}
:where(input[type=color]) {
--form-py: 3px;
--form-px: 3px;
block-size: var(--block-size, 2.5em);
inline-size: var(--inline-size, 2.5em);
}
:where(input[type=color])::-webkit-color-swatch-wrapper {
padding: 0;
border-radius: inherit;
}
:where(input[type=color])::-moz-color-swatch {
border: 0;
border-radius: inherit;
}
:where(input[type=color])::-webkit-color-swatch {
border: 0;
border-radius: inherit;
}
:where(input[type=file]) {
--form-py: 0;
--form-px: 0 0.8rem;
--btn-radius: 0;
--btn-border-width: 0;
overflow: clip;
}
:where(input[type=file])::file-selector-button {
margin-inline-end: 1em;
}
:where(select) {
inline-size: auto;
word-wrap: normal;
}
:where(select:not([size]:not([size="1"]), [multiple])) {
--icon-size: var(--select-icon-size, 1.25em);
--icon-offset: var(--select-icon-offset, 0.8rem);
padding-inline-end: calc(var(--icon-size) + var(--icon-offset) + 0.5ch);
background: var(--select-icon, var(--select-light-scheme)) var(--form-bg, var(--root-bg)) var(--icon-position, right) var(--icon-offset) center/var(--icon-size) no-repeat;
-webkit-print-color-adjust: exact;
print-color-adjust: exact;
}
:where(select:not([size]:not([size="1"]), [multiple])):dir(rtl) {
--icon-position: left;
}
:where(textarea) {
resize: vertical;
}
:where(textarea:not([row])) {
min-block-size: var(--textarea-min-size, calc(3.5lh + var(--form-py, 0.4375rem)));
field-sizing: content;
}
::placeholder {
opacity: 1;
color: color-mix(in srgb, currentcolor 54%, transparent);
}
:where(fieldset) {
min-inline-size: 0;
margin: 0;
padding: 0;
}
:where(legend) {
padding: 0;
}
::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-datetime-edit,
::-webkit-datetime-edit-fields-wrapper,
::-webkit-datetime-edit-year-field,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-hour-field,
::-webkit-datetime-edit-minute-field,
::-webkit-datetime-edit-second-field,
::-webkit-datetime-edit-millisecond-field,
::-webkit-datetime-edit-meridiem-field {
display: inline;
padding-block: 0;
}
::-webkit-date-and-time-value {
min-height: 1lh;
text-align: inherit;
}
::-webkit-calendar-picker-indicator {
line-height: 1;
}
:where([list]:not([type*=date], [type=month], [type=week], [type=time])) {
--datalist-icon: var(--select-icon, var(--chevron-light-scheme));
}
:where([list]:not([type*=date], [type=month], [type=week], [type=time]))::-webkit-calendar-picker-indicator {
display: block ;
background: var(--datalist-icon) center/contain no-repeat;
opacity: 1;
}
:where([list]:not([type*=date], [type=month], [type=week], [type=time]))::-webkit-list-button {
appearance: none;
block-size: 1em;
inline-size: 1em;
padding: 3px;
align-self: center;
background: var(--datalist-icon) center/contain no-repeat;
}