UNPKG

@hummingbirdui/hummingbird

Version:

An open-source system designed for rapid development, without sacrificing the granular control of utility-first CSS.

341 lines (316 loc) 9.89 kB
@utility form-control-fill { @layer base { --input-font-size: var(--input-btn-font-size); --input-radius: var(--input-btn-radius); --input-padding-x: var(--input-btn-padding-x); --input-padding-y: var(--input-btn-padding-y); --input-line-height: var(--input-btn-line-height); --input-border-width: var(--input-btn-border-width); --input-border-color: transparent; --file-selector-btn-bg: var(--background-color-highlight); --file-selector-btn-color: var(--text-color-default); --file-selector-btn-hover-bg: var(--background-color-emphasis); --input-icon-spacing: --spacing(11); @apply w-full appearance-none inline-flex items-center justify-center transition duration-200 leading-[var(--input-line-height)] bg-[var(--input-bg)] text-[length:var(--input-font-size)] text-[var(--input-color)] rounded-[var(--input-radius)] border-[length:var(--input-border-width)] border-[var(--input-border-color)] px-[var(--input-padding-x)] py-[var(--input-padding-y)]; &:is(:disabled, [disabled]) { @apply bg-[var(--input-disabled-bg)]; } @variant hover { @apply bg-[var(--input-hover-bg)]; } &:focus-within, &:focus { @apply outline-0 bg-[var(--input-focus-bg)] border-[var(--input-focus-border-color)]; } &.is-invalid { @apply bg-[var(--color-danger-lighter)] border-[var(--color-danger)]; } &.is-valid { @apply bg-[var(--color-success-lighter)] border-[var(--color-success)]; } &[type='file'] { overflow: hidden; &:not(:disabled):not([readonly]) { cursor: pointer; } } &::file-selector-button { @apply pointer-events-none transition-[background] duration-200 bg-[var(--file-selector-btn-bg)] text-[var(--file-selector-btn-color)] font-semibold px-[var(--input-padding-x)] py-[var(--input-padding-y)] -mx-[var(--input-padding-x)] -my-[var(--input-padding-y)] me-[var(--input-padding-x)]; } &:hover:not(:disabled):not([readonly])::file-selector-button { --file-selector-btn-bg: var(--file-selector-btn-hover-bg); } &.is-invalid::file-selector-button { --file-selector-btn-bg: var(--color-danger); --file-selector-btn-color: var(--color-contrast); --file-selector-btn-hover-bg: var(--color-danger-dark); } &.is-valid::file-selector-button { --file-selector-btn-bg: var(--color-success); --file-selector-btn-color: var(--color-contrast); --file-selector-btn-hover-bg: var(--color-success-dark); } &:is(:disabled, [disabled])::file-selector-button { --file-selector-btn-bg: var(--background-color-muted); } } } @utility form-control { @layer base { --input-font-size: var(--input-btn-font-size); --input-radius: var(--input-btn-radius); --input-padding-x: var(--input-btn-padding-x); --input-padding-y: var(--input-btn-padding-y); --input-line-height: var(--input-btn-line-height); --input-border-width: var(--input-btn-border-width); --input-icon-spacing: --spacing(11); @apply w-full inline-flex items-center justify-center appearance-none transition duration-200 leading-[var(--input-line-height)] text-[length:var(--input-font-size)] text-[var(--input-color)] rounded-[var(--input-radius)] border-[length:var(--input-border-width)] border-[var(--input-border-color)] px-[var(--input-padding-x)] py-[var(--input-padding-y)]; @variant hover { @apply border-[var(--input-hover-border-color)]; } &:focus-within, &:focus { @apply outline-0 border-[var(--input-focus-border-color)]; } &:is(:disabled, [disabled]) { @apply opacity-50; @variant hover { @apply border-[var(--input-disabled-border-color)]; } } &.is-invalid { @apply border-[var(--color-danger)]; } &.is-valid { @apply border-[var(--color-success)]; } &[type='file'] { overflow: hidden; &:not(:disabled):not([readonly]) { cursor: pointer; } } &::file-selector-button { @apply pointer-events-none transition-[border] duration-200 font-semibold px-[var(--input-padding-x)] py-[var(--input-padding-y)] -mx-[var(--input-padding-x)] -my-[var(--input-padding-y)] me-[var(--input-padding-x)] border-r border-[var(--input-border-color)]; } } } @utility input-group-icon { @layer base { --input-icon-color: var(--color-active); --input-icon-font-size: var(--text-xl); --input-padding-x: var(--input-btn-padding-x); @apply relative; &:has(> .form-control-icon-start) { .form-control-fill, .form-control { @apply pl-[var(--input-icon-spacing)]; } } &:has(> .form-control-icon-end) { .form-control-fill, .form-control { @apply pr-[var(--input-icon-spacing)]; } } &:has(.form-control-sm) { .form-control-icon-start, .form-control-icon-end { --input-padding-x: --spacing(3); --input-icon-font-size: var(--text-sm); } } &:has(.form-control-lg) { .form-control-icon-start, .form-control-icon-end { --input-icon-font-size: var(--text-xl); } } } } @utility form-control-icon-start { @layer base { @apply absolute z-1 top-[50%] left-[var(--input-padding-x)] translate-y-[-50%] text-[length:var(--input-icon-font-size)] text-[var(--input-icon-color)]; } } @utility form-control-icon-end { @layer base { @apply absolute z-1 top-[50%] right-[var(--input-padding-x)] translate-y-[-50%] text-[length:var(--input-icon-font-size)] text-[var(--input-icon-color)]; } } @utility form-control-sm { @layer base { --input-padding-x: --spacing(3); --input-padding-y: --spacing(1.25); --input-radius: var(--radius-sm); --input-line-height: 1.25; --input-icon-spacing: --spacing(8.5); } } @utility form-control-lg { @layer base { --input-padding-y: --spacing(2.25); --input-font-size: var(--text-base); --input-icon-spacing: --spacing(12); } } @utility form-control-primary { @layer base { --file-selector-btn-bg: var(--color-primary); --file-selector-btn-color: var(--color-contrast); --file-selector-btn-hover-bg: var(--color-primary-dark); } } @utility form-control-secondary { @layer base { --input-focus-bg: var(--color-secondary-lighter); --input-focus-border-color: var(--color-secondary); --file-selector-btn-bg: var(--color-secondary); --file-selector-btn-color: var(--color-contrast); --file-selector-btn-hover-bg: var(--color-secondary-dark); } } @utility form-control-info { @layer base { --input-focus-bg: var(--color-info-lighter); --input-focus-border-color: var(--color-info); --file-selector-btn-bg: var(--color-info); --file-selector-btn-color: var(--color-contrast); --file-selector-btn-hover-bg: var(--color-info-dark); } } @utility form-control-success { @layer base { --input-focus-bg: var(--color-success-lighter); --input-focus-border-color: var(--color-success); --file-selector-btn-bg: var(--color-success); --file-selector-btn-color: var(--color-contrast); --file-selector-btn-hover-bg: var(--color-success-dark); } } @utility form-control-warning { @layer base { --input-focus-bg: var(--color-warning-lighter); --input-focus-border-color: var(--color-warning); --file-selector-btn-bg: var(--color-warning); --file-selector-btn-color: var(--color-contrast); --file-selector-btn-hover-bg: var(--color-warning-dark); } } @utility form-label { @layer base { --input-label-color: var(--text-color-muted); --input-label-font-size: var(--text-xs); --input-label-font-weight: 600; --input-label-bg: transparent; @apply font-[var(--input-label-font-weight)] text-[var(--input-label-color)] text-[length:var(--input-label-font-size)] bg-[var(--input-label-bg)]; } } @utility form-field { @layer base { @apply flex flex-col gap-1; &:where(:has(.form-control-fill, .form-control, .form-select-fill, .form-select)):focus-within { .form-label { --input-label-color: var(--color-primary); } } &:where(:has(.form-control-secondary, .form-select-secondary)):focus-within { .form-label { --input-label-color: var(--color-secondary); } } &:where(:has(.form-control-info, .form-select-info)):focus-within { .form-label { --input-label-color: var(--color-info); } } &:where(:has(.form-control-success, .form-select-success)):focus-within { .form-label { --input-label-color: var(--color-success); } } &:where(:has(.form-control-warning, .form-select-warning)):focus-within { .form-label { --input-label-color: var(--color-warning); } } &:where(:has(.is-invalid)), &:where(:has(.is-invalid)):focus-within { .form-label { --input-label-color: var(--color-danger); } } &:where(:has(.is-valid)), &:where(:has(.is-valid)):focus-within { .form-label { --input-label-color: var(--color-success); } } &:has(input[disabled]) { .form-label { --input-label-color: var(--color-disabled-color); @apply cursor-default; } } } } @utility form-text { @layer base { --form-text-margin-top: --spacing(1); --form-text-font-size: var(--text-xs); --form-text-font-weight: 400; --form-text-color: var(--text-color-muted); @apply mt-[var(--form-text-margin-top)] text-[length:var(--form-text-font-size)] font-[var(--form-text-font-weight)] text-[var(--form-text-color)]; } }