awacke1 commited on
Commit
cc2cb33
·
verified ·
1 Parent(s): 3e6b272

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +370 -170
index.html CHANGED
@@ -3,7 +3,7 @@
3
  <head>
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Moulin Rouge! Tarot Reading</title>
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
  <link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,700;1,700&family=Crimson+Text:ital,wght@0,400;1,400&display=swap" rel="stylesheet">
@@ -16,95 +16,133 @@
16
  --primary-text: #f5e6d3;
17
  --secondary-text: #3b0909;
18
  --accent-color: #d4af37; /* Gold */
19
- --shadow-color: rgba(0, 0, 0, 0.4);
20
  --card-back-bg: linear-gradient(145deg, #8B0000, #4a0000); /* Deep Red */
21
  }
22
-
 
 
 
 
23
  body {
24
  font-family: 'Crimson Text', serif;
25
  background-color: var(--bg-color);
26
  background-image: radial-gradient(rgba(255, 255, 255, 0.05) 1px, transparent 1px);
27
  background-size: 15px 15px;
28
  color: var(--primary-text);
29
- margin: 0;
30
- padding: 2rem;
31
  display: flex;
32
  flex-direction: column;
33
  align-items: center;
34
- min-height: 100vh;
35
  text-align: center;
 
36
  }
37
-
38
  h1 {
39
  font-family: 'Playfair Display', serif;
40
  font-weight: 700;
41
  font-style: italic;
42
  color: var(--accent-color);
43
  text-shadow: 2px 2px 5px var(--shadow-color);
44
- margin-bottom: 1rem;
45
- font-size: 2.5rem;
46
- }
47
-
48
- p#instructions {
49
- max-width: 600px;
50
- margin-bottom: 2rem;
51
- font-style: italic;
52
- opacity: 0.9;
53
- font-size: 1.1rem;
54
  }
55
 
56
- /* --- Main Layout --- */
57
- #table {
58
  display: flex;
59
- flex-direction: column;
60
  align-items: center;
61
- gap: 2rem;
62
  width: 100%;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
  }
64
-
65
  #controls {
66
  display: flex;
67
  gap: 1rem;
68
- margin-bottom: 2rem;
 
 
 
 
 
 
 
 
 
 
 
69
  }
 
 
 
 
 
 
 
 
 
 
 
70
 
71
  button {
72
  font-family: 'Playfair Display', serif;
73
- padding: 0.8rem 1.5rem;
74
- font-size: 1rem;
75
  border: 2px solid var(--accent-color);
76
  background-color: transparent;
77
  color: var(--accent-color);
78
  border-radius: 5px;
79
  cursor: pointer;
80
  transition: all 0.3s ease;
81
- box-shadow: 0 4px 15px rgba(212, 175, 55, 0.1);
82
  text-transform: uppercase;
83
- letter-spacing: 1px;
84
  }
85
-
86
  button:hover, button:focus {
87
  background-color: var(--accent-color);
88
  color: var(--secondary-text);
89
- box-shadow: 0 4px 20px rgba(212, 175, 55, 0.3);
90
  transform: translateY(-2px);
91
  }
92
 
93
- /* --- Card Slots and Reading Area --- */
 
 
 
 
 
 
 
 
94
  #card-slots {
95
  display: flex;
96
  justify-content: center;
97
- flex-wrap: wrap;
98
- gap: 1.5rem;
99
- perspective: 1200px;
100
  width: 100%;
101
- min-height: 450px; /* Ensure space for cards */
 
 
102
  }
103
-
104
  .card-slot {
105
- width: 300px;
106
- height: 450px;
 
107
  position: relative;
 
108
  }
109
 
110
  .card-slot .placeholder {
@@ -117,17 +155,16 @@
117
  justify-content: center;
118
  align-items: center;
119
  font-style: italic;
120
- opacity: 0.7;
121
  color: var(--accent-color);
 
122
  }
123
-
124
  .placeholder span {
125
  font-family: 'Playfair Display', serif;
126
- font-size: 1.5rem;
127
  font-weight: bold;
128
  }
129
 
130
- /* --- Card Styling & Flip Animation --- */
131
  .card {
132
  width: 100%;
133
  height: 100%;
@@ -136,112 +173,161 @@
136
  transition: transform 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275);
137
  cursor: pointer;
138
  }
139
-
140
- .card.is-flipped {
141
- transform: rotateY(180deg);
142
- }
143
-
144
  .card-face {
145
  position: absolute;
146
  width: 100%;
147
  height: 100%;
148
  backface-visibility: hidden;
149
  border-radius: 15px;
150
- box-shadow: 0 10px 25px var(--shadow-color);
151
  overflow: hidden;
152
  display: flex;
153
  flex-direction: column;
154
  }
155
-
156
  .card-back {
157
  background: var(--card-back-bg);
158
  border: 5px solid var(--accent-color);
159
  display: flex;
160
  justify-content: center;
161
  align-items: center;
 
162
  }
163
-
164
- .card-back-design {
165
- width: 80%;
166
- height: 90%;
167
- border: 2px solid var(--accent-color);
168
- border-radius: 10px;
169
- display: flex;
170
- justify-content: center;
171
- align-items: center;
172
- font-size: 4rem;
173
- color: var(--accent-color);
174
- opacity: 0.8;
175
- font-family: 'Playfair Display', serif;
176
- }
177
-
178
  .card-front {
179
  background-color: var(--card-bg);
180
  color: var(--secondary-text);
181
  transform: rotateY(180deg);
182
- padding: 1rem;
183
  text-align: left;
184
- overflow-y: auto;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
185
  }
186
 
187
- /* --- Card Content Styling --- */
188
  .card-header {
189
  text-align: center;
190
  border-bottom: 2px solid var(--card-border);
191
- padding-bottom: 0.5rem;
192
- margin-bottom: 1rem;
193
  }
194
-
195
  .card-header h2 {
196
  margin: 0;
197
  font-family: 'Playfair Display', serif;
198
- font-size: 1.2rem;
199
  color: #8B0000;
200
  }
201
-
202
  .card-header .tarot-title {
203
  font-style: italic;
204
- font-size: 1rem;
205
  color: #666;
206
  margin-top: 0.25rem;
207
  }
208
-
209
  .card-body {
210
- font-size: 0.95rem;
211
- line-height: 1.5;
 
 
212
  }
213
-
214
- .card-body p {
215
- margin: 0 0 0.75rem 0;
 
216
  }
217
-
218
- .card-body strong {
219
- color: #8B0000;
220
- font-weight: bold;
 
221
  }
222
-
223
- .story, .lyric {
 
 
 
 
 
 
224
  font-style: italic;
225
- background-color: rgba(224, 208, 184, 0.4);
226
- padding: 0.5rem;
227
  border-radius: 8px;
228
  border-left: 3px solid var(--accent-color);
229
  }
230
-
 
 
 
 
 
 
231
  .lyric {
232
- margin-top: 1rem;
233
  border-left-color: #8B0000;
 
234
  }
235
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
236
  </style>
237
  </head>
238
  <body>
239
  <h1>Moulin Rouge! Tarot</h1>
240
- <p id="instructions">A three-card spread for Past, Present, and Future. Click "Draw Cards" to begin your spectacular, spectacular reading, then click each card to reveal its meaning.</p>
241
-
242
- <div id="controls">
243
- <button id="draw-button">Draw Cards</button>
244
- <button id="reset-button">Reset</button>
 
 
 
 
 
 
 
 
 
245
  </div>
246
 
247
  <div id="table">
@@ -254,88 +340,80 @@
254
  // --- Data: Moulin Rouge Tarot Deck ---
