555 lines
9.8 KiB
CSS

/**
* Design System Utility Classes
* These classes provide consistent spacing, layout patterns, and component styles
*/
/* ===== LAYOUT UTILITIES ===== */
.cp-container {
width: 100%;
margin-left: auto;
margin-right: auto;
padding-left: var(--cp-page-padding-sm);
padding-right: var(--cp-page-padding-sm);
}
@media (min-width: 640px) {
.cp-container {
max-width: var(--cp-container-sm);
padding-left: var(--cp-page-padding);
padding-right: var(--cp-page-padding);
}
}
@media (min-width: 768px) {
.cp-container {
max-width: var(--cp-container-md);
}
}
@media (min-width: 1024px) {
.cp-container {
max-width: var(--cp-container-lg);
}
}
@media (min-width: 1280px) {
.cp-container {
max-width: var(--cp-container-xl);
}
}
@media (min-width: 1536px) {
.cp-container {
max-width: var(--cp-container-2xl);
}
}
/* Page layout utilities */
.cp-page {
min-height: 100vh;
display: flex;
flex-direction: column;
}
.cp-page-header {
padding: var(--cp-space-4) var(--cp-page-padding);
border-bottom: 1px solid var(--border);
background: var(--background);
}
.cp-page-content {
flex: 1;
padding: var(--cp-page-padding);
}
.cp-page-footer {
padding: var(--cp-space-4) var(--cp-page-padding);
border-top: 1px solid var(--border);
background: var(--muted);
}
/* ===== SPACING UTILITIES ===== */
/* Stack - vertical spacing between children */
.cp-stack > * + * {
margin-top: var(--cp-space-4);
}
.cp-stack-xs > * + * {
margin-top: var(--cp-space-1);
}
.cp-stack-sm > * + * {
margin-top: var(--cp-space-2);
}
.cp-stack-md > * + * {
margin-top: var(--cp-space-3);
}
.cp-stack-lg > * + * {
margin-top: var(--cp-space-4);
}
.cp-stack-xl > * + * {
margin-top: var(--cp-space-6);
}
.cp-stack-2xl > * + * {
margin-top: var(--cp-space-8);
}
/* Inline - horizontal spacing between children */
.cp-inline {
display: flex;
align-items: center;
gap: var(--cp-space-4);
}
.cp-inline-xs {
display: flex;
align-items: center;
gap: var(--cp-space-1);
}
.cp-inline-sm {
display: flex;
align-items: center;
gap: var(--cp-space-2);
}
.cp-inline-md {
display: flex;
align-items: center;
gap: var(--cp-space-3);
}
.cp-inline-lg {
display: flex;
align-items: center;
gap: var(--cp-space-4);
}
.cp-inline-xl {
display: flex;
align-items: center;
gap: var(--cp-space-6);
}
/* Grid utilities */
.cp-grid {
display: grid;
gap: var(--cp-space-4);
}
.cp-grid-xs {
display: grid;
gap: var(--cp-space-1);
}
.cp-grid-sm {
display: grid;
gap: var(--cp-space-2);
}
.cp-grid-md {
display: grid;
gap: var(--cp-space-3);
}
.cp-grid-lg {
display: grid;
gap: var(--cp-space-4);
}
.cp-grid-xl {
display: grid;
gap: var(--cp-space-6);
}
/* Responsive grid columns */
.cp-grid-cols-1 {
grid-template-columns: repeat(1, minmax(0, 1fr));
}
.cp-grid-cols-2 {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.cp-grid-cols-3 {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.cp-grid-cols-4 {
grid-template-columns: repeat(4, minmax(0, 1fr));
}
.cp-grid-cols-5 {
grid-template-columns: repeat(5, minmax(0, 1fr));
}
.cp-grid-cols-6 {
grid-template-columns: repeat(6, minmax(0, 1fr));
}
@media (min-width: 640px) {
.cp-sm\:grid-cols-1 {
grid-template-columns: repeat(1, minmax(0, 1fr));
}
.cp-sm\:grid-cols-2 {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.cp-sm\:grid-cols-3 {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.cp-sm\:grid-cols-4 {
grid-template-columns: repeat(4, minmax(0, 1fr));
}
}
@media (min-width: 768px) {
.cp-md\:grid-cols-1 {
grid-template-columns: repeat(1, minmax(0, 1fr));
}
.cp-md\:grid-cols-2 {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.cp-md\:grid-cols-3 {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.cp-md\:grid-cols-4 {
grid-template-columns: repeat(4, minmax(0, 1fr));
}
}
@media (min-width: 1024px) {
.cp-lg\:grid-cols-1 {
grid-template-columns: repeat(1, minmax(0, 1fr));
}
.cp-lg\:grid-cols-2 {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.cp-lg\:grid-cols-3 {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.cp-lg\:grid-cols-4 {
grid-template-columns: repeat(4, minmax(0, 1fr));
}
}
/* ===== COMPONENT UTILITIES ===== */
/* Card base styles */
.cp-card {
background: var(--card);
border: 1px solid var(--border);
border-radius: var(--cp-card-radius);
box-shadow: var(--cp-card-shadow);
padding: var(--cp-card-padding);
color: var(--card-foreground);
}
.cp-card-sm {
padding: var(--cp-card-padding-sm);
}
.cp-card-lg {
border-radius: var(--cp-card-radius-lg);
box-shadow: var(--cp-card-shadow-lg);
}
/* Badge/Pill styles */
.cp-badge {
display: inline-flex;
align-items: center;
border-radius: var(--cp-badge-radius);
padding: var(--cp-badge-padding-y) var(--cp-badge-padding-x);
font-size: var(--cp-badge-font-size);
font-weight: var(--cp-badge-font-weight);
line-height: 1;
white-space: nowrap;
}
.cp-badge-primary {
background: var(--primary);
color: var(--primary-foreground);
}
.cp-badge-secondary {
background: var(--secondary);
color: var(--secondary-foreground);
}
.cp-badge-success {
background: var(--cp-success);
color: var(--cp-success-foreground);
}
.cp-badge-warning {
background: var(--cp-warning);
color: var(--cp-warning-foreground);
}
.cp-badge-error {
background: var(--cp-error);
color: var(--cp-error-foreground);
}
.cp-badge-info {
background: var(--cp-info);
color: var(--cp-info-foreground);
}
.cp-badge-outline {
background: transparent;
border: 1px solid currentColor;
}
/* Loading states */
.cp-skeleton {
background: var(--cp-skeleton-base);
border-radius: var(--cp-radius-md);
position: relative;
overflow: hidden;
}
.cp-skeleton::after {
content: "";
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background: linear-gradient(90deg, transparent, var(--cp-skeleton-shimmer), transparent);
animation: cp-skeleton-shimmer 2s infinite;
}
@keyframes cp-skeleton-shimmer {
0% {
transform: translateX(-100%);
}
100% {
transform: translateX(100%);
}
}
/* Focus utilities */
.cp-focus-ring {
outline: var(--cp-focus-ring);
outline-offset: var(--cp-focus-ring-offset);
}
.cp-focus-visible:focus-visible {
outline: var(--cp-focus-ring);
outline-offset: var(--cp-focus-ring-offset);
}
/* ===== ANIMATION UTILITIES ===== */
.cp-transition {
transition-property:
color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow,
transform, filter, backdrop-filter;
transition-timing-function: var(--cp-ease-in-out);
transition-duration: var(--cp-duration-150);
}
.cp-transition-fast {
transition-duration: var(--cp-duration-75);
}
.cp-transition-normal {
transition-duration: var(--cp-duration-150);
}
.cp-transition-slow {
transition-duration: var(--cp-duration-300);
}
/* Hover and interaction states */
.cp-hover-lift:hover {
transform: translateY(-2px);
box-shadow: var(--cp-shadow-lg);
}
.cp-hover-scale:hover {
transform: scale(1.02);
}
/* ===== RESPONSIVE UTILITIES ===== */
/* Hide/show at different breakpoints */
.cp-hidden {
display: none;
}
.cp-block {
display: block;
}
.cp-inline {
display: inline;
}
.cp-inline-block {
display: inline-block;
}
.cp-flex {
display: flex;
}
.cp-inline-flex {
display: inline-flex;
}
.cp-grid {
display: grid;
}
@media (min-width: 640px) {
.cp-sm\:hidden {
display: none;
}
.cp-sm\:block {
display: block;
}
.cp-sm\:inline {
display: inline;
}
.cp-sm\:inline-block {
display: inline-block;
}
.cp-sm\:flex {
display: flex;
}
.cp-sm\:inline-flex {
display: inline-flex;
}
.cp-sm\:grid {
display: grid;
}
}
@media (min-width: 768px) {
.cp-md\:hidden {
display: none;
}
.cp-md\:block {
display: block;
}
.cp-md\:inline {
display: inline;
}
.cp-md\:inline-block {
display: inline-block;
}
.cp-md\:flex {
display: flex;
}
.cp-md\:inline-flex {
display: inline-flex;
}
.cp-md\:grid {
display: grid;
}
}
@media (min-width: 1024px) {
.cp-lg\:hidden {
display: none;
}
.cp-lg\:block {
display: block;
}
.cp-lg\:inline {
display: inline;
}
.cp-lg\:inline-block {
display: inline-block;
}
.cp-lg\:flex {
display: flex;
}
.cp-lg\:inline-flex {
display: inline-flex;
}
.cp-lg\:grid {
display: grid;
}
}
/* ===== TEXT UTILITIES ===== */
.cp-text-xs {
font-size: var(--cp-text-xs);
}
.cp-text-sm {
font-size: var(--cp-text-sm);
}
.cp-text-base {
font-size: var(--cp-text-base);
}
.cp-text-lg {
font-size: var(--cp-text-lg);
}
.cp-text-xl {
font-size: var(--cp-text-xl);
}
.cp-text-2xl {
font-size: var(--cp-text-2xl);
}
.cp-text-3xl {
font-size: var(--cp-text-3xl);
}
.cp-font-light {
font-weight: var(--cp-font-light);
}
.cp-font-normal {
font-weight: var(--cp-font-normal);
}
.cp-font-medium {
font-weight: var(--cp-font-medium);
}
.cp-font-semibold {
font-weight: var(--cp-font-semibold);
}
.cp-font-bold {
font-weight: var(--cp-font-bold);
}
.cp-leading-tight {
line-height: var(--cp-leading-tight);
}
.cp-leading-normal {
line-height: var(--cp-leading-normal);
}
.cp-leading-relaxed {
line-height: var(--cp-leading-relaxed);
}
.cp-text-center {
text-align: center;
}
.cp-text-left {
text-align: left;
}
.cp-text-right {
text-align: right;
}
.cp-truncate {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* ===== ACCESSIBILITY UTILITIES ===== */
.cp-sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
.cp-not-sr-only {
position: static;
width: auto;
height: auto;
padding: 0;
margin: 0;
overflow: visible;
clip: auto;
white-space: normal;
}