@mneme-ai/xray 2.156.0 → 2.157.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/public/index.html +48 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mneme-ai/xray",
3
- "version": "2.156.0",
3
+ "version": "2.157.0",
4
4
  "description": "Mneme Repo X-Ray — a signed, raw-free, deterministic X-Ray of any repo. Every number is reproducible from git/AST/metadata and sealed with an offline-verifiable NOTARY receipt. No source code ever leaves the machine; no LLM guesses anything.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
package/public/index.html CHANGED
@@ -21,7 +21,20 @@
21
21
  -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
22
22
  font-feature-settings:"cv11","ss01";letter-spacing:-0.011em}
23
23
  ::selection{background:var(--a-soft)}
24
- .wrap{max-width:720px;margin:0 auto;padding:0 24px}
24
+ .wrap{max-width:720px;margin:0 auto;padding:0 24px;position:relative;z-index:1}
25
+ /* decorative comets — only on wide screens (desktop / iPad landscape) */
26
+ .comet{position:fixed;pointer-events:none;z-index:0;opacity:0;display:none}
27
+ .comet-a{top:9%;right:3.5vw}
28
+ .comet-b{bottom:7%;left:3vw}
29
+ @media (min-width:1180px){
30
+ .comet{display:block;animation:cometIn 1.2s ease .3s forwards}
31
+ .comet-a{animation:cometIn 1.2s ease .3s forwards, driftA 16s ease-in-out 1.5s infinite alternate}
32
+ .comet-b{animation:cometIn 1.2s ease .6s forwards, driftB 19s ease-in-out 2s infinite alternate}
33
+ }
34
+ @keyframes cometIn{from{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:none}}
35
+ @keyframes driftA{from{transform:translate(0,0) rotate(0deg)}to{transform:translate(-14px,18px) rotate(-3deg)}}
36
+ @keyframes driftB{from{transform:translate(0,0) rotate(0deg)}to{transform:translate(16px,-14px) rotate(3deg)}}
37
+ @media (prefers-reduced-motion:reduce){.comet{animation:none!important;opacity:1!important}}
25
38
  /* hero */
26
39
  header{padding:96px 0 40px;text-align:center}
27
40
  .mark{font-size:12px;letter-spacing:.22em;text-transform:uppercase;color:var(--sub);font-weight:600}
@@ -36,6 +49,9 @@
36
49
  color:var(--sub);font-size:13px;line-height:1.5}
37
50
  .btnhelp b{color:var(--ink2);font-weight:600}
38
51
  .keyhelp{font-size:12.5px;color:var(--sub);margin:12px 0 0;line-height:1.5;text-align:center}
52
+ .keymsg{margin:12px auto 0;max-width:520px;text-align:center;font-size:13px;line-height:1.55;color:#166534;
53
+ background:#f0fdf4;border:1px solid #dcfce7;border-radius:10px;padding:11px 14px}
54
+ .keymsg b{color:#14532d;font-weight:640}
39
55
  button{height:54px;padding:0 24px;border:0;border-radius:var(--rs);background:var(--ink);color:#fff;
40
56
  font-size:15.5px;font-weight:560;cursor:pointer;transition:transform .12s, opacity .18s, background .18s;white-space:nowrap}
41
57
  button:hover{background:#22232c}
@@ -180,6 +196,23 @@
180
196
  </style>
181
197
  </head>
182
198
  <body>
199
+ <!-- decorative comets — desktop / iPad only, hidden on narrow screens -->
200
+ <div class="comet comet-a" aria-hidden="true">
201
+ <svg viewBox="0 0 300 300" width="300" height="300"><defs>
202
+ <linearGradient id="ta" x1="1" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#0b0b0f" stop-opacity=".62"/><stop offset="1" stop-color="#0b0b0f" stop-opacity="0"/></linearGradient></defs>
203
+ <path d="M262 44 Q150 118 30 252 Q150 132 252 54 Z" fill="url(#ta)"/>
204
+ <circle cx="262" cy="44" r="15" fill="#0b0b0f" opacity=".12"/>
205
+ <circle cx="262" cy="44" r="7.5" fill="#0b0b0f"/>
206
+ </svg>
207
+ </div>
208
+ <div class="comet comet-b" aria-hidden="true">
209
+ <svg viewBox="0 0 300 300" width="220" height="220"><defs>
210
+ <linearGradient id="tb" x1="0" y1="1" x2="1" y2="0"><stop offset="0" stop-color="#0b0b0f" stop-opacity=".5"/><stop offset="1" stop-color="#0b0b0f" stop-opacity="0"/></linearGradient></defs>
211
+ <path d="M38 256 Q150 182 270 48 Q150 168 48 246 Z" fill="url(#tb)"/>
212
+ <circle cx="38" cy="256" r="12" fill="#0b0b0f" opacity=".12"/>
213
+ <circle cx="38" cy="256" r="6" fill="#0b0b0f"/>
214
+ </svg>
215
+ </div>
183
216
  <div class="wrap">
184
217
  <header>
185
218
  <div class="mark">Mneme · Repo X-Ray</div>
@@ -203,6 +236,7 @@
203
236
  <button id="savekey" type="button">Save</button>
204
237
  <span id="keystate" class="kstate"></span>
205
238
  </div>
239
+ <div id="keymsg" class="keymsg" style="display:none"></div>
206
240
  </details>
207
241
  <div class="localbox" id="localbox">
208
242
  <div class="lh"><span class="localdot"></span>Local agent detected — scan a folder on <b>this machine</b> (source never leaves it)</div>
@@ -271,13 +305,23 @@ async function profileId(token){
271
305
  function refreshKeyState(){
272
306
  const k=getKey(), st=document.getElementById("keystate"), tab=document.getElementById("tabMine");
273
307
  document.getElementById("key").value = k;
274
- st.textContent = k ? "signed in ✓" : "";
308
+ st.textContent = k ? "saved ✓" : "";
275
309
  tab.style.display = k ? "inline-block" : "none";
276
310
  }
277
311
  document.getElementById("savekey").addEventListener("click", ()=>{
278
312
  const k=document.getElementById("key").value.trim();
279
- if(k) localStorage.setItem("xrayKey",k); else localStorage.removeItem("xrayKey");
280
- refreshKeyState(); loadList();
313
+ const msg=document.getElementById("keymsg");
314
+ if(k){
315
+ localStorage.setItem("xrayKey",k);
316
+ refreshKeyState();
317
+ msg.innerHTML='✓ Saved. From now on, every <b>X-Ray</b> or <b>AI Pack</b> you run is kept under <b>My repos</b> — open it any time with this same key.';
318
+ msg.style.display="block";
319
+ tab="mine"; setTab(document.getElementById("tabMine")); loadList();
320
+ } else {
321
+ localStorage.removeItem("xrayKey"); refreshKeyState();
322
+ msg.innerHTML='Signed out. Reports are no longer saved.'; msg.style.display="block";
323
+ tab="board"; setTab(document.getElementById("tabBoard")); loadList();
324
+ }
281
325
  });
282
326
 
283
327
  let tab="board", offset=0, loaded=[];