hikari-components 0.2.1

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;

// ============================================
// Hikari Link Component
// Styled anchor with full state coverage,
// size variants, icon support, and glow
// ============================================

.hi-link {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    color: var(--hi-color-primary, var(--hi-primary, #FFB3A7));
    text-decoration: none;
    cursor: pointer;
    font-weight: 500;
    transition:
        color vars.$hikari-transition-fast,
        background-color vars.$hikari-transition-fast,
        transform vars.$hikari-transition-fast;
    position: relative;

    &:hover {
        color: var(--hi-button-primary-hover, rgba(255, 192, 203, 0.85));
        text-decoration: underline;
        text-underline-offset: 3px;
        text-decoration-thickness: 1px;
    }

    &:focus-visible {
        outline: 2px solid var(--hi-color-primary, var(--hi-primary));
        outline-offset: 2px;
        border-radius: 2px;
    }

    &:active {
        color: var(--hi-button-primary-dark, #FF9AA9);
        transform: scale(0.97);
    }

    &:visited {
        color: var(--hi-secondary, #519A73);
    }

    &.is-disabled,
    &[aria-disabled="true"],
    &:disabled {
        color: var(--hi-text-disabled, rgba(80, 97, 109, 0.35));
        cursor: not-allowed;
        text-decoration: none;
        pointer-events: none;
    }
}

// Size variants
.hi-link-xs {
    font-size: vars.$hikari-font-size-xs;
}

.hi-link-sm {
    font-size: vars.$hikari-font-size-sm;
}

.hi-link-md {
    font-size: vars.$hikari-font-size-base;
}

.hi-link-lg {
    font-size: vars.$hikari-font-size-lg;
}

// Color variants
.hi-link-default {
    color: var(--hi-color-primary, var(--hi-primary, #FFB3A7));

    &:hover {
        color: var(--hi-button-primary-hover, rgba(255, 192, 203, 0.85));
    }

    &:active {
        color: var(--hi-button-primary-dark, #FF9AA9);
    }
}

.hi-link-secondary {
    color: var(--hi-secondary, #519A73);

    &:hover {
        color: var(--hi-button-secondary-hover, rgba(81, 154, 115, 0.8));
    }

    &:active {
        color: var(--hi-button-secondary-dark, #3D7657);
    }
}

.hi-link-danger {
    color: var(--hi-danger, #FF4C00);

    &:hover {
        color: var(--hi-button-danger-hover, rgba(255, 76, 0, 0.8));
    }

    &:active {
        color: var(--hi-button-danger-dark, #CC3D00);
    }
}

// Icon variant (link with leading icon)
.hi-link-icon {
    gap: 0.375rem;

    svg,
    .hi-icon {
        width: 1em;
        height: 1em;
        flex-shrink: 0;
        transition: transform vars.$hikari-transition-fast;
    }

    &:hover svg,
    &:hover .hi-icon {
        transform: translateX(2px);
    }
}

// Underline mode (always underlined)
.hi-link-underlined {
    text-decoration: underline;
    text-underline-offset: 3px;

    &:hover {
        text-decoration-thickness: 2px;
    }
}

// Ghost variant (subtle, no underline until hover)
.hi-link-ghost {
    color: var(--hi-text-primary, #262626);

    &:hover {
        color: var(--hi-color-primary, var(--hi-primary, #FFB3A7));
        text-decoration: underline;
        text-underline-offset: 3px;
    }
}

// External link indicator
.hi-link-external::after {
    content: "";
    display: inline-block;
    width: 14px;
    height: 14px;
    margin-left: 4px;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6'/%3E%3Cpolyline points='15 3 21 3 21 9'/%3E%3Cline x1='10' y1='14' x2='21' y2='3'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: center;
    background-size: contain;
    opacity: 0.5;
    transition: opacity vars.$hikari-transition-fast;
}

.hi-link-external:hover::after {
    opacity: 1;
}

// Reduced motion support
@media (prefers-reduced-motion: reduce) {
    .hi-link {
        transition: none;
    }

    .hi-link:active {
        transform: none;
    }

    .hi-link-icon:hover svg,
    .hi-link-icon:hover .hi-icon {
        transform: none;
    }
}