/** * 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; }