555 lines
9.8 KiB
CSS
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;
|
|
}
|