comparison mrjunejune/src/jrpg/index.html @ 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
4 <title>Shiba Quest | MrJuneJune</title> 4 <title>Shiba Quest | MrJuneJune</title>
5 {{/parts/base_head.html}} 5 {{/parts/base_head.html}}
6 <link rel="preload" href="/public/jrpg/background-frame-2.webp" as="image" media="not ((max-width: 52rem) and (orientation: portrait))"> 6 <link rel="preload" href="/public/jrpg/background-frame-2.webp" as="image" media="not ((max-width: 52rem) and (orientation: portrait))">
7 <link rel="preload" href="/public/jrpg/background-frame-mobile.webp" as="image" media="(max-width: 52rem) and (orientation: portrait)"> 7 <link rel="preload" href="/public/jrpg/background-frame-mobile.webp" as="image" media="(max-width: 52rem) and (orientation: portrait)">
8 <link rel="preload" href="/public/jrpg/bar-ink.webp" as="image"> 8 <link rel="preload" href="/public/jrpg/bar-ink.webp" as="image">
9 <link rel="stylesheet" href="/public/mjj-composer.css">
9 <link rel="stylesheet" href="/jrpg/jrpg.css"> 10 <link rel="stylesheet" href="/jrpg/jrpg.css">
11 <script type="module" src="/public/mjj-composer.js"></script>
10 <script type="module" src="/jrpg/jrpg.js"></script> 12 <script type="module" src="/jrpg/jrpg.js"></script>
11 </head> 13 </head>
12 <body class="jrpg-page"> 14 <body class="jrpg-page">
13 <main class="jrpg-main"> 15 <main class="jrpg-main">
14 <mjj-jrpg-shell class="jrpg-shell"> 16 <mjj-jrpg-shell class="jrpg-shell">
45 <a href="/" aria-label="Close interface and return home"> 47 <a href="/" aria-label="Close interface and return home">
46 <zen-icon name="close"></zen-icon> 48 <zen-icon name="close"></zen-icon>
47 </a> 49 </a>
48 </zen-button> 50 </zen-button>
49 </nav> 51 </nav>
50 <zen-button class="jrpg-mobile-menu-btn" appearance="plain" size="xs"> 52 <zen-dialog
51 <button 53 class="jrpg-mobile-destination-owner"
52 type="button" 54 data-mobile-destination-owner
53 data-mobile-menu-toggle 55 >
54 aria-label="Toggle destination menu" 56 <zen-button class="jrpg-mobile-menu-btn" appearance="plain" size="xs">
55 aria-expanded="true" 57 <button
56 aria-controls="jrpg-destination-menu" 58 type="button"
59 data-zen-trigger
60 data-mobile-menu-toggle
61 aria-label="Open destination menu"
62 >
63 <zen-icon name="menu"></zen-icon>
64 </button>
65 </zen-button>
66 <dialog
67 class="jrpg-mobile-destination-dialog"
68 data-mobile-destination-dialog
69 aria-labelledby="jrpg-mobile-destination-title"
57 > 70 >
58 <zen-icon name="menu"></zen-icon> 71 <header class="jrpg-mobile-destination-header">
59 </button> 72 <zen-button
60 </zen-button> 73 appearance="plain"
74 size="sm"
75 data-mobile-destination-back-owner
76 hidden
77 >
78 <button
79 type="button"
80 data-mobile-destination-back
81 aria-label="Back to destination menu"
82 >
83 <zen-icon name="chevron-left"></zen-icon>
84 Menu
85 </button>
86 </zen-button>
87 <h2
88 id="jrpg-mobile-destination-title"
89 data-mobile-destination-title
90 >Menu</h2>
91 <zen-button appearance="plain" size="sm">
92 <button
93 type="button"
94 data-zen-close
95 aria-label="Close destination menu"
96 >
97 <zen-icon name="close"></zen-icon>
98 </button>
99 </zen-button>
100 </header>
101 <div
102 class="jrpg-mobile-destination-content"
103 data-mobile-destination-content
104 ></div>
105 </dialog>
106 </zen-dialog>
61 <footer class="jrpg-frame-telemetry" aria-label="System telemetry"> 107 <footer class="jrpg-frame-telemetry" aria-label="System telemetry">
62 <span aria-label="Temperature unavailable">N/A</span> 108 <span aria-label="Temperature unavailable">N/A</span>
63 <span data-frame-account aria-live="polite"><a href="/login?next=/jrpg">LOGIN</a></span> 109 <span data-frame-account aria-live="polite"><a href="/login?next=/jrpg">LOGIN</a></span>
64 <span data-frame-network aria-label="Status online">ONLINE</span> 110 <span data-frame-network aria-label="Status online">ONLINE</span>
65 <time data-frame-uptime aria-label="Uptime">00:00:00</time> 111 <time data-frame-uptime aria-label="Uptime">00:00:00</time>
68 <section class="jrpg-scene" aria-label="Shiba Quest conversation"> 114 <section class="jrpg-scene" aria-label="Shiba Quest conversation">
69 <mjj-jrpg-character state="default"> 115 <mjj-jrpg-character state="default">
70 <img data-character alt=""> 116 <img data-character alt="">
71 </mjj-jrpg-character> 117 </mjj-jrpg-character>
72 118
73 <mjj-jrpg-chat aria-labelledby="conversation-title"> 119 <mjj-jrpg-chat aria-label="Conversation">
74 <div class="jrpg-panel-heading">
75 <h1 id="conversation-title">Conversations</h1>
76 </div>
77 <zen-message-scroller> 120 <zen-message-scroller>
78 <div 121 <div
79 class="jrpg-message-viewport" 122 class="jrpg-message-viewport"
80 data-zen-viewport 123 data-zen-viewport
81 role="log" 124 role="log"
104 </section> 147 </section>
105 148
106 <section class="jrpg-utility" aria-label="Selected destination"> 149 <section class="jrpg-utility" aria-label="Selected destination">
107 <mjj-jrpg-preview data-selection="resume"> 150 <mjj-jrpg-preview data-selection="resume">
108 <article class="jrpg-preview-panel" aria-live="polite"> 151 <article class="jrpg-preview-panel" aria-live="polite">
109 <zen-heading size="xl"> 152 <div class="jrpg-preview-content" data-preview-content>
110 <h2 data-preview-title>Resume</h2> 153 <zen-heading size="xl">
111 </zen-heading> 154 <h2 data-preview-title>Resume</h2>
112 <p data-preview-copy> 155 </zen-heading>
113 Member of Technical Staff and engineering leader with 10+ years building AI agent platforms and production systems. 156 <p data-preview-copy>
114 </p> 157 Member of Technical Staff and engineering leader with 10+ years building AI agent platforms and production systems.
115 <ul class="jrpg-work-showcase" data-work-showcase> 158 </p>
116 <li> 159 <ul class="jrpg-work-showcase" data-work-showcase>
117 <a href="https://www.microsoft.com/en-us/microsoft-copilot/blog/2026/02/26/copilot-tasks-from-answers-to-actions/"> 160 <li>
118 <span>Copilot Tasks</span> 161 <a href="https://www.microsoft.com/en-us/microsoft-copilot/blog/2026/02/26/copilot-tasks-from-answers-to-actions/">
119 <small>Agentic execution</small> 162 <span>Copilot Tasks</span>
120 </a> 163 <small>Agentic execution</small>
121 </li> 164 </a>
122 <li> 165 </li>
123 <a href="https://www.cio.com/article/3977098/microsoft-doubles-down-on-multi-model-ai-as-it-builds-a-copilot-super-app.html"> 166 <li>
124 <span>Copilot SuperApp</span> 167 <a href="https://www.cio.com/article/3977098/microsoft-doubles-down-on-multi-model-ai-as-it-builds-a-copilot-super-app.html">
125 <small>AI platform</small> 168 <span>Copilot SuperApp</span>
126 </a> 169 <small>AI platform</small>
127 </li> 170 </a>
128 </ul> 171 </li>
129 <zen-dialog class="jrpg-preview-dialog"> 172 </ul>
130 <zen-button appearance="plain" size="xs" data-dialog-trigger-owner hidden> 173 <zen-dialog class="jrpg-preview-dialog">
131 <button type="button" data-zen-trigger tabindex="-1" aria-hidden="true"></button> 174 <zen-button appearance="plain" size="xs" data-dialog-trigger-owner hidden>
132 </zen-button> 175 <button type="button" data-zen-trigger tabindex="-1" aria-hidden="true"></button>
133 <dialog class="jrpg-detail-dialog" aria-labelledby="jrpg-dialog-title"> 176 </zen-button>
134 <div class="jrpg-dialog-heading"> 177 <dialog class="jrpg-detail-dialog" aria-labelledby="jrpg-dialog-title">
135 <p>DESTINATION DATA</p> 178 <div class="jrpg-dialog-heading">
136 <div class="jrpg-dialog-heading-actions"> 179 <p>DESTINATION DATA</p>
137 <zen-button appearance="plain" size="md"> 180 <div class="jrpg-dialog-heading-actions">
138 <a href="/resume" data-preview-link> 181 <zen-button appearance="plain" size="md">
139 Open page 182 <a href="/resume" data-preview-link>
140 <zen-icon name="external"></zen-icon> 183 Open page
184 <zen-icon name="external"></zen-icon>
185 </a>
186 </zen-button>
187 <zen-button appearance="plain" size="md">
188 <button type="button" data-zen-close aria-label="Close destination details">
189 <zen-icon name="close"></zen-icon>
190 </button>
191 </zen-button>
192 </div>
193 </div>
194 <h2 id="jrpg-dialog-title" data-dialog-title>Resume</h2>
195 <p data-dialog-copy>Experience, projects, and the systems I have helped build.</p>
196 <section
197 class="jrpg-resume-dossier"
198 data-resume-dossier
199 aria-label="Resume dossier"
200 >
201 <p data-resume-status>Loading resume dossier...</p>
202 <div data-resume-content></div>
203 </section>
204 <section
205 class="jrpg-blog-browser"
206 data-blog-browser
207 aria-label="Blog archive"
208 hidden
209 >
210 <aside>
211 <h3>All blogs</h3>
212 <ol data-blog-list>
213 <li>Loading blog archive...</li>
214 </ol>
215 </aside>
216 <article>
217 <p data-blog-status>Select a blog to inspect.</p>
218 <div data-blog-content></div>
219 </article>
220 </section>
221 <section
222 class="jrpg-tool-browser"
223 data-tool-browser
224 aria-label="Tool workspace"
225 hidden
226 >
227 <article>
228 <p data-tool-status>Select a tool to inspect.</p>
229 <div data-tool-content></div>
230 </article>
231 </section>
232 <div class="jrpg-dialog-actions" data-dialog-actions>
233 <zen-button appearance="plain" size="lg" data-resume-download>
234 <a href="/public/resume.pdf">
235 Download PDF
236 <zen-icon name="download"></zen-icon>
141 </a> 237 </a>
142 </zen-button> 238 </zen-button>
143 <zen-button appearance="plain" size="md">
144 <button type="button" data-zen-close aria-label="Close destination details">
145 <zen-icon name="close"></zen-icon>
146 </button>
147 </zen-button>
148 </div> 239 </div>
149 </div> 240 </dialog>
150 <h2 id="jrpg-dialog-title" data-dialog-title>Resume</h2> 241 </zen-dialog>
151 <p data-dialog-copy>Experience, projects, and the systems I have helped build.</p> 242 </div>
152 <section 243 <mjj-conversation-archive hidden aria-label="Conversations">
153 class="jrpg-resume-dossier"
154 data-resume-dossier
155 aria-label="Resume dossier"
156 >
157 <p data-resume-status>Loading resume dossier...</p>
158 <div data-resume-content></div>
159 </section>
160 <section
161 class="jrpg-blog-browser"
162 data-blog-browser
163 aria-label="Blog archive"
164 hidden
165 >
166 <aside>
167 <h3>All blogs</h3>
168 <ol data-blog-list>
169 <li>Loading blog archive...</li>
170 </ol>
171 </aside>
172 <article>
173 <p data-blog-status>Select a blog to inspect.</p>
174 <div data-blog-content></div>
175 </article>
176 </section>
177 <section
178 class="jrpg-tool-browser"
179 data-tool-browser
180 aria-label="Tool workspace"
181 hidden
182 >
183 <article>
184 <p data-tool-status>Select a tool to inspect.</p>
185 <div data-tool-content></div>
186 </article>
187 </section>
188 <div class="jrpg-dialog-actions" data-dialog-actions>
189 <zen-button appearance="plain" size="lg" data-resume-download>
190 <a href="/public/resume.pdf">
191 Download PDF
192 <zen-icon name="download"></zen-icon>
193 </a>
194 </zen-button>
195 </div>
196 </dialog>
197 </zen-dialog>
198 </article>
199 </mjj-jrpg-preview>
200
201 <mjj-conversation-archive hidden aria-label="Conversations">
202 <div class="jrpg-archive-heading"> 244 <div class="jrpg-archive-heading">
203 <h2>Archive</h2> 245 <h2>Archive</h2>
204 <zen-button appearance="plain" size="xs"> 246 <zen-button appearance="plain" size="xs">
205 <button type="button" data-archive-close aria-label="Close conversations"> 247 <button type="button" data-archive-close aria-label="Close conversations">
206 <zen-icon name="close"></zen-icon> 248 <zen-icon name="close"></zen-icon>
265 <button type="submit">Save</button> 307 <button type="submit">Save</button>
266 </zen-button> 308 </zen-button>
267 </div> 309 </div>
268 </form> 310 </form>
269 </dialog> 311 </dialog>
270 </mjj-conversation-archive> 312 </mjj-conversation-archive>
313 </article>
314 </mjj-jrpg-preview>
271 </section> 315 </section>
272 316
273 <mjj-jrpg-composer> 317 <mjj-composer compact>
274 <form class="jrpg-composer" data-composer> 318 <form class="jrpg-composer" data-composer>
275 <zen-field appearance="plain" size="lg"> 319 <div data-composer-control>
276 <label for="jrpg-message">Message</label> 320 <zen-field size="lg">
277 <textarea 321 <label for="jrpg-message" data-composer-label>Message</label>
278 id="jrpg-message" 322 <textarea
279 name="message" 323 id="jrpg-message"
280 rows="3" 324 name="message"
281 maxlength="500" 325 rows="3"
282 placeholder="Ask Epi about this site..." 326 maxlength="500"
283 required 327 placeholder="Ask Epi about this site..."
284 ></textarea> 328 required
285 </zen-field> 329 ></textarea>
286 <div class="jrpg-composer-actions"> 330 </zen-field>
287 <zen-button appearance="plain" size="sm"> 331 <div class="jrpg-composer-actions" data-composer-actions>
288 <button type="submit"> 332 <zen-button size="sm">
289 Send 333 <button type="submit" aria-label="Send message">
290 <zen-icon name="arrow-right"></zen-icon> 334 <span data-composer-action-label>Send</span>
291 </button> 335 <zen-icon name="arrow-right"></zen-icon>
292 </zen-button> 336 </button>
293 <zen-button appearance="plain" size="sm" data-cancel-control hidden> 337 </zen-button>
294 <button type="button" data-cancel> 338 <zen-button
295 Cancel 339 size="sm"
296 <zen-icon name="close"></zen-icon> 340 variant="danger"
297 </button> 341 data-composer-cancel-owner
298 </zen-button> 342 hidden
343 >
344 <button
345 type="button"
346 data-composer-cancel
347 aria-label="Cancel response"
348 >
349 <span data-composer-action-label>Cancel</span>
350 <zen-icon name="close"></zen-icon>
351 </button>
352 </zen-button>
353 </div>
299 </div> 354 </div>
300 <p class="jrpg-composer-quota" data-quota aria-live="polite" hidden></p> 355 <p
301 <p class="jrpg-composer-hint">Enter to send / Shift + Enter for a new line</p> 356 class="jrpg-composer-quota"
357 data-composer-meta
358 data-quota
359 aria-live="polite"
360 hidden
361 ></p>
362 <p
363 class="jrpg-composer-hint"
364 data-composer-meta
365 >Enter to send / Shift + Enter for a new line</p>
302 </form> 366 </form>
303 </mjj-jrpg-composer> 367 </mjj-composer>
304 368
305 <mjj-jrpg-menu id="jrpg-destination-menu"> 369 <mjj-jrpg-menu id="jrpg-destination-menu">
306 <nav aria-label="Shiba Quest destinations"> 370 <nav aria-label="Shiba Quest destinations">
307 <p class="jrpg-menu-label">Menu</p> 371 <p class="jrpg-menu-label">Menu</p>
308 <ul> 372 <ul>