<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Flowers on mesut · me</title>
    <link>https://mesut.me/flower/</link>
    <description>Recent content in Flowers on mesut · me</description>
    <generator>Hugo -- 0.161.1</generator>
    <language>en</language>
    <atom:link href="https://mesut.me/flower/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title></title>
      <link>https://mesut.me/flower/bride/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mesut.me/flower/bride/</guid>
      <description>&lt;!DOCTYPE html&gt;
&lt;html lang=&#34;tr&#34;&gt;

&lt;head&gt;
  &lt;meta charset=&#34;UTF-8&#34;&gt;
  &lt;meta name=&#34;viewport&#34;
    content=&#34;width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover&#34;&gt;
  &lt;title&gt;Ahsen Çiçek Atıyor!&lt;/title&gt;

  &lt;!-- ======================================================================
  Paste the SAME Firebase config you used in participant.html.
  PASSCODE is only a light deterrent so a guest doesn&#39;t stumble onto this
  page — it is NOT real security. See README.md.
======================================================================= --&gt;
  &lt;script&gt;
    const FIREBASE_CONFIG = {
      apiKey: &#34;AIzaSyADvcKMNTQWDi6aEkeo4WIRCEQD6ELweEY&#34;,
      authDomain: &#34;flower-thrower.firebaseapp.com&#34;,
      databaseURL: &#34;https://flower-thrower-default-rtdb.europe-west1.firebasedatabase.app&#34;,
      projectId: &#34;flower-thrower&#34;,
    };
    const PASSCODE = &#34;1234&#34;;
  &lt;/script&gt;

  &lt;link rel=&#34;preconnect&#34; href=&#34;https://fonts.googleapis.com&#34;&gt;
  &lt;link
    href=&#34;https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,500;0,600;0,700&amp;family=Jost:wght@400;500;600&amp;display=swap&#34;
    rel=&#34;stylesheet&#34;&gt;
  &lt;script src=&#34;https://www.gstatic.com/firebasejs/10.12.2/firebase-app-compat.js&#34;&gt;&lt;/script&gt;
  &lt;script src=&#34;https://www.gstatic.com/firebasejs/10.12.2/firebase-database-compat.js&#34;&gt;&lt;/script&gt;

  &lt;style&gt;
    :root {
      --ink-plum: #2B1620;
      --wine: #6B2737;
      --rose: #D98E9B;
      --gold: #C9A24B;
      --linen: #F6EDE4;
      --sage: #8A9A7E;
      --linen-dim: #EADFD2;
    }

    * {
      box-sizing: border-box;
      -webkit-tap-highlight-color: transparent;
    }

    html,
    body {
      margin: 0;
      padding: 0;
      width: 100%;
      height: 100%;
      overflow: hidden;
      overscroll-behavior: none;
      font-family: &#39;Jost&#39;, sans-serif;
      background: var(--linen);
      color: var(--ink-plum);
    }

    h1,
    h2,
    h3 {
      font-family: &#39;Cormorant Garamond&#39;, serif;
      font-weight: 600;
      margin: 0;
    }

    button {
      font-family: &#39;Jost&#39;, sans-serif;
      cursor: pointer;
      border: none;
    }

    #app {
      position: fixed;
      inset: 0;
      width: 100vw;
      height: 100dvh;
    }

    .screen {
      position: absolute;
      inset: 0;
      display: none;
      flex-direction: column;
    }

    .screen.active {
      display: flex;
    }

    /* ---------- Passcode gate ---------- */
    #screen-gate {
      align-items: center;
      justify-content: center;
      text-align: center;
      padding: 8vw;
      background: radial-gradient(circle at 50% 20%, var(--linen-dim), var(--linen) 70%);
    }

    #screen-gate h1 {
      color: var(--wine);
      font-size: clamp(24px, 6vw, 32px);
      margin-bottom: 18px;
    }

    #gateInput {
      font-size: 18px;
      padding: 14px 18px;
      border-radius: 999px;
      border: 1.5px solid #d8c3ae;
      text-align: center;
      letter-spacing: .3em;
      width: 180px;
      outline: none;
    }

    #gateBtn {
      display: block;
      margin: 16px auto 0;
      background: var(--wine);
      color: var(--linen);
      padding: 13px 28px;
      border-radius: 999px;
      font-size: 14px;
    }

    /* ---------- Control panel ---------- */
    #screen-panel {
      background: var(--linen);
    }

    .panel-header {
      padding: 16px 18px 10px;
      display: flex;
      align-items: center;
      justify-content: space-between;
      border-bottom: 1px solid #e3d3c1;
    }

    .panel-header .eyebrow {
      font-size: 11px;
      letter-spacing: .2em;
      text-transform: uppercase;
      color: var(--wine);
      opacity: .8;
    }

    .panel-header h2 {
      font-size: 20px;
    }

    #resetBtn {
      background: none;
      color: var(--wine);
      font-size: 12px;
      text-decoration: underline;
      opacity: .7;
      padding: 6px;
    }

    .grid {
      flex: 1;
      overflow-y: auto;
      padding: 16px;
      display: grid;
      grid-template-columns: repeat(auto-fill, minmax(84px, 1fr));
      gap: 12px;
      align-content: start;
    }

    .chip {
      display: flex;
      flex-direction: column;
      align-items: center;
      gap: 6px;
      padding: 10px 4px 8px;
      border-radius: 14px;
      background: #fff;
      box-shadow: 0 4px 14px -8px rgba(0, 0, 0, .25);
      transition: transform .15s, opacity .2s;
    }

    .chip:active {
      transform: scale(.94);
    }

    .chip .dot {
      width: 48px;
      height: 48px;
      border-radius: 50%;
      box-shadow: inset 0 0 0 3px rgba(255, 255, 255, .55);
    }

    .chip .nm {
      font-size: 11.5px;
      text-align: center;
      line-height: 1.2;
      max-width: 78px;
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
    }

    .chip.eliminated {
      opacity: .4;
    }

    .chip.eliminated .dot::after {
      content: &#39;✕&#39;;
    }

    .chip .dot {
      display: flex;
      align-items: center;
      justify-content: center;
      color: #fff;
      font-size: 13px;
    }

    .empty-hint {
      color: #a68a75;
      font-size: 13px;
      text-align: center;
      padding: 40px 20px;
      grid-column: 1/-1;
    }

    .panel-footer {
      padding: 14px 16px calc(14px + env(safe-area-inset-bottom));
      border-top: 1px solid #e3d3c1;
      display: flex;
      gap: 10px;
    }

    .count-pill {
      align-self: center;
      font-size: 12.5px;
      color: var(--sage);
      flex: 1;
    }

    #startTossBtn {
      background: var(--wine);
      color: var(--linen);
      padding: 15px 22px;
      border-radius: 999px;
      font-size: 14.5px;
      font-weight: 500;
    }

    #startTossBtn:disabled {
      opacity: .4;
    }

    /* ---------- Toss / drag screen ---------- */
    #screen-toss {
      background: radial-gradient(ellipse at 50% 30%, #3a1f2c, var(--ink-plum) 65%);
      touch-action: none;
    }

    #tossHeader {
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      padding: 14px 16px;
      display: flex;
      justify-content: space-between;
      align-items: center;
      z-index: 20;
    }

    #tossHeader .eyebrow {
      color: var(--rose);
      font-size: 11px;
      letter-spacing: .2em;
      text-transform: uppercase;
    }

    #cancelTossBtn {
      background: rgba(255, 255, 255, .1);
      color: var(--linen);
      padding: 8px 14px;
      border-radius: 999px;
      font-size: 12px;
    }

    #dropZone {
      position: absolute;
      top: 6vh;
      left: 50%;
      transform: translateX(-50%);
      width: 60vw;
      max-width: 260px;
      height: 14vh;
      max-height: 110px;
      border: 2px dashed var(--gold);
      border-radius: 50%;
      display: flex;
      align-items: center;
      justify-content: center;
      color: var(--gold);
      font-size: 11.5px;
      letter-spacing: .15em;
      text-transform: uppercase;
      text-align: center;
      opacity: .75;
      transition: opacity .2s, background .2s;
    }

    #dropZone.armed {
      opacity: 1;
      background: rgba(201, 162, 75, .12);
    }

    #flowerWrap {
      position: absolute;
      width: 24vw;
      max-width: 120px;
      min-width: 70px;
      height: 24vw;
      max-height: 120px;
      min-height: 70px;
      transform: translate(-50%, -50%);
      left: 50%;
      top: 78%;
      filter: drop-shadow(0 0 18px rgba(201, 162, 75, .55));
      cursor: grab;
    }

   #flowerWrap img{ width:100%; height:100%; object-fit:contain; pointer-events:none; }

    #flowerWrap.dragging {
      cursor: grabbing;
    }

    #tossFooter {
      position: absolute;
      bottom: 0;
      left: 0;
      right: 0;
      padding: 0 16px calc(18px + env(safe-area-inset-bottom));
      text-align: center;
      color: #d8c3ae;
      font-size: 12.5px;
      z-index: 20;
    }

    /* ---------- Result screen ---------- */
    #screen-result {
      align-items: center;
      justify-content: center;
      text-align: center;
      padding: 8vw;
      background: radial-gradient(ellipse at 50% 30%, #3a1f2c, var(--ink-plum) 70%);
    }

    #screen-result .eyebrow {
      color: var(--rose);
      font-size: 11px;
      letter-spacing: .2em;
      text-transform: uppercase;
    }

    #screen-result h2 {
      color: var(--linen);
      font-size: clamp(22px, 6vw, 28px);
      margin: 10px 0 6px;
    }

    #resultName {
      color: var(--gold);
      font-style: italic;
      font-size: clamp(30px, 9vw, 40px);
    }

    #playAgainBtn {
      margin-top: 26px;
      background: var(--gold);
      color: var(--ink-plum);
      padding: 14px 26px;
      border-radius: 999px;
      font-size: 14px;
      font-weight: 600;
    }
  &lt;/style&gt;
