@rolemodel/optics
Version:
Optics is a css package that provides base styles and components that can be integrated and customized in a variety of projects.
361 lines (305 loc) • 10.2 kB
CSS
.form-control {
/* Public API (customizable component options) */
--_op-form-control-height-small: var(--op-input-height-small);
--_op-form-control-height-medium: var(--op-input-height-medium);
--_op-form-control-height-large: var(--op-input-height-large);
--_op-form-control-font-small: var(--op-font-x-small);
--_op-form-control-font-medium: var(--op-font-small);
--_op-form-control-font-large: var(--op-font-small);
/* Private API (component option defaults) */
--__op-form-control-height: var(--_op-form-control-height-large);
--__op-form-control-font-size: var(--_op-form-control-font-large);
min-width: var(--__op-form-control-height);
height: var(--__op-form-control-height);
/* Size Modifiers */
&.form-control--small {
--__op-form-control-height: var(--_op-form-control-height-small);
--__op-form-control-font-size: var(--_op-form-control-font-small);
}
&.form-control--medium {
--__op-form-control-height: var(--_op-form-control-height-medium);
--__op-form-control-font-size: var(--_op-form-control-font-medium);
}
&.form-control--large {
--__op-form-control-height: var(--_op-form-control-height-large);
--__op-form-control-font-size: var(--_op-form-control-font-large);
}
/* Disabled State */
&:disabled {
cursor: not-allowed;
opacity: var(--_op-form-control-opacity-disabled);
}
/* Readonly State */
&[readonly] {
padding: 0;
background: transparent;
box-shadow: none;
color: var(--op-color-on-background);
pointer-events: none;
user-select: none;
/* stylelint-disable selector-no-vendor-prefix */
&::-webkit-input-placeholder {
color: var(--op-color-on-background);
}
/* stylelint-enable selector-no-vendor-prefix */
}
}
/* Radio or Checkbox Form Control */
.form-control:is([type='radio'], [type='checkbox']) {
/* Public API (customizable component options) */
--_op-form-control-height-small: var(--op-space-medium);
--_op-form-control-height-medium: var(--op-space-large);
--_op-form-control-height-large: var(--op-space-x-large);
width: var(--__op-form-control-height);
height: var(--__op-form-control-height);
align-self: center;
margin: 0;
accent-color: var(--op-color-primary-base);
cursor: pointer;
& + label {
align-self: center;
}
}
/* Any Form Control that is not a radio or checkbox */
.form-control:not([type='radio'], [type='checkbox']) {
/* Public API (customizable component options) */
--_op-form-control-opacity-disabled: var(--op-opacity-disabled);
/* Private API (component option defaults) */
--__op-form-control-border-color: var(--op-color-neutral-plus-four);
display: block;
width: 100%;
min-width: var(--__op-form-control-height);
height: var(--__op-form-control-height);
border: none;
border-radius: var(--op-radius-medium);
appearance: none;
background-color: var(--op-color-neutral-plus-eight);
box-shadow: var(--op-border-all) var(--__op-form-control-border-color);
color: var(--op-color-neutral-on-plus-eight);
cursor: text;
font-size: var(--__op-form-control-font-size);
line-height: var(--op-line-height-base);
padding-block: var(--op-space-2x-small);
padding-inline: var(--op-space-small) var(--op-space-x-small);
/* Focus State */
&:focus,
&:focus-within,
&:focus-visible {
outline: none;
}
/* Hover State */
&:hover:not(:disabled, [readonly]) {
box-shadow: var(--op-border-all) var(--op-color-primary-plus-three);
}
&:focus-visible:not([readonly]) {
background-color: var(--op-color-primary-plus-seven);
box-shadow: var(--op-input-focus-primary);
color: var(--op-color-primary-on-plus-seven);
}
/* Borderless State */
&.form-control--no-border {
background-color: transparent;
box-shadow: none;
color: var(--op-color-primary-on-plus-max);
&:focus-visible:not([readonly]) {
background-color: var(--op-color-primary-plus-seven);
box-shadow: var(--op-input-focus-primary);
color: var(--op-color-primary-on-plus-seven);
}
/* Borderless + Hover State */
&:hover:not(:disabled, [readonly]) {
background-color: var(--op-color-primary-plus-eight);
box-shadow: inset var(--op-border-all) var(--op-color-primary-plus-two);
color: var(--op-color-primary-on-plus-eight);
}
}
}
/* Color Form Control */
.form-control[type='color'] {
padding: var(--op-space-2x-small);
cursor: pointer;
&::-webkit-color-swatch-wrapper {
padding: 0;
}
&::-webkit-color-swatch {
border: none;
border-radius: var(--op-radius-medium);
}
}
/* File Form Control */
.form-control[type='file'] {
padding-block: 0;
&::file-selector-button {
--__op-btn-base-height: var(--op-input-height-small);
--__op-btn-height: var(--__op-btn-base-height);
display: inline-flex;
min-height: var(--__op-btn-height);
align-items: center;
justify-content: center;
border: none;
border-radius: var(--op-radius-medium);
appearance: none;
background-color: var(--op-color-neutral-plus-eight);
box-shadow: inset var(--op-border-all) var(--op-color-neutral-plus-four);
color: var(--op-color-neutral-on-plus-eight);
cursor: pointer;
font-size: var(--op-font-x-small);
font-weight: var(--op-font-weight-normal);
gap: var(--op-space-x-small);
margin-block: calc((var(--__op-form-control-height) / 2) - (var(--__op-btn-height) / 2));
padding-block: 0;
padding-inline: var(--op-space-x-small);
text-align: center;
text-decoration: none;
transition: var(--op-transition-input);
white-space: nowrap;
}
&.form-control--small::file-selector-button {
--__op-btn-height: calc(var(--__op-btn-base-height) - var(--op-space-x-small));
}
}
select.form-control:not([multiple], [type='radio'], [type='checkbox']) {
appearance: none;
background-image: var(--op-encoded-images-dropdown-arrow);
background-position: center right;
background-position-x: calc(
100% - ((var(--op-space-3x-large) / 2) - (var(--op-encoded-images-dropdown-arrow-width) / 2))
);
background-repeat: no-repeat;
cursor: pointer;
padding-inline-end: var(--op-space-3x-large);
}
select.form-control[multiple] {
min-height: calc(2 * var(--__op-form-control-height));
}
textarea.form-control:not([type='radio'], [type='checkbox']) {
max-width: 100%;
height: calc(2 * var(--__op-form-control-height));
min-height: var(--__op-form-control-height);
}
.form-label {
color: var(--op-color-on-background);
font-size: var(--op-font-x-small);
font-weight: var(--op-font-weight-normal);
letter-spacing: var(--op-letter-spacing-label);
line-height: var(--op-line-height-base);
}
.form-error {
width: fit-content;
color: var(--op-color-alerts-danger-base);
font-size: var(--op-font-x-small);
}
.form-hint {
display: block;
font-size: var(--op-font-small);
font-style: italic;
}
.form-error-summary {
padding: var(--op-space-large);
border-radius: var(--op-radius-large);
background-color: var(--op-color-alerts-danger-plus-seven);
box-shadow: var(--op-border-all) var(--op-color-alerts-danger-on-plus-seven);
color: var(--op-color-alerts-danger-on-plus-seven);
margin-block-end: var(--op-space-large);
h2 {
font-size: var(--op-font-medium);
}
ul {
margin-block-end: 0;
}
}
.form-group {
display: grid;
align-content: baseline;
gap: var(--op-space-x-small);
grid-auto-rows: auto;
grid-template-columns: auto 1fr;
padding-block: var(--op-space-small);
padding-inline: 0;
/* Group Alignment */
/* stylelint-disable no-descending-specificity */
.form-label,
.form-error,
.form-hint,
.form-control:not([type='radio'], [type='checkbox']) {
grid-column: 1 / 3;
}
/* stylelint-enable no-descending-specificity */
.form-control[type='radio'],
.form-control[type='checkbox'] {
grid-column: 1 / 1;
& + .form-label {
grid-column: 2 / 3;
grid-row: 1;
}
}
}
.form-group--inline {
align-items: center;
/* Group Alignment */
/* stylelint-disable no-descending-specificity */
.form-label {
grid-column: unset;
}
.form-error,
.form-hint {
grid-column: 1 / 3;
}
.form-control:not([type='radio'], [type='checkbox']),
.switch {
grid-column: unset;
}
/* stylelint-enable no-descending-specificity */
}
.form-group--error {
/* stylelint-disable no-descending-specificity */
.form-control {
box-shadow: var(--op-border-all) var(--op-color-alerts-danger-base);
&[type='radio'],
&[type='checkbox'] {
box-shadow: none;
& + label {
color: var(--op-color-alerts-danger-minus-three);
font-weight: var(--op-font-weight-bold);
}
}
/* Error + Hover State */
&:hover:not(:disabled, [readonly]) {
background-color: var(--op-color-alerts-danger-plus-seven);
box-shadow: var(--op-border-all) var(--op-color-alerts-danger-minus-two);
color: var(--op-color-alerts-danger-on-plus-seven);
}
/* Readonly State */
&[readonly] {
box-shadow: none;
}
/* Error + Focus State */
&:focus-visible:not([readonly]) {
background-color: var(--op-color-alerts-danger-plus-seven);
box-shadow: var(--op-input-focus-danger);
color: var(--op-color-alerts-danger-on-plus-seven);
}
/* Borderless State */
&.form-control--no-border {
border-radius: 0;
box-shadow: var(--op-border-bottom) var(--op-color-alerts-danger-base);
/* Readonly State */
&[readonly] {
box-shadow: none;
}
/* Borderless + Focus State */
&:focus-visible:not([readonly]) {
background-color: var(--op-color-alerts-danger-plus-seven);
box-shadow: var(--op-border-bottom) var(--op-color-alerts-danger-base);
color: var(--op-color-alerts-danger-on-plus-seven);
}
/* Borderless + Hover State */
&:hover:not(:disabled, [readonly]) {
background-color: var(--op-color-alerts-danger-plus-eight);
box-shadow: var(--op-border-bottom) var(--op-color-alerts-danger-base);
color: var(--op-color-alerts-danger-on-plus-eight);
}
}
}
/* stylelint-enable no-descending-specificity */
}