/* bloom デザインシステム — base.html から外部化 (Phase 0) */
/* =========================================================================
   BUYMA-inspired tokens
   ========================================================================= */
:root {
    --coral:        #E85A71;
    --coral-dark:   #D14056;
    --coral-soft:   #FFF0F3;
    --coral-100:    #FFE0E6;
    --sale:         #E60012;

    --text:         #222222;
    --text-700:     #555555;
    --text-500:     #888888;
    --text-300:     #C8C8C8;

    --line:         #E5E5E5;
    --line-light:   #F0F0F0;

    --bg-white:     #FFFFFF;
    --bg-gray:      #F7F7F7;
    --bg-hover:     #FAFAFA;

    /* 後方互換 CSS vars (ink-*, paper-*, vermillion) が直接参照される場合のため */
    --ink-900: 34 34 34;
    --ink-800: 51 51 51;
    --ink-700: 85 85 85;
    --ink-500: 136 136 136;
    --ink-400: 170 170 170;
    --ink-300: 200 200 200;
    --ink-200: 229 229 229;
    --ink-100: 247 247 247;
    --paper: 255 255 255;
    --paper-raised: 255 255 255;
    --paper-warm: 250 250 250;
    --vermillion: 232 90 113;
    --aiiro: 232 90 113;
    --wakatake: 76 175 80;
    --asagi: 59 140 199;
    --yamabuki: 232 168 56;
    --enji: 209 64 86;
    --kohaku: 232 90 113;
    --sumi-success: 76 175 80;
    --sumi-warn:    232 168 56;
    --sumi-error:   230 0 18;
    --sumi-info:    59 140 199;

    --ease-out: cubic-bezier(0.2, 0, 0, 1);
    --dur-fast: 120ms;
    --dur-base: 200ms;
    --dur-slow: 320ms;

    /* aliases */
    --ease-sumi: cubic-bezier(0.2, 0, 0, 1);
}

html { background: var(--bg-white); color: var(--text); }
body {
    font-family: '"Noto Sans JP"', 'Inter', system-ui, sans-serif;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-rendering: optimizeLegibility;
    font-feature-settings: 'palt', 'kern';
    line-height: 1.7;
    letter-spacing: 0.01em;
    color: var(--text);
    background: var(--bg-white);
}
h1, h2, h3, h4 {
    font-family: '"Noto Sans JP"', 'Inter', sans-serif;
    font-weight: 700;
    letter-spacing: 0.01em;
    line-height: 1.4;
}
.tabular-nums { font-variant-numeric: tabular-nums; }
.numerals { font-variant-numeric: tabular-nums lining-nums; font-weight: 700; }

/* =========================================================================
   Scrollbar
   ========================================================================= */
::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: #D5D5D5; border-radius: 99px; }
::-webkit-scrollbar-thumb:hover { background: #AAA; }

/* =========================================================================
   Labels — clean Uppercase caps
   ========================================================================= */
.label-sumi {
    font-family: 'Inter', '"Noto Sans JP"', sans-serif;
    font-size: 0.6875rem;       /* 11px */
    font-weight: 500;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--text-500);
}
/* 旧 wa-luxury デザインの 単漢字 ラベルと no.XXX 通し番号は撤去 */
.label-kanji,
.label-serial {
    display: none !important;
}

/* =========================================================================
   Section heading
   ========================================================================= */
.section-heading {
    position: relative;
    padding-bottom: 0.75rem;
    border-bottom: 1px solid var(--line);
}
.section-heading::after {
    content: '';
    position: absolute;
    left: 0; bottom: -1px;
    width: 2.5rem; height: 2px;
    background: var(--coral);
    transform-origin: left;
}

.hairline        { border: 1px solid var(--line); }
.hairline-top    { border-top:    1px solid var(--line); }
.hairline-bottom { border-bottom: 1px solid var(--line); }
.hairline-left   { border-left:   1px solid var(--line); }
.hairline-right  { border-right:  1px solid var(--line); }

/* =========================================================================
   Buttons — BUYMA-style flat, moderate radius
   ========================================================================= */