&lt;/head&gt;

&lt;body&gt;
  &lt;div id=&#34;app&#34;&gt;

    &lt;div class=&#34;screen active&#34; id=&#34;screen-gate&#34;&gt;
      &lt;h1&gt;Gelin Girişi&lt;/h1&gt;
      &lt;input id=&#34;gateInput&#34; type=&#34;password&#34; inputmode=&#34;numeric&#34; maxlength=&#34;8&#34; placeholder=&#34;••••&#34;&gt;
      &lt;button id=&#34;gateBtn&#34;&gt;Gir&lt;/button&gt;
    &lt;/div&gt;

    &lt;div class=&#34;screen&#34; id=&#34;screen-panel&#34;&gt;
      &lt;div class=&#34;panel-header&#34;&gt;
        &lt;div&gt;
          &lt;div class=&#34;eyebrow&#34;&gt;Ahsen Çiçek Atıyor!&lt;/div&gt;
          &lt;h2&gt;Kimler devam etsin?&lt;/h2&gt;
        &lt;/div&gt;
        &lt;button id=&#34;resetBtn&#34;&gt;En baştan başla&lt;/button&gt;
      &lt;/div&gt;
      &lt;div class=&#34;grid&#34; id=&#34;grid&#34;&gt;&lt;/div&gt;
      &lt;div class=&#34;panel-footer&#34;&gt;
        &lt;div class=&#34;count-pill&#34; id=&#34;countPill&#34;&gt;0 bekleyen&lt;/div&gt;
        &lt;button id=&#34;startTossBtn&#34; disabled&gt;Çiçeği Gönder →&lt;/button&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;screen&#34; id=&#34;screen-toss&#34;&gt;
      &lt;div id=&#34;tossHeader&#34;&gt;
        &lt;div class=&#34;eyebrow&#34;&gt;Çiçeği sürükle ve bırak&lt;/div&gt;
        &lt;button id=&#34;cancelTossBtn&#34;&gt;Geri&lt;/button&gt;
      &lt;/div&gt;
      &lt;div id=&#34;dropZone&#34;&gt;Buraya bırak&lt;/div&gt;
