// BDS CardIcon Component Styles // Brand Design System - Icon card component with responsive sizing // // Naming Convention: BEM with 'bds' namespace // .bds-card-icon - Base card (responsive layout) // .bds-card-icon--neutral - Neutral color variant (gray tones) // .bds-card-icon--green - Green color variant // .bds-card-icon--hovered - Hovered state (triggers overlay animation) // .bds-card-icon--disabled - Disabled state modifier // .bds-card-icon__overlay - Hover gradient overlay (window shade animation) // .bds-card-icon__icon - Icon container (responsive size) // .bds-card-icon__icon-img - Icon image element // .bds-card-icon__content - Bottom content row // .bds-card-icon__label - Text label // .bds-card-icon__arrow - Arrow icon wrapper @import '../../../styles/breakpoints'; // ============================================================================= // Design Tokens // ============================================================================= // Focus border $bds-card-icon-focus-border-color: $black; $bds-card-icon-focus-border-width: 2px; // Animation (matching TileLogo/CardOffgrid) $bds-card-icon-transition-duration: 200ms; $bds-card-icon-transition-timing: cubic-bezier(0.98, 0.12, 0.12, 0.98); // ----------------------------------------------------------------------------- // Responsive Size Tokens // ----------------------------------------------------------------------------- // SM breakpoint (mobile - default) $bds-card-icon-height-sm: 136px; $bds-card-icon-padding-sm: 8px; $bds-card-icon-icon-size-sm: 56px; // MD breakpoint (tablet) $bds-card-icon-height-md: 140px; $bds-card-icon-padding-md: 12px; $bds-card-icon-icon-size-md: 60px; // LG breakpoint (desktop) $bds-card-icon-height-lg: 144px; $bds-card-icon-padding-lg: 16px; $bds-card-icon-icon-size-lg: 64px; // ============================================================================= // Base Card Styles // ============================================================================= .bds-card-icon { // Reset button/anchor styles appearance: none; border: none; background: none; margin: 0; font: inherit; color: inherit; text-decoration: none; text-align: left; // Layout position: relative; display: flex; flex-direction: column; justify-content: space-between; overflow: hidden; box-sizing: border-box; width: 100%; // Responsive sizing - SM (mobile-first) height: $bds-card-icon-height-sm; padding: $bds-card-icon-padding-sm; @media (min-width: map-get($grid-breakpoints, md)) { height: $bds-card-icon-height-md; padding: $bds-card-icon-padding-md; } @media (min-width: map-get($grid-breakpoints, lg)) { height: $bds-card-icon-height-lg; padding: $bds-card-icon-padding-lg; } // Interaction cursor: pointer; // Transitions transition: background-color $bds-card-icon-transition-duration $bds-card-icon-transition-timing, opacity $bds-card-icon-transition-duration $bds-card-icon-transition-timing; // Hover styles - prevent text underline &:hover { text-decoration: none; } // Focus styles &:focus { outline: $bds-card-icon-focus-border-width solid $bds-card-icon-focus-border-color; outline-offset: 1px; } &:focus:not(:focus-visible) { outline: none; } &:focus-visible { outline: $bds-card-icon-focus-border-width solid $bds-card-icon-focus-border-color; outline-offset: 2px; } } // ============================================================================= // Overlay (Color wipe animation - "Window Shade" effect) // ============================================================================= .bds-card-icon__overlay { position: absolute; inset: 0; pointer-events: none; z-index: 0; // Default: hidden (shade is "rolled up" at bottom) clip-path: inset(100% 0 0 0); transition: clip-path $bds-card-icon-transition-duration $bds-card-icon-transition-timing; } // Hovered state: shade fully raised (visible) .bds-card-icon--hovered .bds-card-icon__overlay { clip-path: inset(0 0 0 0); } // ============================================================================= // Icon Container // ============================================================================= .bds-card-icon__icon { position: relative; z-index: 1; display: flex; align-items: center; justify-content: center; // Responsive icon size - SM width: $bds-card-icon-icon-size-sm; height: $bds-card-icon-icon-size-sm; @media (min-width: map-get($grid-breakpoints, md)) { width: $bds-card-icon-icon-size-md; height: $bds-card-icon-icon-size-md; } @media (min-width: map-get($grid-breakpoints, lg)) { width: $bds-card-icon-icon-size-lg; height: $bds-card-icon-icon-size-lg; } } .bds-card-icon__icon-img { max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: contain; } // ============================================================================= // Content Row (Bottom) // ============================================================================= .bds-card-icon__content { position: relative; z-index: 1; display: flex; align-items: center; justify-content: space-between; width: 100%; } .bds-card-icon__label { // Typography from Figma - Body R token font-family: $font-family-sans-serif; font-weight: 400; color: $black; margin-bottom: 0; // SM/MD breakpoint (mobile-first) font-size: 16px; line-height: 26.1px; letter-spacing: 0px; // LG breakpoint (desktop) @media (min-width: map-get($grid-breakpoints, lg)) { font-size: 18px; line-height: 26.1px; letter-spacing: -0.5px; } } .bds-card-icon__arrow { flex-shrink: 0; color: $black; } // Arrow animation on hover - works for both and