.sumi-btn, .bloom-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    font-family: '"Noto Sans JP"', 'Inter', sans-serif;
    font-weight: 700;
    font-size: 0.8125rem;        /* 13px */
    padding: 0.5rem 1.25rem;
    border-radius: 4px;
    border: 1px solid transparent;
    cursor: pointer;
    transition: background-color var(--dur-base) var(--ease-out),
                border-color var(--dur-base) var(--ease-out),
                color var(--dur-base) var(--ease-out),
                box-shadow var(--dur-base) var(--ease-out),
                opacity var(--dur-base) var(--ease-out);
    text-decoration: none;
    letter-spacing: 0.02em;
    white-space: nowrap;
}
.sumi-btn:disabled, .bloom-btn:disabled {
    opacity: 0.4;
    cursor: not-allowed;
}
.sumi-btn:active:not(:disabled), .bloom-btn:active:not(:disabled) {
    transform: scale(0.97);
    transition: transform 0.1s var(--ease-spring);
}

/* Primary: coral (BUYMA) */
.sumi-btn-primary, .bloom-btn-primary {
    background: var(--coral);
    color: #fff;
    border-color: var(--coral);
    box-shadow: 0 1px 2px rgba(232,90,113,0.15);
}
.sumi-btn-primary:hover:not(:disabled),
.bloom-btn-primary:hover:not(:disabled) {
    background: var(--coral-dark);
    border-color: var(--coral-dark);
    box-shadow: 0 4px 12px rgba(232,90,113,0.25);
}

/* Accent: sale red (urgent only) */
.sumi-btn-accent, .bloom-btn-accent {
    background: var(--sale);
    color: #fff;
    border-color: var(--sale);
}
.sumi-btn-accent:hover:not(:disabled),
.bloom-btn-accent:hover:not(:disabled) {
    background: #C70010;
    border-color: #C70010;
}

/* Secondary: white + gray border */
.sumi-btn-secondary, .bloom-btn-secondary {
    background: var(--bg-white);
    color: var(--text);
    border-color: var(--line);
}
.sumi-btn-secondary:hover:not(:disabled),
.bloom-btn-secondary:hover:not(:disabled) {
    background: var(--bg-gray);
    border-color: #C8C8C8;
}

/* Ghost */
.sumi-btn-ghost, .bloom-btn-ghost {
    background: transparent;
    color: var(--text-700);
    border-color: transparent;
}
.sumi-btn-ghost:hover:not(:disabled),
.bloom-btn-ghost:hover:not(:disabled) {
    color: var(--text);
    background: var(--bg-gray);
}

/* Danger */
.sumi-btn-danger, .bloom-btn-danger {
    background: var(--bg-white);
    color: var(--sale);
    border-color: #F5C2C7;
}
.sumi-btn-danger:hover:not(:disabled),
.bloom-btn-danger:hover:not(:disabled) {
    background: #FFF5F6;
    border-color: var(--sale);
}

.sumi-btn-lg, .bloom-btn-lg {
    padding: 0.75rem 1.75rem;
    font-size: 0.9375rem;
}
.sumi-btn-sm, .bloom-btn-sm {
    padding: 0.375rem 0.875rem;
    font-size: 0.75rem;
}

/* =========================================================================
   Cards — clean white with hairline border
   ========================================================================= */
.sumi-card, .bloom-card {
    background: var(--bg-white);
    border: 1px solid var(--line);
    border-radius: 4px;
    transition: border-color var(--dur-base) var(--ease-out),
                box-shadow   var(--dur-base) var(--ease-out);
}
.sumi-card-hover:hover, .bloom-card-hover:hover {
    border-color: #C8C8C8;
    box-shadow: 0 4px 16px rgba(0,0,0,0.06);
}
.sumi-card-interactive:hover, .bloom-card-interactive:hover {
    border-color: var(--coral);
    box-shadow: 0 4px 16px rgba(232,90,113,0.12);
}
.bloom-glass-card {
    background: var(--bg-white);
    border: 1px solid var(--line);
    border-radius: 4px;
}

/* =========================================================================
   Badges — pill, subtle
   ========================================================================= */
