Files
2026-05-02 10:41:00 +02:00

236 lines
4.9 KiB
CSS

:root {
/* Typography */
--form-font-size: inherit;
--form-font-family: inherit;
--form-label-size: 0.875rem;
--form-helper-size: 0.8rem;
/* Colors */
--form-text: #171717;
--form-placeholder: #9ca3af;
--form-label: #374151;
--form-border: #d1d5db;
--form-border-hover: #bfc5cf;
--form-border-focus: #474747;
--form-border-error: #ef4444;
--form-bg: #ffffff;
--form-bg-disabled: #f3f4f6;
--form-text-disabled: #9ca3af;
--form-error: #ef4444;
--form-success: #22c55e;
--form-check-accent: #474747;
/* Layout */
--form-radius: 8px;
--form-padding-y: 10px;
--form-padding-x: 14px;
--form-gap: 6px;
--form-field-gap: 1.25rem;
--form-control-gap: 10px;
--form-min-height: 44px;
/* Motion */
--form-transition:
border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease,
color 0.2s ease;
/* Focus */
--form-focus-shadow: 0 0 0 3px rgba(71, 71, 71, 0.15);
--form-error-shadow: 0 0 0 3px rgba(239, 68, 68, 0.15);
}
/* Group */
.form-group {
display: flex;
flex-direction: column;
gap: var(--form-gap);
margin-bottom: var(--form-field-gap);
}
fieldset {
border: 0;
padding: 0;
margin: 0;
min-width: 0;
}
/* Labels */
label,
.form-label {
font-size: var(--form-label-size);
font-weight: 600;
color: var(--form-label);
cursor: pointer;
}
.form-label--required::after {
content: " *";
color: var(--form-error);
}
/* Controls */
input[type="text"],
input[type="email"],
input[type="tel"],
input[type="number"],
input[type="password"],
input[type="search"],
input[type="url"],
textarea,
select {
width: 100%;
display: block;
font-family: var(--form-font-family);
font-size: var(--form-font-size);
color: var(--form-text);
background-color: var(--form-bg);
border: 1.5px solid var(--form-border);
border-radius: var(--form-radius);
padding: var(--form-padding-y) var(--form-padding-x);
min-height: var(--form-min-height);
transition: var(--form-transition);
appearance: none;
-webkit-appearance: none;
outline: none;
}
input::placeholder,
textarea::placeholder {
color: var(--form-placeholder);
}
input:hover,
textarea:hover,
select:hover {
border-color: var(--form-border-hover);
}
textarea {
resize: vertical;
min-height: 120px;
line-height: 1.6;
}
/* Focus */
input:focus-visible,
textarea:focus-visible,
select:focus-visible {
border-color: var(--form-border-focus);
box-shadow: var(--form-focus-shadow);
}
/* Error */
input.is-error,
textarea.is-error,
select.is-error {
border-color: var(--form-border-error);
}
input.is-error:focus-visible,
textarea.is-error:focus-visible,
select.is-error:focus-visible {
box-shadow: var(--form-error-shadow);
}
.form-error-msg {
font-size: var(--form-helper-size);
color: var(--form-error);
margin-top: 2px;
}
/* Helper / Success */
.form-help {
font-size: var(--form-helper-size);
color: var(--form-label);
}
.form-success-msg {
font-size: var(--form-helper-size);
color: var(--form-success);
margin-top: 2px;
}
/* Disabled */
input:disabled,
textarea:disabled,
select:disabled {
background-color: var(--form-bg-disabled);
color: var(--form-text-disabled);
cursor: not-allowed;
opacity: 1;
}
/* Select */
select {
cursor: pointer;
padding-right: 40px;
background-repeat: no-repeat;
background-position: right 14px center;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23474747' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
}
/* Checkbox / Radio */
.form-check {
display: flex;
align-items: center;
gap: var(--form-control-gap);
cursor: pointer;
}
.form-check input[type="checkbox"],
.form-check input[type="radio"] {
width: 18px;
height: 18px;
min-width: 18px;
border: 1.5px solid var(--form-border);
background-color: var(--form-bg);
cursor: pointer;
padding: 0;
transition: var(--form-transition);
appearance: none;
-webkit-appearance: none;
}
.form-check input[type="checkbox"] {
border-radius: 4px;
}
.form-check input[type="radio"] {
border-radius: 50%;
}
.form-check input[type="checkbox"]:checked,
.form-check input[type="radio"]:checked {
background-color: var(--form-check-accent);
border-color: var(--form-check-accent);
}
.form-check input[type="checkbox"]:checked {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3'%3E%3Cpath d='M20 6L9 17l-5-5'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: center;
}
.form-check input[type="radio"]:checked {
box-shadow: inset 0 0 0 4px white;
}
.form-check input:focus-visible {
box-shadow: var(--form-focus-shadow);
}
.form-check-label {
font-size: 0.9rem;
color: var(--form-text);
user-select: none;
}
/* Touch */
@media (hover: none) {
input:hover,
textarea:hover,
select:hover {
border-color: var(--form-border);
}
}