svarog-ui-core
Version:
Core components of Svarog UI without themes
116 lines (102 loc) • 3.13 kB
JavaScript
// src/components/Radio/Radio.styles.js
import { css } from '../../utils/styleInjection.js';
export const radioStyles = css`
.radio-container {
display: flex;
flex-direction: column;
margin-bottom: var(--radio-margin-bottom, var(--space-2, 8px));
position: relative;
}
.radio-wrapper {
display: flex;
align-items: center;
position: relative;
cursor: pointer;
user-select: none;
padding: var(--radio-padding, var(--space-1, 4px));
}
/* Hide the browser's default radio */
.radio-input {
position: absolute;
opacity: 0;
width: 0;
height: 0;
margin: 0;
cursor: pointer;
}
/* Create a custom radio */
.radio-indicator {
display: inline-flex;
align-items: center;
justify-content: center;
width: var(--radio-size, 20px);
height: var(--radio-size, 20px);
margin-right: var(--radio-indicator-margin, var(--space-2, 8px));
background-color: var(--radio-bg, #ffffff);
border: var(--radio-border, 1px solid var(--color-gray-400, #6c757d));
border-radius: 50%;
transition: var(--radio-transition, all 0.2s ease-in-out);
}
/* On radio hover, darken border */
.radio-wrapper:hover .radio-indicator {
border-color: var(
--radio-hover-border-color,
var(--color-gray-600, #495057)
);
}
/* When the radio is checked, create inner circle */
.radio-input:checked ~ .radio-indicator::after {
content: '';
display: block;
width: var(--radio-inner-size, 12px);
height: var(--radio-inner-size, 12px);
border-radius: 50%;
background-color: var(--radio-checked-color, var(--color-primary, #007bff));
}
/* When the radio is checked, style the indicator */
.radio-input:checked ~ .radio-indicator {
border-color: var(
--radio-checked-border-color,
var(--color-primary, #007bff)
);
}
/* On focus, add a focus ring */
.radio-input:focus ~ .radio-indicator {
box-shadow: var(--radio-focus-shadow, 0 0 0 0.2rem rgba(0, 123, 255, 0.25));
}
/* Disabled state */
.radio-input:disabled ~ .radio-indicator {
background-color: var(--radio-disabled-bg, var(--color-gray-100, #e9ecef));
border-color: var(
--radio-disabled-border-color,
var(--color-gray-300, #ced4da)
);
cursor: not-allowed;
}
.radio-input:disabled ~ .radio-label {
color: var(--radio-disabled-color, var(--color-gray-400, #6c757d));
cursor: not-allowed;
}
.radio-input:disabled:checked ~ .radio-indicator::after {
background-color: var(
--radio-disabled-checked-color,
var(--color-gray-400, #adb5bd)
);
}
/* Label styling */
.radio-label {
font-size: var(--radio-font-size, var(--font-size-base, 16px));
color: var(--radio-color, var(--color-text, #212529));
font-family: var(
--radio-font-family,
var(--font-family-primary, sans-serif)
);
line-height: 1.5;
}
/* Required indicator */
.radio-input[required] ~ .radio-label:after {
content: '*';
color: var(--radio-required-color, var(--color-danger, #dc3545));
margin-left: var(--space-1, 4px);
}
`;