.sumi-badge, .bloom-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.375rem;
    padding: 0.125rem 0.5rem;
    font-size: 0.6875rem;
    font-weight: 700;
    letter-spacing: 0.04em;
    border-radius: 2px;
    background: var(--bg-gray);
    color: var(--text-700);
    border: 1px solid transparent;
}
.sumi-badge-dot, .bloom-badge-dot {
    width: 6px; height: 6px;
    border-radius: 50%;
    flex-shrink: 0;
    background: currentColor;
}

/* =========================================================================
   Inputs — clean with focus-ring
   ========================================================================= */
.sumi-input, .bloom-input {
    background: var(--bg-white);
    border: 1px solid var(--line);
    border-radius: 4px;
    color: var(--text);
    font-family: '"Noto Sans JP"', 'Inter', sans-serif;
    transition: border-color var(--dur-base) var(--ease-out),
                box-shadow   var(--dur-base) var(--ease-out);
}
.sumi-input:hover:not(:focus), .bloom-input:hover:not(:focus) {
    border-color: #C8C8C8;
}
.sumi-input:focus, .bloom-input:focus {
    border-color: var(--coral);
    outline: none;
    box-shadow: 0 0 0 3px rgba(232,90,113,0.12);
    background: var(--bg-white);
}
.sumi-input::placeholder, .bloom-input::placeholder {
    color: var(--text-500);
}

/* =========================================================================
   Progress — subtle
   ========================================================================= */
.bloom-progress {
    height: 4px;
    background: var(--line-light);
    border-radius: 99px;
    overflow: hidden;
}
.bloom-progress-fill {
    height: 100%;
    background: var(--coral);
    border-radius: 99px;
    transition: width 0.6s var(--ease-out);
}

.bloom-skeleton {
    background: linear-gradient(90deg, var(--bg-gray) 0%, var(--line-light) 30%, var(--bg-gray) 60%);
    background-size: 300% 100%;
    animation: skeletonWave 1.8s ease-in-out infinite;
    border-radius: 4px;
}

/* =========================================================================
   Sidebar — BUYMA-style light/airy with dark text
   ========================================================================= */
.sidebar-link {
    display: flex;
    align-items: center;
    padding: 0.625rem 1.25rem;
    margin: 0;
    font-size: 0.8125rem;
    font-weight: 500;
    color: var(--text-700);
    transition: color var(--dur-base) var(--ease-out),
                background-color var(--dur-base) var(--ease-out);
    text-decoration: none;
    gap: 0.75rem;
    letter-spacing: 0.02em;
    border-left: 3px solid transparent;
    position: relative;
}
.sidebar-link:hover {
    color: var(--text);
    background: var(--bg-gray);
}
.sidebar-link.active {
    color: var(--coral);
    background: var(--coral-soft);
    border-left-color: var(--coral);
    font-weight: 700;
}

/* =========================================================================
   Status colors
   ========================================================================= */
