/
renath
/
dredexgrid
Обзор
Документация
Войти
/
renath
/
dredexgrid
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/_forms.scss
555 строк
11 KB
Renatka
Первый коммит фреймворка
13 ноя 2025, 11:58
13 ноя 2025, 11:58
9120592
Код
Авторство
О чём код?
@use 'sass:map'; @use 'variables'; // Forms variables $form-bg: #ffffff !default; $form-border: #ced4da !default; $form-border-focus: variables.$primary !default; $form-border-error: variables.$danger !default; $form-border-success: variables.$success !default; $form-border-radius: 0.375rem !default; $form-padding: 0.75rem 1rem !default; $form-transition: all 0.15s ease-in-out !default; $form-label-color: #374151 !default; $form-help-color: #6b7280 !default; // Form group .form-group { margin-bottom: 1.5rem; position: relative; } // Form label .form-label { display: block; margin-bottom: 0.5rem; font-weight: 500; color: $form-label-color; font-size: 0.875rem; line-height: 1.25rem; &.required::after { content: "*"; color: $form-border-error; margin-left: 0.25rem; } } // Base form control .form-control { display: block; width: 100%; padding: $form-padding; font-size: 1rem; font-weight: 400; line-height: 1.5; color: variables.$dark; background-color: $form-bg; background-clip: padding-box; border: 1px solid $form-border; border-radius: $form-border-radius; transition: $form-transition; appearance: none; &:focus { color: variables.$dark; background-color: $form-bg; border-color: $form-border-focus; outline: 0; box-shadow: 0 0 0 3px rgba($form-border-focus, 0.1); } &::placeholder { color: #9ca3af; opacity: 1; } &:disabled, &[readonly] { background-color: #f9fafb; opacity: 0.7; cursor: not-allowed; } } // Form control sizes .form-control-sm { padding: 0.5rem 0.75rem; font-size: 0.875rem; border-radius: 0.25rem; } .form-control-lg { padding: 1rem 1.25rem; font-size: 1.125rem; border-radius: 0.5rem; } // Form control states .form-control.is-valid { border-color: $form-border-success; &:focus { border-color: $form-border-success; box-shadow: 0 0 0 3px rgba($form-border-success, 0.1); } } .form-control.is-invalid { border-color: $form-border-error; &:focus { border-color: $form-border-error; box-shadow: 0 0 0 3px rgba($form-border-error, 0.1); } } // Validation feedback .valid-feedback, .invalid-feedback { display: none; width: 100%; margin-top: 0.375rem; font-size: 0.875rem; line-height: 1.25rem; } .valid-feedback { color: $form-border-success; } .invalid-feedback { color: $form-border-error; } .was-validated .form-control:valid ~ .valid-feedback, .form-control.is-valid ~ .valid-feedback { display: block; } .was-validated .form-control:invalid ~ .invalid-feedback, .form-control.is-invalid ~ .invalid-feedback { display: block; } // Select select.form-control { background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e"); background-position: right 0.75rem center; background-repeat: no-repeat; background-size: 1.5em 1.5em; padding-right: 2.5rem; &[multiple] { background-image: none; padding-right: 1rem; } } // Textarea textarea.form-control { min-height: 100px; resize: vertical; &.form-control-lg { min-height: 120px; } &.form-control-sm { min-height: 80px; } } // Checkboxes and Radios .form-check { display: flex; align-items: flex-start; margin-bottom: 0.75rem; position: relative; min-height: 1.5rem; padding-left: 1.75rem; } .form-check-input { width: 1.125rem; height: 1.125rem; margin-top: 0.125rem; margin-left: -1.75rem; float: left; appearance: none; border: 1px solid $form-border; background-color: $form-bg; position: relative; cursor: pointer; transition: $form-transition; &[type="checkbox"] { border-radius: 0.25rem; &:checked { background-color: variables.$primary; border-color: variables.$primary; &::before { content: ""; position: absolute; left: 50%; top: 40%; width: 0.375rem; height: 0.625rem; border: solid white; border-width: 0 2px 2px 0; transform: translate(-50%, -50%) rotate(45deg); } } } &[type="radio"] { border-radius: 50%; &:checked { background-color: $form-bg; border-color: variables.$primary; &::after { content: ""; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 0.5rem; height: 0.5rem; background-color: variables.$primary; border-radius: 50%; } } } &:focus { outline: 0; box-shadow: 0 0 0 3px rgba($form-border-focus, 0.1); } &:disabled { opacity: 0.5; cursor: not-allowed; ~ .form-check-label { opacity: 0.5; cursor: not-allowed; } } } .form-check-label { cursor: pointer; font-size: 0.875rem; line-height: 1.25rem; color: $form-label-color; } // Switch .form-switch { padding-left: 2.5rem; .form-check-input { width: 2rem; margin-left: -2.5rem; background-image: none; background-position: 0; border-radius: 2rem; transition: background-position 0.15s ease-in-out; &:checked { background-position: 100%; background-color: variables.$primary; border-color: variables.$primary; &::before { transform: translate(80%, -50%); } } &::before { content: ""; position: absolute; top: 50%; left: 0.125rem; width: 0.875rem; height: 0.875rem; background-color: white; border-radius: 50%; transform: translate(0, -50%); transition: transform 0.15s ease-in-out; } } } // Form check inline .form-check-inline { display: inline-flex; align-items: center; margin-right: 1rem; margin-bottom: 0; padding-left: 0; .form-check-input { margin-left: 0; margin-right: 0.5rem; } } // Input groups .input-group { position: relative; display: flex; flex-wrap: wrap; align-items: stretch; width: 100%; } .input-group-text { display: flex; align-items: center; padding: $form-padding; font-size: 1rem; font-weight: 400; line-height: 1.5; color: $form-label-color; text-align: center; white-space: nowrap; background-color: #f9fafb; border: 1px solid $form-border; border-radius: $form-border-radius; } .input-group > .form-control { position: relative; flex: 1 1 auto; width: 1%; min-width: 0; } .input-group > .form-control:not(:first-child) { border-top-left-radius: 0; border-bottom-left-radius: 0; } .input-group > .input-group-text:not(:first-child) { border-top-left-radius: 0; border-bottom-left-radius: 0; } .input-group > .form-control:not(:last-child) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .input-group > .input-group-text:not(:last-child) { border-top-right-radius: 0; border-bottom-right-radius: 0; } // Floating labels .form-floating { position: relative; .form-control { height: calc(3.5rem + 2px); line-height: 1.25; padding: 1rem 0.75rem; &::placeholder { color: transparent; } &:focus, &:not(:placeholder-shown) { padding-top: 1.625rem; padding-bottom: 0.625rem; } &:focus ~ .floating-label, &:not(:placeholder-shown) ~ .floating-label { opacity: 0.65; transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); } } .floating-label { position: absolute; top: 0; left: 0; height: 100%; padding: 1rem 0.75rem; pointer-events: none; border: 1px solid transparent; transform-origin: 0 0; transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; color: $form-help-color; } } // Help text .form-text { display: block; margin-top: 0.375rem; font-size: 0.875rem; color: $form-help-color; } // Range input .form-range { width: 100%; height: 1.5rem; padding: 0; background-color: transparent; appearance: none; &:focus { outline: none; &::-webkit-slider-thumb { box-shadow: 0 0 0 3px rgba($form-border-focus, 0.1); } } &::-webkit-slider-thumb { width: 1rem; height: 1rem; margin-top: -0.25rem; background-color: variables.$primary; border: 0; border-radius: 1rem; transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; appearance: none; } &::-webkit-slider-track { width: 100%; height: 0.5rem; color: transparent; cursor: pointer; background-color: #e5e7eb; border-color: transparent; border-radius: 1rem; } } // File input .form-file { position: relative; display: inline-block; width: 100%; height: calc(2.75rem + 2px); margin-bottom: 0; } .form-file-input { position: relative; z-index: 2; width: 100%; height: calc(2.75rem + 2px); margin: 0; opacity: 0; &:focus ~ .form-file-label { border-color: $form-border-focus; box-shadow: 0 0 0 3px rgba($form-border-focus, 0.1); } } .form-file-label { position: absolute; top: 0; right: 0; left: 0; z-index: 1; height: calc(2.75rem + 2px); padding: 0.75rem 1rem; line-height: 1.5; color: $form-label-color; background-color: $form-bg; border: 1px solid $form-border; border-radius: $form-border-radius; transition: $form-transition; &::after { position: absolute; top: 0; right: 0; bottom: 0; z-index: 3; display: block; height: calc(2.75rem + 2px); padding: 0.75rem 1rem; line-height: 1.5; color: $form-label-color; content: "Browse"; background-color: #f9fafb; border-left: inherit; border-radius: 0 $form-border-radius $form-border-radius 0; } } // Dark mode support @media (prefers-color-scheme: dark) { .form-control { background-color: #1f2937; border-color: #4b5563; color: #f9fafb; &:focus { background-color: #1f2937; border-color: $form-border-focus; color: #f9fafb; } } .input-group-text { background-color: #374151; border-color: #4b5563; color: #f9fafb; } .form-file-label { background-color: #1f2937; border-color: #4b5563; color: #f9fafb; &::after { background-color: #374151; color: #f9fafb; } } } // Form layouts .form-inline { display: flex; flex-flow: row wrap; align-items: center; .form-group { margin-right: 1rem; margin-bottom: 0; } } // Responsive forms @each $breakpoint, $width in variables.$breakpoints { @if $width > 0 { @media (min-width: $width) { .form-#{$breakpoint}-inline { display: flex; flex-flow: row wrap; align-items: center; .form-group { margin-right: 1rem; margin-bottom: 0; } } } } }