Mercurial
comparison mrjunejune/test/snapshots/jrpg.snapshot @ 272:41a49c29a28f
polish JRPG conversation experience
Integrate desktop conversations into the utility panel, simplify the mobile frame, add modal destinations and a reusable Zenbu composer lab, and preserve explicit conversation resume behavior.
Co-authored-by: Copilot <[email protected]>
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Fri, 07 Aug 2026 16:05:29 -0700 |
| parents | 056790c4fb0d |
| children | e02e2036ef84 |
comparison
equal
deleted
inserted
replaced
| 271:13d61401c57d | 272:41a49c29a28f |
|---|---|
| 33 <script src="/public/pwa-register.js" defer></script> | 33 <script src="/public/pwa-register.js" defer></script> |
| 34 | 34 |
| 35 <link rel="preload" href="/public/jrpg/background-frame-2.webp" as="image" media="not ((max-width: 52rem) and (orientation: portrait))"> | 35 <link rel="preload" href="/public/jrpg/background-frame-2.webp" as="image" media="not ((max-width: 52rem) and (orientation: portrait))"> |
| 36 <link rel="preload" href="/public/jrpg/background-frame-mobile.webp" as="image" media="(max-width: 52rem) and (orientation: portrait)"> | 36 <link rel="preload" href="/public/jrpg/background-frame-mobile.webp" as="image" media="(max-width: 52rem) and (orientation: portrait)"> |
| 37 <link rel="preload" href="/public/jrpg/bar-ink.webp" as="image"> | 37 <link rel="preload" href="/public/jrpg/bar-ink.webp" as="image"> |
| 38 <link rel="stylesheet" href="/public/mjj-composer.css"> | |
| 38 <link rel="stylesheet" href="/jrpg/jrpg.css"> | 39 <link rel="stylesheet" href="/jrpg/jrpg.css"> |
| 40 <script type="module" src="/public/mjj-composer.js"></script> | |
| 39 <script type="module" src="/jrpg/jrpg.js"></script> | 41 <script type="module" src="/jrpg/jrpg.js"></script> |
| 40 </head> | 42 </head> |
| 41 <body class="jrpg-page"> | 43 <body class="jrpg-page"> |
| 42 <main class="jrpg-main"> | 44 <main class="jrpg-main"> |
| 43 <mjj-jrpg-shell class="jrpg-shell"> | 45 <mjj-jrpg-shell class="jrpg-shell"> |
| 74 <a href="/" aria-label="Close interface and return home"> | 76 <a href="/" aria-label="Close interface and return home"> |
| 75 <zen-icon name="close"></zen-icon> | 77 <zen-icon name="close"></zen-icon> |
| 76 </a> | 78 </a> |
| 77 </zen-button> | 79 </zen-button> |
| 78 </nav> | 80 </nav> |
| 79 <zen-button class="jrpg-mobile-menu-btn" appearance="plain" size="xs"> | 81 <zen-dialog |
| 80 <button | 82 class="jrpg-mobile-destination-owner" |
| 81 type="button" | 83 data-mobile-destination-owner |
| 82 data-mobile-menu-toggle | 84 > |
| 83 aria-label="Toggle destination menu" | 85 <zen-button class="jrpg-mobile-menu-btn" appearance="plain" size="xs"> |
| 84 aria-expanded="true" | 86 <button |
| 85 aria-controls="jrpg-destination-menu" | 87 type="button" |
| 88 data-zen-trigger | |
| 89 data-mobile-menu-toggle | |
| 90 aria-label="Open destination menu" | |
| 91 > | |
| 92 <zen-icon name="menu"></zen-icon> | |
| 93 </button> | |
| 94 </zen-button> | |
| 95 <dialog | |
| 96 class="jrpg-mobile-destination-dialog" | |
| 97 data-mobile-destination-dialog | |
| 98 aria-labelledby="jrpg-mobile-destination-title" | |
| 86 > | 99 > |
| 87 <zen-icon name="menu"></zen-icon> | 100 <header class="jrpg-mobile-destination-header"> |
| 88 </button> | 101 <zen-button |
| 89 </zen-button> | 102 appearance="plain" |
| 103 size="sm" | |
| 104 data-mobile-destination-back-owner | |
| 105 hidden | |
| 106 > | |
| 107 <button | |
| 108 type="button" | |
| 109 data-mobile-destination-back | |
| 110 aria-label="Back to destination menu" | |
| 111 > | |
| 112 <zen-icon name="chevron-left"></zen-icon> | |
| 113 Menu | |
| 114 </button> | |
| 115 </zen-button> | |
| 116 <h2 | |
| 117 id="jrpg-mobile-destination-title" | |
| 118 data-mobile-destination-title | |
| 119 >Menu</h2> | |
| 120 <zen-button appearance="plain" size="sm"> | |
| 121 <button | |
| 122 type="button" | |
| 123 data-zen-close | |
| 124 aria-label="Close destination menu" | |
| 125 > | |
| 126 <zen-icon name="close"></zen-icon> | |
| 127 </button> | |
| 128 </zen-button> | |
| 129 </header> | |
| 130 <div | |
| 131 class="jrpg-mobile-destination-content" | |
| 132 data-mobile-destination-content | |
| 133 ></div> | |
| 134 </dialog> | |
| 135 </zen-dialog> | |
| 90 <footer class="jrpg-frame-telemetry" aria-label="System telemetry"> | 136 <footer class="jrpg-frame-telemetry" aria-label="System telemetry"> |
| 91 <span aria-label="Temperature unavailable">N/A</span> | 137 <span aria-label="Temperature unavailable">N/A</span> |
| 92 <span data-frame-account aria-live="polite"><a href="/login?next=/jrpg">LOGIN</a></span> | 138 <span data-frame-account aria-live="polite"><a href="/login?next=/jrpg">LOGIN</a></span> |
| 93 <span data-frame-network aria-label="Status online">ONLINE</span> | 139 <span data-frame-network aria-label="Status online">ONLINE</span> |
| 94 <time data-frame-uptime aria-label="Uptime">00:00:00</time> | 140 <time data-frame-uptime aria-label="Uptime">00:00:00</time> |
| 97 <section class="jrpg-scene" aria-label="Shiba Quest conversation"> | 143 <section class="jrpg-scene" aria-label="Shiba Quest conversation"> |
| 98 <mjj-jrpg-character state="default"> | 144 <mjj-jrpg-character state="default"> |
| 99 <img data-character alt=""> | 145 <img data-character alt=""> |
| 100 </mjj-jrpg-character> | 146 </mjj-jrpg-character> |
| 101 | 147 |
| 102 <mjj-jrpg-chat aria-labelledby="conversation-title"> | 148 <mjj-jrpg-chat aria-label="Conversation"> |
| 103 <div class="jrpg-panel-heading"> | |
| 104 <h1 id="conversation-title">Conversations</h1> | |
| 105 </div> | |
| 106 <zen-message-scroller> | 149 <zen-message-scroller> |
| 107 <div | 150 <div |
| 108 class="jrpg-message-viewport" | 151 class="jrpg-message-viewport" |
| 109 data-zen-viewport | 152 data-zen-viewport |
| 110 role="log" | 153 role="log" |
| 133 </section> | 176 </section> |
| 134 | 177 |
| 135 <section class="jrpg-utility" aria-label="Selected destination"> | 178 <section class="jrpg-utility" aria-label="Selected destination"> |
| 136 <mjj-jrpg-preview data-selection="resume"> | 179 <mjj-jrpg-preview data-selection="resume"> |
| 137 <article class="jrpg-preview-panel" aria-live="polite"> | 180 <article class="jrpg-preview-panel" aria-live="polite"> |
| 138 <zen-heading size="xl"> | 181 <div class="jrpg-preview-content" data-preview-content> |
| 139 <h2 data-preview-title>Resume</h2> | 182 <zen-heading size="xl"> |
| 140 </zen-heading> | 183 <h2 data-preview-title>Resume</h2> |
| 141 <p data-preview-copy> | 184 </zen-heading> |
| 142 Member of Technical Staff and engineering leader with 10+ years building AI agent platforms and production systems. | 185 <p data-preview-copy> |
| 143 </p> | 186 Member of Technical Staff and engineering leader with 10+ years building AI agent platforms and production systems. |
| 144 <ul class="jrpg-work-showcase" data-work-showcase> | 187 </p> |
| 145 <li> | 188 <ul class="jrpg-work-showcase" data-work-showcase> |
| 146 <a href="https://www.microsoft.com/en-us/microsoft-copilot/blog/2026/02/26/copilot-tasks-from-answers-to-actions/"> | 189 <li> |
| 147 <span>Copilot Tasks</span> | 190 <a href="https://www.microsoft.com/en-us/microsoft-copilot/blog/2026/02/26/copilot-tasks-from-answers-to-actions/"> |
| 148 <small>Agentic execution</small> | 191 <span>Copilot Tasks</span> |
| 149 </a> | 192 <small>Agentic execution</small> |
| 150 </li> | 193 </a> |
| 151 <li> | 194 </li> |
| 152 <a href="https://www.cio.com/article/3977098/microsoft-doubles-down-on-multi-model-ai-as-it-builds-a-copilot-super-app.html"> | 195 <li> |
| 153 <span>Copilot SuperApp</span> | 196 <a href="https://www.cio.com/article/3977098/microsoft-doubles-down-on-multi-model-ai-as-it-builds-a-copilot-super-app.html"> |
| 154 <small>AI platform</small> | 197 <span>Copilot SuperApp</span> |
| 155 </a> | 198 <small>AI platform</small> |
| 156 </li> | 199 </a> |
| 157 </ul> | 200 </li> |
| 158 <zen-dialog class="jrpg-preview-dialog"> | 201 </ul> |
| 159 <zen-button appearance="plain" size="xs" data-dialog-trigger-owner hidden> | 202 <zen-dialog class="jrpg-preview-dialog"> |
| 160 <button type="button" data-zen-trigger tabindex="-1" aria-hidden="true"></button> | 203 <zen-button appearance="plain" size="xs" data-dialog-trigger-owner hidden> |
| 161 </zen-button> | 204 <button type="button" data-zen-trigger tabindex="-1" aria-hidden="true"></button> |
| 162 <dialog class="jrpg-detail-dialog" aria-labelledby="jrpg-dialog-title"> | 205 </zen-button> |
| 163 <div class="jrpg-dialog-heading"> | 206 <dialog class="jrpg-detail-dialog" aria-labelledby="jrpg-dialog-title"> |
| 164 <p>DESTINATION DATA</p> | 207 <div class="jrpg-dialog-heading"> |
| 165 <div class="jrpg-dialog-heading-actions"> | 208 <p>DESTINATION DATA</p> |
| 166 <zen-button appearance="plain" size="md"> | 209 <div class="jrpg-dialog-heading-actions"> |
| 167 <a href="/resume" data-preview-link> | 210 <zen-button appearance="plain" size="md"> |
| 168 Open page | 211 <a href="/resume" data-preview-link> |
| 169 <zen-icon name="external"></zen-icon> | 212 Open page |
| 213 <zen-icon name="external"></zen-icon> | |
| 214 </a> | |
| 215 </zen-button> | |
| 216 <zen-button appearance="plain" size="md"> | |
| 217 <button type="button" data-zen-close aria-label="Close destination details"> | |
| 218 <zen-icon name="close"></zen-icon> | |
| 219 </button> | |
| 220 </zen-button> | |
| 221 </div> | |
| 222 </div> | |
| 223 <h2 id="jrpg-dialog-title" data-dialog-title>Resume</h2> | |
| 224 <p data-dialog-copy>Experience, projects, and the systems I have helped build.</p> | |
| 225 <section | |
| 226 class="jrpg-resume-dossier" | |
| 227 data-resume-dossier | |
| 228 aria-label="Resume dossier" | |
| 229 > | |
| 230 <p data-resume-status>Loading resume dossier...</p> | |
| 231 <div data-resume-content></div> | |
| 232 </section> | |
| 233 <section | |
| 234 class="jrpg-blog-browser" | |
| 235 data-blog-browser | |
| 236 aria-label="Blog archive" | |
| 237 hidden | |
| 238 > | |
| 239 <aside> | |
| 240 <h3>All blogs</h3> | |
| 241 <ol data-blog-list> | |
| 242 <li>Loading blog archive...</li> | |
| 243 </ol> | |
| 244 </aside> | |
| 245 <article> | |
| 246 <p data-blog-status>Select a blog to inspect.</p> | |
| 247 <div data-blog-content></div> | |
| 248 </article> | |
| 249 </section> | |
| 250 <section | |
| 251 class="jrpg-tool-browser" | |
| 252 data-tool-browser | |
| 253 aria-label="Tool workspace" | |
| 254 hidden | |
| 255 > | |
| 256 <article> | |
| 257 <p data-tool-status>Select a tool to inspect.</p> | |
| 258 <div data-tool-content></div> | |
| 259 </article> | |
| 260 </section> | |
| 261 <div class="jrpg-dialog-actions" data-dialog-actions> | |
| 262 <zen-button appearance="plain" size="lg" data-resume-download> | |
| 263 <a href="/public/resume.pdf"> | |
| 264 Download PDF | |
| 265 <zen-icon name="download"></zen-icon> | |
| 170 </a> | 266 </a> |
| 171 </zen-button> | 267 </zen-button> |
| 172 <zen-button appearance="plain" size="md"> | |
| 173 <button type="button" data-zen-close aria-label="Close destination details"> | |
| 174 <zen-icon name="close"></zen-icon> | |
| 175 </button> | |
| 176 </zen-button> | |
| 177 </div> | 268 </div> |
| 178 </div> | 269 </dialog> |
| 179 <h2 id="jrpg-dialog-title" data-dialog-title>Resume</h2> | 270 </zen-dialog> |
| 180 <p data-dialog-copy>Experience, projects, and the systems I have helped build.</p> | 271 </div> |
| 181 <section | 272 <mjj-conversation-archive hidden aria-label="Conversations"> |
| 182 class="jrpg-resume-dossier" | |
| 183 data-resume-dossier | |
| 184 aria-label="Resume dossier" | |
| 185 > | |
| 186 <p data-resume-status>Loading resume dossier...</p> | |
| 187 <div data-resume-content></div> | |
| 188 </section> | |
| 189 <section | |
| 190 class="jrpg-blog-browser" | |
| 191 data-blog-browser | |
| 192 aria-label="Blog archive" | |
| 193 hidden | |
| 194 > | |
| 195 <aside> | |
| 196 <h3>All blogs</h3> | |
| 197 <ol data-blog-list> | |
| 198 <li>Loading blog archive...</li> | |
| 199 </ol> | |
| 200 </aside> | |
| 201 <article> | |
| 202 <p data-blog-status>Select a blog to inspect.</p> | |
| 203 <div data-blog-content></div> | |
| 204 </article> | |
| 205 </section> | |
| 206 <section | |
| 207 class="jrpg-tool-browser" | |
| 208 data-tool-browser | |
| 209 aria-label="Tool workspace" | |
| 210 hidden | |
| 211 > | |
| 212 <article> | |
| 213 <p data-tool-status>Select a tool to inspect.</p> | |
| 214 <div data-tool-content></div> | |
| 215 </article> | |
| 216 </section> | |
| 217 <div class="jrpg-dialog-actions" data-dialog-actions> | |
| 218 <zen-button appearance="plain" size="lg" data-resume-download> | |
| 219 <a href="/public/resume.pdf"> | |
| 220 Download PDF | |
| 221 <zen-icon name="download"></zen-icon> | |
| 222 </a> | |
| 223 </zen-button> | |
| 224 </div> | |
| 225 </dialog> | |
| 226 </zen-dialog> | |
| 227 </article> | |
| 228 </mjj-jrpg-preview> | |
| 229 | |
| 230 <mjj-conversation-archive hidden aria-label="Conversations"> | |
| 231 <div class="jrpg-archive-heading"> | 273 <div class="jrpg-archive-heading"> |
| 232 <h2>Archive</h2> | 274 <h2>Archive</h2> |
| 233 <zen-button appearance="plain" size="xs"> | 275 <zen-button appearance="plain" size="xs"> |
| 234 <button type="button" data-archive-close aria-label="Close conversations"> | 276 <button type="button" data-archive-close aria-label="Close conversations"> |
| 235 <zen-icon name="close"></zen-icon> | 277 <zen-icon name="close"></zen-icon> |
| 294 <button type="submit">Save</button> | 336 <button type="submit">Save</button> |
| 295 </zen-button> | 337 </zen-button> |
| 296 </div> | 338 </div> |
| 297 </form> | 339 </form> |
| 298 </dialog> | 340 </dialog> |
| 299 </mjj-conversation-archive> | 341 </mjj-conversation-archive> |
| 342 </article> | |
| 343 </mjj-jrpg-preview> | |
| 300 </section> | 344 </section> |
| 301 | 345 |
| 302 <mjj-jrpg-composer> | 346 <mjj-composer compact> |
| 303 <form class="jrpg-composer" data-composer> | 347 <form class="jrpg-composer" data-composer> |
| 304 <zen-field appearance="plain" size="lg"> | 348 <div data-composer-control> |
| 305 <label for="jrpg-message">Message</label> | 349 <zen-field size="lg"> |
| 306 <textarea | 350 <label for="jrpg-message" data-composer-label>Message</label> |
| 307 id="jrpg-message" | 351 <textarea |
| 308 name="message" | 352 id="jrpg-message" |
| 309 rows="3" | 353 name="message" |
| 310 maxlength="500" | 354 rows="3" |
| 311 placeholder="Ask Epi about this site..." | 355 maxlength="500" |
| 312 required | 356 placeholder="Ask Epi about this site..." |
| 313 ></textarea> | 357 required |
| 314 </zen-field> | 358 ></textarea> |
| 315 <div class="jrpg-composer-actions"> | 359 </zen-field> |
| 316 <zen-button appearance="plain" size="sm"> | 360 <div class="jrpg-composer-actions" data-composer-actions> |
| 317 <button type="submit"> | 361 <zen-button size="sm"> |
| 318 Send | 362 <button type="submit" aria-label="Send message"> |
| 319 <zen-icon name="arrow-right"></zen-icon> | 363 <span data-composer-action-label>Send</span> |
| 320 </button> | 364 <zen-icon name="arrow-right"></zen-icon> |
| 321 </zen-button> | 365 </button> |
| 322 <zen-button appearance="plain" size="sm" data-cancel-control hidden> | 366 </zen-button> |
| 323 <button type="button" data-cancel> | 367 <zen-button |
| 324 Cancel | 368 size="sm" |
| 325 <zen-icon name="close"></zen-icon> | 369 variant="danger" |
| 326 </button> | 370 data-composer-cancel-owner |
| 327 </zen-button> | 371 hidden |
| 372 > | |
| 373 <button | |
| 374 type="button" | |
| 375 data-composer-cancel | |
| 376 aria-label="Cancel response" | |
| 377 > | |
| 378 <span data-composer-action-label>Cancel</span> | |
| 379 <zen-icon name="close"></zen-icon> | |
| 380 </button> | |
| 381 </zen-button> | |
| 382 </div> | |
| 328 </div> | 383 </div> |
| 329 <p class="jrpg-composer-quota" data-quota aria-live="polite" hidden></p> | 384 <p |
| 330 <p class="jrpg-composer-hint">Enter to send / Shift + Enter for a new line</p> | 385 class="jrpg-composer-quota" |
| 386 data-composer-meta | |
| 387 data-quota | |
| 388 aria-live="polite" | |
| 389 hidden | |
| 390 ></p> | |
| 391 <p | |
| 392 class="jrpg-composer-hint" | |
| 393 data-composer-meta | |
| 394 >Enter to send / Shift + Enter for a new line</p> | |
| 331 </form> | 395 </form> |
| 332 </mjj-jrpg-composer> | 396 </mjj-composer> |
| 333 | 397 |
| 334 <mjj-jrpg-menu id="jrpg-destination-menu"> | 398 <mjj-jrpg-menu id="jrpg-destination-menu"> |
| 335 <nav aria-label="Shiba Quest destinations"> | 399 <nav aria-label="Shiba Quest destinations"> |
| 336 <p class="jrpg-menu-label">Menu</p> | 400 <p class="jrpg-menu-label">Menu</p> |
| 337 <ul> | 401 <ul> |