styleui-components
Version:
Lightweight, modular UI component library with zero dependencies
491 lines (427 loc) • 12.4 kB
CSS
/*------------------------------------*\\
#FORMS
\\*------------------------------------*/
.form-group {
margin-bottom: var(--space-4);
}
.form-group label {
display: block;
font-size: var(--font-size-s);
font-weight: var(--font-medium);
color: var(--text-secondary);
margin-bottom: var(--space-2);
}
.form-control {
display: block;
width: 100%;
padding: var(--space-2) var(--space-3);
font-size: var(--font-size-s);
font-family: var(--font-system);
line-height: var(--line-height-normal);
color: var(--text-primary);
background-color: var(--input-background);
background-clip: padding-box;
border: 1px solid transparent;
border-radius: var(--radius-md);
transition: border-color var(--transition-fast), box-shadow var(--transition-fast), background-color var(--transition-fast);
}
.form-control:focus {
outline: 0;
background-color: var(--input-background-focus);
}
textarea.form-control {
min-height: 120px;
resize: vertical;
}
.form-actions {
display: flex;
justify-content: flex-end;
gap: var(--space-4);
margin-top: var(--space-6);
padding-top: var(--space-6);
border-top: 1px solid var(--border-color);
}
/* Settings Panel Specific Styles */
.setting-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: var(--space-3) 0;
}
.setting-label {
font-weight: var(--font-normal);
color: var(--text-secondary);
}
.color-picker-trigger {
width: 60px;
height: 24px;
border-radius: var(--radius-md);
border: 1px solid var(--border-color-light);
cursor: pointer;
}
.toggle-switch {
appearance: none;
width: 40px;
height: 22px;
background-color: var(--bg-layer-2);
border-radius: 11px;
position: relative;
cursor: pointer;
transition: background-color var(--transition-base);
}
.toggle-switch::before {
content: '';
position: absolute;
width: 16px;
height: 16px;
border-radius: 50%;
background-color: white;
top: 3px;
left: 3px;
transition: transform var(--transition-base);
}
.toggle-switch:checked {
background-color: var(--accent);
}
.toggle-switch:checked::before {
transform: translateX(18px);
}
.form-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: var(--space-4);
}
/*------------------------------------*\\
#CUSTOM SELECT
\\*------------------------------------*/
.custom-select {
position: relative;
display: block;
width: 100%;
}
.custom-select-trigger {
position: relative;
width: 100%;
text-align: left;
cursor: pointer;
}
.custom-select-trigger::after {
content: '';
position: absolute;
top: 50%;
right: var(--space-3);
width: 10px;
height: 10px;
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='currentColor' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: center;
background-size: contain;
transform: translateY(-50%);
pointer-events: none;
transition: transform var(--transition-fast);
}
.custom-select.open .custom-select-trigger::after {
transform: translateY(-50%) rotate(180deg);
}
.custom-select-panel {
position: absolute;
z-index: var(--z-dropdown);
top: calc(100% + var(--space-1));
left: 0;
right: 0;
max-height: 250px;
overflow-y: auto;
background-color: var(--bg-layer-0);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-l);
padding: var(--space-2);
display: none;
opacity: 0;
transform: translateY(-10px);
transition: opacity 0.2s ease, transform 0.2s ease;
}
.custom-select.open .custom-select-panel {
display: block;
opacity: 1;
transform: translateY(0);
}
.custom-select-option {
display: flex;
align-items: center;
gap: var(--space-2);
padding: var(--space-2) var(--space-3);
border-radius: var(--radius-s);
cursor: pointer;
font-size: var(--font-size-s);
color: var(--text-secondary);
white-space: nowrap;
}
.custom-select-option:hover {
background-color: var(--background-hover);
color: var(--text-primary);
}
.custom-select-option.selected {
background-color: var(--accent);
color: var(--accent-text);
font-weight: var(--font-medium);
}
/*------------------------------------*\\
#THIRD-PARTY PICKERS THEME
\\*------------------------------------*/
/* VanillaJS Datepicker Theme */
.datepicker {
background-color: var(--bg-layer-0) ;
border-radius: var(--radius-lg) ;
border: none ;
box-shadow: var(--shadow-l) ;
padding: var(--space-2) ;
}
.datepicker-header, .datepicker-footer {
background-color: transparent ;
}
.datepicker-title, .datepicker-controls .button, .datepicker-view-switch, .dow, .datepicker-cell {
color: var(--text-primary) ;
font-weight: var(--font-normal) ;
}
.datepicker-cell.selected, .datepicker-cell.selected:hover {
background: var(--accent) ;
color: var(--accent-text) ;
}
.datepicker-cell:not(.disabled):not(.selected):hover {
background: var(--background-hover) ;
}
.datepicker-controls .button:hover {
background: var(--background-hover) ;
}
/* Vanilla Picker Theme */
.picker_wrapper {
background: var(--bg-layer-0) ;
border-radius: var(--radius-lg) ;
box-shadow: var(--shadow-l) ;
border: none ;
padding: var(--space-2) ;
}
.picker_arrow::before, .picker_arrow::after {
display: none ;
}
.picker_sl, .picker_hue {
border-radius: var(--radius-md) ;
}
.picker_selector {
border-width: 2px ;
}
/*------------------------------------*\\
#CHECKBOXES & RADIOS
\\*------------------------------------*/
.check-group {
display: flex;
flex-direction: column;
gap: var(--space-3);
}
.checkbox, .radio {
display: inline-flex;
align-items: center;
gap: var(--space-3);
cursor: pointer;
font-size: var(--font-size-s);
color: var(--text-primary);
-webkit-user-select: none;
user-select: none;
}
.checkbox input, .radio input {
position: absolute;
opacity: 0;
cursor: pointer;
height: 0;
width: 0;
}
.checkbox .checkmark, .radio .radiomark {
position: relative;
display: inline-block;
width: 20px;
height: 20px;
background-color: var(--bg-layer-2);
border: 1px solid transparent;
transition: all var(--transition-fast);
}
.checkbox .checkmark {
border-radius: var(--radius-sm);
}
.radio .radiomark {
border-radius: var(--radius-full);
}
.checkbox:hover input ~ .checkmark,
.radio:hover input ~ .radiomark {
background-color: var(--bg-layer-4);
}
.checkbox input:checked ~ .checkmark,
.radio input:checked ~ .radiomark {
background-color: var(--accent);
border-color: transparent;
}
.checkmark::after, .radiomark::after {
content: "";
position: absolute;
display: none;
}
.checkbox input:checked ~ .checkmark::after,
.radio input:checked ~ .radiomark::after {
display: block;
}
.checkmark::after {
left: 6px;
top: 3px;
width: 7px;
height: 12px;
border: solid var(--accent-text);
border-width: 0 2px 2px 0;
transform: rotate(45deg);
}
.radio input:checked ~ .radiomark {
background-color: var(--bg-layer-1);
}
.radiomark::after {
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 10px;
height: 10px;
border-radius: var(--radius-full);
background: var(--accent);
}
.checkbox input:focus-visible ~ .checkmark,
.radio input:focus-visible ~ .radiomark {
box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.2);
border-color: transparent;
}
/* Semantic Colors */
.checkbox-primary input:checked ~ .checkmark { background-color: var(--primary); border-color: transparent; }
.checkbox-success input:checked ~ .checkmark { background-color: var(--success); border-color: transparent; }
.checkbox-warning input:checked ~ .checkmark { background-color: var(--warning); border-color: transparent; }
.checkbox-error input:checked ~ .checkmark { background-color: var(--error); border-color: transparent; }
.checkbox-info input:checked ~ .checkmark { background-color: var(--info); border-color: transparent; }
.radio-primary .radiomark::after { background-color: var(--primary); }
.radio-success .radiomark::after { background-color: var(--success); }
.radio-warning .radiomark::after { background-color: var(--warning); }
.radio-error .radiomark::after { background-color: var(--error); }
.radio-info .radiomark::after { background-color: var(--info); }
.radio-primary:hover input ~ .radiomark, .radio-primary input:checked ~ .radiomark { border-color: transparent; }
.radio-success:hover input ~ .radiomark, .radio-success input:checked ~ .radiomark { border-color: transparent; }
.radio-warning:hover input ~ .radiomark, .radio-warning input:checked ~ .radiomark { border-color: transparent; }
.radio-error:hover input ~ .radiomark, .radio-error input:checked ~ .radiomark { border-color: transparent; }
.radio-info:hover input ~ .radiomark, .radio-info input:checked ~ .radiomark { border-color: transparent; }
/* Specific input type styling */
input[type="range"].form-control {
padding: 0;
-webkit-appearance: none;
appearance: none;
width: 100%;
height: 8px;
background: var(--range-track-background);
border-radius: var(--radius-full);
outline: none;
transition: opacity .2s;
}
input[type="range"].form-control::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 18px;
height: 18px;
background: var(--accent);
cursor: pointer;
border-radius: var(--radius-full);
border: 3px solid var(--bg-layer-1);
}
input[type="range"].form-control::-moz-range-thumb {
width: 18px;
height: 18px;
background: var(--accent);
cursor: pointer;
border-radius: var(--radius-full);
border: 3px solid var(--bg-layer-1);
}
h5 {
font-size: var(--font-size-sm);
font-weight: 500;
color: var(--text-color-secondary);
text-transform: uppercase;
letter-spacing: 0.05em;
margin: var(--space-8) 0 var(--space-3) 0;
padding-bottom: var(--space-2);
border-bottom: 1px solid var(--border-color);
}
h5:first-of-type {
margin-top: 0;
}
input[type="range"] {
-webkit-appearance: none;
appearance: none;
width: 100%;
height: 4px;
background: var(--bg-layer-2);
outline: none;
border-radius: 2px;
margin: var(--space-2) 0;
}
input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 16px;
height: 16px;
background: var(--accent);
cursor: pointer;
border-radius: 50%;
border: 2px solid var(--bg-layer-0);
}
input[type="range"]::-moz-range-thumb {
width: 16px;
height: 16px;
background: var(--accent);
cursor: pointer;
border-radius: 50%;
border: 2px solid var(--bg-layer-0);
}
.dark input[type="range"]::-webkit-slider-thumb {
border-color: var(--bg-layer-1);
}
.dark input[type="range"]::-moz-range-thumb {
border-color: var(--bg-layer-1);
}
.setting-row, .setting-control-container {
display: flex;
justify-content: space-between;
align-items: center;
gap: var(--space-4);
padding: var(--space-2) var(--space-3);
width: 100%;
}
.setting-label {
font-size: var(--font-size-sm);
color: var(--text-color-primary);
}
.tree .setting-control-container {
padding: var(--space-1) 0;
}
.tree .setting-control-container .setting-label {
flex-grow: 1;
}
.tree .tree-item-content > .setting-control-container {
padding-left: 0;
padding-right: 0;
}
/* Ensure controls in tree don't get squished */
.tree .form-control, .tree .toggle-switch, .tree .color-picker-trigger {
flex-shrink: 0;
min-width: 100px;
}
.tree .toggle-switch {
min-width: 40px;
}
.tree .color-picker-trigger {
min-width: 60px;
}
.label-on-right {
flex-direction: row-reverse;
justify-content: flex-end;
gap: var(--space-3);
}