&lt;div id=&#34;flowerWrap&#34;&gt;&lt;img src=&#34;../bouqet.png&#34; alt=&#34;&#34;&gt;&lt;/div&gt;
      &lt;div id=&#34;tossFooter&#34;&gt;Tüm katılımcılar çiçeği canlı olarak izleyecek.&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&#34;screen&#34; id=&#34;screen-result&#34;&gt;
      &lt;div class=&#34;eyebrow&#34;&gt;Çiçeğin Talihlisi&lt;/div&gt;
      &lt;div id=&#34;resultName&#34;&gt;—&lt;/div&gt;
      &lt;h2&gt;Çiçeği aldı!&lt;/h2&gt;
      &lt;button id=&#34;playAgainBtn&#34;&gt;Panele geri dön.&lt;/button&gt;
    &lt;/div&gt;

  &lt;/div&gt;

  &lt;svg width=&#34;0&#34; height=&#34;0&#34; style=&#34;position:absolute&#34;&gt;
    &lt;defs&gt;
      &lt;g id=&#34;flowerShape&#34;&gt;
        &lt;path
          d=&#34;M50 8 C60 8 66 20 60 30 C72 26 84 34 82 46 C90 52 90 64 80 68 C84 80 74 90 62 86 C60 96 48 100 40 92 C30 98 18 90 20 80 C8 82 2 70 10 60 C0 54 2 42 14 38 C10 26 20 14 32 18 C34 8 44 4 50 8 Z&#34;
          opacity=&#34;0.95&#34; /&gt;
        &lt;circle cx=&#34;50&#34; cy=&#34;50&#34; r=&#34;11&#34; fill=&#34;#2B1620&#34; opacity=&#34;0.35&#34; /&gt;
      &lt;/g&gt;
    &lt;/defs&gt;
  &lt;/svg&gt;

  &lt;script&gt;
    firebase.initializeApp(FIREBASE_CONFIG);
    const db = firebase.database();

    // ---------- passcode gate ----------
    document.getElementById(&#39;gateBtn&#39;).addEventListener(&#39;click&#39;, tryGate);
    document.getElementById(&#39;gateInput&#39;).addEventListener(&#39;keydown&#39;, e =&gt; { if (e.key === &#39;Enter&#39;) tryGate(); });
    function tryGate() {
      if (document.getElementById(&#39;gateInput&#39;).value === PASSCODE) {
        switchScreen(&#39;panel&#39;);
      } else {
        document.getElementById(&#39;gateInput&#39;).value = &#39;&#39;;
        document.getElementById(&#39;gateInput&#39;).placeholder = &#39;Try again&#39;;
      }
    }

    const screens = {
      gate: document.getElementById(&#39;screen-gate&#39;),
      panel: document.getElementById(&#39;screen-panel&#39;),
      toss: document.getElementById(&#39;screen-toss&#39;),
      result: document.getElementById(&#39;screen-result&#39;),
    };
    function switchScreen(name) {
      Object.values(screens).forEach(s =&gt; s.classList.remove(&#39;active&#39;));
      screens[name].classList.add(&#39;active&#39;);
    }

    // ---------- participant grid ----------
    let participants = {}; // id -&gt; data
    const grid = document.getElementById(&#39;grid&#39;);

    db.ref(&#39;participants&#39;).on(&#39;value&#39;, snap =&gt; {
      participants = snap.val() || {};
      renderGrid();
    });

    function renderGrid() {
      const entries = Object.entries(participants).sort((a, b) =&gt; (a[1].joinedAt || 0) - (b[1].joinedAt || 0));
      if (entries.length === 0) {
        grid.innerHTML = &#39;&lt;div class=&#34;empty-hint&#34;&gt;Katılımcıların girişi bekleniyor…&lt;/div&gt;&#39;;
      } else {
        grid.innerHTML = entries.map(([id, p]) =&gt; `
      &lt;div class=&#34;chip ${p.status === &#39;eliminated&#39; ? &#39;eliminated&#39; : &#39;&#39;}&#34; data-id=&#34;${id}&#34;&gt;
        &lt;div class=&#34;dot&#34; style=&#34;background:${p.color}&#34;&gt;&lt;/div&gt;
        &lt;!--div class=&#34;nm&#34;&gt;${escapeHtml(p.name)}&lt;/div--!&gt;
      &lt;/div&gt;
    `).join(&#39;&#39;);
      }
      const waitingCount = entries.filter(([, p]) =&gt; p.status === &#39;waiting&#39;).length;
      document.getElementById(&#39;countPill&#39;).textContent = waitingCount + &#39; bekleyen kişi · &#39; + entries.length + &#39; toplam kişi&#39;;
      document.getElementById(&#39;startTossBtn&#39;).disabled = waitingCount &lt; 1;

      grid.querySelectorAll(&#39;.chip&#39;).forEach(chip =&gt; {
        chip.addEventListener(&#39;click&#39;, () =&gt; toggleEliminate(chip.dataset.id));
      });
    }
    function escapeHtml(s) { return s.replace(/[&amp;&lt;&gt;&#34;&#39;]/g, m =&gt; ({ &#39;&amp;&#39;: &#39;&amp;amp;&#39;, &#39;&lt;&#39;: &#39;&amp;lt;&#39;, &#39;&gt;&#39;: &#39;&amp;gt;&#39;, &#39;&#34;&#39;: &#39;&amp;quot;&#39;, &#34;&#39;&#34;: &#39;&amp;#39;&#39; }[m])); }

    function toggleEliminate(id) {
      const p = participants[id];
      if (!p) return;
      const nextStatus = p.status === &#39;eliminated&#39; ? &#39;waiting&#39; : &#39;eliminated&#39;;
      db.ref(&#39;participants/&#39; + id + &#39;/status&#39;).set(nextStatus);
    }

    // ---------- reset ----------
    document.getElementById(&#39;resetBtn&#39;).addEventListener(&#39;click&#39;, async () =&gt; {
      if (!confirm(&#39;This permanently deletes everything in the database — every guest, colour, and result. Use this only to rehearse. Continue?&#39;)) return;
      await db.ref().remove(); // wipes the entire database, not just known fields
      await db.ref().set({ state: &#39;registration&#39;, meta: { nextColorIndex: 0 } }); // minimal state so the app is usable again
      switchScreen(&#39;panel&#39;);
    });

    // ---------- begin toss ----------
    document.getElementById(&#39;startTossBtn&#39;).addEventListener(&#39;click&#39;, () =&gt; {
      db.ref(&#39;state&#39;).set(&#39;tossing&#39;);
      db.ref(&#39;flower&#39;).set({ x: 50, y: 78, visible: true, dragging: false });
      resetFlowerPosition();
      switchScreen(&#39;toss&#39;);
    });
    document.getElementById(&#39;cancelTossBtn&#39;).addEventListener(&#39;click&#39;, () =&gt; {
      db.ref(&#39;state&#39;).set(&#39;registration&#39;);
      switchScreen(&#39;panel&#39;);
    });

    // ---------- drag logic ----------
    const flowerWrap = document.getElementById(&#39;flowerWrap&#39;);
    const dropZone = document.getElementById(&#39;dropZone&#39;);
    let dragging = false;
    let lastX = 50, lastY = 78;
    let rafPending = false;

    function pctFromEvent(e) {
      const point = e.touches ? e.touches[0] : e;
      const x = (point.clientX / window.innerWidth) * 100;
      const y = (point.clientY / window.innerHeight) * 100;
      return { x: Math.max(2, Math.min(98, x)), y: Math.max(2, Math.min(98, y)) };
    }

    function inDropZone(x, y) {
      return y &lt; 20; // top ~1/5 of the screen counts as the drop zone
    }

    function onDragStart(e) {
      dragging = true;
      flowerWrap.classList.add(&#39;dragging&#39;);
      onDragMove(e);
    }
    function onDragMove(e) {
      if (!dragging) return;
      e.preventDefault();
      const { x, y } = pctFromEvent(e);
      lastX = x; lastY = y;
      flowerWrap.style.left = x + &#39;%&#39;;
      flowerWrap.style.top = y + &#39;%&#39;;
      dropZone.classList.toggle(&#39;armed&#39;, inDropZone(x, y));
      if (!rafPending) {
        rafPending = true;
        requestAnimationFrame(() =&gt; {
          db.ref(&#39;flower&#39;).update({ x: lastX, y: lastY, dragging: true });
          rafPending = false;
        });
      }
    }
    function onDragEnd() {
      if (!dragging) return;
      dragging = false;
      flowerWrap.classList.remove(&#39;dragging&#39;);
      dropZone.classList.remove(&#39;armed&#39;);

      if (inDropZone(lastX, lastY)) {
        selectWinner();
      } else {
        resetFlowerPosition();
      }
    }
    function resetFlowerPosition() {
      lastX = 50; lastY = 78;
      flowerWrap.style.left = &#39;50%&#39;;
      flowerWrap.style.top = &#39;78%&#39;;
      db.ref(&#39;flower&#39;).update({ x: 50, y: 78, dragging: false });
    }

    flowerWrap.addEventListener(&#39;mousedown&#39;, onDragStart);
    window.addEventListener(&#39;mousemove&#39;, onDragMove);
    window.addEventListener(&#39;mouseup&#39;, onDragEnd);
    flowerWrap.addEventListener(&#39;touchstart&#39;, onDragStart, { passive: false });
    window.addEventListener(&#39;touchmove&#39;, onDragMove, { passive: false });
    window.addEventListener(&#39;touchend&#39;, onDragEnd);

    // ---------- winner selection ----------
    function selectWinner() {
      const candidates = Object.entries(participants).filter(([, p]) =&gt; p.status === &#39;waiting&#39;);
      if (candidates.length === 0) {
        alert(&#39;No one is left to receive the flower — eliminate fewer guests, or add more.&#39;);
        resetFlowerPosition();
        return;
      }
      const [winnerId, winnerData] = candidates[Math.floor(Math.random() * candidates.length)];
      db.ref(&#39;flower/visible&#39;).set(false);
      db.ref(&#39;participants/&#39; + winnerId + &#39;/status&#39;).set(&#39;winner&#39;);
      db.ref(&#39;winner&#39;).set({ id: winnerId, name: winnerData.name, color: winnerData.color });
      db.ref(&#39;state&#39;).set(&#39;result&#39;);

      document.getElementById(&#39;resultName&#39;).textContent = winnerData.name;
      switchScreen(&#39;result&#39;);
    }

    document.getElementById(&#39;playAgainBtn&#39;).addEventListener(&#39;click&#39;, () =&gt; {
      switchScreen(&#39;panel&#39;);
    });
  &lt;/script&gt;
&lt;/body&gt;

&lt;/html&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://mesut.me/flower/participant/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mesut.me/flower/participant/</guid>
      <description>&lt;!DOCTYPE html&gt;
&lt;html lang=&#34;tr&#34;&gt;

&lt;head&gt;
  &lt;meta charset=&#34;UTF-8&#34;&gt;
  &lt;meta name=&#34;viewport&#34;
    content=&#34;width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover&#34;&gt;
  &lt;title&gt;Ahsen Çiçek Atıyor!&lt;/title&gt;

  &lt;!-- ======================================================================
  SETUP — fill these in before the wedding:
  1. FIREBASE CONFIG below (from your Firebase project settings)
  2. EVENT CONFIG below (couple&#39;s names, date, location for the certificate)
  See README.md for full setup steps.
======================================================================= --&gt;
  &lt;script&gt;
    const FIREBASE_CONFIG = {
      apiKey: &#34;AIzaSyADvcKMNTQWDi6aEkeo4WIRCEQD6ELweEY&#34;,
      authDomain: &#34;flower-thrower.firebaseapp.com&#34;,
      databaseURL: &#34;https://flower-thrower-default-rtdb.europe-west1.firebasedatabase.app&#34;,
      projectId: &#34;flower-thrower&#34;,
    };
    const EVENT_CONFIG = {
      coupleNames: &#34;Ahsen &amp; Mesut&#34;,
      date: &#34;Ağustos 2026&#34;,
      location: &#34;Aydın &amp; İstanbul&#34;,
    };

    const FLOWER_URL = &#34;../bouqet.png&#34;;
  &lt;/script&gt;

  &lt;link rel=&#34;preconnect&#34; href=&#34;https://fonts.googleapis.com&#34;&gt;
  &lt;link
    href=&#34;https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,500;0,600;0,700;1,500&amp;family=Jost:wght@400;500;600&amp;display=swap&#34;
    rel=&#34;stylesheet&#34;&gt;
  &lt;script src=&#34;https://www.gstatic.com/firebasejs/10.12.2/firebase-app-compat.js&#34;&gt;&lt;/script&gt;
  &lt;script src=&#34;https://www.gstatic.com/firebasejs/10.12.2/firebase-database-compat.js&#34;&gt;&lt;/script&gt;
  &lt;script src=&#34;https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js&#34;&gt;&lt;/script&gt;

  &lt;style&gt;
    :root {
      --ink-plum: #2B1620;
      --wine: #6B2737;
      --rose: #D98E9B;
      --gold: #C9A24B;
      --linen: #F6EDE4;
      --sage: #8A9A7E;
      --linen-dim: #EADFD2;
    }

    * {
      box-sizing: border-box;
    }

    html,
    body {
      margin: 0;
      padding: 0;
      width: 100%;
      height: 100%;
      overflow: hidden;
      overscroll-behavior: none;
      font-family: &#39;Jost&#39;, sans-serif;
      background: var(--linen);
      color: var(--ink-plum);
      -webkit-tap-highlight-color: transparent;
    }

    #app {
      position: fixed;
      inset: 0;
      width: 100vw;
      height: 100dvh;
    }

    .screen {
      position: absolute;
      inset: 0;
      display: flex;
      align-items: center;
      justify-content: center;
      flex-direction: column;
      text-align: center;
      padding: 8vw;
      opacity: 0;
      pointer-events: none;
      transition: opacity .5s ease;
    }

    .screen.active {
      opacity: 1;
      pointer-events: auto;
    }

    h1,
    h2,
    h3 {
      font-family: &#39;Cormorant Garamond&#39;, serif;
      font-weight: 600;
      margin: 0;
    }

    .eyebrow {
      font-family: &#39;Jost&#39;, sans-serif;
      letter-spacing: .25em;
      text-transform: uppercase;
      font-size: 16px;
      color: var(--wine);
      opacity: .75;
      margin-bottom: 14px;
    }

    p {
      line-height: 1.5;
    }

    /* ---------- Registration ---------- */
    #screen-register {
      background: radial-gradient(circle at 50% 20%, var(--linen-dim), var(--linen) 70%);
    }

    .watermark-flower {
      position: absolute;
      opacity: .08;
      width: 70vw;
      max-width: 420px;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      pointer-events: none;
      object-fit:contain;
    }

    #screen-register h1 {
      font-size: clamp(28px, 7vw, 44px);
      color: var(--wine);
      position: relative;
    }

    #screen-register .sub {
      font-size: 18px;
      color: #5a4048;
      margin: 10px 0 32px;
      position: relative;
    }

    .name-form {
      position: relative;
      display: flex;
      flex-direction: column;
      gap: 14px;
      width: 100%;
      max-width: 340px;
    }

    input#nameInput {
      font-family: &#39;Jost&#39;, sans-serif;
      font-size: 17px;
      padding: 16px 18px;
      border-radius: 999px;
      border: 1.5px solid #d8c3ae;
      background: #fff;
      color: var(--ink-plum);
      text-align: center;
      outline: none;
    }

    input#nameInput:focus {
      border-color: var(--gold);
    }

    button {
      font-family: &#39;Jost&#39;, sans-serif;
      cursor: pointer;
      border: none;
    }

    .btn-primary {
      background: var(--wine);
      color: var(--linen);
      font-size: 15px;
      letter-spacing: .05em;
      padding: 16px 18px;
      border-radius: 999px;
      font-weight: 500;
      transition: transform .15s ease, background .2s;
    }

    .btn-primary:active {
      transform: scale(.97);
    }

    .btn-primary:disabled {
      opacity: .5;
    }

    /* ---------- Waiting ---------- */
    #screen-waiting {
      background: var(--linen);
    }

    .color-orb {
      width: 132px;
      height: 132px;
      border-radius: 50%;
      margin-bottom: 22px;
      display: flex;
      align-items: center;
      justify-content: center;
      box-shadow: 0 0 0 6px #fff, 0 12px 30px -8px rgba(0, 0, 0, .25);
      animation: breathe 3.2s ease-in-out infinite;
    }

    @keyframes breathe {

      0%,
      100% {
        transform: scale(1);
      }

      50% {
        transform: scale(1.06);
      }
    }

    .color-orb svg {
      width: 58%;
      height: 58%;
    }

    .waitingName {
      font-size: clamp(22px, 6vw, 30px);
    }

    #screen-waiting .sub {
      color: #5a4048;
      margin-top: 8px;
      font-size: 14.5px;
      max-width: 300px;
    }

    .pulse-dots span {
      display: inline-block;
      width: 5px;
      height: 5px;
      border-radius: 50%;
      background: var(--wine);
      margin: 0 3px;
      opacity: .35;
      animation: pulse 1.4s infinite;
    }

    .pulse-dots span:nth-child(2) {
      animation-delay: .2s;
    }

    .pulse-dots span:nth-child(3) {
      animation-delay: .4s;
    }

    @keyframes pulse {

      0%,
      100% {
        opacity: .25;
      }

      50% {
        opacity: .9;
      }
    }

    /* ---------- Eliminated toast ---------- */
    #eliminatedToast {
      position: fixed;
      left: 50%;
      bottom: 8vh;
      transform: translate(-50%, 20px);
      background: var(--ink-plum);
      color: var(--linen);
      padding: 16px 22px;
      border-radius: 16px;
      max-width: 86vw;
      font-size: 14.5px;
      line-height: 1.5;
      text-align: center;
      z-index: 50;
      opacity: 0;
      transition: opacity .5s ease, transform .5s ease;
      pointer-events: none;
      box-shadow: 0 14px 30px -10px rgba(0, 0, 0, .4);
    }

    #eliminatedToast.show {
      opacity: 1;
      transform: translate(-50%, 0);
    }

    #eliminatedToast .eyebrow {
      color: var(--gold);
    }

    /* ---------- Tossing (full bleed, percentage-positioned flower) ---------- */
    #screen-tossing {
      background: radial-gradient(ellipse at 50% 30%, #3a1f2c, var(--ink-plum) 65%);
      overflow: hidden;
    }

    #screen-tossing .hint {
      position: absolute;
      top: 6vh;
      left: 50%;
      transform: translateX(-50%);
      color: var(--rose);
      font-size: 12px;
      letter-spacing: .2em;
      text-transform: uppercase;
      opacity: .7;
    }

    #dimOverlay {
      position: absolute;
      inset: 0;
      background: rgba(0, 0, 0, .55);
      backdrop-filter: blur(1px);
      display: none;
      z-index: 5;
    }

    #dimOverlay.on {
      display: block;
    }

    #flowerWrap {
      position: absolute;
      width: 22vw;
      max-width: 110px;
      min-width: 64px;
      height: 22vw;
      max-height: 110px;
      min-height: 64px;
      transform: translate(-50%, -50%);
      left: 50%;
      top: 70%;
      transition: top .35s ease, left .35s ease;
      filter: drop-shadow(0 0 18px rgba(201, 162, 75, .55));
    }

    #flowerWrap svg {
      width: 100%;
      height: 100%;
      object-fit:contain;
    }

    #flowerWrap.eliminated-flower {
      opacity: .45;
    }

    /* ---------- Result: winner certificate ---------- */
    #screen-winner {
      background: linear-gradient(180deg, #3a1f2c, var(--ink-plum));
      overflow-y: auto;
      padding: 6vh 6vw;
    }

    .certificate {
      background: var(--linen);
      border-radius: 6px;
      padding: 38px 26px;
      width: 100%;
      max-width: 380px;
      border: 2px solid var(--gold);
      position: relative;
      margin: 0 auto;
      box-shadow: 0 30px 60px -20px rgba(0, 0, 0, .6);
    }

    .certificate::before {
      content: &#39;&#39;;
      position: absolute;
      inset: 8px;
      border: 1px solid var(--gold);
      opacity: .55;
      pointer-events: none;
      border-radius: 2px;
    }

    .certificate .eyebrow {
      color: var(--wine);
    }

    .certificate .flowerIcon {
      width: 56px;
      height: 56px;
      margin: 6px auto 14px;
      object-fit:contain;
    }

    .certificate h2 {
      font-size: clamp(24px, 6vw, 32px);
      color: var(--wine);
      margin-bottom: 6px;
    }

    .certificate .winnerName {
      font-size: clamp(30px, 8vw, 42px);
      color: var(--ink-plum);
      font-style: italic;
      margin: 8px 0 16px;
    }

    .certificate p.msg {
      font-size: 14px;
      color: #5a4048;
      line-height: 1.6;
      margin: 0 0 6px;
    }

    .certificate .meta {
      margin-top: 18px;
      padding-top: 14px;
      border-top: 1px dashed #d8c3ae;
      font-size: 11.5px;
      letter-spacing: .08em;
      text-transform: uppercase;
      color: var(--sage);
    }

    .btn-download {
      margin-top: 22px;
      background: var(--gold);
      color: var(--ink-plum);
      padding: 15px 20px;
      border-radius: 999px;
      font-size: 14.5px;
      font-weight: 600;
      letter-spacing: .03em;
      width: 100%;
      max-width: 380px;
    }

    /* ---------- Result: someone else won ---------- */
    #screen-lost {
      background: radial-gradient(ellipse at 50% 30%, #3a1f2c, var(--ink-plum) 70%);
    }

    #screen-lost .eyebrow {
      color: var(--rose);
    }

    #screen-lost h2 {
      color: var(--linen);
      font-size: clamp(24px, 7vw, 34px);
    }

    #screen-lost .winnerLine {
      color: var(--gold);
      font-style: italic;
      font-size: clamp(26px, 8vw, 36px);
      margin: 10px 0;
    }

    #screen-lost p {
      color: #d8c3ae;
      font-size: 18px;
      max-width: 320px;
    }
  &lt;/style&gt;
&lt;/head&gt;

&lt;body&gt;

  &lt;div id=&#34;app&#34;&gt;

    &lt;!-- 1. Registration --&gt;
    &lt;div class=&#34;screen active&#34; id=&#34;screen-register&#34;&gt;
      &lt;!-- &lt;svg class=&#34;watermark-flower&#34; viewBox=&#34;0 0 100 100&#34;&gt;&lt;use href=&#34;#flowerShape&#34; fill=&#34;#6B2737&#34;/&gt;&lt;/svg&gt; --&gt;
      &lt;img src=&#34;../bouqet.png&#34; alt=&#34;Flower&#34;&gt;
      &lt;div class=&#34;eyebrow&#34;&gt;Ahsen Birazdan Çiçeğini Atacak!&lt;/div&gt;
      &lt;h1&gt;Çiçeği kazanma şansını yakala...&lt;/h1&gt;
      &lt;p class=&#34;sub&#34;&gt;Ön elemeden sonra finale kalan kişiler gelinin attığı çiçeğin rastgele düşüşüne göre seçilecek.&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://mesut.me/flower/readme/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://mesut.me/flower/readme/</guid>
      <description>&lt;h1 id=&#34;find-your-fate--setup-guide&#34;&gt;Find Your Fate — setup guide&lt;/h1&gt;
&lt;p&gt;Two pages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;participant.html&lt;/strong&gt; — the URL you send to guests (name entry → wait → live flower → certificate)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;bride.html&lt;/strong&gt; — the URL only the bride uses (tap to eliminate → drag-and-release the flower)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No server needed. Both pages talk directly to Firebase Realtime Database from the browser.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
