236 lines
4.9 KiB
CSS
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);
|
|
}
|
|
}
|