protokit-ui
Version:
A comprehensive React component library with hand-drawn design system. Features 30+ beautiful, accessible components including buttons, forms, navigation, data display, and layout components. Built with TypeScript and styled with CSS for modern React appl
137 lines (118 loc) • 2.9 kB
CSS
.paper-textarea-wrapper {
position: relative;
width: 100%;
}
.paper-textarea {
font-family: var(--font-family);
width: 100%;
border: 2px solid var(--ink-black);
border-radius: var(--radius-md);
padding: var(--spacing-sm) var(--spacing-md);
background: var(--paper-white);
font-size: var(--font-size-base);
transition: all var(--transition-normal);
outline: none;
color: var(--ink-black);
position: relative;
resize: vertical;
min-height: 100px;
line-height: 1.5;
}
.paper-textarea::placeholder {
color: var(--ink-light);
font-family: var(--font-family);
}
/* Focus state */
.paper-textarea:focus {
border-style: dashed;
border-width: 3px;
box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.1);
transform: translateY(-1px);
}
/* Error state */
.paper-textarea--error {
border-color: var(--error-red);
animation: shake 0.5s ease-in-out;
}
.paper-textarea--error:focus {
border-color: var(--error-red);
box-shadow: 0 0 0 2px rgba(255, 107, 107, 0.2);
}
/* Disabled state */
.paper-textarea--disabled {
border-color: var(--pencil-gray);
background: var(--paper-gray);
color: var(--pencil-gray);
cursor: not-allowed;
resize: none;
}
.paper-textarea--disabled::placeholder {
color: var(--pencil-gray);
}
/* Error message */
.paper-textarea__error {
color: var(--error-red);
font-size: var(--font-size-sm);
margin-top: var(--spacing-xs);
font-family: var(--font-family);
position: relative;
padding-left: var(--spacing-sm);
}
.paper-textarea__error::before {
content: '⚠';
position: absolute;
left: 0;
top: 0;
}
/* Character counter */
.paper-textarea__counter {
color: var(--ink-light);
font-size: var(--font-size-sm);
margin-top: var(--spacing-xs);
font-family: var(--font-family);
text-align: right;
}
/* Hand-drawn border effect */
.paper-textarea::before {
content: '';
position: absolute;
top: -1px;
left: -1px;
right: -1px;
bottom: -1px;
border: 1px solid var(--ink-black);
border-radius: var(--radius-md);
opacity: 0.3;
pointer-events: none;
transition: opacity var(--transition-normal);
}
.paper-textarea:focus::before {
opacity: 0.1;
}
/* Shake animation for error state */
@keyframes shake {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-2px); }
75% { transform: translateX(2px); }
}
/* Hover state */
.paper-textarea:hover:not(.paper-textarea--disabled) {
border-color: var(--ink-gray);
transform: translateY(-1px);
}
/* Success state */
.paper-textarea--success {
border-color: var(--success-green);
}
.paper-textarea--success:focus {
border-color: var(--success-green);
box-shadow: 0 0 0 2px rgba(81, 207, 102, 0.2);
}
/* Warning state */
.paper-textarea--warning {
border-color: var(--warning-yellow);
}
.paper-textarea--warning:focus {
border-color: var(--warning-yellow);
box-shadow: 0 0 0 2px rgba(255, 212, 59, 0.2);
}