hikari-components 0.2.0

Core UI components (40+) for the Hikari design system
// Use theme variables with namespace to avoid conflicts
@use 'variables' as vars;
@use 'mixins' as mix;
@use './card-vars.scss' as card-vars;

// ============================================
// Hikari Card Component
// Features: Elevated shadows, hover accent bar, smooth transitions
// Three-layer CSS variable system:
// - Layer1: Foundation variables (foundation.scss)
// - Layer2: Component variables (card-vars.scss)
// - Custom: Runtime overrides via AnimationBuilder
// ============================================

// ============================================
// Icon color inheritance for theme support
// ============================================

.hi-card,
.hi-card-header,
.hi-card-body,
.hi-card-footer {
  svg {
    color: inherit;
  }
}

// ============================================
// Base Card Styles
// ============================================

.hi-card {
  // Layer2 variables are defined in card-vars.scss

  // Layout
  display: flex;
  flex-direction: column;
  overflow: hidden;

  // Spacing
  margin: 0;

  // Appearance - use CSS variables
  border-radius: var(--hi-card-radius);
  border: var(--hi-card-border-width) var(--hi-card-border-style) var(--hi-card-border-color);

  // Background - use CSS variables
  background: var(--hi-card-bg);
  backdrop-filter: var(--hi-card-blur);

  // Shadow - use CSS variables
  box-shadow: var(--hi-card-shadow);

  // Position
  position: relative;
  overflow: visible;

  // Transitions - use CSS variables
  transition: var(--hi-card-transition);
}

// ============================================
// Card Header
// ============================================

.hi-card-header {
  position: relative;
  z-index: 1;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: var(--hi-card-padding-header);
  border-bottom: 1px solid var(--hi-card-divider-color);
  background: var(--hi-card-bg-header);
}

// Left section (avatar + title/subtitle)
.hi-card-header-left {
  display: flex;
  align-items: center;
  gap: var(--hi-card-gap);
  flex: 1;
}

// Avatar container
.hi-card-header-avatar {
  flex-shrink: 0;
}

// Right section (action buttons)
.hi-card-header-action {
  display: flex;
  align-items: center;
  margin-left: auto;
  flex-shrink: 0;

  button,
  .hi-icon-button {
    background: transparent;
  }

  .hi-card-extra {
    display: flex;
    align-items: center;
    gap: 0.5rem;
  }
}

// Title - use CSS variables
.hi-card-title {
  margin: 0;
  font-family: vars.$hikari-font-family-sans;
  font-size: var(--hi-card-title-font-size);
  font-weight: var(--hi-card-title-font-weight);
  color: var(--hi-card-title-color);
  letter-spacing: 0.02em;
}

// Subtitle - use CSS variables
.hi-card-subtitle {
  margin: 0.25rem 0 0 0;
  font-family: vars.$hikari-font-family-sans;
  font-size: var(--hi-card-subtitle-font-size);
  font-weight: 400;
  color: var(--hi-card-subtitle-color);
}

// ============================================
// Card Body
// ============================================

.hi-card-body {
  position: relative;
  z-index: 1;
  flex: 1;
  padding: var(--hi-card-padding-body);
  color: var(--hi-card-body-color);
  font-size: var(--hi-card-body-font-size);
  line-height: var(--hi-card-body-line-height);
}

// ============================================
// Card Footer
// ============================================

.hi-card-footer {
  position: relative;
  z-index: 1;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: var(--hi-card-padding-footer);
  border-top: 1px solid var(--hi-card-divider-color);
  background: var(--hi-card-bg-footer);

  .hi-card-actions {
    display: flex;
    gap: 0.5rem;
  }
}

// ============================================
// Card Media (images/videos)
// ============================================

.hi-card-media {
  width: 100%;
  object-fit: cover;
  border-bottom: 1px solid var(--hi-card-divider-color);
  display: block;
}

// ============================================
// Card Actions (MUI-style footer)
// ============================================

.hi-card-actions {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  padding: 0.5rem 1rem;
  gap: 0.5rem;

  &.hi-card-actions-no-spacing {
    gap: 0;
  }
}

// ============================================
// Cover Image
// ============================================

.hi-card-cover {
  width: 100%;
  height: 200px;
  object-fit: cover;
  border-bottom: 1px solid var(--hi-card-divider-color);
}

// ============================================
// Hoverable Card
// ============================================

.hi-card-hoverable {
  cursor: pointer;

  &:hover {
    border-color: var(--hi-card-border-color-hover);
    box-shadow: var(--hi-card-shadow-hover);
  }
}

// ============================================
// Loading State
// ============================================

.hi-card-loading {
  position: relative;
  overflow: hidden;
  pointer-events: none;

  &::after {
    content: '';
    position: absolute;
    top: 0;
    left: -100%;
    width: 100%;
    height: 100%;
    background: linear-gradient(
      90deg,
      transparent,
      var(--hi-white-10, rgba(255, 255, 255, 0.1)),
      transparent
    );
  }
}

// ============================================
// Card Variants - Variables defined in card-vars.scss
// ============================================

.hi-card-bordered {
  // Variables defined in card-vars.scss
}

.hi-card-flat {
  // Variables defined in card-vars.scss
  box-shadow: none;

  &:hover {
    transform: none;
    box-shadow: none;
  }
}

// ============================================
// Size Variants - Variables defined in card-vars.scss
// ============================================

.hi-card-sm,
.hi-card-md,
.hi-card-lg {
  // Size variables are already set by the classes in card-vars.scss
  
  .hi-card-cover {
    height: 150px;
  }
}

.hi-card-md .hi-card-cover {
  height: 200px;
}

.hi-card-lg .hi-card-cover {
  height: 280px;
}

// ============================================
// Grid Layout for Multiple Cards
// ============================================

.hi-card-grid {
  display: grid;
  gap: 1rem;

  &.hi-card-grid-2 {
    grid-template-columns: repeat(2, 1fr);
  }

  &.hi-card-grid-3 {
    grid-template-columns: repeat(3, 1fr);
  }

  &.hi-card-grid-4 {
    grid-template-columns: repeat(4, 1fr);
  }

  @media (max-width: 768px) {
    &.hi-card-grid-2,
    &.hi-card-grid-3,
    &.hi-card-grid-4 {
      grid-template-columns: 1fr;
    }
  }
}

// ============================================
// Animations
// ============================================

.hi-card-animate-in {
  // Animation handled by JS
}

// Staggered animation for card grids
.hi-card-stagger {
  .hi-card {
    opacity: 0;
  }
}

// ============================================
// Glow Effect (Mouse-following spotlight)
// ============================================

.hi-card-glow {
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 0;
  border-radius: inherit;
  opacity: 0;
  transition: opacity 0.3s ease-in-out;

  background: radial-gradient(
    circle at var(--hi-glow-x, 50%) var(--hi-glow-y, 50%),
    var(--hi-card-glow) 0%,
    transparent calc(var(--hi-glow-spread, 1.5) * 100%)
  );
}

.hi-card:hover .hi-card-glow {
  opacity: var(--hi-glow-opacity, 0.15);
}