|
| 1 | +<!DOCTYPE html> |
| 2 | +<html lang="en"> |
| 3 | + <head> |
| 4 | + <meta charset="UTF-8" /> |
| 5 | + <meta name="viewport" content="width=device-width,initial-scale=1" /> |
| 6 | + <title>Sunny Beans — demo host app</title> |
| 7 | + <style> |
| 8 | + :root { |
| 9 | + --cream: #fbf6ec; |
| 10 | + --espresso: #2c2118; |
| 11 | + --bean: #6f4e37; |
| 12 | + --crema: #c98b54; |
| 13 | + } |
| 14 | + * { box-sizing: border-box; } |
| 15 | + body { |
| 16 | + margin: 0; |
| 17 | + font-family: Georgia, "Times New Roman", serif; |
| 18 | + color: var(--espresso); |
| 19 | + background: var(--cream); |
| 20 | + /* leave room for the docked inspector on the right */ |
| 21 | + padding-right: 440px; |
| 22 | + } |
| 23 | + .wrap { max-width: 760px; margin: 0 auto; padding: 0 28px; } |
| 24 | + nav { |
| 25 | + display: flex; |
| 26 | + align-items: center; |
| 27 | + gap: 14px; |
| 28 | + padding: 18px 28px; |
| 29 | + border-bottom: 1px solid #e7dcc8; |
| 30 | + } |
| 31 | + .logo { font-size: 20px; font-weight: 700; letter-spacing: -0.02em; } |
| 32 | + .nav-spacer { flex: 1; } |
| 33 | + .icon-btn { |
| 34 | + width: 40px; height: 40px; |
| 35 | + display: grid; place-items: center; |
| 36 | + background: var(--espresso); color: var(--cream); |
| 37 | + border: 0; border-radius: 10px; cursor: pointer; |
| 38 | + } |
| 39 | + .hero { padding: 56px 0 40px; } |
| 40 | + .hero h1 { font-size: 44px; line-height: 1.05; margin: 0 0 14px; } |
| 41 | + .hero .cup { |
| 42 | + width: 100%; height: 260px; border-radius: 16px; display: block; |
| 43 | + margin: 22px 0; |
| 44 | + } |
| 45 | + /* deliberately low contrast helper copy */ |
| 46 | + .muted { color: #cdbfa8; font-size: 15px; } |
| 47 | + .section { padding: 36px 0; border-top: 1px solid #e7dcc8; } |
| 48 | + .section h2 { font-size: 26px; margin: 0 0 16px; } |
| 49 | + form { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; } |
| 50 | + input[type="email"] { |
| 51 | + flex: 1; min-width: 240px; |
| 52 | + padding: 12px 14px; font-size: 16px; |
| 53 | + border: 1px solid var(--bean); border-radius: 10px; background: #fff; |
| 54 | + } |
| 55 | + .btn { |
| 56 | + padding: 12px 20px; font-size: 16px; font-weight: 700; |
| 57 | + background: var(--crema); color: var(--espresso); |
| 58 | + border: 0; border-radius: 10px; cursor: pointer; |
| 59 | + } |
| 60 | + .roasts { list-style: none; padding: 0; display: grid; gap: 12px; } |
| 61 | + .roasts li { |
| 62 | + display: flex; align-items: center; gap: 14px; |
| 63 | + padding: 14px; background: #fff; border-radius: 12px; |
| 64 | + border: 1px solid #ece2cf; |
| 65 | + } |
| 66 | + .swatch { width: 46px; height: 46px; border-radius: 8px; } |
| 67 | + footer { |
| 68 | + padding: 40px 0 80px; margin-top: 24px; |
| 69 | + border-top: 1px solid #e7dcc8; |
| 70 | + } |
| 71 | + footer a { color: var(--bean); } |
| 72 | + .fineprint { color: #d7cbb4; font-size: 13px; } |
| 73 | + |
| 74 | + /* docked inspector — this chrome is intentionally accessible so it |
| 75 | + doesn't show up in its own report */ |
| 76 | + .df-dock { |
| 77 | + position: fixed; |
| 78 | + top: 0; right: 0; bottom: 0; |
| 79 | + width: 420px; |
| 80 | + border-left: 1px solid #d8cbb4; |
| 81 | + box-shadow: -16px 0 40px rgb(44 33 24 / 12%); |
| 82 | + background: #0d1017; |
| 83 | + z-index: 5; |
| 84 | + } |
| 85 | + .df-dock__frame { width: 100%; height: 100%; border: 0; display: block; } |
| 86 | + @media (max-width: 900px) { |
| 87 | + body { padding-right: 0; padding-bottom: 50vh; } |
| 88 | + .df-dock { top: auto; width: auto; height: 50vh; border-left: 0; border-top: 1px solid #d8cbb4; } |
| 89 | + } |
| 90 | + </style> |
| 91 | + </head> |
| 92 | + <body> |
| 93 | + <nav> |
| 94 | + <span class="logo">Sunny Beans</span> |
| 95 | + <span class="nav-spacer"></span> |
| 96 | + <!-- a11y bug: icon-only button with no accessible name --> |
| 97 | + <button class="icon-btn" type="button"> |
| 98 | + <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"> |
| 99 | + <path d="M4 6h16M4 12h16M4 18h16" /> |
| 100 | + </svg> |
| 101 | + </button> |
| 102 | + </nav> |
| 103 | + |
| 104 | + <div class="wrap"> |
| 105 | + <section class="hero"> |
| 106 | + <h1>Small-batch coffee, roasted the morning it ships.</h1> |
| 107 | + <!-- a11y bug: image without alt text --> |
| 108 | + <img |
| 109 | + class="cup" |
| 110 | + src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='760' height='260'%3E%3Crect width='760' height='260' fill='%236f4e37'/%3E%3Ccircle cx='380' cy='130' r='70' fill='%23c98b54'/%3E%3C/svg%3E" |
| 111 | + /> |
| 112 | + <!-- a11y bug: low-contrast text --> |
| 113 | + <p class="muted"> |
| 114 | + Sourced from a dozen farms, roasted in tiny drums, and sent the same day. |
| 115 | + </p> |
| 116 | + </section> |
| 117 | + |
| 118 | + <section class="section"> |
| 119 | + <h2>Get the first-Friday drop</h2> |
| 120 | + <form onsubmit="return false"> |
| 121 | + <!-- a11y bug: input with no associated label --> |
| 122 | + <input type="email" placeholder="you@example.com" /> |
| 123 | + <button class="btn" type="submit">Notify me</button> |
| 124 | + </form> |
| 125 | + <p class="fineprint">We email once a month. Unsubscribe anytime.</p> |
| 126 | + </section> |
| 127 | + |
| 128 | + <section class="section"> |
| 129 | + <h2>This week's roasts</h2> |
| 130 | + <ul class="roasts"> |
| 131 | + <li> |
| 132 | + <span class="swatch" style="background:#3b2317"></span> |
| 133 | + <span><strong>Midnight Drum</strong> — dark, cocoa, molasses</span> |
| 134 | + </li> |
| 135 | + <li> |
| 136 | + <span class="swatch" style="background:#8a5a32"></span> |
| 137 | + <span><strong>Sunrise House</strong> — balanced, caramel, citrus</span> |
| 138 | + </li> |
| 139 | + <li> |
| 140 | + <span class="swatch" style="background:#c98b54"></span> |
| 141 | + <span><strong>Golden Hour</strong> — light, floral, stone fruit</span> |
| 142 | + </li> |
| 143 | + </ul> |
| 144 | + </section> |
| 145 | + |
| 146 | + <footer> |
| 147 | + <p>Questions? Visit our help center or follow along:</p> |
| 148 | + <!-- a11y bug: link with no discernible text (icon only, no label) --> |
| 149 | + <a href="https://example.com/social"> |
| 150 | + <svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"> |
| 151 | + <path d="M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Zm0 5a3 3 0 1 1 0 6 3 3 0 0 1 0-6Z" /> |
| 152 | + </svg> |
| 153 | + </a> |
| 154 | + <p class="fineprint">© Sunny Beans Coffee Co. All rights reserved.</p> |
| 155 | + </footer> |
| 156 | + </div> |
| 157 | + |
| 158 | + <!-- Docked A11y Inspector panel (same origin → shares the BroadcastChannel). --> |
| 159 | + <aside class="df-dock" aria-label="A11y Inspector"> |
| 160 | + <iframe class="df-dock__frame" title="A11y Inspector panel" src="/__devframe-a11y-inspector/"></iframe> |
| 161 | + </aside> |
| 162 | + |
| 163 | + <!-- The injected a11y agent: scans this page and answers the panel. --> |
| 164 | + <script type="module" src="/__df-inject/inject.js"></script> |
| 165 | + </body> |
| 166 | +</html> |
0 commit comments