Every card wears its FAQ seal; library cards enlarge above the booklet
The FAQ affordance moves onto the card itself: a small dark seal in the corner of any card with official rulings, everywhere cards render — hand, inspector, peek, final reveal, discard pile, card library — opening the rulings modal on tap (the link, never the text: card faces stay verbatim card text). The separate inspector buttons and library chips retire in its favor. And clicking a library card mid-game no longer summons the App-level inspector beneath the help modal, greyed out and useless — the library enlarges its card in its own overlay, centered above the booklet, seal included. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
4833a229e1
commit
5375941ed3
@@ -360,3 +360,70 @@
|
||||
[ 1439648ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1444751ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1448652ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1453645ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1459299ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1465442ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1468615ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1473754ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1477523ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1481404ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1484988ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1487873ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1491214ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1497291ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1500003ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1505529ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1508113ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1514157ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1520490ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1526105ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1530847ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1534309ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1536942ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1540226ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1544946ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1549964ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1556375ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1560217ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1565790ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1571967ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1577594ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1584020ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1588841ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1594870ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1599656ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1604363ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1607346ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1610702ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1616755ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1623158ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1628550ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1632054ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1634779ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1637945ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1643501ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1648496ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1654167ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1657851ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1661856ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1666697ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1670130ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1674976ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1679260ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1683713ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1688808ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1691522ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1695744ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1700477ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1703591ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1709022ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1711953ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1715990ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1718918ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1724646ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1727912ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1730598ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1736344ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1742739ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1748352ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
[ 1753260ms] [ERROR] WebSocket connection to 'ws://127.0.0.1:8899/ws' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8899/assets/index-Di4XAJUy.js:1
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
- generic [ref=f10e3]:
|
||||
- banner [ref=f10e4]:
|
||||
- generic [ref=f10e5]: Wiz-War
|
||||
- generic [ref=f10e6]: sixth edition
|
||||
- button "help & rules" [ref=f10e7] [cursor=pointer]
|
||||
- generic [ref=f10e8]: reconnecting…
|
||||
- generic [ref=f10e10]:
|
||||
- generic [ref=f10e11]: Wiz-War
|
||||
- generic [ref=f10e12]: A game of magical combat in a stone labyrinth
|
||||
- button "about this game — a labor of love" [ref=f10e13] [cursor=pointer]
|
||||
- generic [ref=f10e14]:
|
||||
- generic [ref=f10e15]: Your wizard's name
|
||||
- textbox "Your wizard's name" [ref=f10e16]:
|
||||
- /placeholder: e.g. Mordecai
|
||||
- generic [ref=f10e17]:
|
||||
- button "Create a game" [disabled] [ref=f10e18]
|
||||
- generic [ref=f10e19]: or join one
|
||||
- textbox "CODE" [ref=f10e20]
|
||||
- button "Join" [disabled] [ref=f10e21]
|
||||
- generic [ref=f10e22]:
|
||||
- generic [ref=f10e23]: "or play here, passing the device:"
|
||||
- group "number of wizards" [ref=f10e24]:
|
||||
- button "2" [ref=f10e25] [cursor=pointer]
|
||||
- button "3" [ref=f10e26] [cursor=pointer]
|
||||
- button "4" [ref=f10e27] [cursor=pointer]
|
||||
- button "5" [ref=f10e28] [cursor=pointer]
|
||||
- button "6" [ref=f10e29] [cursor=pointer]
|
||||
- button "Gather 2 wizards" [ref=f10e30] [cursor=pointer]
|
||||
- generic [ref=f10e31]:
|
||||
- 'checkbox "with Expansion Set #1" [checked] [ref=f10e32]'
|
||||
- text: "with Expansion Set #1"
|
||||
- generic [ref=f10e33]:
|
||||
- textbox "seat transfer phrase" [ref=f10e34]:
|
||||
- /placeholder: ember-troll-dagger
|
||||
- button "Claim a transferred seat" [disabled] [ref=f10e35]
|
||||
- generic [ref=f10e36]:
|
||||
- generic [ref=f10e37]:
|
||||
- generic [ref=f10e38]: your games
|
||||
- button "notify me on my turn" [ref=f10e39] [cursor=pointer]
|
||||
- generic [ref=f10e40]:
|
||||
- button "NX8Y as Some Old Guy — unreachable" [ref=f10e41] [cursor=pointer]:
|
||||
- generic [ref=f10e42]: NX8Y
|
||||
- generic [ref=f10e43]: as Some Old Guy — unreachable
|
||||
- button "×" [ref=f10e44] [cursor=pointer]
|
||||
@@ -757,7 +757,7 @@
|
||||
</header>
|
||||
<div class="discard-grid">
|
||||
{#each [...view.discardPile].reverse() as card (card.instanceId)}
|
||||
<Card {card} onclick={() => (peekCard = card)} />
|
||||
<Card {card} onclick={() => (peekCard = card)} onfaq={(id) => (faqCardId = id)} />
|
||||
{/each}
|
||||
{#if view.discardPile.length === 0}
|
||||
<span class="discard-empty">Nothing has been cast away yet.</span>
|
||||
@@ -770,11 +770,8 @@
|
||||
{#if peekCard}
|
||||
<div class="inspector" role="img" aria-label="displayed card, enlarged">
|
||||
<button class="inspector-close" onclick={() => { peekCard = null; peekCreatureId = null; }} aria-label="hide card">×</button>
|
||||
<div class="inspector-card"><Card card={peekCard} /></div>
|
||||
<div class="inspector-card"><Card card={peekCard} onfaq={(id) => (faqCardId = id)} /></div>
|
||||
{#if peekNote}<div class="peek-note">{peekNote}</div>{/if}
|
||||
{#if cardDef(peekCard.cardId).faqRulings.length > 0}
|
||||
<button class="faq-link" onclick={() => (faqCardId = peekCard!.cardId)}>Official FAQ</button>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
@@ -1340,11 +1337,8 @@
|
||||
<div class="inspector" role="img" aria-label="selected card, enlarged">
|
||||
<button class="inspector-close" onclick={() => (inspectorHidden = true)} aria-label="hide enlarged card">×</button>
|
||||
<div class="inspector-card">
|
||||
<Card card={selectedCard} />
|
||||
<Card card={selectedCard} onfaq={(id) => (faqCardId = id)} />
|
||||
</div>
|
||||
{#if cardDef(selectedCard.cardId).faqRulings.length > 0}
|
||||
<button class="faq-link" onclick={() => (faqCardId = selectedCard!.cardId)}>Official FAQ</button>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
@@ -1364,7 +1358,7 @@
|
||||
</span>
|
||||
<div class="reveal-cards">
|
||||
{#each view.revealedHands[p.id] ?? [] as card (card.instanceId)}
|
||||
<Card {card} onclick={() => (peekCard = card)} />
|
||||
<Card {card} onclick={() => (peekCard = card)} onfaq={(id) => (faqCardId = id)} />
|
||||
{/each}
|
||||
{#if (view.revealedHands[p.id] ?? []).length === 0}
|
||||
<span class="reveal-empty">empty-handed</span>
|
||||
@@ -1389,6 +1383,7 @@
|
||||
glowing={interruptCards.some((c) => c.instanceId === card.instanceId)}
|
||||
charges={view.wandCharges[card.instanceId] ?? null}
|
||||
onclick={() => selectCard(card)}
|
||||
onfaq={(id) => (faqCardId = id)}
|
||||
/>
|
||||
{/each}
|
||||
</div>
|
||||
@@ -1988,21 +1983,6 @@
|
||||
}
|
||||
.discard-empty { font-family: "Caveat", cursive; color: #8a7a5e; font-size: 1.1rem; }
|
||||
|
||||
.faq-link {
|
||||
display: block;
|
||||
margin: 0.35rem 0 0 auto;
|
||||
background: #2b2218;
|
||||
color: #e8dfc6;
|
||||
border: none;
|
||||
border-radius: 3px;
|
||||
font-family: "Oswald", sans-serif;
|
||||
font-size: 0.62rem;
|
||||
letter-spacing: 0.1em;
|
||||
text-transform: uppercase;
|
||||
padding: 0.25rem 0.5rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
.faq-link:hover { background: #43331f; }
|
||||
.peek-note {
|
||||
margin-top: 0.4rem;
|
||||
background: #2b2218;
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
glowing = false,
|
||||
charges = null,
|
||||
onclick,
|
||||
onfaq,
|
||||
}: {
|
||||
card: CardInstance;
|
||||
selected?: boolean;
|
||||
@@ -20,6 +21,8 @@
|
||||
/** Playable RIGHT NOW out of turn — a golden pulse invites the tap. */
|
||||
glowing?: boolean;
|
||||
charges?: number | null;
|
||||
/** When set, cards with official FAQ rulings wear a tappable FAQ seal. */
|
||||
onfaq?: (cardId: string) => void;
|
||||
onclick?: () => void;
|
||||
} = $props();
|
||||
|
||||
@@ -75,6 +78,13 @@
|
||||
{#if displayed}
|
||||
<span class="badge">DISPLAYED{charges != null ? ` · ${charges}` : ""}</span>
|
||||
{/if}
|
||||
{#if onfaq && def.faqRulings.length > 0}
|
||||
<span
|
||||
class="faq-seal" role="button" tabindex="-1"
|
||||
onclick={(ev) => { ev.stopPropagation(); onfaq?.(card.cardId); }}
|
||||
onkeydown={() => {}}
|
||||
>FAQ</span>
|
||||
{/if}
|
||||
</button>
|
||||
|
||||
<style>
|
||||
@@ -202,6 +212,21 @@
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.faq-seal {
|
||||
position: absolute;
|
||||
bottom: 0.15rem;
|
||||
right: 0.2rem;
|
||||
background: #2b2218;
|
||||
color: #e8dfc6;
|
||||
font-family: "Oswald", sans-serif;
|
||||
font-size: 0.42rem;
|
||||
letter-spacing: 0.12em;
|
||||
padding: 0.1rem 0.25rem;
|
||||
border-radius: 2px;
|
||||
cursor: pointer;
|
||||
opacity: 0.85;
|
||||
}
|
||||
.faq-seal:hover { opacity: 1; }
|
||||
.card.glowing {
|
||||
box-shadow: 0 0 0 2px #c9a72a, 0 0 14px 3px rgba(201, 167, 42, 0.55);
|
||||
animation: card-glow 1.4s ease-in-out infinite;
|
||||
@@ -211,7 +236,22 @@
|
||||
50% { box-shadow: 0 0 0 2px #c9a72a, 0 0 6px 1px rgba(201, 167, 42, 0.3); }
|
||||
}
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.card.glowing { animation: none; }
|
||||
.faq-seal {
|
||||
position: absolute;
|
||||
bottom: 0.15rem;
|
||||
right: 0.2rem;
|
||||
background: #2b2218;
|
||||
color: #e8dfc6;
|
||||
font-family: "Oswald", sans-serif;
|
||||
font-size: 0.42rem;
|
||||
letter-spacing: 0.12em;
|
||||
padding: 0.1rem 0.25rem;
|
||||
border-radius: 2px;
|
||||
cursor: pointer;
|
||||
opacity: 0.85;
|
||||
}
|
||||
.faq-seal:hover { opacity: 1; }
|
||||
.card.glowing { animation: none; }
|
||||
.card { transition: none; }
|
||||
.card:hover, .card.selected, .card.attached { transform: none; }
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
// svelte-ignore state_referenced_locally -- the initial tab is intentionally a one-time value
|
||||
let tab = $state<"play" | "rules" | "cards" | "about" | "tally">(initialTab);
|
||||
let faqCardId = $state<string | null>(null);
|
||||
let libPeek = $state<string | null>(null);
|
||||
|
||||
function openTally() {
|
||||
tab = "tally";
|
||||
@@ -50,6 +51,14 @@
|
||||
|
||||
<svelte:window {onkeydown} />
|
||||
|
||||
{#if libPeek}
|
||||
<div class="lib-peek-scrim" role="button" tabindex="-1" onclick={() => (libPeek = null)} onkeydown={() => {}}>
|
||||
<div class="lib-peek">
|
||||
<Card card={{ instanceId: `peek-${libPeek}`, cardId: libPeek }} onfaq={(id) => (faqCardId = id)} />
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if faqCardId}
|
||||
<Faq cardId={faqCardId} onclose={() => (faqCardId = null)} />
|
||||
{/if}
|
||||
@@ -174,13 +183,14 @@
|
||||
<div class="card-grid">
|
||||
{#each filtered as def (def.id)}
|
||||
<div class="card-slot">
|
||||
<Card card={{ instanceId: `lib-${def.id}`, cardId: def.id }} />
|
||||
<Card
|
||||
card={{ instanceId: `lib-${def.id}`, cardId: def.id }}
|
||||
onclick={() => (libPeek = def.id)}
|
||||
onfaq={(id) => (faqCardId = id)}
|
||||
/>
|
||||
<span class="card-meta">
|
||||
×{def.quantity}{def.alsoIn?.length ? ` (+${def.alsoIn[0]!.quantity} exp)` : ""}
|
||||
· {def.set === "basic" ? "base" : "exp 1"}
|
||||
{#if def.faqRulings.length > 0}
|
||||
· <button class="faq-chip" onclick={() => (faqCardId = def.id)}>FAQ</button>
|
||||
{/if}
|
||||
</span>
|
||||
</div>
|
||||
{/each}
|
||||
@@ -305,16 +315,20 @@
|
||||
.card-slot { display: flex; flex-direction: column; align-items: center; gap: 0.25rem; }
|
||||
.card-slot :global(.card) { cursor: default; }
|
||||
.card-slot :global(.card:hover) { transform: none; box-shadow: 0 3px 8px rgba(10, 8, 4, 0.45); }
|
||||
.faq-chip {
|
||||
background: none;
|
||||
border: none;
|
||||
padding: 0;
|
||||
font: inherit;
|
||||
color: #8a4a1f;
|
||||
text-decoration: underline;
|
||||
text-decoration-style: dotted;
|
||||
cursor: pointer;
|
||||
.lib-peek-scrim {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
background: rgba(10, 12, 16, 0.55);
|
||||
display: grid;
|
||||
place-items: center;
|
||||
z-index: 55;
|
||||
}
|
||||
.lib-peek :global(.card) {
|
||||
transform: scale(2.1);
|
||||
cursor: default;
|
||||
box-shadow: 0 18px 50px rgba(0, 0, 0, 0.7);
|
||||
}
|
||||
.lib-peek :global(.card:hover) { transform: scale(2.1); }
|
||||
.card-meta {
|
||||
font-family: "Courier Prime", monospace;
|
||||
font-size: 0.68rem;
|
||||
|
||||
Reference in New Issue
Block a user