.status-queued     { color: var(--text-500); }
.status-processing { color: #3B8CC7; }
.status-completed  { color: #4CAF50; }
.status-failed     { color: var(--sale); }
.status-canceled   { color: var(--text-500); }

.text-sumi-success { color: #4CAF50; }
.text-sumi-warn    { color: #E8A838; }
.text-sumi-error   { color: var(--sale); }
.text-sumi-info    { color: #3B8CC7; }

/* =========================================================================
   Spinner
   ========================================================================= */
@keyframes sumi-spin { to { transform: rotate(360deg); } }
.bloom-spinner {
    display: inline-block;
    width: 14px; height: 14px;
    border: 2px solid rgb(255 255 255 / 0.3);
    border-top-color: #fff;
    border-radius: 50%;
    animation: sumi-spin 0.6s linear infinite;
    vertical-align: middle;
}
.bloom-spinner-dark {
    border-color: rgba(0,0,0,0.1);
    border-top-color: var(--coral);
}
@keyframes pulse-dot { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } }
.animate-pulse-dot { animation: pulse-dot 1.5s ease-in-out infinite; }

/* =========================================================================
   Link underline
   ========================================================================= */
.bloom-link-underline, .sumi-link {
    position: relative;
    text-decoration: none;
    color: var(--coral);
    font-weight: 500;
}
.bloom-link-underline:hover, .sumi-link:hover {
    color: var(--coral-dark);
    text-decoration: underline;
    text-underline-offset: 3px;
}

/* =========================================================================
   Table rows
   ========================================================================= */
.bloom-table-row, .sumi-row {
    transition: background-color var(--dur-fast) var(--ease-out);
}
.bloom-table-row:hover, .sumi-row:hover {
    background-color: var(--bg-hover);
}

/* =========================================================================
   Backward-compat (wa-luxury 装飾は BUYMA スタイルで無効化/差替え)
   ========================================================================= */
.bloom-gradient-hero,
.bloom-mesh-bg,
.bloom-mesh-animated {
    background: var(--bg-white);
    position: relative;
    overflow: hidden;
}
.seigaiha-bg, .asanoha-bg,
.kado-top-left, .kado-top-right,
.kado-bottom-left, .kado-bottom-right,
.fude-divider { display: none !important; }
.hanko { display: none !important; }
.bloom-text-gradient { color: var(--text); background: none; -webkit-text-fill-color: initial; }
.bloom-glow, .bloom-glow-animate { box-shadow: none; }
.bloom-glass { background: rgb(255 255 255 / 0.92); backdrop-filter: blur(8px); }
.kanji-step { font-family: '"Noto Sans JP"', sans-serif; font-weight: 700; }

/* =========================================================================
   Tooltip
   ========================================================================= */
[data-tooltip] { position: relative; }
[data-tooltip]:hover::after {
    content: attr(data-tooltip);
    position: absolute;
    bottom: calc(100% + 6px);
    left: 50%;
    transform: translateX(-50%);
    padding: 5px 10px;
    background: var(--text);
    color: #fff;
    font-size: 0.6875rem;
    letter-spacing: 0.03em;
    border-radius: 3px;
    white-space: nowrap;
    pointer-events: none;
    z-index: 50;
    animation: fadeIn 0.15s ease-out;
}

.bloom-divider, .sumi-divider {
    border: none;
    height: 1px;
    background: var(--line);
}

.animate-page-enter { animation: pageEnter 0.35s var(--ease-out) forwards; }

.htmx-indicator { opacity: 0; transition: opacity 0.3s ease; }
.htmx-request .htmx-indicator,
.htmx-request.htmx-indicator { opacity: 1; }

/* =========================================================================
   Keyframes (declared explicitly so CSS animations always run,
   regardless of Tailwind CDN's JIT emission)
   ========================================================================= */
@keyframes fadeIn       { 0%{opacity:0} 100%{opacity:1} }
@keyframes fadeInUp     { 0%{opacity:0;transform:translateY(8px)} 100%{opacity:1;transform:translateY(0)} }
@keyframes fadeInDown   { 0%{opacity:0;transform:translateY(-4px)} 100%{opacity:1;transform:translateY(0)} }
@keyframes scaleIn      { 0%{opacity:0;transform:scale(.97)} 100%{opacity:1;transform:scale(1)} }
@keyframes slideInRight { 0%{opacity:0;transform:translateX(8px)} 100%{opacity:1;transform:translateX(0)} }
@keyframes slideInLeft  { 0%{opacity:0;transform:translateX(-8px)} 100%{opacity:1;transform:translateX(0)} }
@keyframes pageEnter    { 0%{opacity:0;transform:translateY(6px)} 100%{opacity:1;transform:translateY(0)} }
@keyframes pulseSoft    { 0%,100%{opacity:1} 50%{opacity:.5} }
@keyframes skeletonWave { 0%{background-position:-200% 0} 100%{background-position:200% 0} }
@keyframes hairlineReveal { 0%{transform:scaleX(0);transform-origin:left} 100%{transform:scaleX(1);transform-origin:left} }

/* =========================================================================
   Stagger — start visible (opacity 1) to avoid any “invisible” glitch
   if animations don’t run. Transform still animates for subtle lift.
   ========================================================================= */
.stagger-children > * {
    animation: fadeInUp 0.35s var(--ease-out) both;
}
.stagger-children > *:nth-child(1) { animation-delay: 0s; }
.stagger-children > *:nth-child(2) { animation-delay: 0.04s; }
.stagger-children > *:nth-child(3) { animation-delay: 0.08s; }
.stagger-children > *:nth-child(4) { animation-delay: 0.12s; }
.stagger-children > *:nth-child(5) { animation-delay: 0.16s; }
.stagger-children > *:nth-child(6) { animation-delay: 0.20s; }
.stagger-children > *:nth-child(7) { animation-delay: 0.24s; }
.stagger-children > *:nth-child(8) { animation-delay: 0.28s; }
.stagger-children > *:nth-child(n+9) { animation-delay: 0.32s; }

.stagger-rows tbody tr {
    animation: fadeInUp 0.3s var(--ease-out) both;
}
.stagger-rows tbody tr:nth-child(1) { animation-delay: 0s; }
.stagger-rows tbody tr:nth-child(2) { animation-delay: 0.03s; }
.stagger-rows tbody tr:nth-child(3) { animation-delay: 0.06s; }
.stagger-rows tbody tr:nth-child(4) { animation-delay: 0.09s; }
.stagger-rows tbody tr:nth-child(5) { animation-delay: 0.12s; }
.stagger-rows tbody tr:nth-child(n+6) { animation-delay: 0.15s; }

/* =========================================================================
   Focus ring
   ========================================================================= */
.bloom-focus-ring:focus-visible,
.sumi-focus:focus-visible {
    outline: 2px solid var(--coral);
    outline-offset: 2px;
}

/* =========================================================================
   Glitch (error pages) — BUYMA style = subtle
   ========================================================================= */
.bloom-glitch { animation: none; color: var(--text); }

/* =========================================================================
   Reduced motion / print
   ========================================================================= */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
    }
}
@media print {
    body { background: #fff; color: #000; }
}

/* =========================================================================
   Scroll reveal — .reveal クラスでスクロール出現
   ========================================================================= */
.reveal {
    opacity: 0;
    transform: translateY(28px);
    transition: opacity 0.7s cubic-bezier(0.22, 0.61, 0.36, 1),
                transform 0.7s cubic-bezier(0.22, 0.61, 0.36, 1);
}
.reveal.reveal-in {
    opacity: 1;
    transform: none;
}

/* =========================================================================
   View Transitions API — MPAのままSPA級のページ遷移を実現
   Chrome 111+ で有効。非対応ブラウザは通常のページ遷移に自然にフォールバック
   ========================================================================= */
@view-transition {
    navigation: auto;
}
::view-transition-old(root),
::view-transition-new(root) {
    animation-duration: 0.22s;
    animation-timing-function: var(--ease-out);
}

/* =========================================================================
   Motion tokens — スプリング近似イージング（Motion One 不使用、CSSのみ）
   ========================================================================= */
:root {
    --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
}

/* =========================================================================
   マイクロインタラクション — 入力エラー / 汎用ホバーリフト
   ========================================================================= */
@keyframes shake {
    10%, 90% { transform: translateX(-1px); }
    20%, 80% { transform: translateX(2px); }
    30%, 50%, 70% { transform: translateX(-4px); }
    40%, 60% { transform: translateX(4px); }
}
.sumi-input-error, .bloom-input-error {
    border-color: var(--sale) !important;
    animation: shake 0.4s var(--ease-out);
}

/* 汎用ホバーリフト（インラインJSでのカードホバーを置き換える共通クラス） */
.bloom-lift-hover {
    transition: transform var(--dur-base) var(--ease-out),
                border-color var(--dur-base) var(--ease-out),
                box-shadow var(--dur-base) var(--ease-out);
}
.bloom-lift-hover:hover {
    transform: translateY(-2px);
    border-color: var(--coral);
    box-shadow: 0 4px 16px rgba(232,90,113,0.10);
}

/* =========================================================================
   Native <dialog> 共通スタイル — bloomConfirm・解約モーダル等で使用
   ========================================================================= */
.bloom-dialog {
    padding: 0;
    border: none;
    background: transparent;
    max-height: 90vh;
}
.bloom-dialog::backdrop {
    background: rgba(0, 0, 0, 0.4);
    backdrop-filter: blur(2px);
}
.bloom-dialog[open] {
    animation: scaleIn 0.2s var(--ease-out) forwards;
}
@media (prefers-reduced-motion: reduce) {
    .bloom-dialog[open] { animation: none; }
}