255
  const tarot_data = [
256
  // Major Arcana
257
- {"name":"Christian's Arrival","card":"0 - The Fool","classifier":"Major Arcana","character":"Christian","emojis":"✍️, 🚂","story":"A young, penniless writer arrives in Montmartre, full of naive ideals about truth, beauty, freedom, and love. He takes a leap of faith, leaving his old life behind to join the Bohemian revolution, unaware of the spectacular and tragic journey that awaits.","lyric":"The hills are alive with the sound of music..."},
258
  {"name":"Zidler the Showman","card":"I - The Magician","classifier":"Major Arcana","character":"Zidler","emojis":"🎩, 🎪","story":"Harold Zidler, the proprietor of the Moulin Rouge, is the master manipulator. He has all the tools—the dancers, the stage, the spectacle—and uses his willpower to manifest a world of fantasy and illusion to attract the rich and powerful.","lyric":"The show must go on!"},
259
- {"name":"Satine's Secret","card":"II - The High Priestess","classifier":"Major Arcana","character":"Satine","emojis":"💎, 🤫","story":"Satine, the Sparkling Diamond, holds a deep secret: her consumption. She guards this intuitive knowledge, this hidden truth beneath the glittering surface, knowing it will change everything. She is the keeper of a mystery that others cannot yet see.","lyric":"A kiss on the hand may be quite continental, but diamonds are a girl's best friend."},
260
  {"name":"The Courtesan's Role","card":"III - The Empress","classifier":"Major Arcana","character":"Satine","emojis":"💃, ❤️","story":"As the star of the Moulin Rouge, Satine embodies earthly delights, sensuality, and creativity. She is the nurturing mother of the club, promising abundance and pleasure, her entire being a work of art designed to bring dreams to life.","lyric":"I'm the Sparkling Diamond!"},
261
- {"name":"The Duke's Authority","card":"IV - The Emperor","classifier":"Major Arcana","character":"The Duke","emojis":"👑, 📜","story":"The Duke represents structure, power, and worldly authority. He seeks to own and control the Moulin Rouge and Satine, imposing his will through contracts and the unyielding structure of patronage. His rule is absolute and possessive.","lyric":"It's not that I'm a jealous man... I just don't like other people touching my things."},
262
- {"name":"The Bohemian Ideal","card":"V - The Hierophant","classifier":"Major Arcana","character":"Toulouse-Lautrec","emojis":"🎨, 📜","story":"Toulouse-Lautrec is the high priest of the Bohemian revolution, teaching its core beliefs: truth, beauty, freedom, and love. He is the keeper of tradition for this unconventional group, guiding Christian and upholding their sacred values against the establishment.","lyric":"The greatest thing you'll ever learn is just to love and be loved in return."},
263
- {"name":"The Choice","card":"VI - The Lovers","classifier":"Major Arcana","character":"Satine & Christian","emojis":"❤️, 💔","story":"The central conflict. Satine is torn between two paths, two values: the true, passionate love offered by Christian, and the financial security and career promised by the Duke. This is the ultimate choice of the heart, a defining alignment of values.","lyric":"Come what may, I will love you until my dying day."},
264
- {"name":"Spectacular Spectacular","card":"VII - The Chariot","classifier":"Major Arcana","character":"The Bohemians","emojis":"🎭, ➡️","story":"Driven by the sheer force of will and Christian's creative vision, the Bohemians propel their play, 'Spectacular Spectacular,' forward. They harness the opposing forces of comedy and tragedy, love and jealousy, to steer their ambitious project toward opening night.","lyric":"So exciting! We'll write a show!"},
265
- {"name":"A Woman Has to Be Strong","card":"VIII - Strength","classifier":"Major Arcana","character":"Satine","emojis":"🦁, ❤️‍🩹","story":"Satine must tame the wild beast of her own heart and the dangerous passions of the men around her. Her strength is not physical, but internal: the compassion, patience, and courage to maintain her composure and protect Christian in the face of the Duke's jealousy.","lyric":"The French are glad to die for love. They delight in fighting duels. But I prefer a man who lives and gives expensive jewels."},
266
- {"name":"The Penniless Writer","card":"IX - The Hermit","classifier":"Major Arcana","character":"Christian","emojis":"✍️, 🏮","story":"After Satine's death, Christian retreats into the solitude of his garret. He withdraws from the world to process his grief and find the truth of his story, writing it down to bring the light of his inner wisdom out into the world.","lyric":"I've paid my whore... I owe you nothing."},
267
  {"name":"The Topsy-Turvy World","card":"X - Wheel of Fortune","classifier":"Major Arcana","character":"The Moulin Rouge","emojis":"🎡, 🎭","story":"The Moulin Rouge itself is a wheel of fortune. One night you're on top, the star of the show; the next, you're replaced. The fate of the show, the love affair, and the club are constantly turning, subject to the whims of luck, patronage, and destiny.","lyric":"Because you can, can, can!"},
268
- {"name":"The Duke's Decree","card":"XI - Justice","classifier":"Major Arcana","character":"The Duke","emojis":"⚖️, 📜","story":"The Duke operates on a cold logic of cause and effect. He has paid for the club and for Satine, and he expects the deed to be honored. This card represents the clear, and often harsh, consequences of the contracts and choices that have been made.","lyric":"I am the Duke. That is the final word."},
269
- {"name":"A Secret Love","card":"XII - The Hanged Man","classifier":"Major Arcana","character":"Christian & Satine","emojis":"🤫, 🤸","story":"Christian and Satine must suspend their lives, putting their love on hold and seeing the world from a new perspective to keep their affair secret. They are in a state of voluntary sacrifice, waiting for the right moment to act, seeing things differently than those around them.","lyric":"We should be lovers... we can't do that."},
270
- {"name":"Consumption's Toll","card":"XIII - Death","classifier":"Major Arcana","character":"Satine","emojis":"💀, 🥀","story":"Satine's terminal illness represents an inevitable, unstoppable, and transformative end. It is the force that will bring the curtain down on her life and her love affair, clearing the way for the tragic but beautiful story that Christian will write.","lyric":"I'm dying, Christian. It's the consumption."},
271
- {"name":"The Green Fairy","card":"XIV - Temperance","classifier":"Major Arcana","character":"The Bohemians","emojis":"🧪, 🧚","story":"The Bohemians blend inspiration (absinthe) with creativity (writing) to find a perfect synthesis. The Green Fairy represents this alchemical process, mixing different elements to create a new vision, a balanced path between madness and genius.","lyric":"I'm the Green Fairy! Freedom, beauty, truth, and love!"},
272
  {"name":"The Patronage Trap","card":"XV - The Devil","classifier":"Major Arcana","character":"The Duke","emojis":"⛓️, 💰","story":"The deal with the Duke is a trap. It offers the illusion of security and success, but binds Satine and the Moulin Rouge in a chain of ownership and jealousy. It represents the dark side of materialism, addiction to power, and possessive obsession.","lyric":"She is mine."},
273
  {"name":"The Final Confrontation","card":"XVI - The Tower","classifier":"Major Arcana","character":"The Stage","emojis":"💥, 🎭","story":"The climax of the play mirrors reality as the Duke's rage explodes. The false reality of the stage is shattered by a sudden, shocking revelation of truth. The entire structure of lies comes crashing down in a moment of violent, chaotic change.","lyric":"He's got a gun!"},
274
- {"name":"The Elephant","card":"XVII - The Star","classifier":"Major Arcana","character":"Christian & Satine","emojis":"🐘, ✨","story":"In the sanctuary of the elephant, Christian and Satine find a moment of pure hope, inspiration, and serenity away from the chaos of the club. It is their guiding star, a place where their love feels pure and blessed by a higher power.","lyric":"Come what may... I will love you..."},
275
- {"name":"The Unconscious Fear","card":"XVIII - The Moon","classifier":"Major Arcana","character":"Satine","emojis":"🌙, 😥","story":"Satine navigates a world of illusion and deception, both on stage and off. She is haunted by deep-seated fears of poverty and her past, forces that emerge from the unconscious and threaten to derail her path to love and security.","lyric":"Another hero, another mindless crime. Behind the curtain, in the pantomime."},
276
  {"name":"The Perfect Show","card":"XIX - The Sun","classifier":"Major Arcana","character":"Spectacular Spectacular","emojis":"☀️, 👏","story":"The moment the show succeeds, it is a burst of pure joy, success, and clarity. The vision of the Bohemians is realized, and for a brief, shining moment, everything is vibrant, triumphant, and celebrated by all.","lyric":"We have a show!"},
277
  {"name":"The Story is Told","card":"XX - Judgment","classifier":"Major Arcana","character":"Christian","emojis":"✍️, 🌅","story":"At the end, Christian answers a higher calling. He rises from his grief to write the story of his love, bringing absolution and rebirth. He judges the events that have passed and gives them meaning, resurrecting their love as a timeless tale.","lyric":"This is a story about love."},
278
- {"name":"The Greatest Thing","card":"XXI - The World","classifier":"Major Arcana","character":"The Story","emojis":"🌍, ❤️","story":"The story of Christian and Satine reaches its successful completion. It becomes a whole, integrated narrative that teaches the 'greatest thing.' The cycle is complete, the lesson is learned, and their love has achieved a form of worldly immortality.","lyric":"The greatest thing you'll ever learn is just to love and be loved in return."},
279
-
280
- // Wands (Christian - Passion/Creativity)
281
  {"name":"The Spark of a Story","card":"Ace of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"💡, 🔥","story":"The moment Christian, filled with the Bohemian spirit, has the initial, passionate idea for 'Spectacular Spectacular.' It is a pure burst of creative energy and inspiration, a new beginning and a call to action.","lyric":"A story about a penniless sitar player!"},
282
  {"name":"A Choice of Paths","card":"Two of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"🗺️, 🤔","story":"Christian stands between the world of his father and the world of the Moulin Rouge. He holds his potential in his hands, making a bold choice to leave security behind and plan a future based on his creative passion.","lyric":"I don't want to be a lawyer!"},
283
- {"name":"The Pitch","card":"Three of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"🚢, 🔭","story":"Christian and the Bohemians pitch their show to Satine and Zidler. They are looking to the future, anticipating the results of their creative enterprise and waiting for their ship to come in.","lyric":"It's a story about a magical kingdom in faraway India!"},
284
- {"name":"The First Rehearsal","card":"Four of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"🎉, 🏡","story":"The cast and crew come together for the first time, celebrating the beginning of their new creative project. There is a sense of harmony, community, and the joy of a stable foundation for their work.","lyric":"The Bohemians, the children of the revolution!"},
285
  {"name":"Creative Conflict","card":"Five of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"😖, 🎭","story":"The rehearsals are chaotic. The writer, the composer, the actors—everyone has a different idea. This represents the minor struggles and creative clashes that are part of any ambitious project.","lyric":"But the ending is not happy!"},
286
- {"name":"The Poet's Victory","card":"Six of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"🏆, 👏","story":"Satine chooses Christian's song, 'Your Song,' over the Duke's wishes. It is a public recognition of his talent and a victory for his creative vision and passionate love.","lyric":"My gift is my song, and this one's for you."},
287
  {"name":"Defending the Story","card":"Seven of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"🛡️, ✍️","story":"Christian must constantly defend his artistic integrity and the 'happy ending' of his play against the Duke's demands and Zidler's compromises. He stands his ground, fighting for his creative principles.","lyric":"The greatest thing is love!"},
288
- {"name":"A Love Letter","card":"Eight of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"💌, ✈️","story":"Christian's passion and words travel swiftly to Satine's heart. 'Your Song' is a direct, energetic message of love that overcomes all obstacles to reach its destination.","lyric":"How wonderful life is while you're in the world."},
289
- {"name":"The Burden of Love","card":"Nine of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"🤕, стойкос��ь","story":"Wounded by jealousy and the seeming betrayal of Satine, Christian is weary but not defeated. He gathers his resilience for one final stand, ready to defend his love despite the pain.","lyric":"I've paid my whore. I owe you nothing."},
290
- {"name":"The Weight of the Story","card":"Ten of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"😫, ✍️","story":"At the end, Christian is left alone, burdened with the responsibility of telling their tragic story. The creative passion that once brought him joy has now become a heavy weight he must carry.","lyric":"A story about a love that will live forever."},
291
  {"name":"The Idealist","card":"Page of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"🤩, 📜","story":"Christian at the very beginning: exploring his new passion for the Bohemian ideals, full of creative energy, and ready to embark on a new adventure without fully understanding the consequences.","lyric":"I am the writer!"},
292
- {"name":"The Romantic Hero","card":"Knight of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"🧗, ❤️‍🔥","story":"Christian's passionate and often reckless pursuit of Satine. He charges into the Moulin Rouge, climbs elephants, and writes poetry, driven by a fiery love that is both charming and impulsive.","lyric":"I've come to tell you my secret. I love you."},
293
- {"name":"The Playwright","card":"Queen of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"👑, 🎭","story":"Christian, in his creative element, is confident, determined, and the center of the show's creation. He inspires others with his vibrant energy and his unwavering belief in the power of his story.","lyric":"No, it's about love! Overcoming all obstacles!"},
294
  {"name":"The Father","card":"King of Wands","classifier":"Wands - Fire - Creativity","character":"Christian's Father","emojis":"👨‍💼, 😠","story":"Christian's father represents the established, visionary leader of a different world. He has a clear vision for Christian's future (as a lawyer) and tries to control his son's passionate, creative impulses with his own authority.","lyric":"You'll be a lawyer!"},
295
-
296
- // Pentacles (Satine - Physical/Material)
297
- {"name":"The Duke's Offer","card":"Ace of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"💎, 🤝","story":"The Duke makes his offer to fund the show in exchange for Satine. This is a new, tangible opportunity for wealth and security, a seed of prosperity planted in the material world.","lyric":"A man who lives and gives expensive jewels."},
298
  {"name":"The Double Life","card":"Two of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"🎭, ⚖️","story":"Satine masterfully juggles two realities: her public performances for the Duke and her secret, private moments with Christian. She is constantly balancing her financial obligations with her heart's desires.","lyric":"I can't fall in love with anyone."},
299
  {"name":"A Star is Born","card":"Three of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"💃, 👏","story":"Satine's performance in the initial pitch for the show demonstrates her skill and mastery of her craft. It is a moment of teamwork where her tangible talent is recognized as the key to the project's success.","lyric":"He's a maharajah!"},
300
- {"name":"The Gilded Cage","card":"Four of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"🔒, 💎","story":"Satine clings to the security promised by the Duke, fearing a return to poverty. She builds a wall around her heart, holding tightly to material stability at the expense of emotional freedom.","lyric":"We're creatures of the underworld. We can't afford to love."},
301
  {"name":"The Sickness","card":"Five of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"😥, ❄️","story":"Satine collapses from her consumption. This is a moment of physical hardship, illness, and feeling left out in the cold, facing the harsh reality that material wealth cannot protect her from her body's decline.","lyric":"I'm cold."},
302
  {"name":"A Diamond for a Song","card":"Six of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"🎁, 💔","story":"The diamond necklace from the Duke. It is a gift of immense value, but it comes with strings attached. It represents a power imbalance, a charity that is really a transaction for ownership.","lyric":"It's for you..."},
303
- {"name":"The Long Game","card":"Seven of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"🤔, ⏳","story":"Satine must patiently wait for the show to become a success, hoping her investment of time and emotion will pay off in long-term security. She is assessing her progress, wondering if her hard work will bear fruit.","lyric":"I'm a courtesan. I'm paid to make men believe what they want to believe."},
304
- {"name":"The Courtesan's Craft","card":"Eight of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"💄, 🎭","story":"Satine's life is one of diligent, repetitive work. She is a master of her craft—the art of seduction and performance—and she dedicates herself to perfecting the skills required for her job.","lyric":"I make men believe I'm in love with them."},
305
  {"name":"The Real Actress","card":"Nine of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"💃, 🕊️","story":"Satine dreams of becoming a 'real actress,' a life of independent success and self-sufficiency. This card represents the grace, discipline, and financial independence she longs for, free from the control of men.","lyric":"I want to be a real actress!"},
306
  {"name":"The Moulin Rouge Legacy","card":"Ten of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"🏰, 💰","story":"The ultimate material goal: for the Moulin Rouge to be transformed from a dance hall into a legitimate, wealthy theatre. This represents the establishment of a lasting financial legacy and community stability.","lyric":"A real theatre!"},
307
- {"name":"The Aspiring Actress","card":"Page of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"🌟, 📖","story":"Satine at her core is a student of the material world, eager to learn the craft of acting and manifest a new, tangible reality for herself. She is focused on a new opportunity for earthly success.","lyric":"I can't just fall in love. I have to think about my future."},
308
  {"name":"The Diamond Dog","card":"Knight of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"🐕, 💎","story":"Satine's public persona is hardworking, dependable, and focused on the practical goal of securing her future. She methodically works towards her material goals, even at a slow and steady pace.","lyric":"I am the Sparkling Diamond!"},
309
  {"name":"The Star Performer","card":"Queen of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"👑, 💃","story":"As the star of the Moulin Rouge, Satine is a nurturing, practical, and down-to-earth figure for the other dancers. She manages the material and physical world of the club with grace and authority.","lyric":"The show must go on!"},
310
- {"name":"The Financier","card":"King of Pentacles","classifier":"Pentacles - Earth - Physical","character":"The Duke","emojis":"💰, 👑","story":"The Duke in his element: a master of wealth and enterprise. He uses his vast fortune to control the world around him, seeing everything as an investment and expecting a return. He is the king of the material world.","lyric":"I'm a financier. I invest in things."},
311
-
312
- // Swords (The Duke - Conflict/Reason)
313
  {"name":"The Duke's Claim","card":"Ace of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"💡, 🗡️","story":"The Duke makes his intentions clear. His offer is a breakthrough moment of sharp, cold clarity: he will fund the show, but Satine is part of the deal. The truth of his possessiveness is revealed.","lyric":"She is mine."},
314
- {"name":"The Stalemate","card":"Two of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"😑, ⚔️","story":"The Duke is willfully blind to the love between Christian and Satine, creating a tense stalemate. He blocks out the emotional truth, refusing to make a decision and keeping everyone in a state of suspended conflict.","lyric":"I don't believe you. You're a courtesan."},
315
  {"name":"The Jealous Heart","card":"Three of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"💔, 😥","story":"The moment the Duke realizes the truth of the affair. It is a painful, piercing sorrow born of betrayal and jealousy. The heartbreak is sharp, intellectual, and leads to a desire for revenge.","lyric":"He's been with her!"},
316
- {"name":"The Ultimatum","card":"Four of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"⏳, 😠","story":"After a jealous outburst, the Duke retreats to plan his next move. This is a period of forced rest and contemplation, a strategic withdrawal to recover from a conflict and decide on a new course of action.","lyric":"If you're not with me, you're against me."},
317
  {"name":"A Hollow Victory","card":"Five of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"😒, 🏆","story":"The Duke forces Satine to send Christian away. He wins the conflict, but it is a pyrrhic victory that brings no joy, only the cold satisfaction of having asserted his power through cruelty.","lyric":"Tell him you don't love him."},
318
- {"name":"The Escape","card":"Six of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"✈️, 😥","story":"The Duke, feeling betrayed, contemplates abandoning the whole project. This card represents a sorrowful transition, moving away from a difficult situation towards a calmer, but uncertain, future.","lyric":"I'm leaving. The show is off."},
319
  {"name":"The Deception","card":"Seven of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"🤫, 😈","story":"The Duke operates through deception and strategy, using Zidler as his pawn and manipulating events from behind the scenes. He acts alone, using his intellect to try and outsmart his rivals.","lyric":"I control everything."},
320
- {"name":"The Gilded Cage's Bars","card":"Eight of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"⛓️, 😥","story":"The Duke creates a situation where Satine feels trapped and powerless, believing there is no way out of her obligation to him. He uses threats and logic to restrict her choices and isolate her.","lyric":"If you leave me, I'll kill your lover."},
321
  {"name":"The Nightmare","card":"Nine of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"😰, 😠","story":"The Duke is tormented by anxiety, paranoia, and jealousy over the affair. He is kept awake at night by his dark thoughts, a mental anguish born from his fear of betrayal and loss of control.","lyric":"He's been with her behind my back!"},
322
  {"name":"The Final Betrayal","card":"Ten of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"💀, 🗡️","story":"The Duke's rage culminates in the final, dramatic confrontation on stage. It is a moment of absolute ruin, the painful and violent end of the affair, brought about by his vengeful actions.","lyric":"My way, or the highway!"},
323
  {"name":"The Threat","card":"Page of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"📜, 🗣️","story":"The Duke's initial interactions are full of probing questions and tests. He is curious, communicative, and uses his words as a way to gather information and assert his intellectual dominance.","lyric":"A real actress..."},
324
  {"name":"The Pursuer","card":"Knight of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"🏃, 😠","story":"When his ownership is challenged, the Duke acts with swift, assertive, and ruthless ambition. He pursues his goal of possessing Satine with a single-minded and cold logic, regardless of the emotional cost.","lyric":"I will have her."},
325
- {"name":"The Unseen Power","card":"Queen of Swords","classifier":"Swords - Air - Reason","character":"Marie","emojis":"👑, 🤫","story":"Marie, the head courtesan, operates with the sharp, unbiased clarity of experience. She understands the rules of the world they live in and offers Satine clear, if sometimes painful, advice based on impartial truth.","lyric":"You must make him believe you love him."},
326
  {"name":"The Patron","card":"King of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"👑, 🗡️","story":"The Duke in his ultimate form: a figure of immense intellectual and worldly power. He rules with authority, truth (as he sees it), and the law of contracts. He is the final arbiter of their fates.","lyric":"The show will end my way."},
327
-
328
- // Cups (The Ensemble - Emotion/Dreams)
329
  {"name":"The Bohemian Ideal","card":"Ace of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"❤️, 🥂","story":"The overflowing of creative and emotional energy as the Bohemians welcome Christian. It is a moment of pure, divine love for their ideals, a new spiritual and emotional beginning.","lyric":"Freedom, Beauty, Truth, and Love!"},
330
  {"name":"A Perfect Union","card":"Two of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"🤝, ❤️","story":"The partnership between Christian's words and Satine's voice. It is a mutual attraction and a union of two souls that forms the emotional heart of the show and their love story.","lyric":"We should be lovers..."},
331
- {"name":"The Children of the Underworld","card":"Three of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"🎉, 💃","story":"The joyous, celebratory moments of the cast creating their show. It is a time of friendship, community, and the emotional high of shared creative expression.","lyric":"Here we are now, entertainers!"},
332
  {"name":"Apathy and Dreams","card":"Four of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"😒, 🤔","story":"During a creative block, the Bohemians are apathetic and withdrawn. They are contemplating their situation, waiting for a new emotional or spiritual offering to re-engage their passion.","lyric":"The writer's blocked!"},
333
- {"name":"The Loss of an Ideal","card":"Five of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"😥, 💔","story":"The moment the Bohemians realize the Duke's influence is corrupting their play and their ideals. It is a moment of grief and disappointment, focusing on what has been lost.","lyric":"It's about a penniless sitar player... and the woman he loves..."},
334
  {"name":"Nostalgia for the Garret","card":"Six of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"🎨, 🏡","story":"The Bohemians look back on the innocent, happy times in their garret before the complications of the Duke and the Moulin Rouge. It is a moment of nostalgia for a simpler, purer emotional past.","lyric":"We are the children of the revolution!"},
335
  {"name":"The World of Illusion","card":"Seven of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"💭, 🧚","story":"The influence of absinthe and the Green Fairy. The Bohemians are presented with a world of fantasy, dreams, and illusion, with many creative choices but a danger of getting lost in the fantasy.","lyric":"The Green Fairy!"},
336
  {"name":"Leaving the Party","card":"Eight of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"🚶, 🌙","story":"The moment Christian decides to leave the Moulin Rouge, walking away from the emotional chaos and disillusionment to seek a higher, more authentic truth, even if it means walking away alone.","lyric":"I've paid my whore."},
337
  {"name":"A Dream Come True","card":"Nine of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"😊, 🥂","story":"The moment the show is a success and the cast gets everything they wished for: a hit play, a real theatre. It is a moment of pure emotional satisfaction and contentment.","lyric":"We have a show!"},
338
- {"name":"Tragic Fulfillment","card":"Ten of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"😭, ❤️","story":"The final tableau. Though tragic, the love story is complete and has achieved a kind of divine, emotional fulfillment. The community is united in their shared grief and the beauty of the love they witnessed.","lyric":"A love that will live forever."},
339
  {"name":"The Narcoleptic Argentinian","card":"Page of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"😴, 💃","story":"The Argentinian represents the intuitive, emotional, and somewhat naive side of the ensemble. He is a messenger of unconscious feelings, often expressing them in surprising and creative ways.","lyric":"The hills are alive..."},
340
  {"name":"The Sitar Player","card":"Knight of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"🎸, ❤️","story":"The romantic hero of 'Spectacular Spectacular.' He is on a quest driven by his heart, a romantic idealist who follows his emotions and creative vision above all else.","lyric":"I will love you..."},
341
  {"name":"The Indian Princess","card":"Queen of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"👑, 💧","story":"The character Satine plays. She is compassionate, intuitive, and in control of her emotional world, representing the emotional heart and soul of the story they are trying to tell.","lyric":"She is the queen of the underworld."},
@@ -346,14 +424,97 @@
346
  const drawButton = document.getElementById('draw-button');
347
  const resetButton = document.getElementById('reset-button');
348
  const cardSlotsContainer = document.getElementById('card-slots');
349
-
 
 
350
  let drawnCards = [];
 
351
 
352
- // --- Functions ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
353
 
354
  /**
355
- * Shuffles an array in place using the Fisher-Yates algorithm.
356
- * @param {Array} array The array to shuffle.
357
  */
358
  function shuffle(array) {
359
  for (let i = array.length - 1; i > 0; i--) {
@@ -362,79 +523,119 @@
362
  }
363
  }
364
 
 
 
 
 
 
 
 
 
365
  /**
366
  * Creates the HTML for a single card.
367
- * @param {Object} cardData The data for the card.
368
- * @param {string} position The position in the reading (e.g., 'Past').
369
- * @returns {HTMLElement} The card element.
370
  */
371
  function createCardElement(cardData, position) {
372
  const card = document.createElement('div');
373
  card.className = 'card';
 
 
374
 
375
  card.innerHTML = `
376
  <div class="card-face card-back">
377
- <div class="card-back-design">
378
- <span>M</span>
379
- </div>
380
  </div>
381
  <div class="card-face card-front">
382
- <div class="card-header">
383
- <h2>${cardData.name} ${cardData.emojis}</h2>
384
- <p class="tarot-title">${cardData.card}</p>
385
- </div>
386
- <div class="card-body">
387
- <p><strong>Position:</strong> ${position}</p>
388
- <p><strong>Character/Theme:</strong> <em>${cardData.character}</em></p>
389
- <p class="story"><strong>Story:</strong> ${cardData.story}</p>
390
- <p class="lyric"><strong>Lyric:</strong> "${cardData.lyric}"</p>
 
 
 
 
391
  </div>
392
  </div>
393
  `;
394
-
395
  card.addEventListener('click', () => {
396
  card.classList.toggle('is-flipped');
397
  });
398
-
399
  return card;
400
  }
401
 
402
  /**
403
- * Draws three cards and places them in the slots.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
404
  */
405
  function drawReading() {
406
  if (drawnCards.length > 0) return; // Prevent re-drawing
407
-
408
  shuffle(tarot_data);
409
  drawnCards = tarot_data.slice(0, 3);
410
- const positions = ['The Past', 'The Present', 'The Future'];
411
-
412
- cardSlotsContainer.innerHTML = ''; // Clear placeholders
413
 
 
414
  drawnCards.forEach((card, index) => {
415
  const slot = document.createElement('div');
416
  slot.className = 'card-slot';
417
-
418
  const cardElement = createCardElement(card, positions[index]);
419
  slot.appendChild(cardElement);
420
  cardSlotsContainer.appendChild(slot);
421
  });
 
 
422
  }
423
-
424
  /**
425
  * Resets the reading to its initial state.
426
  */
427
  function resetReading() {
428
  drawnCards = [];
 
 
 
429
  cardSlotsContainer.innerHTML = '';
430
  setupPlaceholders();
431
  }
432
-
433
  /**
434
  * Sets up the initial placeholder slots.
435
  */
436
  function setupPlaceholders() {
437
- const positions = ['The Past', 'The Present', 'The Future'];
438
  cardSlotsContainer.innerHTML = ''; // Clear any existing cards
439
  for (let i = 0; i < 3; i++) {
440
  const placeholder = document.createElement('div');
@@ -451,10 +652,9 @@
451
  // --- Event Listeners ---
452
  drawButton.addEventListener('click', drawReading);
453
  resetButton.addEventListener('click', resetReading);
454
-
455
  // --- Initial Setup ---
456
  window.onload = setupPlaceholders;
457
-
458
  </script>
459
  </body>
460
  </html>
 
3
  <head>
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Moulin Rouge! Tarot</title>
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
  <link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,700;1,700&family=Crimson+Text:ital,wght@0,400;1,400&display=swap" rel="stylesheet">
 
16
  --primary-text: #f5e6d3;
17
  --secondary-text: #3b0909;
18
  --accent-color: #d4af37; /* Gold */
19
+ --shadow-color: rgba(0, 0, 0, 0.5);
20
  --card-back-bg: linear-gradient(145deg, #8B0000, #4a0000); /* Deep Red */
21
  }
22
+ html, body {
23
+ height: 100%;
24
+ margin: 0;
25
+ overflow: hidden; /* Prevent body scroll */
26
+ }
27
  body {
28
  font-family: 'Crimson Text', serif;
29
  background-color: var(--bg-color);
30
  background-image: radial-gradient(rgba(255, 255, 255, 0.05) 1px, transparent 1px);
31
  background-size: 15px 15px;
32
  color: var(--primary-text);
33
+ padding: 0.5rem; /* Reduced padding */
 
34
  display: flex;
35
  flex-direction: column;
36
  align-items: center;
 
37
  text-align: center;
38
+ box-sizing: border-box;
39
  }
 
40
  h1 {
41
  font-family: 'Playfair Display', serif;
42
  font-weight: 700;
43
  font-style: italic;
44
  color: var(--accent-color);
45
  text-shadow: 2px 2px 5px var(--shadow-color);
46
+ margin: 0 0 0.5rem 0; /* Reduced margin */
47
+ font-size: clamp(1.8rem, 5vw, 2.2rem);
 
 
 
 
 
 
 
 
48
  }
49
 
50
+ /* --- Horizontal Top Bar --- */
51
+ #top-bar {
52
  display: flex;
53
+ justify-content: space-between;
54
  align-items: center;
 
55
  width: 100%;
56
+ max-width: 1200px;
57
+ padding: 0.5rem 1rem;
58
+ margin-bottom: 0.5rem; /* Reduced margin */
59
+ background-color: rgba(0,0,0,0.2);
60
+ border-radius: 10px;
61
+ border: 1px solid rgba(212, 175, 55, 0.2);
62
+ box-sizing: border-box;
63
+ gap: 1.5rem;
64
+ flex-shrink: 0;
65
+ }
66
+ p#instructions {
67
+ flex-grow: 1;
68
+ text-align: left;
69
+ margin: 0;
70
+ font-style: italic;
71
+ opacity: 0.9;
72
+ font-size: clamp(0.8rem, 1.5vw, 1rem);
73
  }
 
74
  #controls {
75
  display: flex;
76
  gap: 1rem;
77
+ flex-shrink: 0;
78
+ }
79
+ #score-board {
80
+ position: static; /* Removed absolute positioning */
81
+ display: flex;
82
+ align-items: center;
83
+ gap: 1rem;
84
+ background-color: rgba(0,0,0,0.3);
85
+ border: 1px solid var(--accent-color);
86
+ border-radius: 10px;
87
+ padding: 0.5rem 1rem;
88
+ box-shadow: 0 2px 10px rgba(0,0,0,0.5);
89
  }
90
+ #score-board h2 {
91
+ margin: 0;
92
+ font-family: 'Playfair Display', serif;
93
+ color: var(--accent-color);
94
+ font-size: 1.1rem;
95
+ }
96
+ #score-board .score-details {
97
+ text-align: right;
98
+ }
99
+ #score-board p { margin: 0; font-size: 1rem; }
100
+ #bonus-info { font-size: 0.8rem; font-style: italic; opacity: 0.8; }
101
 
102
  button {
103
  font-family: 'Playfair Display', serif;
104
+ padding: 0.7rem 1.2rem;
105
+ font-size: 0.9rem;
106
  border: 2px solid var(--accent-color);
107
  background-color: transparent;
108
  color: var(--accent-color);
109
  border-radius: 5px;
110
  cursor: pointer;
111
  transition: all 0.3s ease;
 
112
  text-transform: uppercase;
 
113
  }
 
114
  button:hover, button:focus {
115
  background-color: var(--accent-color);
116
  color: var(--secondary-text);
 
117
  transform: translateY(-2px);
118
  }
119
 
120
+ /* --- Main Table and Card Layout --- */
121
+ #table {
122
+ display: flex;
123
+ flex-direction: column;
124
+ align-items: center;
125
+ width: 100%;
126
+ flex-grow: 1; /* Takes up remaining vertical space */
127
+ overflow: hidden; /* Hide any potential overflow */
128
+ }
129
  #card-slots {
130
  display: flex;
131
  justify-content: center;
132
+ align-items: center;
133
+ flex-wrap: nowrap; /* Prevent wrapping */
134
+ gap: 2vw; /* Responsive gap */
135
  width: 100%;
136
+ height: 100%; /* Fill the table area */
137
+ max-width: 1800px;
138
+ perspective: 2000px;
139
  }
 
140
  .card-slot {
141
+ height: 98%; /* Fill vertical space */
142
+ width: auto; /* Let width be determined by aspect ratio */
143
+ aspect-ratio: 9 / 16; /* Taller aspect ratio */
144
  position: relative;
145
+ max-width: 31%; /* Prevent cards from becoming too wide on ultrawide screens */
146
  }
147
 
148
  .card-slot .placeholder {
 
155
  justify-content: center;
156
  align-items: center;
157
  font-style: italic;
 
158
  color: var(--accent-color);
159
+ box-sizing: border-box;
160
  }
 
161
  .placeholder span {
162
  font-family: 'Playfair Display', serif;
163
+ font-size: clamp(1.2rem, 4vw, 1.8rem);
164
  font-weight: bold;
165
  }
166
 
167
+ /* --- Card Styling --- */
168
  .card {
169
  width: 100%;
170
  height: 100%;
 
173
  transition: transform 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275);
174
  cursor: pointer;
175
  }
176
+ .card.is-flipped { transform: rotateY(180deg); }
 
 
 
 
177
  .card-face {
178
  position: absolute;
179
  width: 100%;
180
  height: 100%;
181
  backface-visibility: hidden;
182
  border-radius: 15px;
183
+ box-shadow: 0 10px 30px var(--shadow-color);
184
  overflow: hidden;
185
  display: flex;
186
  flex-direction: column;
187
  }
 
188
  .card-back {
189
  background: var(--card-back-bg);
190
  border: 5px solid var(--accent-color);
191
  display: flex;
192
  justify-content: center;
193
  align-items: center;
194
+ box-sizing: border-box;
195
  }
196
+ .card-back .animated-svg-back { width: 100%; height: 100%; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
197
  .card-front {
198
  background-color: var(--card-bg);
199
  color: var(--secondary-text);
200
  transform: rotateY(180deg);
201
+ padding: 4%; /* Use percentage for scaling padding */
202
  text-align: left;
203
+ box-sizing: border-box;
204
+ position: relative; /* For background SVG positioning */
205
+ }
206
+ .background-suit-icon {
207
+ position: absolute;
208
+ top: 50%;
209
+ left: 50%;
210
+ transform: translate(-50%, -50%);
211
+ width: 80%;
212
+ height: 80%;
213
+ opacity: 0.08;
214
+ z-index: 0;
215
+ }
216
+ .card-content {
217
+ position: relative;
218
+ z-index: 1;
219
+ height: 100%;
220
+ display: flex;
221
+ flex-direction: column;
222
+ }
223
+ .suit-border {
224
+ position: absolute;
225
+ left: 0;
226
+ top: 0;
227
+ width: 100%;
228
+ height: 100%;
229
+ z-index: 2;
230
+ pointer-events: none; /* Make sure it doesn't block clicks */
231
  }
232
 
233
+ /* --- Card Content Styling (NO SCROLL) --- */
234
  .card-header {
235
  text-align: center;
236
  border-bottom: 2px solid var(--card-border);
237
+ padding-bottom: 2%;
238
+ margin-bottom: 4%;
239
  }
 
240
  .card-header h2 {
241
  margin: 0;
242
  font-family: 'Playfair Display', serif;
243
+ font-size: 3.5vh; /* Proportional font size */
244
  color: #8B0000;
245
  }
 
246
  .card-header .tarot-title {
247
  font-style: italic;
248
+ font-size: 2.8vh; /* Proportional font size */
249
  color: #666;
250
  margin-top: 0.25rem;
251
  }
 
252
  .card-body {
253
+ font-size: 2.2vh; /* Proportional font size */
254
+ line-height: 1.45;
255
+ flex-grow: 1;
256
+ overflow: hidden; /* Prevent content from overflowing */
257
  }
258
+ .card-body p {
259
+ margin: 0 0 3% 0;
260
+ display: flex;
261
+ align-items: center;
262
  }
263
+ .card-body .body-icon {
264
+ width: 2.5vh;
265
+ height: 2.5vh;
266
+ margin-right: 0.5em;
267
+ flex-shrink: 0;
268
  }
269
+ .card-body .detail-text {
270
+ font-size: 2.8vh; /* Proportional font size */
271
+ font-family: 'Playfair Display', serif;
272
+ }
273
+
274
+ .card-body strong { color: #8B0000; font-weight: bold; }
275
+ .info-box {
276
+ display: block; /* Override flex for these paragraphs */
277
  font-style: italic;
278
+ background-color: rgba(224, 208, 184, 0.2);
279
+ padding: 2%;
280
  border-radius: 8px;
281
  border-left: 3px solid var(--accent-color);
282
  }
283
+ .info-box-title {
284
+ font-weight: bold;
285
+ font-style: normal;
286
+ display: block;
287
+ margin-bottom: 0.3em;
288
+ color: #8B0000;
289
+ }
290
  .lyric {
291
+ margin-top: 4%;
292
  border-left-color: #8B0000;
293
+ text-align: center;
294
  }
295
 
296
+ /* Responsive adjustments for the top bar */
297
+ @media (max-width: 900px) {
298
+ #top-bar {
299
+ flex-direction: column;
300
+ align-items: stretch;
301
+ gap: 0.5rem;
302
+ }
303
+ p#instructions {
304
+ text-align: center;
305
+ }
306
+ #controls {
307
+ justify-content: center;
308
+ }
309
+ #score-board {
310
+ justify-content: space-between;
311
+ }
312
+ }
313
  </style>
314
  </head>
315
  <body>
316
  <h1>Moulin Rouge! Tarot</h1>
317
+
318
+ <div id="top-bar">
319
+ <p id="instructions">Past, Present, Future spread. Draw cards, then click to reveal. Score bonus points for suits!</p>
320
+ <div id="controls">
321
+ <button id="draw-button">Draw Cards</button>
322
+ <button id="reset-button">Reset</button>
323
+ </div>
324
+ <div id="score-board">
325
+ <h2>Score</h2>
326
+ <div class="score-details">
327
+ <p id="current-score">0</p>
328
+ <p id="bonus-info"></p>
329
+ </div>
330
+ </div>
331
  </div>
332
 
333
  <div id="table">
 
340
  // --- Data: Moulin Rouge Tarot Deck ---
341
  const tarot_data = [
342
  // Major Arcana
343
+ {"name":"Christian's Arrival","card":"0 - The Fool","classifier":"Major Arcana","character":"Christian","emojis":"✍️, 🚂","story":"A young, penniless writer arrives in Montmartre, full of naive ideals about truth, beauty, freedom, and love. He takes a leap of faith, leaving his old life behind to join the Bohemian revolution, unaware of the spectacular and tragic journey that awaits.","lyric":"The hills are alive...<br>with the sound of music!"},
344
  {"name":"Zidler the Showman","card":"I - The Magician","classifier":"Major Arcana","character":"Zidler","emojis":"🎩, 🎪","story":"Harold Zidler, the proprietor of the Moulin Rouge, is the master manipulator. He has all the tools—the dancers, the stage, the spectacle—and uses his willpower to manifest a world of fantasy and illusion to attract the rich and powerful.","lyric":"The show must go on!"},
345
+ {"name":"Satine's Secret","card":"II - The High Priestess","classifier":"Major Arcana","character":"Satine","emojis":"💎, 🤫","story":"Satine, the Sparkling Diamond, holds a deep secret: her consumption. She guards this intuitive knowledge, this hidden truth beneath the glittering surface, knowing it will change everything. She is the keeper of a mystery that others cannot yet see.","lyric":"A kiss on the hand may be quite continental,<br>but diamonds are a girl's best friend."},
346
  {"name":"The Courtesan's Role","card":"III - The Empress","classifier":"Major Arcana","character":"Satine","emojis":"💃, ❤️","story":"As the star of the Moulin Rouge, Satine embodies earthly delights, sensuality, and creativity. She is the nurturing mother of the club, promising abundance and pleasure, her entire being a work of art designed to bring dreams to life.","lyric":"I'm the Sparkling Diamond!"},
347
+ {"name":"The Duke's Authority","card":"IV - The Emperor","classifier":"Major Arcana","character":"The Duke","emojis":"👑, 📜","story":"The Duke represents structure, power, and worldly authority. He seeks to own and control the Moulin Rouge and Satine, imposing his will through contracts and the unyielding structure of patronage. His rule is absolute and possessive.","lyric":"It's not that I'm a jealous man...<br>I just don't like other people touching my things."},
348
+ {"name":"The Bohemian Ideal","card":"V - The Hierophant","classifier":"Major Arcana","character":"Toulouse-Lautrec","emojis":"🎨, 📜","story":"Toulouse-Lautrec is the high priest of the Bohemian revolution, teaching its core beliefs: truth, beauty, freedom, and love. He is the keeper of tradition for this unconventional group, guiding Christian and upholding their sacred values against the establishment.","lyric":"The greatest thing you'll ever learn<br>is just to love and be loved in return."},
349
+ {"name":"The Choice","card":"VI - The Lovers","classifier":"Major Arcana","character":"Satine & Christian","emojis":"❤️, 💔","story":"The central conflict. Satine is torn between two paths, two values: the true, passionate love offered by Christian, and the financial security and career promised by the Duke. This is the ultimate choice of the heart, a defining alignment of values.","lyric":"Come what may,<br>I will love you until my dying day."},
350
+ {"name":"Spectacular Spectacular","card":"VII - The Chariot","classifier":"Major Arcana","character":"The Bohemians","emojis":"🎭, ➡️","story":"Driven by the sheer force of will and Christian's creative vision, the Bohemians propel their play, 'Spectacular Spectacular,' forward. They harness the opposing forces of comedy and tragedy, love and jealousy, to steer their ambitious project toward opening night.","lyric":"So exciting!<br>We'll write a show!"},
351
+ {"name":"A Woman Has to Be Strong","card":"VIII - Strength","classifier":"Major Arcana","character":"Satine","emojis":"🦁, ❤️‍🩹","story":"Satine must tame the wild beast of her own heart and the dangerous passions of the men around her. Her strength is not physical, but internal: the compassion, patience, and courage to maintain her composure and protect Christian in the face of the Duke's jealousy.","lyric":"They delight in fighting duels,<br>But I prefer a man who lives and gives expensive jewels."},
352
+ {"name":"The Penniless Writer","card":"IX - The Hermit","classifier":"Major Arcana","character":"Christian","emojis":"✍️, 🏮","story":"After Satine's death, Christian retreats into the solitude of his garret. He withdraws from the world to process his grief and find the truth of his story, writing it down to bring the light of his inner wisdom out into the world.","lyric":"I've paid my whore...<br>I owe you nothing."},
353
  {"name":"The Topsy-Turvy World","card":"X - Wheel of Fortune","classifier":"Major Arcana","character":"The Moulin Rouge","emojis":"🎡, 🎭","story":"The Moulin Rouge itself is a wheel of fortune. One night you're on top, the star of the show; the next, you're replaced. The fate of the show, the love affair, and the club are constantly turning, subject to the whims of luck, patronage, and destiny.","lyric":"Because you can, can, can!"},
354
+ {"name":"The Duke's Decree","card":"XI - Justice","classifier":"Major Arcana","character":"The Duke","emojis":"⚖️, 📜","story":"The Duke operates on a cold logic of cause and effect. He has paid for the club and for Satine, and he expects the deed to be honored. This card represents the clear, and often harsh, consequences of the contracts and choices that have been made.","lyric":"I am the Duke.<br>That is the final word."},
355
+ {"name":"A Secret Love","card":"XII - The Hanged Man","classifier":"Major Arcana","character":"Christian & Satine","emojis":"🤫, 🤸","story":"Christian and Satine must suspend their lives, putting their love on hold and seeing the world from a new perspective to keep their affair secret. They are in a state of voluntary sacrifice, waiting for the right moment to act, seeing things differently than those around them.","lyric":"We should be lovers...<br>we can't do that."},
356
+ {"name":"Consumption's Toll","card":"XIII - Death","classifier":"Major Arcana","character":"Satine","emojis":"💀, 🥀","story":"Satine's terminal illness represents an inevitable, unstoppable, and transformative end. It is the force that will bring the curtain down on her life and her love affair, clearing the way for the tragic but beautiful story that Christian will write.","lyric":"I'm dying, Christian.<br>It's the consumption."},
357
+ {"name":"The Green Fairy","card":"XIV - Temperance","classifier":"Major Arcana","character":"The Bohemians","emojis":"🧪, 🧚","story":"The Bohemians blend inspiration (absinthe) with creativity (writing) to find a perfect synthesis. The Green Fairy represents this alchemical process, mixing different elements to create a new vision, a balanced path between madness and genius.","lyric":"I'm the Green Fairy!<br>Freedom, beauty, truth, and love!"},
358
  {"name":"The Patronage Trap","card":"XV - The Devil","classifier":"Major Arcana","character":"The Duke","emojis":"⛓️, 💰","story":"The deal with the Duke is a trap. It offers the illusion of security and success, but binds Satine and the Moulin Rouge in a chain of ownership and jealousy. It represents the dark side of materialism, addiction to power, and possessive obsession.","lyric":"She is mine."},
359
  {"name":"The Final Confrontation","card":"XVI - The Tower","classifier":"Major Arcana","character":"The Stage","emojis":"💥, 🎭","story":"The climax of the play mirrors reality as the Duke's rage explodes. The false reality of the stage is shattered by a sudden, shocking revelation of truth. The entire structure of lies comes crashing down in a moment of violent, chaotic change.","lyric":"He's got a gun!"},
360
+ {"name":"The Elephant","card":"XVII - The Star","classifier":"Major Arcana","character":"Christian & Satine","emojis":"🐘, ✨","story":"In the sanctuary of the elephant, Christian and Satine find a moment of pure hope, inspiration, and serenity away from the chaos of the club. It is their guiding star, a place where their love feels pure and blessed by a higher power.","lyric":"Come what may...<br>I will love you..."},
361
+ {"name":"The Unconscious Fear","card":"XVIII - The Moon","classifier":"Major Arcana","character":"Satine","emojis":"🌙, 😥","story":"Satine navigates a world of illusion and deception, both on stage and off. She is haunted by deep-seated fears of poverty and her past, forces that emerge from the unconscious and threaten to derail her path to love and security.","lyric":"Another hero, another mindless crime,<br>Behind the curtain, in the pantomime."},
362
  {"name":"The Perfect Show","card":"XIX - The Sun","classifier":"Major Arcana","character":"Spectacular Spectacular","emojis":"☀️, 👏","story":"The moment the show succeeds, it is a burst of pure joy, success, and clarity. The vision of the Bohemians is realized, and for a brief, shining moment, everything is vibrant, triumphant, and celebrated by all.","lyric":"We have a show!"},
363
  {"name":"The Story is Told","card":"XX - Judgment","classifier":"Major Arcana","character":"Christian","emojis":"✍️, 🌅","story":"At the end, Christian answers a higher calling. He rises from his grief to write the story of his love, bringing absolution and rebirth. He judges the events that have passed and gives them meaning, resurrecting their love as a timeless tale.","lyric":"This is a story about love."},
364
+ {"name":"The Greatest Thing","card":"XXI - The World","classifier":"Major Arcana","character":"The Story","emojis":"🌍, ❤️","story":"The story of Christian and Satine reaches its successful completion. It becomes a whole, integrated narrative that teaches the 'greatest thing.' The cycle is complete, the lesson is learned, and their love has achieved a form of worldly immortality.","lyric":"The greatest thing you'll ever learn<br>is just to love and be loved in return."},
 
 
365
  {"name":"The Spark of a Story","card":"Ace of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"💡, 🔥","story":"The moment Christian, filled with the Bohemian spirit, has the initial, passionate idea for 'Spectacular Spectacular.' It is a pure burst of creative energy and inspiration, a new beginning and a call to action.","lyric":"A story about a penniless sitar player!"},
366
  {"name":"A Choice of Paths","card":"Two of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"🗺️, 🤔","story":"Christian stands between the world of his father and the world of the Moulin Rouge. He holds his potential in his hands, making a bold choice to leave security behind and plan a future based on his creative passion.","lyric":"I don't want to be a lawyer!"},
367
+ {"name":"The Pitch","card":"Three of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"🚢, 🔭","story":"Christian and the Bohemians pitch their show to Satine and Zidler. They are looking to the future, anticipating the results of their creative enterprise and waiting for their ship to come in.","lyric":"It's a story about a magical kingdom<br>in faraway India!"},
368
+ {"name":"The First Rehearsal","card":"Four of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"🎉, 🏡","story":"The cast and crew come together for the first time, celebrating the beginning of their new creative project. There is a sense of harmony, community, and the joy of a stable foundation for their work.","lyric":"The Bohemians,<br>the children of the revolution!"},
369
  {"name":"Creative Conflict","card":"Five of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"😖, 🎭","story":"The rehearsals are chaotic. The writer, the composer, the actors—everyone has a different idea. This represents the minor struggles and creative clashes that are part of any ambitious project.","lyric":"But the ending is not happy!"},
370
+ {"name":"The Poet's Victory","card":"Six of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"🏆, 👏","story":"Satine chooses Christian's song, 'Your Song,' over the Duke's wishes. It is a public recognition of his talent and a victory for his creative vision and passionate love.","lyric":"My gift is my song,<br>and this one's for you."},
371
  {"name":"Defending the Story","card":"Seven of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"🛡️, ✍️","story":"Christian must constantly defend his artistic integrity and the 'happy ending' of his play against the Duke's demands and Zidler's compromises. He stands his ground, fighting for his creative principles.","lyric":"The greatest thing is love!"},
372
+ {"name":"A Love Letter","card":"Eight of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"💌, ✈️","story":"Christian's passion and words travel swiftly to Satine's heart. 'Your Song' is a direct, energetic message of love that overcomes all obstacles to reach its destination.","lyric":"How wonderful life is<br>while you're in the world."},
373
+ {"name":"The Burden of Love","card":"Nine of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"🤕, стойкость","story":"Wounded by jealousy and the seeming betrayal of Satine, Christian is weary but not defeated. He gathers his resilience for one final stand, ready to defend his love despite the pain.","lyric":"I've paid my whore.<br>I owe you nothing."},
374
+ {"name":"The Weight of the Story","card":"Ten of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"😫, ✍️","story":"At the end, Christian is left alone, burdened with the responsibility of telling their tragic story. The creative passion that once brought him joy has now become a heavy weight he must carry.","lyric":"A story about a love<br>that will live forever."},
375
  {"name":"The Idealist","card":"Page of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"🤩, 📜","story":"Christian at the very beginning: exploring his new passion for the Bohemian ideals, full of creative energy, and ready to embark on a new adventure without fully understanding the consequences.","lyric":"I am the writer!"},
376
+ {"name":"The Romantic Hero","card":"Knight of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"🧗, ❤️‍🔥","story":"Christian's passionate and often reckless pursuit of Satine. He charges into the Moulin Rouge, climbs elephants, and writes poetry, driven by a fiery love that is both charming and impulsive.","lyric":"I've come to tell you my secret.<br>I love you."},
377
+ {"name":"The Playwright","card":"Queen of Wands","classifier":"Wands - Fire - Creativity","character":"Christian","emojis":"👑, 🎭","story":"Christian, in his creative element, is confident, determined, and the center of the show's creation. He inspires others with his vibrant energy and his unwavering belief in the power of his story.","lyric":"No, it's about love!<br>Overcoming all obstacles!"},
378
  {"name":"The Father","card":"King of Wands","classifier":"Wands - Fire - Creativity","character":"Christian's Father","emojis":"👨‍💼, 😠","story":"Christian's father represents the established, visionary leader of a different world. He has a clear vision for Christian's future (as a lawyer) and tries to control his son's passionate, creative impulses with his own authority.","lyric":"You'll be a lawyer!"},
379
+ {"name":"The Duke's Offer","card":"Ace of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"💎, 🤝","story":"The Duke makes his offer to fund the show in exchange for Satine. This is a new, tangible opportunity for wealth and security, a seed of prosperity planted in the material world.","lyric":"A man who lives<br>and gives expensive jewels."},
 
 
380
  {"name":"The Double Life","card":"Two of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"🎭, ⚖️","story":"Satine masterfully juggles two realities: her public performances for the Duke and her secret, private moments with Christian. She is constantly balancing her financial obligations with her heart's desires.","lyric":"I can't fall in love with anyone."},
381
  {"name":"A Star is Born","card":"Three of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"💃, 👏","story":"Satine's performance in the initial pitch for the show demonstrates her skill and mastery of her craft. It is a moment of teamwork where her tangible talent is recognized as the key to the project's success.","lyric":"He's a maharajah!"},
382
+ {"name":"The Gilded Cage","card":"Four of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"🔒, 💎","story":"Satine clings to the security promised by the Duke, fearing a return to poverty. She builds a wall around her heart, holding tightly to material stability at the expense of emotional freedom.","lyric":"We're creatures of the underworld.<br>We can't afford to love."},
383
  {"name":"The Sickness","card":"Five of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"😥, ❄️","story":"Satine collapses from her consumption. This is a moment of physical hardship, illness, and feeling left out in the cold, facing the harsh reality that material wealth cannot protect her from her body's decline.","lyric":"I'm cold."},
384
  {"name":"A Diamond for a Song","card":"Six of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"🎁, 💔","story":"The diamond necklace from the Duke. It is a gift of immense value, but it comes with strings attached. It represents a power imbalance, a charity that is really a transaction for ownership.","lyric":"It's for you..."},
385
+ {"name":"The Long Game","card":"Seven of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"🤔, ⏳","story":"Satine must patiently wait for the show to become a success, hoping her investment of time and emotion will pay off in long-term security. She is assessing her progress, wondering if her hard work will bear fruit.","lyric":"I'm a courtesan.<br>I'm paid to make men believe what they want to believe."},
386
+ {"name":"The Courtesan's Craft","card":"Eight of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"💄, 🎭","story":"Satine's life is one of diligent, repetitive work. She is a master of her craft—the art of seduction and performance—and she dedicates herself to perfecting the skills required for her job.","lyric":"I make men believe<br>I'm in love with them."},
387
  {"name":"The Real Actress","card":"Nine of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"💃, 🕊️","story":"Satine dreams of becoming a 'real actress,' a life of independent success and self-sufficiency. This card represents the grace, discipline, and financial independence she longs for, free from the control of men.","lyric":"I want to be a real actress!"},
388
  {"name":"The Moulin Rouge Legacy","card":"Ten of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"🏰, 💰","story":"The ultimate material goal: for the Moulin Rouge to be transformed from a dance hall into a legitimate, wealthy theatre. This represents the establishment of a lasting financial legacy and community stability.","lyric":"A real theatre!"},
389
+ {"name":"The Aspiring Actress","card":"Page of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"🌟, 📖","story":"Satine at her core is a student of the material world, eager to learn the craft of acting and manifest a new, tangible reality for herself. She is focused on a new opportunity for earthly success.","lyric":"I can't just fall in love.<br>I have to think about my future."},
390
  {"name":"The Diamond Dog","card":"Knight of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"🐕, 💎","story":"Satine's public persona is hardworking, dependable, and focused on the practical goal of securing her future. She methodically works towards her material goals, even at a slow and steady pace.","lyric":"I am the Sparkling Diamond!"},
391
  {"name":"The Star Performer","card":"Queen of Pentacles","classifier":"Pentacles - Earth - Physical","character":"Satine","emojis":"👑, 💃","story":"As the star of the Moulin Rouge, Satine is a nurturing, practical, and down-to-earth figure for the other dancers. She manages the material and physical world of the club with grace and authority.","lyric":"The show must go on!"},
392
+ {"name":"The Financier","card":"King of Pentacles","classifier":"Pentacles - Earth - Physical","character":"The Duke","emojis":"💰, 👑","story":"The Duke in his element: a master of wealth and enterprise. He uses his vast fortune to control the world around him, seeing everything as an investment and expecting a return. He is the king of the material world.","lyric":"I'm a financier.<br>I invest in things."},
 
 
393
  {"name":"The Duke's Claim","card":"Ace of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"💡, 🗡️","story":"The Duke makes his intentions clear. His offer is a breakthrough moment of sharp, cold clarity: he will fund the show, but Satine is part of the deal. The truth of his possessiveness is revealed.","lyric":"She is mine."},
394
+ {"name":"The Stalemate","card":"Two of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"😑, ⚔️","story":"The Duke is willfully blind to the love between Christian and Satine, creating a tense stalemate. He blocks out the emotional truth, refusing to make a decision and keeping everyone in a state of suspended conflict.","lyric":"I don't believe you.<br>You're a courtesan."},
395
  {"name":"The Jealous Heart","card":"Three of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"💔, 😥","story":"The moment the Duke realizes the truth of the affair. It is a painful, piercing sorrow born of betrayal and jealousy. The heartbreak is sharp, intellectual, and leads to a desire for revenge.","lyric":"He's been with her!"},
396
+ {"name":"The Ultimatum","card":"Four of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"⏳, 😠","story":"After a jealous outburst, the Duke retreats to plan his next move. This is a period of forced rest and contemplation, a strategic withdrawal to recover from a conflict and decide on a new course of action.","lyric":"If you're not with me,<br>you're against me."},
397
  {"name":"A Hollow Victory","card":"Five of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"😒, 🏆","story":"The Duke forces Satine to send Christian away. He wins the conflict, but it is a pyrrhic victory that brings no joy, only the cold satisfaction of having asserted his power through cruelty.","lyric":"Tell him you don't love him."},
398
+ {"name":"The Escape","card":"Six of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"✈️, 😥","story":"The Duke, feeling betrayed, contemplates abandoning the whole project. This card represents a sorrowful transition, moving away from a difficult situation towards a calmer, but uncertain, future.","lyric":"I'm leaving.<br>The show is off."},
399
  {"name":"The Deception","card":"Seven of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"🤫, 😈","story":"The Duke operates through deception and strategy, using Zidler as his pawn and manipulating events from behind the scenes. He acts alone, using his intellect to try and outsmart his rivals.","lyric":"I control everything."},
400
+ {"name":"The Gilded Cage's Bars","card":"Eight of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"⛓️, 😥","story":"The Duke creates a situation where Satine feels trapped and powerless, believing there is no way out of her obligation to him. He uses threats and logic to restrict her choices and isolate her.","lyric":"If you leave me,<br>I'll kill your lover."},
401
  {"name":"The Nightmare","card":"Nine of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"😰, 😠","story":"The Duke is tormented by anxiety, paranoia, and jealousy over the affair. He is kept awake at night by his dark thoughts, a mental anguish born from his fear of betrayal and loss of control.","lyric":"He's been with her behind my back!"},
402
  {"name":"The Final Betrayal","card":"Ten of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"💀, 🗡️","story":"The Duke's rage culminates in the final, dramatic confrontation on stage. It is a moment of absolute ruin, the painful and violent end of the affair, brought about by his vengeful actions.","lyric":"My way, or the highway!"},
403
  {"name":"The Threat","card":"Page of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"📜, 🗣️","story":"The Duke's initial interactions are full of probing questions and tests. He is curious, communicative, and uses his words as a way to gather information and assert his intellectual dominance.","lyric":"A real actress..."},
404
  {"name":"The Pursuer","card":"Knight of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"🏃, 😠","story":"When his ownership is challenged, the Duke acts with swift, assertive, and ruthless ambition. He pursues his goal of possessing Satine with a single-minded and cold logic, regardless of the emotional cost.","lyric":"I will have her."},
405
+ {"name":"The Unseen Power","card":"Queen of Swords","classifier":"Swords - Air - Reason","character":"Marie","emojis":"👑, 🤫","story":"Marie, the head courtesan, operates with the sharp, unbiased clarity of experience. She understands the rules of the world they live in and offers Satine clear, if sometimes painful, advice based on impartial truth.","lyric":"You must make him believe<br>you love him."},
406
  {"name":"The Patron","card":"King of Swords","classifier":"Swords - Air - Reason","character":"The Duke","emojis":"👑, 🗡️","story":"The Duke in his ultimate form: a figure of immense intellectual and worldly power. He rules with authority, truth (as he sees it), and the law of contracts. He is the final arbiter of their fates.","lyric":"The show will end my way."},
 
 
407
  {"name":"The Bohemian Ideal","card":"Ace of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"❤️, 🥂","story":"The overflowing of creative and emotional energy as the Bohemians welcome Christian. It is a moment of pure, divine love for their ideals, a new spiritual and emotional beginning.","lyric":"Freedom, Beauty, Truth, and Love!"},
408
  {"name":"A Perfect Union","card":"Two of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"🤝, ❤️","story":"The partnership between Christian's words and Satine's voice. It is a mutual attraction and a union of two souls that forms the emotional heart of the show and their love story.","lyric":"We should be lovers..."},
409
+ {"name":"The Children of the Underworld","card":"Three of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"🎉, 💃","story":"The joyous, celebratory moments of the cast creating their show. It is a time of friendship, community, and the emotional high of shared creative expression.","lyric":"Here we are now,<br>entertainers!"},
410
  {"name":"Apathy and Dreams","card":"Four of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"😒, 🤔","story":"During a creative block, the Bohemians are apathetic and withdrawn. They are contemplating their situation, waiting for a new emotional or spiritual offering to re-engage their passion.","lyric":"The writer's blocked!"},
411
+ {"name":"The Loss of an Ideal","card":"Five of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"😥, 💔","story":"The moment the Bohemians realize the Duke's influence is corrupting their play and their ideals. It is a moment of grief and disappointment, focusing on what has been lost.","lyric":"It's about a penniless sitar player...<br>and the woman he loves..."},
412
  {"name":"Nostalgia for the Garret","card":"Six of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"🎨, 🏡","story":"The Bohemians look back on the innocent, happy times in their garret before the complications of the Duke and the Moulin Rouge. It is a moment of nostalgia for a simpler, purer emotional past.","lyric":"We are the children of the revolution!"},
413
  {"name":"The World of Illusion","card":"Seven of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"💭, 🧚","story":"The influence of absinthe and the Green Fairy. The Bohemians are presented with a world of fantasy, dreams, and illusion, with many creative choices but a danger of getting lost in the fantasy.","lyric":"The Green Fairy!"},
414
  {"name":"Leaving the Party","card":"Eight of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"🚶, 🌙","story":"The moment Christian decides to leave the Moulin Rouge, walking away from the emotional chaos and disillusionment to seek a higher, more authentic truth, even if it means walking away alone.","lyric":"I've paid my whore."},
415
  {"name":"A Dream Come True","card":"Nine of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"😊, 🥂","story":"The moment the show is a success and the cast gets everything they wished for: a hit play, a real theatre. It is a moment of pure emotional satisfaction and contentment.","lyric":"We have a show!"},
416
+ {"name":"Tragic Fulfillment","card":"Ten of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"😭, ❤️","story":"The final tableau. Though tragic, the love story is complete and has achieved a kind of divine, emotional fulfillment. The community are united in their shared grief and the beauty of the love they witnessed.","lyric":"A love that will live forever."},
417
  {"name":"The Narcoleptic Argentinian","card":"Page of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"😴, 💃","story":"The Argentinian represents the intuitive, emotional, and somewhat naive side of the ensemble. He is a messenger of unconscious feelings, often expressing them in surprising and creative ways.","lyric":"The hills are alive..."},
418
  {"name":"The Sitar Player","card":"Knight of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"🎸, ❤️","story":"The romantic hero of 'Spectacular Spectacular.' He is on a quest driven by his heart, a romantic idealist who follows his emotions and creative vision above all else.","lyric":"I will love you..."},
419
  {"name":"The Indian Princess","card":"Queen of Cups","classifier":"Cups - Water - Emotional","character":"The Ensemble","emojis":"👑, 💧","story":"The character Satine plays. She is compassionate, intuitive, and in control of her emotional world, representing the emotional heart and soul of the story they are trying to tell.","lyric":"She is the queen of the underworld."},
 
424
  const drawButton = document.getElementById('draw-button');
425
  const resetButton = document.getElementById('reset-button');
426
  const cardSlotsContainer = document.getElementById('card-slots');
427
+ const scoreDisplay = document.getElementById('current-score');
428
+ const bonusInfoDisplay = document.getElementById('bonus-info');
429
+
430
  let drawnCards = [];
431
+ let score = 0;
432
 
433
+ // --- SVG Definitions ---
434
+ const bodyIcons = {
435
+ position: `<svg class="body-icon" viewBox="0 0 24 24" fill="currentColor"><path d="M12 11.5A2.5 2.5 0 0 1 9.5 9A2.5 2.5 0 0 1 12 6.5A2.5 2.5 0 0 1 14.5 9a2.5 2.5 0 0 1-2.5 2.5M12 2a7 7 0 0 0-7 7c0 5.25 7 13 7 13s7-7.75 7-13a7 7 0 0 0-7-7Z"><animate attributeName="opacity" values="0.6;1;0.6" dur="3s" repeatCount="indefinite" /></path></svg>`,
436
+ character: `<svg class="body-icon" viewBox="0 0 24 24" fill="currentColor"><path d="M16.5 13.5A1.5 1.5 0 0 1 15 12A1.5 1.5 0 0 1 16.5 10.5A1.5 1.5 0 0 1 18 12a1.5 1.5 0 0 1-1.5 1.5m-9 0A1.5 1.5 0 0 1 6 12A1.5 1.5 0 0 1 7.5 10.5A1.5 1.5 0 0 1 9 12a1.5 1.5 0 0 1-1.5 1.5M12 2a10 10 0 0 0-10 10a10 10 0 0 0 10 10a10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8s8 3.58 8 8s-3.58 8-8 8m0-4.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5Z"><animateTransform attributeName="transform" type="rotate" from="0 12 12" to="15 12 12" dur="4s" repeatCount="indefinite" yoyo="true" /></path></svg>`,
437
+ };
438
+
439
+ const suitColors = {
440
+ 'Wands': '#FF5733', // Fiery Orange
441
+ 'Cups': '#337BFF', // Watery Blue
442
+ 'Swords': '#A8A8A8', // Airy Silver
443
+ 'Pentacles': '#28A745', // Earthy Green
444
+ 'Major Arcana': '#D4AF37' // Gold
445
+ };
446
+
447
+ const backgroundSuitIcons = {
448
+ 'Wands': `<svg class="background-suit-icon" viewBox="0 0 100 100"><defs><filter id="glow-wands"><feGaussianBlur stdDeviation="2.5" result="coloredBlur"/><feFlood flood-color="${suitColors.Wands}" flood-opacity="0.8" result="flood"/><feComposite in="flood" in2="coloredBlur" operator="in" result="glow"/><feMerge><feMergeNode in="glow"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g stroke-width="3" stroke="currentColor" filter="url(#glow-wands)"><path d="M50,10 L50,90" /><path d="M40,20 L60,20" /><path d="M45,90 L55,90" /><circle cx="50" cy="10" r="8"><animate attributeName="r" values="8;10;8" dur="3s" repeatCount="indefinite" /></circle><path d="M50,10 L50,90" stroke-width="1.5" stroke-opacity="0.5"><animate attributeName="stroke-dasharray" values="0 100; 50 50; 100 0" dur="3s" repeatCount="indefinite"/></path></g></svg>`,
449
+ 'Cups': `<svg class="background-suit-icon" viewBox="0 0 100 100"><defs><filter id="glow-cups"><feGaussianBlur stdDeviation="3" result="coloredBlur"/><feFlood flood-color="${suitColors.Cups}" flood-opacity="0.8" result="flood"/><feComposite in="flood" in2="coloredBlur" operator="in" result="glow"/><feMerge><feMergeNode in="glow"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g stroke-width="2" stroke="currentColor" fill="none" filter="url(#glow-cups)"><path d="M30 10 H 70 V 30 C 70 45, 60 50, 50 60 C 40 50, 30 45, 30 30 Z" /><path d="M40 70 H 60" /><path d="M50 60 V 80" /><path d="M35 80 H 65" /><path d="M40,5 C40,0 45,0 45,5 S50,0 50,5 S55,0 55,5 S60,0 60,5"><animate attributeName="d" values="M40,5 C40,0 45,0 45,5 S50,0 50,5 S55,0 55,5 S60,0 60,5; M40,8 C40,3 45,3 45,8 S50,3 50,8 S55,3 55,8 S60,3 60,8; M40,5 C40,0 45,0 45,5 S50,0 50,5 S55,0 55,5 S60,0 60,5" dur="3s" repeatCount="indefinite" /></path></g></svg>`,
450
+ 'Swords': `<svg class="background-suit-icon" viewBox="0 0 100 100"><defs><filter id="glow-swords"><feGaussianBlur stdDeviation="2.5" result="coloredBlur"/><feFlood flood-color="${suitColors.Swords}" flood-opacity="0.7" result="flood"/><feComposite in="flood" in2="coloredBlur" operator="in" result="glow"/><feMerge><feMergeNode in="glow"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g stroke-width="3" stroke="currentColor" fill="none" filter="url(#glow-swords)"><path d="M50,10 L50,70" /><path d="M35,80 L65,80" /><path d="M50,70 C 40 80, 40 85, 50 90 C 60 85, 60 80, 50 70 Z" /><path d="M50,10 L50,70" stroke-width="1" stroke-dasharray="2 4"><animate attributeName="stroke-dashoffset" from="0" to="12" dur="1s" repeatCount="indefinite" /></path></g></svg>`,
451
+ 'Pentacles': `<svg class="background-suit-icon" viewBox="0 0 100 100"><defs><filter id="glow-pentacles"><feGaussianBlur stdDeviation="3" result="coloredBlur"/><feFlood flood-color="${suitColors.Pentacles}" flood-opacity="0.8" result="flood"/><feComposite in="flood" in2="coloredBlur" operator="in" result="glow"/><feMerge><feMergeNode in="glow"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g fill="none" stroke="currentColor" filter="url(#glow-pentacles)"><circle cx="50" cy="50" r="38" stroke-width="1.5" /><path stroke-width="2" d="M50 10 L21 89 L90 35 L10 35 L79 89 Z"><animateTransform attributeName="transform" type="rotate" from="0 50 50" to="360 50 50" dur="20s" linear="true" repeatCount="indefinite" /></path></g></svg>`,
452
+ 'Major Arcana': `<svg class="background-suit-icon" viewBox="0 0 100 100"><defs><filter id="glow-arcana"><feGaussianBlur stdDeviation="3" result="coloredBlur"/><feFlood flood-color="${suitColors['Major Arcana']}" flood-opacity="0.8" result="flood"/><feComposite in="flood" in2="coloredBlur" operator="in" result="glow"/><feMerge><feMergeNode in="glow"/><feMergeNode in="SourceGraphic"/></feMerge></filter></defs><g stroke-width="1.5" stroke="currentColor" fill="none" filter="url(#glow-arcana)"><path d="M50,10 L50,90 M10,50 L90,50"><animateTransform attributeName="transform" type="rotate" from="0 50 50" to="360 50 50" dur="25s" linear="true" repeatCount="indefinite" /></path><path d="M22,22 L78,78 M22,78 L78,22"><animateTransform attributeName="transform" type="rotate" from="360 50 50" to="0 50 50" dur="35s" linear="true" repeatCount="indefinite" /></path><circle cx="50" cy="50" r="20"><animate attributeName="r" values="20;28;20" dur="7s" repeatCount="indefinite" /></circle></g></svg>`
453
+ };
454
+
455
+ const suitBorders = {
456
+ 'Wands': `<svg class="suit-border" viewBox="0 0 100 180" preserveAspectRatio="none"><path d="M 5,5 C 20 80, -10 100, 5 175 M 95,5 C 80 80, 110 100, 95 175" fill="none" stroke="${suitColors.Wands}" stroke-width="1.5" opacity="0.3" stroke-dasharray="5,5"><animate attributeName="stroke-dashoffset" from="0" to="20" dur="2s" repeatCount="indefinite" /></path></svg>`,
457
+ 'Cups': `<svg class="suit-border" viewBox="0 0 100 180" preserveAspectRatio="none"><path d="M 5,5 Q 25 90, 5 175 M 95,5 Q 75 90, 95 175" fill="none" stroke="${suitColors.Cups}" stroke-width="1.5" opacity="0.3" stroke-dasharray="170" stroke-dashoffset="170"><animate attributeName="stroke-dashoffset" values="340;0;340" dur="6s" repeatCount="indefinite" /></path></svg>`,
458
+ 'Swords': `<svg class="suit-border" viewBox="0 0 100 180" preserveAspectRatio="none"><path d="M5,5 L5,175 M95,5 L95,175" fill="none" stroke="${suitColors.Swords}" stroke-width="1.5" opacity="0.4" /><path d="M5,5 L95,5 M5,175 L95,175" fill="none" stroke="${suitColors.Swords}" stroke-width="3" opacity="0.4" /></svg>`,
459
+ 'Pentacles': `<svg class="suit-border" viewBox="0 0 100 180" preserveAspectRatio="none"><rect x="2" y="2" width="96" height="176" rx="10" fill="none" stroke="${suitColors.Pentacles}" stroke-width="1.5" opacity="0.3"><animate attributeName="stroke-dasharray" values="10 40; 40 10; 10 40" dur="5s" repeatCount="indefinite" /></rect></svg>`,
460
+ 'Major Arcana': `<svg class="suit-border" viewBox="0 0 100 180" preserveAspectRatio="none"><defs><path id="arcana-filigree" d="M0,10 C 20,0 30,20 50,10 S 80,0 100,10" stroke="${suitColors['Major Arcana']}" fill="none" stroke-width="1.5" opacity="0.4" stroke-dasharray="100"/></defs><use href="#arcana-filigree" transform="translate(0, 5)"><animate attributeName="stroke-dashoffset" values="200;0" dur="8s" linear="true" repeatCount="indefinite" /></use><use href="#arcana-filigree" transform="translate(100, 5) scale(-1, 1) translate(-100, 0)"><animate attributeName="stroke-dashoffset" values="0;200" dur="8s" linear="true" repeatCount="indefinite" /></use><use href="#arcana-filigree" transform="translate(0, 165) scale(1,-1)"><animate attributeName="stroke-dashoffset" values="0;200" dur="8s" linear="true" repeatCount="indefinite" /></use><use href="#arcana-filigree" transform="translate(100, 165) scale(-1, -1) translate(-100, 0)"><animate attributeName="stroke-dashoffset" values="200;0" dur="8s" linear="true" repeatCount="indefinite" /></use></svg>`
461
+ };
462
+
463
+ // --- L-System SVG Generator for Card Backs ---
464
+ const lSystemGenerator = (suit) => {
465
+ const rules = {
466
+ 'Wands': { 'F': 'F[+F]F[-F]F' },
467
+ 'Cups': { 'X': 'F+[[X]-X]-F[-FX]+X', 'F': 'FF' },
468
+ 'Swords': { 'F': 'F-F++F-F' },
469
+ 'Pentacles': { 'F': 'FF-[-F+F+F]+[+F-F-F]' },
470
+ 'Major Arcana': { 'X': 'F[+X]F[-X]+X', 'F': 'FF' }
471
+ };
472
+ const axiom = (suit === 'Cups' || suit === 'Major Arcana') ? 'X' : 'F';
473
+ const iterations = (suit === 'Wands' || suit === 'Swords') ? 3 : 4;
474
+ const angle = (suit === 'Swords') ? 60 : 25;
475
+ const length = (suit === 'Wands' || suit === 'Swords') ? 15 : 5;
476
+ const color = suitColors[suit] || suitColors['Major Arcana'];
477
+
478
+ let current = axiom;
479
+ for (let i = 0; i < iterations; i++) {
480
+ let next = '';
481
+ for (const char of current) {
482
+ next += rules[suit][char] || char;
483
+ }
484
+ current = next;
485
+ }
486
+
487
+ let path = '';
488
+ const stack = [];
489
+ let x = 50, y = 100, a = -90;
490
+ for (const char of current) {
491
+ if (char === 'F') {
492
+ const newX = x + length * Math.cos(a * Math.PI / 180);
493
+ const newY = y + length * Math.sin(a * Math.PI / 180);
494
+ path += `M${x},${y} L${newX},${newY} `;
495
+ x = newX; y = newY;
496
+ } else if (char === '+') a += angle;
497
+ else if (char === '-') a -= angle;
498
+ else if (char === '[') stack.push({x, y, a});
499
+ else if (char === ']') ({x, y, a} = stack.pop());
500
+ }
501
+
502
+ return `
503
+ <svg class="animated-svg-back" width="100%" height="100%" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
504
+ <defs>
505
+ <filter id="glow-back-${suit}"><feGaussianBlur stdDeviation="1" result="coloredBlur"/><feFlood flood-color="${color}" flood-opacity="0.9" result="flood"/><feComposite in="flood" in2="coloredBlur" operator="in" result="glow"/><feMerge><feMergeNode in="glow"/><feMergeNode in="SourceGraphic"/></feMerge></filter>
506
+ </defs>
507
+ <g transform="translate(0, -10)">
508
+ <path d="${path}" stroke="${color}" stroke-width="0.5" fill="none" opacity="0.7">
509
+ <animateTransform attributeName="transform" type="rotate" from="0 50 50" to="360 50 50" dur="60s" linear="true" repeatCount="indefinite" />
510
+ </path>
511
+ </g>
512
+ <text x="50" y="50" font-family="Playfair Display" font-size="60" fill="${color}" text-anchor="middle" dominant-baseline="central" filter="url(#glow-back-${suit})">M</text>
513
+ </svg>`;
514
+ };
515
 
516
  /**
517
+ * Shuffles an array in place.
 
518
  */
519
  function shuffle(array) {
520
  for (let i = array.length - 1; i > 0; i--) {
 
523
  }
524
  }
525
 
526
+ /**
527
+ * Extracts the suit from the classifier string.
528
+ */
529
+ function getSuit(classifier) {
530
+ if (classifier.startsWith('Major')) return 'Major Arcana';
531
+ return classifier.split(' ')[0];
532
+ }
533
+
534
  /**
535
  * Creates the HTML for a single card.
 
 
 
536
  */
537
  function createCardElement(cardData, position) {
538
  const card = document.createElement('div');
539
  card.className = 'card';
540
+ const suit = getSuit(cardData.classifier);
541
+ const displayName = cardData.name.replace(/^The\s/, '');
542
 
543
  card.innerHTML = `
544
  <div class="card-face card-back">
545
+ ${lSystemGenerator(suit)}
 
 
546
  </div>
547
  <div class="card-face card-front">
548
+ ${backgroundSuitIcons[suit] || ''}
549
+ ${suitBorders[suit] || ''}
550
+ <div class="card-content">
551
+ <div class="card-header">
552
+ <h2>${displayName} ${cardData.emojis}</h2>
553
+ <p class="tarot-title">${cardData.card}</p>
554
+ </div>
555
+ <div class="card-body">
556
+ <p>${bodyIcons.position} <em class="detail-text">${position}</em></p>
557
+ <p>${bodyIcons.character} <em class="detail-text">${cardData.character}</em></p>
558
+ <div class="info-box story"><span class="info-box-title">Story</span>${cardData.story}</div>
559
+ <div class="info-box lyric"><span class="info-box-title">Lyric</span>"${cardData.lyric}"</div>
560
+ </div>
561
  </div>
562
  </div>
563
  `;
564
+
565
  card.addEventListener('click', () => {
566
  card.classList.toggle('is-flipped');
567
  });
 
568
  return card;
569
  }
570
 
571
  /**
572
+ * Calculates the score based on drawn cards.
573
+ */
574
+ function calculateScore() {
575
+ score = 0;
576
+ bonusInfoDisplay.innerHTML = '';
577
+ const suitCounts = {};
578
+
579
+ drawnCards.forEach(card => {
580
+ const suit = getSuit(card.classifier);
581
+ suitCounts[suit] = (suitCounts[suit] || 0) + 1;
582
+ });
583
+
584
+ let bonusMessages = [];
585
+ for (const suit in suitCounts) {
586
+ const count = suitCounts[suit];
587
+ let bonus = 0;
588
+ if (count === 2) bonus = 100;
589
+ else if (count === 3) bonus = 300;
590
+
591
+ if (bonus > 0) {
592
+ score += bonus;
593
+ bonusMessages.push(`+${bonus} for ${count} ${suit}`);
594
+ }
595
+ }
596
+
597
+ scoreDisplay.textContent = score;
598
+ bonusInfoDisplay.innerHTML = bonusMessages.join('<br>');
599
+ }
600
+
601
+ /**
602
+ * Draws cards and places them in the slots.
603
  */
604
  function drawReading() {
605
  if (drawnCards.length > 0) return; // Prevent re-drawing
 
606
  shuffle(tarot_data);
607
  drawnCards = tarot_data.slice(0, 3);
608
+ const positions = ['Past', 'Present', 'Future'];
 
 
609
 
610
+ cardSlotsContainer.innerHTML = ''; // Clear placeholders
611
  drawnCards.forEach((card, index) => {
612
  const slot = document.createElement('div');
613
  slot.className = 'card-slot';
 
614
  const cardElement = createCardElement(card, positions[index]);
615
  slot.appendChild(cardElement);
616
  cardSlotsContainer.appendChild(slot);
617
  });
618
+
619
+ calculateScore();
620
  }
621
+
622
  /**
623
  * Resets the reading to its initial state.
624
  */
625
  function resetReading() {
626
  drawnCards = [];
627
+ score = 0;
628
+ scoreDisplay.textContent = '0';
629
+ bonusInfoDisplay.innerHTML = '';
630
  cardSlotsContainer.innerHTML = '';
631
  setupPlaceholders();
632
  }
633
+
634
  /**
635
  * Sets up the initial placeholder slots.
636
  */
637
  function setupPlaceholders() {
638
+ const positions = ['Past', 'Present', 'Future'];
639
  cardSlotsContainer.innerHTML = ''; // Clear any existing cards
640
  for (let i = 0; i < 3; i++) {
641
  const placeholder = document.createElement('div');
 
652
  // --- Event Listeners ---
653
  drawButton.addEventListener('click', drawReading);
654
  resetButton.addEventListener('click', resetReading);
655
+
656
  // --- Initial Setup ---
657
  window.onload = setupPlaceholders;
 
658
  </script>
659
  </body>
660
  </html>