|
24 | 24 | isTenhou: boolean; |
25 | 25 | /** Whether chiihou */ |
26 | 26 | isChiihou: boolean; |
| 27 | + /** Whether hand has open melds (chi, pon, open kan) */ |
| 28 | + hasOpenMelds?: boolean; |
27 | 29 | /** Callback for any option change */ |
28 | 30 | onChange: () => void; |
29 | 31 | } |
|
40 | 42 | isChankan = $bindable(), |
41 | 43 | isTenhou = $bindable(), |
42 | 44 | isChiihou = $bindable(), |
| 45 | + hasOpenMelds = false, |
43 | 46 | onChange, |
44 | 47 | }: Props = $props(); |
45 | 48 |
|
| 49 | + // When hand becomes open, uncheck riichi-related options |
| 50 | + $effect(() => { |
| 51 | + if (hasOpenMelds) { |
| 52 | + if (isRiichi) isRiichi = false; |
| 53 | + if (isDoubleRiichi) isDoubleRiichi = false; |
| 54 | + if (isIppatsu) isIppatsu = false; |
| 55 | + } |
| 56 | + }); |
| 57 | +
|
46 | 58 | const winds = ['east', 'south', 'west', 'north'] as const; |
47 | 59 | const windSymbols = { east: '東', south: '南', west: '西', north: '北' }; |
48 | 60 |
|
|
138 | 150 | <!-- Riichi Options --> |
139 | 151 | <div class="option-section"> |
140 | 152 | <h3 class="section-title">Riichi</h3> |
| 153 | + {#if hasOpenMelds} |
| 154 | + <div class="open-hand-notice"> |
| 155 | + 🔓 Open hand — Riichi not available |
| 156 | + </div> |
| 157 | + {/if} |
141 | 158 | <div class="checkbox-group"> |
142 | | - <label class="checkbox-item"> |
| 159 | + <label class="checkbox-item" class:disabled={hasOpenMelds}> |
143 | 160 | <input |
144 | 161 | type="checkbox" |
145 | 162 | bind:checked={isRiichi} |
| 163 | + disabled={hasOpenMelds} |
146 | 164 | onchange={handleRiichiChange} |
147 | 165 | /> |
148 | 166 | <span class="checkbox-label">Riichi</span> |
149 | 167 | <span class="han-indicator">+1 han</span> |
150 | 168 | </label> |
151 | | - <label class="checkbox-item" class:disabled={!isRiichi}> |
| 169 | + <label class="checkbox-item" class:disabled={hasOpenMelds || !isRiichi}> |
152 | 170 | <input |
153 | 171 | type="checkbox" |
154 | 172 | bind:checked={isDoubleRiichi} |
155 | | - disabled={!isRiichi} |
| 173 | + disabled={hasOpenMelds || !isRiichi} |
156 | 174 | onchange={handleDoubleRiichiChange} |
157 | 175 | /> |
158 | 176 | <span class="checkbox-label">Double Riichi</span> |
159 | 177 | <span class="han-indicator">+1 han</span> |
160 | 178 | </label> |
161 | | - <label class="checkbox-item" class:disabled={!isRiichi}> |
| 179 | + <label class="checkbox-item" class:disabled={hasOpenMelds || !isRiichi}> |
162 | 180 | <input |
163 | 181 | type="checkbox" |
164 | 182 | bind:checked={isIppatsu} |
165 | | - disabled={!isRiichi} |
| 183 | + disabled={hasOpenMelds || !isRiichi} |
166 | 184 | onchange={onChange} |
167 | 185 | /> |
168 | 186 | <span class="checkbox-label">Ippatsu</span> |
|
412 | 430 | color: var(--bg-primary); |
413 | 431 | } |
414 | 432 |
|
| 433 | + .open-hand-notice { |
| 434 | + font-size: 0.8rem; |
| 435 | + color: var(--text-secondary); |
| 436 | + background: rgba(255, 193, 7, 0.15); |
| 437 | + border: 1px solid rgba(255, 193, 7, 0.3); |
| 438 | + border-radius: 6px; |
| 439 | + padding: 0.5rem 0.75rem; |
| 440 | + margin-bottom: 0.5rem; |
| 441 | + } |
| 442 | +
|
415 | 443 | @media (max-width: 768px) { |
416 | 444 | .winds-grid { |
417 | 445 | grid-template-columns: 1fr; |
|
0 commit comments