Mercurial
diff mrjunejune/test/snapshots/jrpg.snapshot @ 273:e02e2036ef84 default tip
add Layer 2 JRPG component system
Add reusable content and window modals, an isolated component sandbox, shared cyberpunk scroll areas, production-safe cache freshness, and server-rendered JRPG panel state.
Co-authored-by: Copilot <[email protected]>
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Sat, 08 Aug 2026 02:08:08 -0700 |
| parents | 41a49c29a28f |
| children |
line wrap: on
line diff
--- a/mrjunejune/test/snapshots/jrpg.snapshot Fri Aug 07 16:05:29 2026 -0700 +++ b/mrjunejune/test/snapshots/jrpg.snapshot Sat Aug 08 02:08:08 2026 -0700 @@ -36,13 +36,18 @@ <link rel="preload" href="/public/jrpg/background-frame-mobile.webp" as="image" media="(max-width: 52rem) and (orientation: portrait)"> <link rel="preload" href="/public/jrpg/bar-ink.webp" as="image"> <link rel="stylesheet" href="/public/mjj-composer.css"> + <link rel="stylesheet" href="/public/mjj-modal.css"> <link rel="stylesheet" href="/jrpg/jrpg.css"> <script type="module" src="/public/mjj-composer.js"></script> + <script type="module" src="/public/mjj-modal.js"></script> <script type="module" src="/jrpg/jrpg.js"></script> </head> <body class="jrpg-page"> <main class="jrpg-main"> - <mjj-jrpg-shell class="jrpg-shell"> + <mjj-jrpg-shell + class="jrpg-shell" + data-initial-panel="resume" + > <div class="jrpg-workspace"> <div class="jrpg-brand"> <header> @@ -78,61 +83,67 @@ </a> </zen-button> </nav> - <zen-dialog + <mjj-window-modal class="jrpg-mobile-destination-owner" data-mobile-destination-owner > - <zen-button class="jrpg-mobile-menu-btn" appearance="plain" size="xs"> - <button - type="button" - data-zen-trigger - data-mobile-menu-toggle - aria-label="Open destination menu" - > - <zen-icon name="menu"></zen-icon> - </button> - </zen-button> - <dialog - class="jrpg-mobile-destination-dialog" - data-mobile-destination-dialog - aria-labelledby="jrpg-mobile-destination-title" - > - <header class="jrpg-mobile-destination-header"> - <zen-button - appearance="plain" - size="sm" - data-mobile-destination-back-owner - hidden + <zen-dialog> + <zen-button class="jrpg-mobile-menu-btn" appearance="plain" size="xs"> + <button + type="button" + data-zen-trigger + data-mobile-menu-toggle + aria-label="Open destination menu" > - <button - type="button" - data-mobile-destination-back - aria-label="Back to destination menu" + <zen-icon name="menu"></zen-icon> + </button> + </zen-button> + <dialog + class="jrpg-mobile-destination-dialog" + data-mobile-destination-dialog + > + <header class="jrpg-mobile-destination-header" data-modal-header> + <zen-button + appearance="plain" + size="sm" + data-mobile-destination-back-owner + hidden > - <zen-icon name="chevron-left"></zen-icon> - Menu - </button> - </zen-button> - <h2 - id="jrpg-mobile-destination-title" - data-mobile-destination-title - >Menu</h2> - <zen-button appearance="plain" size="sm"> - <button - type="button" - data-zen-close - aria-label="Close destination menu" - > - <zen-icon name="close"></zen-icon> - </button> - </zen-button> - </header> - <div - class="jrpg-mobile-destination-content" - data-mobile-destination-content - ></div> - </dialog> - </zen-dialog> + <button + type="button" + data-mobile-destination-back + aria-label="Back to destination menu" + > + <zen-icon name="chevron-left"></zen-icon> + Menu + </button> + </zen-button> + <h2 + id="jrpg-mobile-destination-title" + data-mobile-destination-title + data-modal-title + >Menu</h2> + <zen-button appearance="plain" size="sm"> + <button + type="button" + data-zen-close + aria-label="Close destination menu" + > + <zen-icon name="close"></zen-icon> + </button> + </zen-button> + </header> + <zen-scroll-area + class="jrpg-mobile-destination-content" + data-mobile-destination-content + data-modal-body + data-cyber-scroll + tabindex="0" + aria-label="Destination content" + ></zen-scroll-area> + </dialog> + </zen-dialog> + </mjj-window-modal> <footer class="jrpg-frame-telemetry" aria-label="System telemetry"> <span aria-label="Temperature unavailable">N/A</span> <span data-frame-account aria-live="polite"><a href="/login?next=/jrpg">LOGIN</a></span> @@ -178,50 +189,60 @@ <section class="jrpg-utility" aria-label="Selected destination"> <mjj-jrpg-preview data-selection="resume"> <article class="jrpg-preview-panel" aria-live="polite"> - <div class="jrpg-preview-content" data-preview-content> + <div + class="jrpg-preview-content" + data-preview-content + + > <zen-heading size="xl"> <h2 data-preview-title>Resume</h2> </zen-heading> <p data-preview-copy> - Member of Technical Staff and engineering leader with 10+ years building AI agent platforms and production systems. + Member of Technical Staff and engineering leader with 10+ years building AI agent platforms and production systems across Microsoft, Meta, Google, and growth-stage companies. </p> - <ul class="jrpg-work-showcase" data-work-showcase> - <li> - <a href="https://www.microsoft.com/en-us/microsoft-copilot/blog/2026/02/26/copilot-tasks-from-answers-to-actions/"> - <span>Copilot Tasks</span> - <small>Agentic execution</small> - </a> - </li> - <li> - <a href="https://www.cio.com/article/3977098/microsoft-doubles-down-on-multi-model-ai-as-it-builds-a-copilot-super-app.html"> - <span>Copilot SuperApp</span> - <small>AI platform</small> - </a> - </li> - </ul> - <zen-dialog class="jrpg-preview-dialog"> - <zen-button appearance="plain" size="xs" data-dialog-trigger-owner hidden> - <button type="button" data-zen-trigger tabindex="-1" aria-hidden="true"></button> - </zen-button> - <dialog class="jrpg-detail-dialog" aria-labelledby="jrpg-dialog-title"> - <div class="jrpg-dialog-heading"> - <p>DESTINATION DATA</p> + <ul class="jrpg-work-showcase" data-work-showcase><li><a href="/resume" data-resume-modal><span>Full resume</span><small>Career dossier</small></a></li><li><a href="https://www.microsoft.com/en-us/microsoft-copilot/blog/2026/02/26/copilot-tasks-from-answers-to-actions/"><span>Copilot Tasks</span><small>Agentic execution</small></a></li></ul> + <mjj-content-modal data-detail-modal-owner> + <zen-dialog class="jrpg-preview-dialog"> + <zen-button appearance="plain" size="xs" data-dialog-trigger-owner hidden> + <button type="button" data-zen-trigger tabindex="-1" aria-hidden="true"></button> + </zen-button> + <dialog class="jrpg-detail-dialog"> + <header class="jrpg-dialog-heading" data-modal-header> + <div data-modal-heading> + <p data-modal-kicker>DESTINATION DATA</p> + <h2 + id="jrpg-dialog-title" + data-dialog-title + data-modal-title + >Resume</h2> + </div> <div class="jrpg-dialog-heading-actions"> - <zen-button appearance="plain" size="md"> - <a href="/resume" data-preview-link> - Open page - <zen-icon name="external"></zen-icon> + <zen-button + appearance="plain" + size="sm" + data-resume-download + > + <a href="/public/resume.pdf"> + Download PDF + <zen-icon name="download"></zen-icon> </a> </zen-button> - <zen-button appearance="plain" size="md"> + <zen-button appearance="plain" size="sm"> <button type="button" data-zen-close aria-label="Close destination details"> <zen-icon name="close"></zen-icon> </button> </zen-button> - </div> - </div> - <h2 id="jrpg-dialog-title" data-dialog-title>Resume</h2> - <p data-dialog-copy>Experience, projects, and the systems I have helped build.</p> + </div> + </header> + <zen-scroll-area + class="jrpg-detail-body" + data-modal-body + data-cyber-scroll + tabindex="0" + aria-label="Destination details" + > + <div class="jrpg-detail-content" data-modal-article> + <p data-dialog-copy>Experience, projects, and the systems I have helped build.</p> <section class="jrpg-resume-dossier" data-resume-dossier @@ -258,18 +279,16 @@ <div data-tool-content></div> </article> </section> - <div class="jrpg-dialog-actions" data-dialog-actions> - <zen-button appearance="plain" size="lg" data-resume-download> - <a href="/public/resume.pdf"> - Download PDF - <zen-icon name="download"></zen-icon> - </a> - </zen-button> - </div> - </dialog> - </zen-dialog> + </div> + </zen-scroll-area> + </dialog> + </zen-dialog> + </mjj-content-modal> </div> - <mjj-conversation-archive hidden aria-label="Conversations"> + <mjj-conversation-archive + hidden + aria-label="Conversations" + > <div class="jrpg-archive-heading"> <h2>Archive</h2> <zen-button appearance="plain" size="xs"> @@ -292,52 +311,83 @@ <button type="button" data-archive-load-more>Load more</button> </zen-button> <p class="jrpg-archive-status" data-archive-status aria-live="polite">Loading conversations...</p> - <dialog - class="jrpg-archive-dialog" - data-archive-delete-dialog - aria-labelledby="archive-delete-title" - aria-modal="true" - > - <p id="archive-delete-title" class="jrpg-archive-dialog-title">Delete this conversation?</p> - <p data-archive-delete-name class="jrpg-archive-dialog-subtitle"></p> - <div class="jrpg-archive-dialog-actions"> - <zen-button appearance="plain" size="md"> - <button type="button" data-archive-delete-cancel>Cancel</button> - </zen-button> - <zen-button appearance="plain" size="md"> - <button type="button" data-archive-delete-confirm>Delete</button> + <mjj-content-modal data-archive-delete-owner> + <zen-dialog> + <zen-button appearance="plain" size="xs" hidden> + <button type="button" data-zen-trigger tabindex="-1" aria-hidden="true"></button> </zen-button> - </div> - </dialog> - <dialog - class="jrpg-archive-dialog" - data-archive-rename-dialog - aria-labelledby="archive-rename-title" - aria-modal="true" - > - <p id="archive-rename-title" class="jrpg-archive-dialog-title">Rename conversation</p> - <form data-archive-rename-form novalidate> - <zen-field appearance="plain" size="md"> - <label for="archive-rename-input">New title</label> - <input - id="archive-rename-input" - data-archive-rename-input - type="text" - maxlength="200" - required - autocomplete="off" + <dialog + class="jrpg-archive-dialog" + data-archive-delete-dialog + > + <header data-modal-header> + <h2 + id="archive-delete-title" + class="jrpg-archive-dialog-title" + data-modal-title + >Delete this conversation?</h2> + </header> + <div data-modal-body> + <div data-modal-article> + <p data-archive-delete-name class="jrpg-archive-dialog-subtitle"></p> + </div> + </div> + <footer class="jrpg-archive-dialog-actions" data-modal-footer> + <zen-button appearance="plain" size="md"> + <button type="button" data-archive-delete-cancel>Cancel</button> + </zen-button> + <zen-button appearance="plain" size="md"> + <button type="button" data-archive-delete-confirm>Delete</button> + </zen-button> + </footer> + </dialog> + </zen-dialog> + </mjj-content-modal> + <mjj-window-modal data-archive-rename-owner> + <zen-dialog> + <zen-button appearance="plain" size="xs" hidden> + <button type="button" data-zen-trigger tabindex="-1" aria-hidden="true"></button> + </zen-button> + <dialog + class="jrpg-archive-dialog" + data-archive-rename-dialog + > + <header data-modal-header> + <h2 + id="archive-rename-title" + class="jrpg-archive-dialog-title" + data-modal-title + >Rename conversation</h2> + </header> + <form + id="archive-rename-form" + data-modal-body + data-archive-rename-form + novalidate > - </zen-field> - <div class="jrpg-archive-dialog-actions"> + <zen-field appearance="plain" size="md"> + <label for="archive-rename-input">New title</label> + <input + id="archive-rename-input" + data-archive-rename-input + type="text" + maxlength="200" + required + autocomplete="off" + > + </zen-field> + </form> + <footer class="jrpg-archive-dialog-actions" data-modal-footer> <zen-button appearance="plain" size="md"> <button type="button" data-archive-rename-cancel>Cancel</button> </zen-button> <zen-button appearance="plain" size="md"> - <button type="submit">Save</button> + <button type="submit" form="archive-rename-form">Save</button> </zen-button> - </div> - </form> - </dialog> + </footer> + </dialog> + </zen-dialog> + </mjj-window-modal> </mjj-conversation-archive> </article> </mjj-jrpg-preview> @@ -435,26 +485,30 @@ </nav> </mjj-jrpg-menu> - <zen-dialog class="jrpg-login-dialog-owner" data-login-dialog-owner> - <zen-button appearance="plain" size="md" hidden> - <button type="button" data-zen-trigger tabindex="-1" aria-hidden="true"></button> - </zen-button> - <dialog - class="jrpg-login-dialog" - data-login-dialog - aria-labelledby="jrpg-login-title" - aria-modal="true" - > - <div class="jrpg-login-dialog-header"> - <h2 id="jrpg-login-title">SIGN IN</h2> - <zen-button appearance="plain" size="md"> - <button type="button" data-zen-close aria-label="Close sign-in dialog"> - <zen-icon name="close"></zen-icon> - </button> - </zen-button> - </div> - <div role="alert" data-login-error aria-live="assertive" hidden></div> - <form data-login-form novalidate> + <mjj-window-modal class="jrpg-login-dialog-owner" data-login-dialog-owner> + <zen-dialog> + <zen-button appearance="plain" size="md" hidden> + <button type="button" data-zen-trigger tabindex="-1" aria-hidden="true"></button> + </zen-button> + <dialog + class="jrpg-login-dialog" + data-login-dialog + > + <header class="jrpg-login-dialog-header" data-modal-header> + <h2 id="jrpg-login-title" data-modal-title>SIGN IN</h2> + <zen-button appearance="plain" size="md"> + <button type="button" data-zen-close aria-label="Close sign-in dialog"> + <zen-icon name="close"></zen-icon> + </button> + </zen-button> + </header> + <form + id="jrpg-login-form" + data-login-form + data-modal-body + novalidate + > + <div role="alert" data-login-error aria-live="assertive" hidden></div> <zen-field appearance="plain" size="md"> <label for="jrpg-login-username">Username</label> <input @@ -480,17 +534,22 @@ maxlength="1024" > </zen-field> - <div class="jrpg-login-dialog-actions"> + </form> + <footer class="jrpg-login-dialog-actions" data-modal-footer> <zen-button appearance="plain" size="md"> <button type="button" data-login-cancel data-zen-close>Cancel</button> </zen-button> <zen-button appearance="plain" size="md"> - <button type="submit" data-login-submit>Sign in</button> + <button + type="submit" + form="jrpg-login-form" + data-login-submit + >Sign in</button> </zen-button> - </div> - </form> - </dialog> - </zen-dialog> + </footer> + </dialog> + </zen-dialog> + </mjj-window-modal> </div> </mjj-jrpg-shell> </main>