Write on the margins of the internet. Powered by the AT Protocol. margin.at
extension web atproto comments

Add eslint and fix all lint issues, fix some bugs, and refactor extension showing annotations on-site with better comfort

+5508 -602
+3
backend/internal/db/queries.go
··· 825 825 } 826 826 827 827 normalized := strings.ToLower(parsed.Host) + parsed.Path 828 + if parsed.RawQuery != "" { 829 + normalized += "?" + parsed.RawQuery 830 + } 828 831 normalized = strings.TrimSuffix(normalized, "/") 829 832 830 833 return hashString(normalized)
+89 -41
extension/background/service-worker.js
··· 6 6 const hasSidebarAction = 7 7 typeof browser !== "undefined" && 8 8 typeof browser.sidebarAction !== "undefined"; 9 - const hasSessionStorage = 10 - typeof chrome !== "undefined" && 11 - chrome.storage && 12 - typeof chrome.storage.session !== "undefined"; 13 9 const hasNotifications = 14 10 typeof chrome !== "undefined" && typeof chrome.notifications !== "undefined"; 15 11 ··· 71 67 return false; 72 68 } 73 69 74 - async function storePendingAnnotation(data) { 75 - if (hasSessionStorage) { 76 - await chrome.storage.session.set({ pendingAnnotation: data }); 77 - } else { 78 - await chrome.storage.local.set({ 79 - pendingAnnotation: data, 80 - pendingAnnotationExpiry: Date.now() + 60000, 81 - }); 82 - } 83 - } 84 - 85 70 chrome.runtime.onInstalled.addListener(async () => { 86 71 const stored = await chrome.storage.local.get(["apiUrl"]); 87 72 if (!stored.apiUrl) { ··· 118 103 if (hasSidebarAction) { 119 104 try { 120 105 await browser.sidebarAction.close(); 121 - } catch (e) {} 106 + } catch { 107 + /* ignore */ 108 + } 122 109 } 123 110 }); 124 111 125 - chrome.action.onClicked.addListener(async (tab) => { 112 + chrome.action.onClicked.addListener(async () => { 126 113 const stored = await chrome.storage.local.get(["apiUrl"]); 127 114 const webUrl = stored.apiUrl || WEB_BASE; 128 115 chrome.tabs.create({ url: webUrl }); ··· 130 117 131 118 chrome.contextMenus.onClicked.addListener(async (info, tab) => { 132 119 if (info.menuItemId === "margin-open-sidebar") { 133 - if (hasSidePanel && chrome.sidePanel && chrome.sidePanel.open) { 134 - try { 135 - await chrome.sidePanel.open({ windowId: tab.windowId }); 136 - } catch (err) { 137 - console.error("Failed to open side panel:", err); 138 - } 139 - } else if (hasSidebarAction) { 140 - try { 141 - await browser.sidebarAction.open(); 142 - } catch (err) { 143 - console.error("Failed to open Firefox sidebar:", err); 144 - } 145 - } 120 + await openAnnotationUI(tab.id); 146 121 return; 147 122 } 148 123 ··· 189 164 selectionText: info.selectionText, 190 165 }); 191 166 selector = response?.selector; 192 - } catch (err) {} 193 - 194 - if (selector && (hasSidePanel || hasSidebarAction)) { 195 - await storePendingAnnotation({ 196 - url: tab.url, 197 - title: tab.title, 198 - selector: selector, 199 - }); 200 - const opened = await openAnnotationUI(tab.id); 201 - if (opened) return; 167 + } catch { 168 + /* ignore */ 202 169 } 203 170 204 171 if (!selector && info.selectionText) { ··· 208 175 }; 209 176 } 210 177 178 + if (selector) { 179 + try { 180 + await chrome.tabs.sendMessage(tab.id, { 181 + type: "SHOW_INLINE_ANNOTATE", 182 + data: { 183 + url: tab.url, 184 + title: tab.title, 185 + selector: selector, 186 + }, 187 + }); 188 + return; 189 + } catch { 190 + /* ignore */ 191 + } 192 + } 193 + 211 194 if (WEB_BASE) { 212 195 let composeUrl = `${WEB_BASE}/new?url=${encodeURIComponent(tab.url)}`; 213 196 if (selector) { ··· 227 210 selectionText: info.selectionText, 228 211 }); 229 212 if (response && response.success) return; 230 - } catch (err) {} 213 + } catch { 214 + /* ignore */ 215 + } 231 216 232 217 if (info.selectionText) { 233 218 selector = { ··· 657 642 throw new Error( 658 643 `Failed to add to collection: ${res.status} ${errText}`, 659 644 ); 645 + } 646 + 647 + const data = await res.json(); 648 + sendResponse({ success: true, data }); 649 + break; 650 + } 651 + 652 + case "GET_REPLIES": { 653 + if (!API_BASE) { 654 + sendResponse({ success: false, error: "API URL not configured" }); 655 + return; 656 + } 657 + 658 + const uri = request.data.uri; 659 + const res = await fetch( 660 + `${API_BASE}/api/replies?uri=${encodeURIComponent(uri)}`, 661 + ); 662 + 663 + if (!res.ok) { 664 + throw new Error(`Failed to fetch replies: ${res.status}`); 665 + } 666 + 667 + const data = await res.json(); 668 + sendResponse({ success: true, data: data.items || [] }); 669 + break; 670 + } 671 + 672 + case "CREATE_REPLY": { 673 + if (!API_BASE) { 674 + sendResponse({ success: false, error: "API URL not configured" }); 675 + return; 676 + } 677 + 678 + const cookie = await chrome.cookies.get({ 679 + url: API_BASE, 680 + name: "margin_session", 681 + }); 682 + 683 + if (!cookie) { 684 + sendResponse({ success: false, error: "Not authenticated" }); 685 + return; 686 + } 687 + 688 + const { parentUri, parentCid, rootUri, rootCid, text } = request.data; 689 + const res = await fetch(`${API_BASE}/api/annotations/reply`, { 690 + method: "POST", 691 + credentials: "include", 692 + headers: { 693 + "Content-Type": "application/json", 694 + "X-Session-Token": cookie.value, 695 + }, 696 + body: JSON.stringify({ 697 + parentUri, 698 + parentCid, 699 + rootUri, 700 + rootCid, 701 + text, 702 + }), 703 + }); 704 + 705 + if (!res.ok) { 706 + const errText = await res.text(); 707 + throw new Error(`Failed to create reply: ${res.status} ${errText}`); 660 708 } 661 709 662 710 const data = await res.json();
+663 -213
extension/content/content.js
··· 2 2 let sidebarHost = null; 3 3 let sidebarShadow = null; 4 4 let popoverEl = null; 5 + let selectionPopupEl = null; 5 6 6 7 let activeItems = []; 7 - 8 - let hoveredItems = []; 9 - let tooltipEl = null; 10 - let hideTimer = null; 8 + let currentSelection = null; 11 9 12 10 const OVERLAY_STYLES = ` 13 11 :host { all: initial; } ··· 18 16 width: 100%; 19 17 height: 100%; 20 18 pointer-events: none; 21 - } 22 - .margin-badge { 23 - position: absolute; 24 - background: #6366f1; 25 - color: white; 26 - padding: 4px 10px; 27 - border-radius: 99px; 28 - font-size: 11px; 29 - font-weight: 600; 30 - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; 31 - cursor: pointer; 32 - pointer-events: auto; 33 - box-shadow: 0 2px 8px rgba(99, 102, 241, 0.3); 34 - display: flex; 35 - align-items: center; 36 - gap: 6px; 37 - transform: translateY(-120%); 38 - white-space: nowrap; 39 - transition: transform 0.15s, background-color 0.15s; 40 - z-index: 2147483647; 41 - } 42 - .margin-badge:hover { 43 - transform: translateY(-125%) scale(1.05); 44 - background: #4f46e5; 45 - z-index: 2147483647; 46 - } 47 - .margin-badge-avatar { 48 - width: 16px; 49 - height: 16px; 50 - border-radius: 50%; 51 - background: rgba(255,255,255,0.2); 52 - display: flex; 53 - align-items: center; 54 - justify-content: center; 55 - font-size: 9px; 56 - object-fit: cover; 57 - } 58 - .margin-badge-stack { 59 - display: flex; 60 - align-items: center; 61 - } 62 - .margin-badge-stack .margin-badge-avatar { 63 - margin-left: -6px; 64 - border: 1px solid #6366f1; 65 - } 66 - .margin-badge-stack .margin-badge-avatar:first-child { 67 - margin-left: 0; 68 - } 69 - .margin-badge-stem { 70 - position: absolute; 71 - left: 14px; 72 - bottom: -6px; 73 - width: 2px; 74 - height: 6px; 75 - background: #6366f1; 76 - border-radius: 2px; 77 19 } 78 20 79 21 .margin-popover { ··· 149 91 padding: 4px 8px; color: #a1a1aa; font-size: 11px; cursor: pointer; 150 92 } 151 93 .btn-action:hover { background: #27272a; color: #e4e4e7; } 94 + 95 + .margin-selection-popup { 96 + position: fixed; 97 + display: flex; 98 + gap: 4px; 99 + padding: 6px; 100 + background: #09090b; 101 + border: 1px solid #27272a; 102 + border-radius: 8px; 103 + box-shadow: 0 8px 16px rgba(0,0,0,0.4); 104 + z-index: 2147483647; 105 + pointer-events: auto; 106 + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; 107 + animation: popover-in 0.15s forwards; 108 + } 109 + .selection-btn { 110 + display: flex; 111 + align-items: center; 112 + gap: 6px; 113 + padding: 6px 12px; 114 + background: transparent; 115 + border: none; 116 + border-radius: 6px; 117 + color: #e4e4e7; 118 + font-size: 12px; 119 + font-weight: 500; 120 + cursor: pointer; 121 + transition: background 0.15s; 122 + } 123 + .selection-btn:hover { 124 + background: #27272a; 125 + } 126 + .selection-btn svg { 127 + width: 14px; 128 + height: 14px; 129 + } 130 + .inline-compose-modal { 131 + position: fixed; 132 + width: 340px; 133 + max-width: calc(100vw - 40px); 134 + background: #09090b; 135 + border: 1px solid #27272a; 136 + border-radius: 12px; 137 + padding: 16px; 138 + box-sizing: border-box; 139 + box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.5); 140 + z-index: 2147483647; 141 + pointer-events: auto; 142 + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; 143 + color: #e4e4e7; 144 + animation: popover-in 0.15s forwards; 145 + overflow: hidden; 146 + } 147 + .inline-compose-modal * { 148 + box-sizing: border-box; 149 + } 150 + .inline-compose-quote { 151 + padding: 8px 12px; 152 + background: #18181b; 153 + border-left: 3px solid #6366f1; 154 + border-radius: 4px; 155 + font-size: 12px; 156 + color: #a1a1aa; 157 + font-style: italic; 158 + margin-bottom: 12px; 159 + max-height: 60px; 160 + overflow: hidden; 161 + word-break: break-word; 162 + } 163 + .inline-compose-textarea { 164 + width: 100%; 165 + min-height: 80px; 166 + padding: 10px 12px; 167 + background: #18181b; 168 + border: 1px solid #27272a; 169 + border-radius: 8px; 170 + color: #e4e4e7; 171 + font-family: inherit; 172 + font-size: 13px; 173 + resize: vertical; 174 + margin-bottom: 12px; 175 + box-sizing: border-box; 176 + } 177 + .inline-compose-textarea:focus { 178 + outline: none; 179 + border-color: #6366f1; 180 + } 181 + .inline-compose-actions { 182 + display: flex; 183 + justify-content: flex-end; 184 + gap: 8px; 185 + } 186 + .btn-cancel { 187 + padding: 8px 16px; 188 + background: transparent; 189 + border: 1px solid #27272a; 190 + border-radius: 6px; 191 + color: #a1a1aa; 192 + font-size: 13px; 193 + cursor: pointer; 194 + } 195 + .btn-cancel:hover { 196 + background: #27272a; 197 + color: #e4e4e7; 198 + } 199 + .btn-submit { 200 + padding: 8px 16px; 201 + background: #6366f1; 202 + border: none; 203 + border-radius: 6px; 204 + color: white; 205 + font-size: 13px; 206 + font-weight: 500; 207 + cursor: pointer; 208 + } 209 + .btn-submit:hover { 210 + background: #4f46e5; 211 + } 212 + .btn-submit:disabled { 213 + opacity: 0.5; 214 + cursor: not-allowed; 215 + } 216 + .reply-section { 217 + border-top: 1px solid #27272a; 218 + padding: 12px 16px; 219 + background: #0f0f12; 220 + border-radius: 0 0 12px 12px; 221 + } 222 + .reply-textarea { 223 + width: 100%; 224 + min-height: 60px; 225 + padding: 8px 10px; 226 + background: #18181b; 227 + border: 1px solid #27272a; 228 + border-radius: 6px; 229 + color: #e4e4e7; 230 + font-family: inherit; 231 + font-size: 12px; 232 + resize: none; 233 + margin-bottom: 8px; 234 + } 235 + .reply-textarea:focus { 236 + outline: none; 237 + border-color: #6366f1; 238 + } 239 + .reply-submit { 240 + padding: 6px 12px; 241 + background: #6366f1; 242 + border: none; 243 + border-radius: 4px; 244 + color: white; 245 + font-size: 11px; 246 + font-weight: 500; 247 + cursor: pointer; 248 + float: right; 249 + } 250 + .reply-submit:disabled { 251 + opacity: 0.5; 252 + } 253 + .reply-item { 254 + padding: 8px 0; 255 + border-top: 1px solid #27272a; 256 + } 257 + .reply-item:first-child { 258 + border-top: none; 259 + } 260 + .reply-author { 261 + font-size: 11px; 262 + font-weight: 600; 263 + color: #a1a1aa; 264 + margin-bottom: 4px; 265 + } 266 + .reply-text { 267 + font-size: 12px; 268 + color: #e4e4e7; 269 + line-height: 1.4; 270 + } 152 271 `; 153 272 154 273 class DOMTextMatcher { ··· 203 322 let matchIndex = this.corpus.indexOf(searchText); 204 323 205 324 if (matchIndex === -1) { 206 - const cleaned = searchText.replace(/\s+/g, " "); 207 - return null; 325 + const normalizedSearch = searchText.replace(/\s+/g, " ").trim(); 326 + matchIndex = this.corpus.indexOf(normalizedSearch); 327 + 328 + if (matchIndex === -1) { 329 + const fuzzyMatch = this.fuzzyFindInCorpus(searchText); 330 + if (fuzzyMatch) { 331 + const start = this.mapIndexToPoint(fuzzyMatch.start); 332 + const end = this.mapIndexToPoint(fuzzyMatch.end); 333 + if (start && end) { 334 + const range = document.createRange(); 335 + range.setStart(start.node, start.offset); 336 + range.setEnd(end.node, end.offset); 337 + return range; 338 + } 339 + } 340 + return null; 341 + } 208 342 } 209 343 210 344 const start = this.mapIndexToPoint(matchIndex); ··· 219 353 return null; 220 354 } 221 355 356 + fuzzyFindInCorpus(searchText) { 357 + const searchWords = searchText 358 + .trim() 359 + .split(/\s+/) 360 + .filter((w) => w.length > 0); 361 + if (searchWords.length === 0) return null; 362 + 363 + const corpusLower = this.corpus.toLowerCase(); 364 + 365 + const firstWord = searchWords[0].toLowerCase(); 366 + let searchStart = 0; 367 + 368 + while (searchStart < corpusLower.length) { 369 + const wordStart = corpusLower.indexOf(firstWord, searchStart); 370 + if (wordStart === -1) break; 371 + 372 + let corpusPos = wordStart; 373 + let matched = true; 374 + let lastMatchEnd = wordStart; 375 + 376 + for (const word of searchWords) { 377 + const wordLower = word.toLowerCase(); 378 + while ( 379 + corpusPos < corpusLower.length && 380 + /\s/.test(this.corpus[corpusPos]) 381 + ) { 382 + corpusPos++; 383 + } 384 + const corpusSlice = corpusLower.slice( 385 + corpusPos, 386 + corpusPos + wordLower.length, 387 + ); 388 + if (corpusSlice !== wordLower) { 389 + matched = false; 390 + break; 391 + } 392 + 393 + corpusPos += wordLower.length; 394 + lastMatchEnd = corpusPos; 395 + } 396 + 397 + if (matched) { 398 + return { start: wordStart, end: lastMatchEnd }; 399 + } 400 + 401 + searchStart = wordStart + 1; 402 + } 403 + 404 + return null; 405 + } 406 + 222 407 mapIndexToPoint(corpusIndex) { 223 408 for (const info of this.indices) { 224 409 if ( ··· 265 450 container.id = "margin-overlay-container"; 266 451 sidebarShadow.appendChild(container); 267 452 268 - createTooltip(container); 269 - 270 453 const observer = new ResizeObserver(() => { 271 454 sidebarHost.style.height = `${getScrollHeight()}px`; 272 455 }); 273 456 if (document.body) observer.observe(document.body); 274 457 if (document.documentElement) observer.observe(document.documentElement); 275 458 276 - fetchAnnotations(); 459 + if (typeof chrome !== "undefined" && chrome.storage) { 460 + chrome.storage.local.get(["showOverlay"], (result) => { 461 + if (result.showOverlay === false) { 462 + sidebarHost.style.display = "none"; 463 + } else { 464 + fetchAnnotations(); 465 + } 466 + }); 467 + } else { 468 + fetchAnnotations(); 469 + } 277 470 278 471 document.addEventListener("mousemove", handleMouseMove); 279 - document.addEventListener("click", handleDocumentClick); 472 + document.addEventListener("click", handleDocumentClick, true); 473 + document.addEventListener("mouseup", handleTextSelection); 280 474 } 281 475 282 - function createTooltip(container) { 283 - tooltipEl = document.createElement("div"); 284 - tooltipEl.className = "margin-badge"; 285 - tooltipEl.style.opacity = "0"; 286 - tooltipEl.style.transition = "opacity 0.1s, transform 0.1s"; 287 - tooltipEl.style.pointerEvents = "auto"; 476 + function handleTextSelection(e) { 477 + if (e.target.closest && e.target.closest("#margin-overlay-host")) return; 478 + 479 + const selection = window.getSelection(); 480 + const selectedText = selection?.toString().trim(); 481 + if (!selectedText || selectedText.length < 3) { 482 + hideSelectionPopup(); 483 + return; 484 + } 288 485 289 - tooltipEl.addEventListener("click", (e) => { 290 - e.stopPropagation(); 291 - if (hoveredItems.length > 0) { 292 - const firstItem = hoveredItems[0]; 293 - const rect = activeItems 294 - .find((x) => x.item === firstItem) 295 - ?.range.getBoundingClientRect(); 296 - if (rect) { 297 - const top = rect.top + window.scrollY; 298 - const left = rect.left + window.scrollX; 299 - showPopover(hoveredItems, top, left); 300 - } 486 + const anchorNode = selection.anchorNode; 487 + if (anchorNode) { 488 + const parent = anchorNode.parentElement; 489 + if ( 490 + parent && 491 + (parent.tagName === "INPUT" || 492 + parent.tagName === "TEXTAREA" || 493 + parent.isContentEditable) 494 + ) { 495 + return; 301 496 } 497 + } 498 + 499 + currentSelection = { 500 + text: selectedText, 501 + selector: { type: "TextQuoteSelector", exact: selectedText }, 502 + }; 503 + 504 + showSelectionPopup(e.clientX, e.clientY); 505 + } 506 + 507 + function showSelectionPopup(x, y) { 508 + hideSelectionPopup(); 509 + if (!sidebarShadow) return; 510 + 511 + const container = sidebarShadow.getElementById("margin-overlay-container"); 512 + if (!container) return; 513 + 514 + selectionPopupEl = document.createElement("div"); 515 + selectionPopupEl.className = "margin-selection-popup"; 516 + 517 + const popupWidth = 180; 518 + const viewportWidth = window.innerWidth; 519 + let left = x + 5; 520 + if (left + popupWidth > viewportWidth) { 521 + left = viewportWidth - popupWidth - 10; 522 + } 523 + 524 + selectionPopupEl.style.left = `${left}px`; 525 + selectionPopupEl.style.top = `${y + 10}px`; 526 + 527 + selectionPopupEl.innerHTML = ` 528 + <button class="selection-btn btn-annotate"> 529 + <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> 530 + <path d="M12 20h9M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z"/> 531 + </svg> 532 + Annotate 533 + </button> 534 + <button class="selection-btn btn-highlight"> 535 + <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> 536 + <path d="M9 11l3 3L22 4"/> 537 + <path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/> 538 + </svg> 539 + Highlight 540 + </button> 541 + `; 542 + 543 + selectionPopupEl 544 + .querySelector(".btn-annotate") 545 + .addEventListener("click", (e) => { 546 + e.stopPropagation(); 547 + hideSelectionPopup(); 548 + showInlineComposeModal(); 549 + }); 550 + 551 + selectionPopupEl 552 + .querySelector(".btn-highlight") 553 + .addEventListener("click", async (e) => { 554 + e.stopPropagation(); 555 + hideSelectionPopup(); 556 + 557 + chrome.runtime.sendMessage( 558 + { 559 + type: "CREATE_HIGHLIGHT", 560 + data: { 561 + url: window.location.href, 562 + title: document.title, 563 + selector: currentSelection.selector, 564 + color: "#fcd34d", 565 + }, 566 + }, 567 + (res) => { 568 + if (res && res.success) { 569 + fetchAnnotations(); 570 + } 571 + }, 572 + ); 573 + }); 574 + 575 + container.appendChild(selectionPopupEl); 576 + 577 + setTimeout(() => { 578 + document.addEventListener("mousedown", closeSelectionPopupOutside, { 579 + once: true, 580 + }); 581 + }, 100); 582 + } 583 + 584 + function hideSelectionPopup() { 585 + if (selectionPopupEl) { 586 + selectionPopupEl.remove(); 587 + selectionPopupEl = null; 588 + } 589 + } 590 + 591 + function closeSelectionPopupOutside(e) { 592 + if (selectionPopupEl && !selectionPopupEl.contains(e.target)) { 593 + hideSelectionPopup(); 594 + } 595 + } 596 + 597 + function showInlineComposeModal() { 598 + if (!sidebarShadow || !currentSelection) return; 599 + 600 + const container = sidebarShadow.getElementById("margin-overlay-container"); 601 + if (!container) return; 602 + 603 + const existingModal = container.querySelector(".inline-compose-modal"); 604 + if (existingModal) existingModal.remove(); 605 + 606 + const modal = document.createElement("div"); 607 + modal.className = "inline-compose-modal"; 608 + 609 + modal.style.left = `${Math.max(20, (window.innerWidth - 340) / 2)}px`; 610 + modal.style.top = `${Math.min(200, window.innerHeight / 4)}px`; 611 + 612 + const truncatedQuote = 613 + currentSelection.text.length > 100 614 + ? currentSelection.text.substring(0, 100) + "..." 615 + : currentSelection.text; 616 + 617 + modal.innerHTML = ` 618 + <div class="inline-compose-quote">"${truncatedQuote}"</div> 619 + <textarea class="inline-compose-textarea" placeholder="Add your annotation..." autofocus></textarea> 620 + <div class="inline-compose-actions"> 621 + <button class="btn-cancel">Cancel</button> 622 + <button class="btn-submit">Post Annotation</button> 623 + </div> 624 + `; 625 + 626 + const textarea = modal.querySelector("textarea"); 627 + const submitBtn = modal.querySelector(".btn-submit"); 628 + const cancelBtn = modal.querySelector(".btn-cancel"); 629 + 630 + cancelBtn.addEventListener("click", () => { 631 + modal.remove(); 302 632 }); 303 - container.appendChild(tooltipEl); 633 + 634 + submitBtn.addEventListener("click", async () => { 635 + const text = textarea.value.trim(); 636 + if (!text) return; 637 + 638 + submitBtn.disabled = true; 639 + submitBtn.textContent = "Posting..."; 640 + 641 + chrome.runtime.sendMessage( 642 + { 643 + type: "CREATE_ANNOTATION", 644 + data: { 645 + url: currentSelection.url || window.location.href, 646 + title: currentSelection.title || document.title, 647 + text: text, 648 + selector: currentSelection.selector, 649 + }, 650 + }, 651 + (res) => { 652 + if (res && res.success) { 653 + modal.remove(); 654 + fetchAnnotations(); 655 + } else { 656 + submitBtn.disabled = false; 657 + submitBtn.textContent = "Post Annotation"; 658 + alert( 659 + "Failed to create annotation: " + (res?.error || "Unknown error"), 660 + ); 661 + } 662 + }, 663 + ); 664 + }); 665 + 666 + container.appendChild(modal); 667 + textarea.focus(); 668 + 669 + const handleEscape = (e) => { 670 + if (e.key === "Escape") { 671 + modal.remove(); 672 + document.removeEventListener("keydown", handleEscape); 673 + } 674 + }; 675 + document.addEventListener("keydown", handleEscape); 304 676 } 305 677 678 + let hoverIndicator = null; 679 + 306 680 function handleMouseMove(e) { 307 681 const x = e.clientX; 308 682 const y = e.clientY; 309 - 310 683 let foundItems = []; 311 - 684 + let firstRange = null; 312 685 for (const { range, item } of activeItems) { 313 686 const rects = range.getClientRects(); 314 687 for (const rect of rects) { 315 - const padding = 5; 316 688 if ( 317 - x >= rect.left - padding && 318 - x <= rect.right + padding && 319 - y >= rect.top - padding && 320 - y <= rect.bottom + padding 689 + x >= rect.left && 690 + x <= rect.right && 691 + y >= rect.top && 692 + y <= rect.bottom 321 693 ) { 322 - if (!foundItems.includes(item)) { 323 - foundItems.push(item); 694 + if (!firstRange) firstRange = range; 695 + if (!foundItems.some((f) => f.item === item)) { 696 + foundItems.push({ range, item, rect }); 324 697 } 325 698 break; 326 699 } 327 700 } 328 701 } 329 702 330 - let isOverTooltip = false; 331 - if (tooltipEl && tooltipEl.style.opacity === "1") { 332 - const rect = tooltipEl.getBoundingClientRect(); 333 - if ( 334 - x >= rect.left && 335 - x <= rect.right && 336 - y >= rect.top && 337 - y <= rect.bottom 338 - ) { 339 - isOverTooltip = true; 340 - } 341 - } 703 + if (foundItems.length > 0) { 704 + document.body.style.cursor = "pointer"; 342 705 343 - if (foundItems.length > 0 || isOverTooltip) { 344 - if (hideTimer) { 345 - clearTimeout(hideTimer); 346 - hideTimer = null; 347 - } 348 - if (foundItems.length > 0) { 349 - const currentIds = hoveredItems 350 - .map((i) => i.id || i.cid) 351 - .sort() 352 - .join(","); 353 - const newIds = foundItems 354 - .map((i) => i.id || i.cid) 355 - .sort() 356 - .join(","); 357 - 358 - if (currentIds !== newIds) { 359 - hoveredItems = foundItems; 360 - updateTooltip(); 706 + if (!hoverIndicator && sidebarShadow) { 707 + const container = sidebarShadow.getElementById( 708 + "margin-overlay-container", 709 + ); 710 + if (container) { 711 + hoverIndicator = document.createElement("div"); 712 + hoverIndicator.className = "margin-hover-indicator"; 713 + hoverIndicator.style.cssText = ` 714 + position: fixed; 715 + display: flex; 716 + align-items: center; 717 + pointer-events: none; 718 + z-index: 2147483647; 719 + opacity: 0; 720 + transition: opacity 0.15s, transform 0.15s; 721 + transform: scale(0.8); 722 + `; 723 + container.appendChild(hoverIndicator); 361 724 } 362 725 } 363 - } else { 364 - if (!hideTimer && hoveredItems.length > 0) { 365 - hideTimer = setTimeout(() => { 366 - hoveredItems = []; 367 - updateTooltip(); 368 - hideTimer = null; 369 - }, 300); 370 - } 371 - } 372 - } 373 726 374 - function updateTooltip() { 375 - if (!tooltipEl) return; 727 + if (hoverIndicator) { 728 + const authorsMap = new Map(); 729 + foundItems.forEach(({ item }) => { 730 + const author = item.author || item.creator || {}; 731 + const id = author.did || author.handle || "unknown"; 732 + if (!authorsMap.has(id)) { 733 + authorsMap.set(id, author); 734 + } 735 + }); 736 + const uniqueAuthors = Array.from(authorsMap.values()); 376 737 377 - if (hoveredItems.length === 0) { 378 - tooltipEl.style.opacity = "0"; 379 - tooltipEl.style.transform = "translateY(-105%) scale(0.9)"; 380 - tooltipEl.style.pointerEvents = "none"; 381 - return; 382 - } 738 + const maxShow = 3; 739 + const displayAuthors = uniqueAuthors.slice(0, maxShow); 740 + const overflow = uniqueAuthors.length - maxShow; 383 741 384 - tooltipEl.style.pointerEvents = "auto"; 742 + let html = displayAuthors 743 + .map((author, i) => { 744 + const avatar = author.avatar; 745 + const handle = author.handle || "U"; 746 + const marginLeft = i === 0 ? "0" : "-8px"; 385 747 386 - const authorsMap = new Map(); 387 - hoveredItems.forEach((item) => { 388 - const author = item.author || item.creator || {}; 389 - const id = author.did || author.handle; 390 - if (id && !authorsMap.has(id)) { 391 - authorsMap.set(id, author); 392 - } 393 - }); 748 + if (avatar) { 749 + return `<img src="${avatar}" style="width: 24px; height: 24px; border-radius: 50%; object-fit: cover; border: 2px solid #09090b; margin-left: ${marginLeft};">`; 750 + } else { 751 + return `<div style="width: 24px; height: 24px; border-radius: 50%; background: #6366f1; color: white; display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 600; font-family: -apple-system, sans-serif; border: 2px solid #09090b; margin-left: ${marginLeft};">${handle[0]?.toUpperCase() || "U"}</div>`; 752 + } 753 + }) 754 + .join(""); 394 755 395 - const uniqueAuthors = Array.from(authorsMap.values()); 396 - let contentHtml = ""; 756 + if (overflow > 0) { 757 + html += `<div style="width: 24px; height: 24px; border-radius: 50%; background: #27272a; color: #a1a1aa; display: flex; align-items: center; justify-content: center; font-size: 10px; font-weight: 600; font-family: -apple-system, sans-serif; border: 2px solid #09090b; margin-left: -8px;">+${overflow}</div>`; 758 + } 397 759 398 - if (uniqueAuthors.length === 1) { 399 - const author = uniqueAuthors[0] || {}; 400 - const handle = author.handle || "User"; 401 - const avatar = author.avatar; 402 - const count = hoveredItems.length; 760 + hoverIndicator.innerHTML = html; 403 761 404 - let avatarHtml = `<div class="margin-badge-avatar">${handle[0]?.toUpperCase() || "U"}</div>`; 405 - if (avatar) { 406 - avatarHtml = `<img src="${avatar}" class="margin-badge-avatar">`; 762 + const firstRect = firstRange.getClientRects()[0]; 763 + const totalWidth = 764 + Math.min(uniqueAuthors.length, maxShow + (overflow > 0 ? 1 : 0)) * 765 + 18 + 766 + 8; 767 + const leftPos = firstRect.left - totalWidth; 768 + const topPos = firstRect.top + firstRect.height / 2 - 12; 769 + 770 + hoverIndicator.style.left = `${leftPos}px`; 771 + hoverIndicator.style.top = `${topPos}px`; 772 + hoverIndicator.style.opacity = "1"; 773 + hoverIndicator.style.transform = "scale(1)"; 407 774 } 408 - 409 - contentHtml = `${avatarHtml}<span>${handle}${count > 1 ? ` (${count})` : ""}</span>`; 410 775 } else { 411 - let stackHtml = `<div class="margin-badge-stack">`; 412 - const displayAuthors = uniqueAuthors.slice(0, 3); 413 - displayAuthors.forEach((author) => { 414 - const handle = author.handle || "U"; 415 - const avatar = author.avatar; 416 - if (avatar) { 417 - stackHtml += `<img src="${avatar}" class="margin-badge-avatar">`; 418 - } else { 419 - stackHtml += `<div class="margin-badge-avatar">${handle[0]?.toUpperCase() || "U"}</div>`; 420 - } 421 - }); 422 - stackHtml += `</div>`; 423 - 424 - contentHtml = `${stackHtml}<span>${uniqueAuthors.length} people</span>`; 776 + document.body.style.cursor = ""; 777 + if (hoverIndicator) { 778 + hoverIndicator.style.opacity = "0"; 779 + hoverIndicator.style.transform = "scale(0.8)"; 780 + } 425 781 } 426 - 427 - tooltipEl.innerHTML = ` 428 - ${contentHtml} 429 - <div class="margin-badge-stem"></div> 430 - `; 782 + } 431 783 432 - const firstItem = hoveredItems[0]; 433 - const match = activeItems.find((x) => x.item === firstItem); 434 - if (match) { 435 - const rects = match.range.getClientRects(); 436 - if (rects && rects.length > 0) { 437 - const rect = rects[0]; 438 - const top = rect.top + window.scrollY; 439 - const left = rect.left + window.scrollX; 784 + function handleDocumentClick(e) { 785 + const x = e.clientX; 786 + const y = e.clientY; 787 + if (popoverEl && sidebarShadow) { 788 + const rect = popoverEl.getBoundingClientRect(); 789 + if ( 790 + x >= rect.left && 791 + x <= rect.right && 792 + y >= rect.top && 793 + y <= rect.bottom 794 + ) { 795 + return; 796 + } 797 + } 440 798 441 - tooltipEl.style.top = `${top - 36}px`; 442 - tooltipEl.style.left = `${left}px`; 443 - tooltipEl.style.opacity = "1"; 444 - tooltipEl.style.transform = "translateY(0) scale(1)"; 799 + let clickedItems = []; 800 + for (const { range, item } of activeItems) { 801 + const rects = range.getClientRects(); 802 + for (const rect of rects) { 803 + if ( 804 + x >= rect.left && 805 + x <= rect.right && 806 + y >= rect.top && 807 + y <= rect.bottom 808 + ) { 809 + if (!clickedItems.includes(item)) { 810 + clickedItems.push(item); 811 + } 812 + break; 813 + } 445 814 } 446 815 } 447 - } 448 816 449 - function handleDocumentClick(e) { 450 - if (hoveredItems.length > 0) { 817 + if (clickedItems.length > 0) { 451 818 e.preventDefault(); 452 819 e.stopPropagation(); 453 820 454 - const item = hoveredItems[0]; 455 - const match = activeItems.find((x) => x.item === item); 821 + if (popoverEl) { 822 + const currentIds = popoverEl.dataset.itemIds; 823 + const newIds = clickedItems 824 + .map((i) => i.uri || i.id) 825 + .sort() 826 + .join(","); 827 + 828 + if (currentIds === newIds) { 829 + popoverEl.remove(); 830 + popoverEl = null; 831 + return; 832 + } 833 + } 834 + 835 + const firstItem = clickedItems[0]; 836 + const match = activeItems.find((x) => x.item === firstItem); 456 837 if (match) { 457 838 const rects = match.range.getClientRects(); 458 839 if (rects.length > 0) { 459 840 const rect = rects[0]; 460 841 const top = rect.top + window.scrollY; 461 842 const left = rect.left + window.scrollX; 462 - showPopover(hoveredItems, top, left); 843 + showPopover(clickedItems, top, left); 463 844 } 464 845 } 846 + } else { 847 + if (popoverEl) { 848 + popoverEl.remove(); 849 + popoverEl = null; 850 + } 465 851 } 466 852 } 467 - 468 - function refreshPositions() {} 469 853 470 854 function renderBadges(annotations) { 471 855 if (!sidebarShadow) return; ··· 484 868 if (range) { 485 869 activeItems.push({ range, item }); 486 870 487 - const color = item.color || "#c084fc"; 871 + const color = item.color || "#6366f1"; 488 872 if (!rangesByColor[color]) rangesByColor[color] = []; 489 873 rangesByColor[color].push(range); 490 874 } 491 875 }); 492 876 493 - if (CSS.highlights) { 877 + if (typeof CSS !== "undefined" && CSS.highlights) { 494 878 CSS.highlights.clear(); 495 879 for (const [color, ranges] of Object.entries(rangesByColor)) { 496 880 const highlight = new Highlight(...ranges); ··· 508 892 const style = document.createElement("style"); 509 893 style.textContent = ` 510 894 ::highlight(${name}) { 511 - background-color: ${color}66; 512 - color: inherit; 895 + text-decoration: underline; 896 + text-decoration-color: ${color}; 897 + text-decoration-thickness: 2px; 898 + text-underline-offset: 2px; 513 899 cursor: pointer; 514 900 } 515 901 `; ··· 523 909 popoverEl = document.createElement("div"); 524 910 popoverEl.className = "margin-popover"; 525 911 912 + const ids = items 913 + .map((i) => i.uri || i.id) 914 + .sort() 915 + .join(","); 916 + popoverEl.dataset.itemIds = ids; 917 + 526 918 const popWidth = 320; 527 919 const screenWidth = window.innerWidth; 528 920 let finalLeft = left; ··· 531 923 popoverEl.style.top = `${top + 20}px`; 532 924 popoverEl.style.left = `${finalLeft}px`; 533 925 534 - const title = 535 - items.length > 1 ? `${items.length} Annotations` : "Annotation"; 926 + const hasHighlights = items.some((item) => item.type === "Highlight"); 927 + const hasAnnotations = items.some((item) => item.type !== "Highlight"); 928 + let title; 929 + if (items.length > 1) { 930 + if (hasHighlights && hasAnnotations) { 931 + title = `${items.length} Items`; 932 + } else if (hasHighlights) { 933 + title = `${items.length} Highlights`; 934 + } else { 935 + title = `${items.length} Annotations`; 936 + } 937 + } else { 938 + title = items[0]?.type === "Highlight" ? "Highlight" : "Annotation"; 939 + } 536 940 537 941 let contentHtml = items 538 942 .map((item) => { ··· 591 995 </div> 592 996 `; 593 997 594 - popoverEl.querySelector(".popover-close").addEventListener("click", () => { 998 + popoverEl.querySelector(".popover-close").addEventListener("click", (e) => { 999 + e.stopPropagation(); 595 1000 popoverEl.remove(); 596 1001 popoverEl = null; 597 1002 }); 598 1003 599 1004 const replyBtns = popoverEl.querySelectorAll(".btn-reply"); 600 1005 replyBtns.forEach((btn) => { 601 - btn.addEventListener("click", () => { 1006 + btn.addEventListener("click", (e) => { 1007 + e.stopPropagation(); 602 1008 const id = btn.getAttribute("data-id"); 603 1009 if (id) { 604 1010 chrome.runtime.sendMessage({ ··· 636 1042 }, 0); 637 1043 } 638 1044 639 - function closePopoverOutside(e) { 1045 + function closePopoverOutside() { 640 1046 if (popoverEl) { 641 1047 popoverEl.remove(); 642 1048 popoverEl = null; ··· 644 1050 } 645 1051 } 646 1052 647 - function fetchAnnotations() { 1053 + function fetchAnnotations(retryCount = 0) { 648 1054 if (typeof chrome !== "undefined" && chrome.runtime) { 649 1055 chrome.runtime.sendMessage( 650 1056 { ··· 652 1058 data: { url: window.location.href }, 653 1059 }, 654 1060 (res) => { 655 - if (res && res.success) { 1061 + if (res && res.success && res.data && res.data.length > 0) { 656 1062 renderBadges(res.data); 1063 + } else if (retryCount < 3) { 1064 + setTimeout( 1065 + () => fetchAnnotations(retryCount + 1), 1066 + 1000 * (retryCount + 1), 1067 + ); 657 1068 } 658 1069 }, 659 1070 ); ··· 672 1083 return true; 673 1084 } 674 1085 1086 + if (request.type === "SHOW_INLINE_ANNOTATE") { 1087 + currentSelection = { 1088 + text: request.data.selector?.exact || "", 1089 + selector: request.data.selector, 1090 + url: request.data.url, 1091 + title: request.data.title, 1092 + }; 1093 + showInlineComposeModal(); 1094 + sendResponse({ success: true }); 1095 + return true; 1096 + } 1097 + 1098 + if (request.type === "UPDATE_OVERLAY_VISIBILITY") { 1099 + if (sidebarHost) { 1100 + sidebarHost.style.display = request.show ? "block" : "none"; 1101 + } 1102 + if (request.show) { 1103 + fetchAnnotations(); 1104 + } else { 1105 + if (typeof CSS !== "undefined" && CSS.highlights) { 1106 + CSS.highlights.clear(); 1107 + } 1108 + } 1109 + sendResponse({ success: true }); 1110 + return true; 1111 + } 1112 + 675 1113 if (request.type === "SCROLL_TO_TEXT") { 676 1114 const selector = request.selector; 677 1115 if (selector?.exact) { ··· 698 1136 } else { 699 1137 initOverlay(); 700 1138 } 1139 + 1140 + window.addEventListener("load", () => { 1141 + if (typeof chrome !== "undefined" && chrome.storage) { 1142 + chrome.storage.local.get(["showOverlay"], (result) => { 1143 + if (result.showOverlay !== false) { 1144 + setTimeout(() => fetchAnnotations(), 500); 1145 + } 1146 + }); 1147 + } else { 1148 + setTimeout(() => fetchAnnotations(), 500); 1149 + } 1150 + }); 701 1151 })();
+25
extension/eslint.config.js
··· 1 + import js from "@eslint/js"; 2 + import globals from "globals"; 3 + 4 + export default [ 5 + { ignores: ["dist"] }, 6 + { 7 + files: ["**/*.js"], 8 + languageOptions: { 9 + ecmaVersion: 2020, 10 + globals: { 11 + ...globals.browser, 12 + ...globals.webextensions, 13 + }, 14 + parserOptions: { 15 + ecmaVersion: "latest", 16 + sourceType: "module", 17 + }, 18 + }, 19 + rules: { 20 + ...js.configs.recommended.rules, 21 + "no-unused-vars": ["warn", { argsIgnorePattern: "^_" }], 22 + "no-undef": "warn", 23 + }, 24 + }, 25 + ];
+1 -1
extension/icons/site.webmanifest
··· 16 16 "theme_color": "#ffffff", 17 17 "background_color": "#ffffff", 18 18 "display": "standalone" 19 - } 19 + }
+1091
extension/package-lock.json
··· 1 + { 2 + "name": "margin-extension", 3 + "version": "0.1.0", 4 + "lockfileVersion": 3, 5 + "requires": true, 6 + "packages": { 7 + "": { 8 + "name": "margin-extension", 9 + "version": "0.1.0", 10 + "devDependencies": { 11 + "@eslint/js": "^9.39.2", 12 + "eslint": "^9.39.2", 13 + "globals": "^17.0.0" 14 + } 15 + }, 16 + "node_modules/@eslint-community/eslint-utils": { 17 + "version": "4.9.1", 18 + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", 19 + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", 20 + "dev": true, 21 + "license": "MIT", 22 + "dependencies": { 23 + "eslint-visitor-keys": "^3.4.3" 24 + }, 25 + "engines": { 26 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 27 + }, 28 + "funding": { 29 + "url": "https://opencollective.com/eslint" 30 + }, 31 + "peerDependencies": { 32 + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 33 + } 34 + }, 35 + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 36 + "version": "3.4.3", 37 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 38 + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 39 + "dev": true, 40 + "license": "Apache-2.0", 41 + "engines": { 42 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 43 + }, 44 + "funding": { 45 + "url": "https://opencollective.com/eslint" 46 + } 47 + }, 48 + "node_modules/@eslint-community/regexpp": { 49 + "version": "4.12.2", 50 + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", 51 + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", 52 + "dev": true, 53 + "license": "MIT", 54 + "engines": { 55 + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 56 + } 57 + }, 58 + "node_modules/@eslint/config-array": { 59 + "version": "0.21.1", 60 + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", 61 + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", 62 + "dev": true, 63 + "license": "Apache-2.0", 64 + "dependencies": { 65 + "@eslint/object-schema": "^2.1.7", 66 + "debug": "^4.3.1", 67 + "minimatch": "^3.1.2" 68 + }, 69 + "engines": { 70 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 71 + } 72 + }, 73 + "node_modules/@eslint/config-helpers": { 74 + "version": "0.4.2", 75 + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", 76 + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", 77 + "dev": true, 78 + "license": "Apache-2.0", 79 + "dependencies": { 80 + "@eslint/core": "^0.17.0" 81 + }, 82 + "engines": { 83 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 84 + } 85 + }, 86 + "node_modules/@eslint/core": { 87 + "version": "0.17.0", 88 + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", 89 + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", 90 + "dev": true, 91 + "license": "Apache-2.0", 92 + "dependencies": { 93 + "@types/json-schema": "^7.0.15" 94 + }, 95 + "engines": { 96 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 97 + } 98 + }, 99 + "node_modules/@eslint/eslintrc": { 100 + "version": "3.3.3", 101 + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", 102 + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", 103 + "dev": true, 104 + "license": "MIT", 105 + "dependencies": { 106 + "ajv": "^6.12.4", 107 + "debug": "^4.3.2", 108 + "espree": "^10.0.1", 109 + "globals": "^14.0.0", 110 + "ignore": "^5.2.0", 111 + "import-fresh": "^3.2.1", 112 + "js-yaml": "^4.1.1", 113 + "minimatch": "^3.1.2", 114 + "strip-json-comments": "^3.1.1" 115 + }, 116 + "engines": { 117 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 118 + }, 119 + "funding": { 120 + "url": "https://opencollective.com/eslint" 121 + } 122 + }, 123 + "node_modules/@eslint/eslintrc/node_modules/globals": { 124 + "version": "14.0.0", 125 + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", 126 + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 127 + "dev": true, 128 + "license": "MIT", 129 + "engines": { 130 + "node": ">=18" 131 + }, 132 + "funding": { 133 + "url": "https://github.com/sponsors/sindresorhus" 134 + } 135 + }, 136 + "node_modules/@eslint/js": { 137 + "version": "9.39.2", 138 + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", 139 + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", 140 + "dev": true, 141 + "license": "MIT", 142 + "engines": { 143 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 144 + }, 145 + "funding": { 146 + "url": "https://eslint.org/donate" 147 + } 148 + }, 149 + "node_modules/@eslint/object-schema": { 150 + "version": "2.1.7", 151 + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", 152 + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", 153 + "dev": true, 154 + "license": "Apache-2.0", 155 + "engines": { 156 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 157 + } 158 + }, 159 + "node_modules/@eslint/plugin-kit": { 160 + "version": "0.4.1", 161 + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", 162 + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", 163 + "dev": true, 164 + "license": "Apache-2.0", 165 + "dependencies": { 166 + "@eslint/core": "^0.17.0", 167 + "levn": "^0.4.1" 168 + }, 169 + "engines": { 170 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 171 + } 172 + }, 173 + "node_modules/@humanfs/core": { 174 + "version": "0.19.1", 175 + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", 176 + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", 177 + "dev": true, 178 + "license": "Apache-2.0", 179 + "engines": { 180 + "node": ">=18.18.0" 181 + } 182 + }, 183 + "node_modules/@humanfs/node": { 184 + "version": "0.16.7", 185 + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", 186 + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", 187 + "dev": true, 188 + "license": "Apache-2.0", 189 + "dependencies": { 190 + "@humanfs/core": "^0.19.1", 191 + "@humanwhocodes/retry": "^0.4.0" 192 + }, 193 + "engines": { 194 + "node": ">=18.18.0" 195 + } 196 + }, 197 + "node_modules/@humanwhocodes/module-importer": { 198 + "version": "1.0.1", 199 + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 200 + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 201 + "dev": true, 202 + "license": "Apache-2.0", 203 + "engines": { 204 + "node": ">=12.22" 205 + }, 206 + "funding": { 207 + "type": "github", 208 + "url": "https://github.com/sponsors/nzakas" 209 + } 210 + }, 211 + "node_modules/@humanwhocodes/retry": { 212 + "version": "0.4.3", 213 + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", 214 + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", 215 + "dev": true, 216 + "license": "Apache-2.0", 217 + "engines": { 218 + "node": ">=18.18" 219 + }, 220 + "funding": { 221 + "type": "github", 222 + "url": "https://github.com/sponsors/nzakas" 223 + } 224 + }, 225 + "node_modules/@types/estree": { 226 + "version": "1.0.8", 227 + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", 228 + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", 229 + "dev": true, 230 + "license": "MIT" 231 + }, 232 + "node_modules/@types/json-schema": { 233 + "version": "7.0.15", 234 + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 235 + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 236 + "dev": true, 237 + "license": "MIT" 238 + }, 239 + "node_modules/acorn": { 240 + "version": "8.15.0", 241 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", 242 + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", 243 + "dev": true, 244 + "license": "MIT", 245 + "peer": true, 246 + "bin": { 247 + "acorn": "bin/acorn" 248 + }, 249 + "engines": { 250 + "node": ">=0.4.0" 251 + } 252 + }, 253 + "node_modules/acorn-jsx": { 254 + "version": "5.3.2", 255 + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 256 + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 257 + "dev": true, 258 + "license": "MIT", 259 + "peerDependencies": { 260 + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 261 + } 262 + }, 263 + "node_modules/ajv": { 264 + "version": "6.12.6", 265 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 266 + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 267 + "dev": true, 268 + "license": "MIT", 269 + "dependencies": { 270 + "fast-deep-equal": "^3.1.1", 271 + "fast-json-stable-stringify": "^2.0.0", 272 + "json-schema-traverse": "^0.4.1", 273 + "uri-js": "^4.2.2" 274 + }, 275 + "funding": { 276 + "type": "github", 277 + "url": "https://github.com/sponsors/epoberezkin" 278 + } 279 + }, 280 + "node_modules/ansi-styles": { 281 + "version": "4.3.0", 282 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 283 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 284 + "dev": true, 285 + "license": "MIT", 286 + "dependencies": { 287 + "color-convert": "^2.0.1" 288 + }, 289 + "engines": { 290 + "node": ">=8" 291 + }, 292 + "funding": { 293 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 294 + } 295 + }, 296 + "node_modules/argparse": { 297 + "version": "2.0.1", 298 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 299 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 300 + "dev": true, 301 + "license": "Python-2.0" 302 + }, 303 + "node_modules/balanced-match": { 304 + "version": "1.0.2", 305 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 306 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 307 + "dev": true, 308 + "license": "MIT" 309 + }, 310 + "node_modules/brace-expansion": { 311 + "version": "1.1.12", 312 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", 313 + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", 314 + "dev": true, 315 + "license": "MIT", 316 + "dependencies": { 317 + "balanced-match": "^1.0.0", 318 + "concat-map": "0.0.1" 319 + } 320 + }, 321 + "node_modules/callsites": { 322 + "version": "3.1.0", 323 + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 324 + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 325 + "dev": true, 326 + "license": "MIT", 327 + "engines": { 328 + "node": ">=6" 329 + } 330 + }, 331 + "node_modules/chalk": { 332 + "version": "4.1.2", 333 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 334 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 335 + "dev": true, 336 + "license": "MIT", 337 + "dependencies": { 338 + "ansi-styles": "^4.1.0", 339 + "supports-color": "^7.1.0" 340 + }, 341 + "engines": { 342 + "node": ">=10" 343 + }, 344 + "funding": { 345 + "url": "https://github.com/chalk/chalk?sponsor=1" 346 + } 347 + }, 348 + "node_modules/color-convert": { 349 + "version": "2.0.1", 350 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 351 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 352 + "dev": true, 353 + "license": "MIT", 354 + "dependencies": { 355 + "color-name": "~1.1.4" 356 + }, 357 + "engines": { 358 + "node": ">=7.0.0" 359 + } 360 + }, 361 + "node_modules/color-name": { 362 + "version": "1.1.4", 363 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 364 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 365 + "dev": true, 366 + "license": "MIT" 367 + }, 368 + "node_modules/concat-map": { 369 + "version": "0.0.1", 370 + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 371 + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 372 + "dev": true, 373 + "license": "MIT" 374 + }, 375 + "node_modules/cross-spawn": { 376 + "version": "7.0.6", 377 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 378 + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 379 + "dev": true, 380 + "license": "MIT", 381 + "dependencies": { 382 + "path-key": "^3.1.0", 383 + "shebang-command": "^2.0.0", 384 + "which": "^2.0.1" 385 + }, 386 + "engines": { 387 + "node": ">= 8" 388 + } 389 + }, 390 + "node_modules/debug": { 391 + "version": "4.4.3", 392 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", 393 + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", 394 + "dev": true, 395 + "license": "MIT", 396 + "dependencies": { 397 + "ms": "^2.1.3" 398 + }, 399 + "engines": { 400 + "node": ">=6.0" 401 + }, 402 + "peerDependenciesMeta": { 403 + "supports-color": { 404 + "optional": true 405 + } 406 + } 407 + }, 408 + "node_modules/deep-is": { 409 + "version": "0.1.4", 410 + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 411 + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 412 + "dev": true, 413 + "license": "MIT" 414 + }, 415 + "node_modules/escape-string-regexp": { 416 + "version": "4.0.0", 417 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 418 + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 419 + "dev": true, 420 + "license": "MIT", 421 + "engines": { 422 + "node": ">=10" 423 + }, 424 + "funding": { 425 + "url": "https://github.com/sponsors/sindresorhus" 426 + } 427 + }, 428 + "node_modules/eslint": { 429 + "version": "9.39.2", 430 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", 431 + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", 432 + "dev": true, 433 + "license": "MIT", 434 + "peer": true, 435 + "dependencies": { 436 + "@eslint-community/eslint-utils": "^4.8.0", 437 + "@eslint-community/regexpp": "^4.12.1", 438 + "@eslint/config-array": "^0.21.1", 439 + "@eslint/config-helpers": "^0.4.2", 440 + "@eslint/core": "^0.17.0", 441 + "@eslint/eslintrc": "^3.3.1", 442 + "@eslint/js": "9.39.2", 443 + "@eslint/plugin-kit": "^0.4.1", 444 + "@humanfs/node": "^0.16.6", 445 + "@humanwhocodes/module-importer": "^1.0.1", 446 + "@humanwhocodes/retry": "^0.4.2", 447 + "@types/estree": "^1.0.6", 448 + "ajv": "^6.12.4", 449 + "chalk": "^4.0.0", 450 + "cross-spawn": "^7.0.6", 451 + "debug": "^4.3.2", 452 + "escape-string-regexp": "^4.0.0", 453 + "eslint-scope": "^8.4.0", 454 + "eslint-visitor-keys": "^4.2.1", 455 + "espree": "^10.4.0", 456 + "esquery": "^1.5.0", 457 + "esutils": "^2.0.2", 458 + "fast-deep-equal": "^3.1.3", 459 + "file-entry-cache": "^8.0.0", 460 + "find-up": "^5.0.0", 461 + "glob-parent": "^6.0.2", 462 + "ignore": "^5.2.0", 463 + "imurmurhash": "^0.1.4", 464 + "is-glob": "^4.0.0", 465 + "json-stable-stringify-without-jsonify": "^1.0.1", 466 + "lodash.merge": "^4.6.2", 467 + "minimatch": "^3.1.2", 468 + "natural-compare": "^1.4.0", 469 + "optionator": "^0.9.3" 470 + }, 471 + "bin": { 472 + "eslint": "bin/eslint.js" 473 + }, 474 + "engines": { 475 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 476 + }, 477 + "funding": { 478 + "url": "https://eslint.org/donate" 479 + }, 480 + "peerDependencies": { 481 + "jiti": "*" 482 + }, 483 + "peerDependenciesMeta": { 484 + "jiti": { 485 + "optional": true 486 + } 487 + } 488 + }, 489 + "node_modules/eslint-scope": { 490 + "version": "8.4.0", 491 + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", 492 + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", 493 + "dev": true, 494 + "license": "BSD-2-Clause", 495 + "dependencies": { 496 + "esrecurse": "^4.3.0", 497 + "estraverse": "^5.2.0" 498 + }, 499 + "engines": { 500 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 501 + }, 502 + "funding": { 503 + "url": "https://opencollective.com/eslint" 504 + } 505 + }, 506 + "node_modules/eslint-visitor-keys": { 507 + "version": "4.2.1", 508 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", 509 + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", 510 + "dev": true, 511 + "license": "Apache-2.0", 512 + "engines": { 513 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 514 + }, 515 + "funding": { 516 + "url": "https://opencollective.com/eslint" 517 + } 518 + }, 519 + "node_modules/espree": { 520 + "version": "10.4.0", 521 + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", 522 + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", 523 + "dev": true, 524 + "license": "BSD-2-Clause", 525 + "dependencies": { 526 + "acorn": "^8.15.0", 527 + "acorn-jsx": "^5.3.2", 528 + "eslint-visitor-keys": "^4.2.1" 529 + }, 530 + "engines": { 531 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 532 + }, 533 + "funding": { 534 + "url": "https://opencollective.com/eslint" 535 + } 536 + }, 537 + "node_modules/esquery": { 538 + "version": "1.7.0", 539 + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", 540 + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", 541 + "dev": true, 542 + "license": "BSD-3-Clause", 543 + "dependencies": { 544 + "estraverse": "^5.1.0" 545 + }, 546 + "engines": { 547 + "node": ">=0.10" 548 + } 549 + }, 550 + "node_modules/esrecurse": { 551 + "version": "4.3.0", 552 + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 553 + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 554 + "dev": true, 555 + "license": "BSD-2-Clause", 556 + "dependencies": { 557 + "estraverse": "^5.2.0" 558 + }, 559 + "engines": { 560 + "node": ">=4.0" 561 + } 562 + }, 563 + "node_modules/estraverse": { 564 + "version": "5.3.0", 565 + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 566 + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 567 + "dev": true, 568 + "license": "BSD-2-Clause", 569 + "engines": { 570 + "node": ">=4.0" 571 + } 572 + }, 573 + "node_modules/esutils": { 574 + "version": "2.0.3", 575 + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 576 + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 577 + "dev": true, 578 + "license": "BSD-2-Clause", 579 + "engines": { 580 + "node": ">=0.10.0" 581 + } 582 + }, 583 + "node_modules/fast-deep-equal": { 584 + "version": "3.1.3", 585 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 586 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 587 + "dev": true, 588 + "license": "MIT" 589 + }, 590 + "node_modules/fast-json-stable-stringify": { 591 + "version": "2.1.0", 592 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 593 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 594 + "dev": true, 595 + "license": "MIT" 596 + }, 597 + "node_modules/fast-levenshtein": { 598 + "version": "2.0.6", 599 + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 600 + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 601 + "dev": true, 602 + "license": "MIT" 603 + }, 604 + "node_modules/file-entry-cache": { 605 + "version": "8.0.0", 606 + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 607 + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 608 + "dev": true, 609 + "license": "MIT", 610 + "dependencies": { 611 + "flat-cache": "^4.0.0" 612 + }, 613 + "engines": { 614 + "node": ">=16.0.0" 615 + } 616 + }, 617 + "node_modules/find-up": { 618 + "version": "5.0.0", 619 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 620 + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 621 + "dev": true, 622 + "license": "MIT", 623 + "dependencies": { 624 + "locate-path": "^6.0.0", 625 + "path-exists": "^4.0.0" 626 + }, 627 + "engines": { 628 + "node": ">=10" 629 + }, 630 + "funding": { 631 + "url": "https://github.com/sponsors/sindresorhus" 632 + } 633 + }, 634 + "node_modules/flat-cache": { 635 + "version": "4.0.1", 636 + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", 637 + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 638 + "dev": true, 639 + "license": "MIT", 640 + "dependencies": { 641 + "flatted": "^3.2.9", 642 + "keyv": "^4.5.4" 643 + }, 644 + "engines": { 645 + "node": ">=16" 646 + } 647 + }, 648 + "node_modules/flatted": { 649 + "version": "3.3.3", 650 + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", 651 + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", 652 + "dev": true, 653 + "license": "ISC" 654 + }, 655 + "node_modules/glob-parent": { 656 + "version": "6.0.2", 657 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 658 + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 659 + "dev": true, 660 + "license": "ISC", 661 + "dependencies": { 662 + "is-glob": "^4.0.3" 663 + }, 664 + "engines": { 665 + "node": ">=10.13.0" 666 + } 667 + }, 668 + "node_modules/globals": { 669 + "version": "17.0.0", 670 + "resolved": "https://registry.npmjs.org/globals/-/globals-17.0.0.tgz", 671 + "integrity": "sha512-gv5BeD2EssA793rlFWVPMMCqefTlpusw6/2TbAVMy0FzcG8wKJn4O+NqJ4+XWmmwrayJgw5TzrmWjFgmz1XPqw==", 672 + "dev": true, 673 + "license": "MIT", 674 + "engines": { 675 + "node": ">=18" 676 + }, 677 + "funding": { 678 + "url": "https://github.com/sponsors/sindresorhus" 679 + } 680 + }, 681 + "node_modules/has-flag": { 682 + "version": "4.0.0", 683 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 684 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 685 + "dev": true, 686 + "license": "MIT", 687 + "engines": { 688 + "node": ">=8" 689 + } 690 + }, 691 + "node_modules/ignore": { 692 + "version": "5.3.2", 693 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 694 + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 695 + "dev": true, 696 + "license": "MIT", 697 + "engines": { 698 + "node": ">= 4" 699 + } 700 + }, 701 + "node_modules/import-fresh": { 702 + "version": "3.3.1", 703 + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", 704 + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 705 + "dev": true, 706 + "license": "MIT", 707 + "dependencies": { 708 + "parent-module": "^1.0.0", 709 + "resolve-from": "^4.0.0" 710 + }, 711 + "engines": { 712 + "node": ">=6" 713 + }, 714 + "funding": { 715 + "url": "https://github.com/sponsors/sindresorhus" 716 + } 717 + }, 718 + "node_modules/imurmurhash": { 719 + "version": "0.1.4", 720 + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 721 + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 722 + "dev": true, 723 + "license": "MIT", 724 + "engines": { 725 + "node": ">=0.8.19" 726 + } 727 + }, 728 + "node_modules/is-extglob": { 729 + "version": "2.1.1", 730 + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 731 + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 732 + "dev": true, 733 + "license": "MIT", 734 + "engines": { 735 + "node": ">=0.10.0" 736 + } 737 + }, 738 + "node_modules/is-glob": { 739 + "version": "4.0.3", 740 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 741 + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 742 + "dev": true, 743 + "license": "MIT", 744 + "dependencies": { 745 + "is-extglob": "^2.1.1" 746 + }, 747 + "engines": { 748 + "node": ">=0.10.0" 749 + } 750 + }, 751 + "node_modules/isexe": { 752 + "version": "2.0.0", 753 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 754 + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 755 + "dev": true, 756 + "license": "ISC" 757 + }, 758 + "node_modules/js-yaml": { 759 + "version": "4.1.1", 760 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", 761 + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", 762 + "dev": true, 763 + "license": "MIT", 764 + "dependencies": { 765 + "argparse": "^2.0.1" 766 + }, 767 + "bin": { 768 + "js-yaml": "bin/js-yaml.js" 769 + } 770 + }, 771 + "node_modules/json-buffer": { 772 + "version": "3.0.1", 773 + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 774 + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 775 + "dev": true, 776 + "license": "MIT" 777 + }, 778 + "node_modules/json-schema-traverse": { 779 + "version": "0.4.1", 780 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 781 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 782 + "dev": true, 783 + "license": "MIT" 784 + }, 785 + "node_modules/json-stable-stringify-without-jsonify": { 786 + "version": "1.0.1", 787 + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 788 + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 789 + "dev": true, 790 + "license": "MIT" 791 + }, 792 + "node_modules/keyv": { 793 + "version": "4.5.4", 794 + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 795 + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 796 + "dev": true, 797 + "license": "MIT", 798 + "dependencies": { 799 + "json-buffer": "3.0.1" 800 + } 801 + }, 802 + "node_modules/levn": { 803 + "version": "0.4.1", 804 + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 805 + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 806 + "dev": true, 807 + "license": "MIT", 808 + "dependencies": { 809 + "prelude-ls": "^1.2.1", 810 + "type-check": "~0.4.0" 811 + }, 812 + "engines": { 813 + "node": ">= 0.8.0" 814 + } 815 + }, 816 + "node_modules/locate-path": { 817 + "version": "6.0.0", 818 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 819 + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 820 + "dev": true, 821 + "license": "MIT", 822 + "dependencies": { 823 + "p-locate": "^5.0.0" 824 + }, 825 + "engines": { 826 + "node": ">=10" 827 + }, 828 + "funding": { 829 + "url": "https://github.com/sponsors/sindresorhus" 830 + } 831 + }, 832 + "node_modules/lodash.merge": { 833 + "version": "4.6.2", 834 + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 835 + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 836 + "dev": true, 837 + "license": "MIT" 838 + }, 839 + "node_modules/minimatch": { 840 + "version": "3.1.2", 841 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 842 + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 843 + "dev": true, 844 + "license": "ISC", 845 + "dependencies": { 846 + "brace-expansion": "^1.1.7" 847 + }, 848 + "engines": { 849 + "node": "*" 850 + } 851 + }, 852 + "node_modules/ms": { 853 + "version": "2.1.3", 854 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 855 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 856 + "dev": true, 857 + "license": "MIT" 858 + }, 859 + "node_modules/natural-compare": { 860 + "version": "1.4.0", 861 + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 862 + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 863 + "dev": true, 864 + "license": "MIT" 865 + }, 866 + "node_modules/optionator": { 867 + "version": "0.9.4", 868 + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 869 + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 870 + "dev": true, 871 + "license": "MIT", 872 + "dependencies": { 873 + "deep-is": "^0.1.3", 874 + "fast-levenshtein": "^2.0.6", 875 + "levn": "^0.4.1", 876 + "prelude-ls": "^1.2.1", 877 + "type-check": "^0.4.0", 878 + "word-wrap": "^1.2.5" 879 + }, 880 + "engines": { 881 + "node": ">= 0.8.0" 882 + } 883 + }, 884 + "node_modules/p-limit": { 885 + "version": "3.1.0", 886 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 887 + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 888 + "dev": true, 889 + "license": "MIT", 890 + "dependencies": { 891 + "yocto-queue": "^0.1.0" 892 + }, 893 + "engines": { 894 + "node": ">=10" 895 + }, 896 + "funding": { 897 + "url": "https://github.com/sponsors/sindresorhus" 898 + } 899 + }, 900 + "node_modules/p-locate": { 901 + "version": "5.0.0", 902 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 903 + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 904 + "dev": true, 905 + "license": "MIT", 906 + "dependencies": { 907 + "p-limit": "^3.0.2" 908 + }, 909 + "engines": { 910 + "node": ">=10" 911 + }, 912 + "funding": { 913 + "url": "https://github.com/sponsors/sindresorhus" 914 + } 915 + }, 916 + "node_modules/parent-module": { 917 + "version": "1.0.1", 918 + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 919 + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 920 + "dev": true, 921 + "license": "MIT", 922 + "dependencies": { 923 + "callsites": "^3.0.0" 924 + }, 925 + "engines": { 926 + "node": ">=6" 927 + } 928 + }, 929 + "node_modules/path-exists": { 930 + "version": "4.0.0", 931 + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 932 + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 933 + "dev": true, 934 + "license": "MIT", 935 + "engines": { 936 + "node": ">=8" 937 + } 938 + }, 939 + "node_modules/path-key": { 940 + "version": "3.1.1", 941 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 942 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 943 + "dev": true, 944 + "license": "MIT", 945 + "engines": { 946 + "node": ">=8" 947 + } 948 + }, 949 + "node_modules/prelude-ls": { 950 + "version": "1.2.1", 951 + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 952 + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 953 + "dev": true, 954 + "license": "MIT", 955 + "engines": { 956 + "node": ">= 0.8.0" 957 + } 958 + }, 959 + "node_modules/punycode": { 960 + "version": "2.3.1", 961 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 962 + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 963 + "dev": true, 964 + "license": "MIT", 965 + "engines": { 966 + "node": ">=6" 967 + } 968 + }, 969 + "node_modules/resolve-from": { 970 + "version": "4.0.0", 971 + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 972 + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 973 + "dev": true, 974 + "license": "MIT", 975 + "engines": { 976 + "node": ">=4" 977 + } 978 + }, 979 + "node_modules/shebang-command": { 980 + "version": "2.0.0", 981 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 982 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 983 + "dev": true, 984 + "license": "MIT", 985 + "dependencies": { 986 + "shebang-regex": "^3.0.0" 987 + }, 988 + "engines": { 989 + "node": ">=8" 990 + } 991 + }, 992 + "node_modules/shebang-regex": { 993 + "version": "3.0.0", 994 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 995 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 996 + "dev": true, 997 + "license": "MIT", 998 + "engines": { 999 + "node": ">=8" 1000 + } 1001 + }, 1002 + "node_modules/strip-json-comments": { 1003 + "version": "3.1.1", 1004 + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1005 + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1006 + "dev": true, 1007 + "license": "MIT", 1008 + "engines": { 1009 + "node": ">=8" 1010 + }, 1011 + "funding": { 1012 + "url": "https://github.com/sponsors/sindresorhus" 1013 + } 1014 + }, 1015 + "node_modules/supports-color": { 1016 + "version": "7.2.0", 1017 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1018 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1019 + "dev": true, 1020 + "license": "MIT", 1021 + "dependencies": { 1022 + "has-flag": "^4.0.0" 1023 + }, 1024 + "engines": { 1025 + "node": ">=8" 1026 + } 1027 + }, 1028 + "node_modules/type-check": { 1029 + "version": "0.4.0", 1030 + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1031 + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1032 + "dev": true, 1033 + "license": "MIT", 1034 + "dependencies": { 1035 + "prelude-ls": "^1.2.1" 1036 + }, 1037 + "engines": { 1038 + "node": ">= 0.8.0" 1039 + } 1040 + }, 1041 + "node_modules/uri-js": { 1042 + "version": "4.4.1", 1043 + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1044 + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1045 + "dev": true, 1046 + "license": "BSD-2-Clause", 1047 + "dependencies": { 1048 + "punycode": "^2.1.0" 1049 + } 1050 + }, 1051 + "node_modules/which": { 1052 + "version": "2.0.2", 1053 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1054 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1055 + "dev": true, 1056 + "license": "ISC", 1057 + "dependencies": { 1058 + "isexe": "^2.0.0" 1059 + }, 1060 + "bin": { 1061 + "node-which": "bin/node-which" 1062 + }, 1063 + "engines": { 1064 + "node": ">= 8" 1065 + } 1066 + }, 1067 + "node_modules/word-wrap": { 1068 + "version": "1.2.5", 1069 + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 1070 + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 1071 + "dev": true, 1072 + "license": "MIT", 1073 + "engines": { 1074 + "node": ">=0.10.0" 1075 + } 1076 + }, 1077 + "node_modules/yocto-queue": { 1078 + "version": "0.1.0", 1079 + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1080 + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1081 + "dev": true, 1082 + "license": "MIT", 1083 + "engines": { 1084 + "node": ">=10" 1085 + }, 1086 + "funding": { 1087 + "url": "https://github.com/sponsors/sindresorhus" 1088 + } 1089 + } 1090 + } 1091 + }
+14
extension/package.json
··· 1 + { 2 + "name": "margin-extension", 3 + "version": "0.1.0", 4 + "private": true, 5 + "type": "module", 6 + "scripts": { 7 + "lint": "eslint ." 8 + }, 9 + "devDependencies": { 10 + "@eslint/js": "^9.39.2", 11 + "eslint": "^9.39.2", 12 + "globals": "^17.0.0" 13 + } 14 + }
+62
extension/popup/popup.css
··· 648 648 gap: 8px; 649 649 margin-left: auto; 650 650 } 651 + 652 + .toggle-switch { 653 + position: relative; 654 + display: inline-block; 655 + width: 44px; 656 + height: 24px; 657 + flex-shrink: 0; 658 + } 659 + 660 + .toggle-switch input { 661 + opacity: 0; 662 + width: 0; 663 + height: 0; 664 + } 665 + 666 + .toggle-slider { 667 + position: absolute; 668 + cursor: pointer; 669 + top: 0; 670 + left: 0; 671 + right: 0; 672 + bottom: 0; 673 + background-color: var(--border); 674 + transition: 0.2s; 675 + border-radius: 24px; 676 + } 677 + 678 + .toggle-slider:before { 679 + position: absolute; 680 + content: ""; 681 + height: 18px; 682 + width: 18px; 683 + left: 3px; 684 + bottom: 3px; 685 + background-color: var(--text-secondary); 686 + transition: 0.2s; 687 + border-radius: 50%; 688 + } 689 + 690 + .toggle-switch input:checked + .toggle-slider { 691 + background-color: var(--accent); 692 + } 693 + 694 + .toggle-switch input:checked + .toggle-slider:before { 695 + transform: translateX(20px); 696 + background-color: white; 697 + } 698 + 699 + .settings-input { 700 + width: 100%; 701 + padding: 10px 12px; 702 + background: var(--bg-tertiary); 703 + border: 1px solid var(--border); 704 + border-radius: var(--radius-md); 705 + color: var(--text-primary); 706 + font-size: 13px; 707 + } 708 + 709 + .settings-input:focus { 710 + outline: none; 711 + border-color: var(--accent); 712 + }
+20
extension/popup/popup.html
··· 218 218 <button id="close-settings" class="btn-icon">×</button> 219 219 </div> 220 220 <div class="setting-item"> 221 + <div 222 + style=" 223 + display: flex; 224 + justify-content: space-between; 225 + align-items: center; 226 + " 227 + > 228 + <div> 229 + <label>Show page overlays</label> 230 + <p class="setting-help" style="margin-top: 2px"> 231 + Highlights, badges, and tooltips on pages 232 + </p> 233 + </div> 234 + <label class="toggle-switch"> 235 + <input type="checkbox" id="overlay-toggle" checked /> 236 + <span class="toggle-slider"></span> 237 + </label> 238 + </div> 239 + </div> 240 + <div class="setting-item"> 221 241 <label for="api-url">API URL (for self-hosting)</label> 222 242 <input 223 243 type="url"
+33 -17
extension/popup/popup.js
··· 39 39 collectionList: document.getElementById("collection-list"), 40 40 collectionLoading: document.getElementById("collection-loading"), 41 41 collectionsEmpty: document.getElementById("collections-empty"), 42 + overlayToggle: document.getElementById("overlay-toggle"), 42 43 }; 43 44 44 45 let currentTab = null; 45 46 let apiUrl = "https://margin.at"; 46 47 let currentUserDid = null; 47 48 let pendingSelector = null; 48 - let activeAnnotationUriForCollection = null; 49 + // let _activeAnnotationUriForCollection = null; 49 50 50 - const storage = await browserAPI.storage.local.get(["apiUrl"]); 51 + const storage = await browserAPI.storage.local.get(["apiUrl", "showOverlay"]); 51 52 if (storage.apiUrl) { 52 53 apiUrl = storage.apiUrl; 53 54 } 54 55 els.apiUrlInput.value = apiUrl; 56 + 57 + if (els.overlayToggle) { 58 + els.overlayToggle.checked = storage.showOverlay !== false; 59 + } 55 60 56 61 try { 57 62 const [tab] = await browserAPI.tabs.query({ ··· 74 79 pendingData = sessionData.pendingAnnotation; 75 80 await browserAPI.storage.session.remove(["pendingAnnotation"]); 76 81 } 77 - } catch (e) {} 82 + } catch { 83 + /* ignore */ 84 + } 78 85 } 79 86 80 87 if (!pendingData) { ··· 209 216 210 217 els.saveSettings?.addEventListener("click", async () => { 211 218 const newUrl = els.apiUrlInput.value.replace(/\/$/, ""); 219 + const showOverlay = els.overlayToggle?.checked ?? true; 220 + 221 + await browserAPI.storage.local.set({ apiUrl: newUrl, showOverlay }); 212 222 if (newUrl) { 213 - await browserAPI.storage.local.set({ apiUrl: newUrl }); 214 223 apiUrl = newUrl; 215 - await sendMessage({ type: "UPDATE_SETTINGS" }); 216 - views.settings.style.display = "none"; 217 - checkSession(); 218 224 } 225 + await sendMessage({ type: "UPDATE_SETTINGS" }); 226 + 227 + const tabs = await browserAPI.tabs.query({}); 228 + for (const tab of tabs) { 229 + if (tab.id) { 230 + try { 231 + await browserAPI.tabs.sendMessage(tab.id, { 232 + type: "UPDATE_OVERLAY_VISIBILITY", 233 + show: showOverlay, 234 + }); 235 + } catch { 236 + /* ignore */ 237 + } 238 + } 239 + } 240 + 241 + views.settings.style.display = "none"; 242 + checkSession(); 219 243 }); 220 244 221 245 els.closeCollectionSelector?.addEventListener("click", () => { 222 246 views.collectionSelector.style.display = "none"; 223 - activeAnnotationUriForCollection = null; 224 247 }); 225 248 226 249 async function openCollectionSelector(annotationUri) { ··· 228 251 console.error("No currentUserDid, returning early"); 229 252 return; 230 253 } 231 - activeAnnotationUriForCollection = annotationUri; 232 254 views.collectionSelector.style.display = "flex"; 233 255 els.collectionList.innerHTML = ""; 234 256 els.collectionLoading.style.display = "block"; ··· 507 529 const actions = document.createElement("div"); 508 530 actions.className = "annotation-item-actions"; 509 531 510 - if ( 511 - item.author?.did === currentUserDid || 512 - item.creator?.did === currentUserDid 513 - ) { 532 + if (currentUserDid) { 514 533 const folderBtn = document.createElement("button"); 515 534 folderBtn.className = "btn-icon"; 516 535 folderBtn.innerHTML = ··· 580 599 581 600 row.appendChild(content); 582 601 583 - if ( 584 - item.author?.did === currentUserDid || 585 - item.creator?.did === currentUserDid 586 - ) { 602 + if (currentUserDid) { 587 603 const folderBtn = document.createElement("button"); 588 604 folderBtn.className = "btn-icon"; 589 605 folderBtn.innerHTML =
+47
extension/sidepanel/sidepanel.css
··· 882 882 gap: 8px; 883 883 margin-left: auto; 884 884 } 885 + 886 + .toggle-switch { 887 + position: relative; 888 + display: inline-block; 889 + width: 44px; 890 + height: 24px; 891 + flex-shrink: 0; 892 + } 893 + 894 + .toggle-switch input { 895 + opacity: 0; 896 + width: 0; 897 + height: 0; 898 + } 899 + 900 + .toggle-slider { 901 + position: absolute; 902 + cursor: pointer; 903 + top: 0; 904 + left: 0; 905 + right: 0; 906 + bottom: 0; 907 + background-color: var(--border); 908 + transition: 0.2s; 909 + border-radius: 24px; 910 + } 911 + 912 + .toggle-slider:before { 913 + position: absolute; 914 + content: ""; 915 + height: 18px; 916 + width: 18px; 917 + left: 3px; 918 + bottom: 3px; 919 + background-color: var(--text-secondary); 920 + transition: 0.2s; 921 + border-radius: 50%; 922 + } 923 + 924 + .toggle-switch input:checked + .toggle-slider { 925 + background-color: var(--accent); 926 + } 927 + 928 + .toggle-switch input:checked + .toggle-slider:before { 929 + transform: translateX(20px); 930 + background-color: white; 931 + }
+20
extension/sidepanel/sidepanel.html
··· 250 250 <button id="close-settings" class="btn-icon">×</button> 251 251 </div> 252 252 <div class="setting-item"> 253 + <div 254 + style=" 255 + display: flex; 256 + justify-content: space-between; 257 + align-items: center; 258 + " 259 + > 260 + <div> 261 + <label>Show page overlays</label> 262 + <p class="setting-help" style="margin-top: 2px"> 263 + Display highlights, badges, and tooltips on pages 264 + </p> 265 + </div> 266 + <label class="toggle-switch"> 267 + <input type="checkbox" id="overlay-toggle" checked /> 268 + <span class="toggle-slider"></span> 269 + </label> 270 + </div> 271 + </div> 272 + <div class="setting-item"> 253 273 <label for="api-url">API URL</label> 254 274 <input 255 275 type="url"
+36 -21
extension/sidepanel/sidepanel.js
··· 37 37 collectionList: document.getElementById("collection-list"), 38 38 collectionLoading: document.getElementById("collection-loading"), 39 39 collectionsEmpty: document.getElementById("collections-empty"), 40 + overlayToggle: document.getElementById("overlay-toggle"), 40 41 }; 41 42 42 43 let currentTab = null; 43 44 let apiUrl = ""; 44 45 let currentUserDid = null; 45 46 let pendingSelector = null; 46 - let activeAnnotationUriForCollection = null; 47 47 48 48 const storage = await chrome.storage.local.get(["apiUrl"]); 49 49 if (storage.apiUrl) { ··· 51 51 } 52 52 53 53 els.apiUrlInput.value = apiUrl; 54 + 55 + const overlayStorage = await chrome.storage.local.get(["showOverlay"]); 56 + if (els.overlayToggle) { 57 + els.overlayToggle.checked = overlayStorage.showOverlay !== false; 58 + } 54 59 55 60 chrome.storage.onChanged.addListener((changes, area) => { 56 61 if (area === "local" && changes.apiUrl) { ··· 253 258 254 259 els.closeCollectionSelector?.addEventListener("click", () => { 255 260 views.collectionSelector.style.display = "none"; 256 - activeAnnotationUriForCollection = null; 257 261 }); 258 262 259 263 els.saveSettings?.addEventListener("click", async () => { 260 264 const newUrl = els.apiUrlInput.value.replace(/\/$/, ""); 265 + const showOverlay = els.overlayToggle?.checked ?? true; 266 + 267 + await chrome.storage.local.set({ apiUrl: newUrl, showOverlay }); 261 268 if (newUrl) { 262 - await chrome.storage.local.set({ apiUrl: newUrl }); 263 269 apiUrl = newUrl; 264 - await sendMessage({ type: "UPDATE_SETTINGS" }); 265 - views.settings.style.display = "none"; 266 - checkSession(); 270 + } 271 + await sendMessage({ type: "UPDATE_SETTINGS" }); 272 + 273 + const tabs = await chrome.tabs.query({}); 274 + for (const tab of tabs) { 275 + if (tab.id) { 276 + try { 277 + await chrome.tabs.sendMessage(tab.id, { 278 + type: "UPDATE_OVERLAY_VISIBILITY", 279 + show: showOverlay, 280 + }); 281 + } catch { 282 + /* ignore */ 283 + } 284 + } 267 285 } 286 + 287 + views.settings.style.display = "none"; 288 + checkSession(); 268 289 }); 269 290 270 291 els.signOutBtn?.addEventListener("click", async () => { ··· 367 388 console.error("No currentUserDid, returning early"); 368 389 return; 369 390 } 370 - activeAnnotationUriForCollection = annotationUri; 371 391 views.collectionSelector.style.display = "flex"; 372 392 els.collectionList.innerHTML = ""; 373 393 els.collectionLoading.style.display = "block"; ··· 561 581 header.appendChild(badge); 562 582 } 563 583 564 - if ( 565 - item.author?.did === currentUserDid || 566 - item.creator?.did === currentUserDid 567 - ) { 584 + if (currentUserDid) { 568 585 const actions = document.createElement("div"); 569 586 actions.className = "annotation-item-actions"; 570 587 ··· 635 652 let hostname = item.source; 636 653 try { 637 654 hostname = new URL(item.source).hostname; 638 - } catch {} 655 + } catch { 656 + /* ignore */ 657 + } 639 658 640 659 const row = document.createElement("div"); 641 660 row.style.display = "flex"; ··· 658 677 659 678 row.appendChild(content); 660 679 661 - if ( 662 - item.author?.did === currentUserDid || 663 - item.creator?.did === currentUserDid 664 - ) { 680 + if (currentUserDid) { 665 681 const folderBtn = document.createElement("button"); 666 682 folderBtn.className = "btn-icon"; 667 683 folderBtn.innerHTML = ··· 701 717 let hostname = url; 702 718 try { 703 719 hostname = new URL(url).hostname; 704 - } catch {} 720 + } catch { 721 + /* ignore */ 722 + } 705 723 706 724 const header = document.createElement("div"); 707 725 header.className = "annotation-item-header"; ··· 721 739 722 740 header.appendChild(meta); 723 741 724 - if ( 725 - item.author?.did === currentUserDid || 726 - item.creator?.did === currentUserDid 727 - ) { 742 + if (currentUserDid) { 728 743 const actions = document.createElement("div"); 729 744 actions.className = "annotation-item-actions"; 730 745
+40
web/eslint.config.js
··· 1 + import js from "@eslint/js"; 2 + import globals from "globals"; 3 + import react from "eslint-plugin-react"; 4 + import reactHooks from "eslint-plugin-react-hooks"; 5 + import reactRefresh from "eslint-plugin-react-refresh"; 6 + 7 + export default [ 8 + { ignores: ["dist"] }, 9 + { 10 + files: ["**/*.{js,jsx}"], 11 + languageOptions: { 12 + ecmaVersion: 2020, 13 + globals: globals.browser, 14 + parserOptions: { 15 + ecmaVersion: "latest", 16 + ecmaFeatures: { jsx: true }, 17 + sourceType: "module", 18 + }, 19 + }, 20 + settings: { react: { version: "18.3" } }, 21 + plugins: { 22 + react, 23 + "react-hooks": reactHooks, 24 + "react-refresh": reactRefresh, 25 + }, 26 + rules: { 27 + ...js.configs.recommended.rules, 28 + ...react.configs.recommended.rules, 29 + ...react.configs["jsx-runtime"].rules, 30 + ...reactHooks.configs.recommended.rules, 31 + "react/jsx-no-target-blank": "off", 32 + "react-refresh/only-export-components": [ 33 + "warn", 34 + { allowConstantExport: true }, 35 + ], 36 + "no-unused-vars": ["warn", { argsIgnorePattern: "^_" }], 37 + "react/prop-types": "off", 38 + }, 39 + }, 40 + ];
+3051 -12
web/package-lock.json
··· 15 15 "react-router-dom": "^6.28.0" 16 16 }, 17 17 "devDependencies": { 18 + "@eslint/js": "^9.39.2", 18 19 "@types/react": "^18.3.12", 19 20 "@types/react-dom": "^18.3.1", 20 21 "@vitejs/plugin-react": "^4.3.3", 22 + "eslint": "^9.39.2", 23 + "eslint-plugin-react": "^7.37.5", 24 + "eslint-plugin-react-hooks": "^7.0.1", 25 + "eslint-plugin-react-refresh": "^0.4.26", 26 + "globals": "^17.0.0", 21 27 "vite": "^6.0.3" 22 28 } 23 29 }, ··· 746 752 "node": ">=18" 747 753 } 748 754 }, 755 + "node_modules/@eslint-community/eslint-utils": { 756 + "version": "4.9.1", 757 + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", 758 + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", 759 + "dev": true, 760 + "license": "MIT", 761 + "dependencies": { 762 + "eslint-visitor-keys": "^3.4.3" 763 + }, 764 + "engines": { 765 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 766 + }, 767 + "funding": { 768 + "url": "https://opencollective.com/eslint" 769 + }, 770 + "peerDependencies": { 771 + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 772 + } 773 + }, 774 + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 775 + "version": "3.4.3", 776 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 777 + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 778 + "dev": true, 779 + "license": "Apache-2.0", 780 + "engines": { 781 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 782 + }, 783 + "funding": { 784 + "url": "https://opencollective.com/eslint" 785 + } 786 + }, 787 + "node_modules/@eslint-community/regexpp": { 788 + "version": "4.12.2", 789 + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", 790 + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", 791 + "dev": true, 792 + "license": "MIT", 793 + "engines": { 794 + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 795 + } 796 + }, 797 + "node_modules/@eslint/config-array": { 798 + "version": "0.21.1", 799 + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", 800 + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", 801 + "dev": true, 802 + "license": "Apache-2.0", 803 + "dependencies": { 804 + "@eslint/object-schema": "^2.1.7", 805 + "debug": "^4.3.1", 806 + "minimatch": "^3.1.2" 807 + }, 808 + "engines": { 809 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 810 + } 811 + }, 812 + "node_modules/@eslint/config-helpers": { 813 + "version": "0.4.2", 814 + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", 815 + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", 816 + "dev": true, 817 + "license": "Apache-2.0", 818 + "dependencies": { 819 + "@eslint/core": "^0.17.0" 820 + }, 821 + "engines": { 822 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 823 + } 824 + }, 825 + "node_modules/@eslint/core": { 826 + "version": "0.17.0", 827 + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", 828 + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", 829 + "dev": true, 830 + "license": "Apache-2.0", 831 + "dependencies": { 832 + "@types/json-schema": "^7.0.15" 833 + }, 834 + "engines": { 835 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 836 + } 837 + }, 838 + "node_modules/@eslint/eslintrc": { 839 + "version": "3.3.3", 840 + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", 841 + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", 842 + "dev": true, 843 + "license": "MIT", 844 + "dependencies": { 845 + "ajv": "^6.12.4", 846 + "debug": "^4.3.2", 847 + "espree": "^10.0.1", 848 + "globals": "^14.0.0", 849 + "ignore": "^5.2.0", 850 + "import-fresh": "^3.2.1", 851 + "js-yaml": "^4.1.1", 852 + "minimatch": "^3.1.2", 853 + "strip-json-comments": "^3.1.1" 854 + }, 855 + "engines": { 856 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 857 + }, 858 + "funding": { 859 + "url": "https://opencollective.com/eslint" 860 + } 861 + }, 862 + "node_modules/@eslint/eslintrc/node_modules/globals": { 863 + "version": "14.0.0", 864 + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", 865 + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 866 + "dev": true, 867 + "license": "MIT", 868 + "engines": { 869 + "node": ">=18" 870 + }, 871 + "funding": { 872 + "url": "https://github.com/sponsors/sindresorhus" 873 + } 874 + }, 875 + "node_modules/@eslint/js": { 876 + "version": "9.39.2", 877 + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", 878 + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", 879 + "dev": true, 880 + "license": "MIT", 881 + "engines": { 882 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 883 + }, 884 + "funding": { 885 + "url": "https://eslint.org/donate" 886 + } 887 + }, 888 + "node_modules/@eslint/object-schema": { 889 + "version": "2.1.7", 890 + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", 891 + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", 892 + "dev": true, 893 + "license": "Apache-2.0", 894 + "engines": { 895 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 896 + } 897 + }, 898 + "node_modules/@eslint/plugin-kit": { 899 + "version": "0.4.1", 900 + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", 901 + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", 902 + "dev": true, 903 + "license": "Apache-2.0", 904 + "dependencies": { 905 + "@eslint/core": "^0.17.0", 906 + "levn": "^0.4.1" 907 + }, 908 + "engines": { 909 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 910 + } 911 + }, 912 + "node_modules/@humanfs/core": { 913 + "version": "0.19.1", 914 + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", 915 + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", 916 + "dev": true, 917 + "license": "Apache-2.0", 918 + "engines": { 919 + "node": ">=18.18.0" 920 + } 921 + }, 922 + "node_modules/@humanfs/node": { 923 + "version": "0.16.7", 924 + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", 925 + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", 926 + "dev": true, 927 + "license": "Apache-2.0", 928 + "dependencies": { 929 + "@humanfs/core": "^0.19.1", 930 + "@humanwhocodes/retry": "^0.4.0" 931 + }, 932 + "engines": { 933 + "node": ">=18.18.0" 934 + } 935 + }, 936 + "node_modules/@humanwhocodes/module-importer": { 937 + "version": "1.0.1", 938 + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 939 + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 940 + "dev": true, 941 + "license": "Apache-2.0", 942 + "engines": { 943 + "node": ">=12.22" 944 + }, 945 + "funding": { 946 + "type": "github", 947 + "url": "https://github.com/sponsors/nzakas" 948 + } 949 + }, 950 + "node_modules/@humanwhocodes/retry": { 951 + "version": "0.4.3", 952 + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", 953 + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", 954 + "dev": true, 955 + "license": "Apache-2.0", 956 + "engines": { 957 + "node": ">=18.18" 958 + }, 959 + "funding": { 960 + "type": "github", 961 + "url": "https://github.com/sponsors/nzakas" 962 + } 963 + }, 749 964 "node_modules/@jridgewell/gen-mapping": { 750 965 "version": "0.3.13", 751 966 "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", ··· 797 1012 } 798 1013 }, 799 1014 "node_modules/@remix-run/router": { 800 - "version": "1.23.1", 801 - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.1.tgz", 802 - "integrity": "sha512-vDbaOzF7yT2Qs4vO6XV1MHcJv+3dgR1sT+l3B8xxOVhUC336prMvqrvsLL/9Dnw2xr6Qhz4J0dmS0llNAbnUmQ==", 1015 + "version": "1.23.2", 1016 + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", 1017 + "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", 803 1018 "license": "MIT", 804 1019 "engines": { 805 1020 "node": ">=14.0.0" ··· 1172 1387 "dev": true, 1173 1388 "license": "MIT" 1174 1389 }, 1390 + "node_modules/@types/json-schema": { 1391 + "version": "7.0.15", 1392 + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 1393 + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 1394 + "dev": true, 1395 + "license": "MIT" 1396 + }, 1175 1397 "node_modules/@types/prop-types": { 1176 1398 "version": "15.7.15", 1177 1399 "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", ··· 1222 1444 "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" 1223 1445 } 1224 1446 }, 1447 + "node_modules/acorn": { 1448 + "version": "8.15.0", 1449 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", 1450 + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", 1451 + "dev": true, 1452 + "license": "MIT", 1453 + "peer": true, 1454 + "bin": { 1455 + "acorn": "bin/acorn" 1456 + }, 1457 + "engines": { 1458 + "node": ">=0.4.0" 1459 + } 1460 + }, 1461 + "node_modules/acorn-jsx": { 1462 + "version": "5.3.2", 1463 + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 1464 + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 1465 + "dev": true, 1466 + "license": "MIT", 1467 + "peerDependencies": { 1468 + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 1469 + } 1470 + }, 1471 + "node_modules/ajv": { 1472 + "version": "6.12.6", 1473 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1474 + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1475 + "dev": true, 1476 + "license": "MIT", 1477 + "dependencies": { 1478 + "fast-deep-equal": "^3.1.1", 1479 + "fast-json-stable-stringify": "^2.0.0", 1480 + "json-schema-traverse": "^0.4.1", 1481 + "uri-js": "^4.2.2" 1482 + }, 1483 + "funding": { 1484 + "type": "github", 1485 + "url": "https://github.com/sponsors/epoberezkin" 1486 + } 1487 + }, 1488 + "node_modules/ansi-styles": { 1489 + "version": "4.3.0", 1490 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1491 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1492 + "dev": true, 1493 + "license": "MIT", 1494 + "dependencies": { 1495 + "color-convert": "^2.0.1" 1496 + }, 1497 + "engines": { 1498 + "node": ">=8" 1499 + }, 1500 + "funding": { 1501 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1502 + } 1503 + }, 1504 + "node_modules/argparse": { 1505 + "version": "2.0.1", 1506 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1507 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1508 + "dev": true, 1509 + "license": "Python-2.0" 1510 + }, 1511 + "node_modules/array-buffer-byte-length": { 1512 + "version": "1.0.2", 1513 + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", 1514 + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", 1515 + "dev": true, 1516 + "license": "MIT", 1517 + "dependencies": { 1518 + "call-bound": "^1.0.3", 1519 + "is-array-buffer": "^3.0.5" 1520 + }, 1521 + "engines": { 1522 + "node": ">= 0.4" 1523 + }, 1524 + "funding": { 1525 + "url": "https://github.com/sponsors/ljharb" 1526 + } 1527 + }, 1528 + "node_modules/array-includes": { 1529 + "version": "3.1.9", 1530 + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", 1531 + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", 1532 + "dev": true, 1533 + "license": "MIT", 1534 + "dependencies": { 1535 + "call-bind": "^1.0.8", 1536 + "call-bound": "^1.0.4", 1537 + "define-properties": "^1.2.1", 1538 + "es-abstract": "^1.24.0", 1539 + "es-object-atoms": "^1.1.1", 1540 + "get-intrinsic": "^1.3.0", 1541 + "is-string": "^1.1.1", 1542 + "math-intrinsics": "^1.1.0" 1543 + }, 1544 + "engines": { 1545 + "node": ">= 0.4" 1546 + }, 1547 + "funding": { 1548 + "url": "https://github.com/sponsors/ljharb" 1549 + } 1550 + }, 1551 + "node_modules/array.prototype.findlast": { 1552 + "version": "1.2.5", 1553 + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", 1554 + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", 1555 + "dev": true, 1556 + "license": "MIT", 1557 + "dependencies": { 1558 + "call-bind": "^1.0.7", 1559 + "define-properties": "^1.2.1", 1560 + "es-abstract": "^1.23.2", 1561 + "es-errors": "^1.3.0", 1562 + "es-object-atoms": "^1.0.0", 1563 + "es-shim-unscopables": "^1.0.2" 1564 + }, 1565 + "engines": { 1566 + "node": ">= 0.4" 1567 + }, 1568 + "funding": { 1569 + "url": "https://github.com/sponsors/ljharb" 1570 + } 1571 + }, 1572 + "node_modules/array.prototype.flat": { 1573 + "version": "1.3.3", 1574 + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", 1575 + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", 1576 + "dev": true, 1577 + "license": "MIT", 1578 + "dependencies": { 1579 + "call-bind": "^1.0.8", 1580 + "define-properties": "^1.2.1", 1581 + "es-abstract": "^1.23.5", 1582 + "es-shim-unscopables": "^1.0.2" 1583 + }, 1584 + "engines": { 1585 + "node": ">= 0.4" 1586 + }, 1587 + "funding": { 1588 + "url": "https://github.com/sponsors/ljharb" 1589 + } 1590 + }, 1591 + "node_modules/array.prototype.flatmap": { 1592 + "version": "1.3.3", 1593 + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", 1594 + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", 1595 + "dev": true, 1596 + "license": "MIT", 1597 + "dependencies": { 1598 + "call-bind": "^1.0.8", 1599 + "define-properties": "^1.2.1", 1600 + "es-abstract": "^1.23.5", 1601 + "es-shim-unscopables": "^1.0.2" 1602 + }, 1603 + "engines": { 1604 + "node": ">= 0.4" 1605 + }, 1606 + "funding": { 1607 + "url": "https://github.com/sponsors/ljharb" 1608 + } 1609 + }, 1610 + "node_modules/array.prototype.tosorted": { 1611 + "version": "1.1.4", 1612 + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", 1613 + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", 1614 + "dev": true, 1615 + "license": "MIT", 1616 + "dependencies": { 1617 + "call-bind": "^1.0.7", 1618 + "define-properties": "^1.2.1", 1619 + "es-abstract": "^1.23.3", 1620 + "es-errors": "^1.3.0", 1621 + "es-shim-unscopables": "^1.0.2" 1622 + }, 1623 + "engines": { 1624 + "node": ">= 0.4" 1625 + } 1626 + }, 1627 + "node_modules/arraybuffer.prototype.slice": { 1628 + "version": "1.0.4", 1629 + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", 1630 + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", 1631 + "dev": true, 1632 + "license": "MIT", 1633 + "dependencies": { 1634 + "array-buffer-byte-length": "^1.0.1", 1635 + "call-bind": "^1.0.8", 1636 + "define-properties": "^1.2.1", 1637 + "es-abstract": "^1.23.5", 1638 + "es-errors": "^1.3.0", 1639 + "get-intrinsic": "^1.2.6", 1640 + "is-array-buffer": "^3.0.4" 1641 + }, 1642 + "engines": { 1643 + "node": ">= 0.4" 1644 + }, 1645 + "funding": { 1646 + "url": "https://github.com/sponsors/ljharb" 1647 + } 1648 + }, 1649 + "node_modules/async-function": { 1650 + "version": "1.0.0", 1651 + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", 1652 + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", 1653 + "dev": true, 1654 + "license": "MIT", 1655 + "engines": { 1656 + "node": ">= 0.4" 1657 + } 1658 + }, 1659 + "node_modules/available-typed-arrays": { 1660 + "version": "1.0.7", 1661 + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", 1662 + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", 1663 + "dev": true, 1664 + "license": "MIT", 1665 + "dependencies": { 1666 + "possible-typed-array-names": "^1.0.0" 1667 + }, 1668 + "engines": { 1669 + "node": ">= 0.4" 1670 + }, 1671 + "funding": { 1672 + "url": "https://github.com/sponsors/ljharb" 1673 + } 1674 + }, 1675 + "node_modules/balanced-match": { 1676 + "version": "1.0.2", 1677 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1678 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1679 + "dev": true, 1680 + "license": "MIT" 1681 + }, 1225 1682 "node_modules/baseline-browser-mapping": { 1226 1683 "version": "2.9.11", 1227 1684 "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", ··· 1230 1687 "license": "Apache-2.0", 1231 1688 "bin": { 1232 1689 "baseline-browser-mapping": "dist/cli.js" 1690 + } 1691 + }, 1692 + "node_modules/brace-expansion": { 1693 + "version": "1.1.12", 1694 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", 1695 + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", 1696 + "dev": true, 1697 + "license": "MIT", 1698 + "dependencies": { 1699 + "balanced-match": "^1.0.0", 1700 + "concat-map": "0.0.1" 1233 1701 } 1234 1702 }, 1235 1703 "node_modules/browserslist": { ··· 1267 1735 "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1268 1736 } 1269 1737 }, 1738 + "node_modules/call-bind": { 1739 + "version": "1.0.8", 1740 + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", 1741 + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", 1742 + "dev": true, 1743 + "license": "MIT", 1744 + "dependencies": { 1745 + "call-bind-apply-helpers": "^1.0.0", 1746 + "es-define-property": "^1.0.0", 1747 + "get-intrinsic": "^1.2.4", 1748 + "set-function-length": "^1.2.2" 1749 + }, 1750 + "engines": { 1751 + "node": ">= 0.4" 1752 + }, 1753 + "funding": { 1754 + "url": "https://github.com/sponsors/ljharb" 1755 + } 1756 + }, 1757 + "node_modules/call-bind-apply-helpers": { 1758 + "version": "1.0.2", 1759 + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 1760 + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 1761 + "dev": true, 1762 + "license": "MIT", 1763 + "dependencies": { 1764 + "es-errors": "^1.3.0", 1765 + "function-bind": "^1.1.2" 1766 + }, 1767 + "engines": { 1768 + "node": ">= 0.4" 1769 + } 1770 + }, 1771 + "node_modules/call-bound": { 1772 + "version": "1.0.4", 1773 + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", 1774 + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", 1775 + "dev": true, 1776 + "license": "MIT", 1777 + "dependencies": { 1778 + "call-bind-apply-helpers": "^1.0.2", 1779 + "get-intrinsic": "^1.3.0" 1780 + }, 1781 + "engines": { 1782 + "node": ">= 0.4" 1783 + }, 1784 + "funding": { 1785 + "url": "https://github.com/sponsors/ljharb" 1786 + } 1787 + }, 1788 + "node_modules/callsites": { 1789 + "version": "3.1.0", 1790 + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1791 + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1792 + "dev": true, 1793 + "license": "MIT", 1794 + "engines": { 1795 + "node": ">=6" 1796 + } 1797 + }, 1270 1798 "node_modules/caniuse-lite": { 1271 1799 "version": "1.0.30001762", 1272 1800 "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", ··· 1288 1816 ], 1289 1817 "license": "CC-BY-4.0" 1290 1818 }, 1819 + "node_modules/chalk": { 1820 + "version": "4.1.2", 1821 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1822 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1823 + "dev": true, 1824 + "license": "MIT", 1825 + "dependencies": { 1826 + "ansi-styles": "^4.1.0", 1827 + "supports-color": "^7.1.0" 1828 + }, 1829 + "engines": { 1830 + "node": ">=10" 1831 + }, 1832 + "funding": { 1833 + "url": "https://github.com/chalk/chalk?sponsor=1" 1834 + } 1835 + }, 1836 + "node_modules/color-convert": { 1837 + "version": "2.0.1", 1838 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1839 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1840 + "dev": true, 1841 + "license": "MIT", 1842 + "dependencies": { 1843 + "color-name": "~1.1.4" 1844 + }, 1845 + "engines": { 1846 + "node": ">=7.0.0" 1847 + } 1848 + }, 1849 + "node_modules/color-name": { 1850 + "version": "1.1.4", 1851 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1852 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1853 + "dev": true, 1854 + "license": "MIT" 1855 + }, 1856 + "node_modules/concat-map": { 1857 + "version": "0.0.1", 1858 + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1859 + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1860 + "dev": true, 1861 + "license": "MIT" 1862 + }, 1291 1863 "node_modules/convert-source-map": { 1292 1864 "version": "2.0.0", 1293 1865 "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", ··· 1295 1867 "dev": true, 1296 1868 "license": "MIT" 1297 1869 }, 1870 + "node_modules/cross-spawn": { 1871 + "version": "7.0.6", 1872 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 1873 + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1874 + "dev": true, 1875 + "license": "MIT", 1876 + "dependencies": { 1877 + "path-key": "^3.1.0", 1878 + "shebang-command": "^2.0.0", 1879 + "which": "^2.0.1" 1880 + }, 1881 + "engines": { 1882 + "node": ">= 8" 1883 + } 1884 + }, 1298 1885 "node_modules/csstype": { 1299 1886 "version": "3.2.3", 1300 1887 "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", ··· 1302 1889 "dev": true, 1303 1890 "license": "MIT" 1304 1891 }, 1892 + "node_modules/data-view-buffer": { 1893 + "version": "1.0.2", 1894 + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", 1895 + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", 1896 + "dev": true, 1897 + "license": "MIT", 1898 + "dependencies": { 1899 + "call-bound": "^1.0.3", 1900 + "es-errors": "^1.3.0", 1901 + "is-data-view": "^1.0.2" 1902 + }, 1903 + "engines": { 1904 + "node": ">= 0.4" 1905 + }, 1906 + "funding": { 1907 + "url": "https://github.com/sponsors/ljharb" 1908 + } 1909 + }, 1910 + "node_modules/data-view-byte-length": { 1911 + "version": "1.0.2", 1912 + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", 1913 + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", 1914 + "dev": true, 1915 + "license": "MIT", 1916 + "dependencies": { 1917 + "call-bound": "^1.0.3", 1918 + "es-errors": "^1.3.0", 1919 + "is-data-view": "^1.0.2" 1920 + }, 1921 + "engines": { 1922 + "node": ">= 0.4" 1923 + }, 1924 + "funding": { 1925 + "url": "https://github.com/sponsors/inspect-js" 1926 + } 1927 + }, 1928 + "node_modules/data-view-byte-offset": { 1929 + "version": "1.0.1", 1930 + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", 1931 + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", 1932 + "dev": true, 1933 + "license": "MIT", 1934 + "dependencies": { 1935 + "call-bound": "^1.0.2", 1936 + "es-errors": "^1.3.0", 1937 + "is-data-view": "^1.0.1" 1938 + }, 1939 + "engines": { 1940 + "node": ">= 0.4" 1941 + }, 1942 + "funding": { 1943 + "url": "https://github.com/sponsors/ljharb" 1944 + } 1945 + }, 1305 1946 "node_modules/debug": { 1306 1947 "version": "4.4.3", 1307 1948 "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", ··· 1320 1961 } 1321 1962 } 1322 1963 }, 1964 + "node_modules/deep-is": { 1965 + "version": "0.1.4", 1966 + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1967 + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1968 + "dev": true, 1969 + "license": "MIT" 1970 + }, 1971 + "node_modules/define-data-property": { 1972 + "version": "1.1.4", 1973 + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 1974 + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 1975 + "dev": true, 1976 + "license": "MIT", 1977 + "dependencies": { 1978 + "es-define-property": "^1.0.0", 1979 + "es-errors": "^1.3.0", 1980 + "gopd": "^1.0.1" 1981 + }, 1982 + "engines": { 1983 + "node": ">= 0.4" 1984 + }, 1985 + "funding": { 1986 + "url": "https://github.com/sponsors/ljharb" 1987 + } 1988 + }, 1989 + "node_modules/define-properties": { 1990 + "version": "1.2.1", 1991 + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", 1992 + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", 1993 + "dev": true, 1994 + "license": "MIT", 1995 + "dependencies": { 1996 + "define-data-property": "^1.0.1", 1997 + "has-property-descriptors": "^1.0.0", 1998 + "object-keys": "^1.1.1" 1999 + }, 2000 + "engines": { 2001 + "node": ">= 0.4" 2002 + }, 2003 + "funding": { 2004 + "url": "https://github.com/sponsors/ljharb" 2005 + } 2006 + }, 2007 + "node_modules/doctrine": { 2008 + "version": "2.1.0", 2009 + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 2010 + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 2011 + "dev": true, 2012 + "license": "Apache-2.0", 2013 + "dependencies": { 2014 + "esutils": "^2.0.2" 2015 + }, 2016 + "engines": { 2017 + "node": ">=0.10.0" 2018 + } 2019 + }, 2020 + "node_modules/dunder-proto": { 2021 + "version": "1.0.1", 2022 + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 2023 + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 2024 + "dev": true, 2025 + "license": "MIT", 2026 + "dependencies": { 2027 + "call-bind-apply-helpers": "^1.0.1", 2028 + "es-errors": "^1.3.0", 2029 + "gopd": "^1.2.0" 2030 + }, 2031 + "engines": { 2032 + "node": ">= 0.4" 2033 + } 2034 + }, 1323 2035 "node_modules/electron-to-chromium": { 1324 2036 "version": "1.5.267", 1325 2037 "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", ··· 1327 2039 "dev": true, 1328 2040 "license": "ISC" 1329 2041 }, 2042 + "node_modules/es-abstract": { 2043 + "version": "1.24.1", 2044 + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", 2045 + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", 2046 + "dev": true, 2047 + "license": "MIT", 2048 + "dependencies": { 2049 + "array-buffer-byte-length": "^1.0.2", 2050 + "arraybuffer.prototype.slice": "^1.0.4", 2051 + "available-typed-arrays": "^1.0.7", 2052 + "call-bind": "^1.0.8", 2053 + "call-bound": "^1.0.4", 2054 + "data-view-buffer": "^1.0.2", 2055 + "data-view-byte-length": "^1.0.2", 2056 + "data-view-byte-offset": "^1.0.1", 2057 + "es-define-property": "^1.0.1", 2058 + "es-errors": "^1.3.0", 2059 + "es-object-atoms": "^1.1.1", 2060 + "es-set-tostringtag": "^2.1.0", 2061 + "es-to-primitive": "^1.3.0", 2062 + "function.prototype.name": "^1.1.8", 2063 + "get-intrinsic": "^1.3.0", 2064 + "get-proto": "^1.0.1", 2065 + "get-symbol-description": "^1.1.0", 2066 + "globalthis": "^1.0.4", 2067 + "gopd": "^1.2.0", 2068 + "has-property-descriptors": "^1.0.2", 2069 + "has-proto": "^1.2.0", 2070 + "has-symbols": "^1.1.0", 2071 + "hasown": "^2.0.2", 2072 + "internal-slot": "^1.1.0", 2073 + "is-array-buffer": "^3.0.5", 2074 + "is-callable": "^1.2.7", 2075 + "is-data-view": "^1.0.2", 2076 + "is-negative-zero": "^2.0.3", 2077 + "is-regex": "^1.2.1", 2078 + "is-set": "^2.0.3", 2079 + "is-shared-array-buffer": "^1.0.4", 2080 + "is-string": "^1.1.1", 2081 + "is-typed-array": "^1.1.15", 2082 + "is-weakref": "^1.1.1", 2083 + "math-intrinsics": "^1.1.0", 2084 + "object-inspect": "^1.13.4", 2085 + "object-keys": "^1.1.1", 2086 + "object.assign": "^4.1.7", 2087 + "own-keys": "^1.0.1", 2088 + "regexp.prototype.flags": "^1.5.4", 2089 + "safe-array-concat": "^1.1.3", 2090 + "safe-push-apply": "^1.0.0", 2091 + "safe-regex-test": "^1.1.0", 2092 + "set-proto": "^1.0.0", 2093 + "stop-iteration-iterator": "^1.1.0", 2094 + "string.prototype.trim": "^1.2.10", 2095 + "string.prototype.trimend": "^1.0.9", 2096 + "string.prototype.trimstart": "^1.0.8", 2097 + "typed-array-buffer": "^1.0.3", 2098 + "typed-array-byte-length": "^1.0.3", 2099 + "typed-array-byte-offset": "^1.0.4", 2100 + "typed-array-length": "^1.0.7", 2101 + "unbox-primitive": "^1.1.0", 2102 + "which-typed-array": "^1.1.19" 2103 + }, 2104 + "engines": { 2105 + "node": ">= 0.4" 2106 + }, 2107 + "funding": { 2108 + "url": "https://github.com/sponsors/ljharb" 2109 + } 2110 + }, 2111 + "node_modules/es-define-property": { 2112 + "version": "1.0.1", 2113 + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 2114 + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 2115 + "dev": true, 2116 + "license": "MIT", 2117 + "engines": { 2118 + "node": ">= 0.4" 2119 + } 2120 + }, 2121 + "node_modules/es-errors": { 2122 + "version": "1.3.0", 2123 + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 2124 + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 2125 + "dev": true, 2126 + "license": "MIT", 2127 + "engines": { 2128 + "node": ">= 0.4" 2129 + } 2130 + }, 2131 + "node_modules/es-iterator-helpers": { 2132 + "version": "1.2.2", 2133 + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", 2134 + "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", 2135 + "dev": true, 2136 + "license": "MIT", 2137 + "dependencies": { 2138 + "call-bind": "^1.0.8", 2139 + "call-bound": "^1.0.4", 2140 + "define-properties": "^1.2.1", 2141 + "es-abstract": "^1.24.1", 2142 + "es-errors": "^1.3.0", 2143 + "es-set-tostringtag": "^2.1.0", 2144 + "function-bind": "^1.1.2", 2145 + "get-intrinsic": "^1.3.0", 2146 + "globalthis": "^1.0.4", 2147 + "gopd": "^1.2.0", 2148 + "has-property-descriptors": "^1.0.2", 2149 + "has-proto": "^1.2.0", 2150 + "has-symbols": "^1.1.0", 2151 + "internal-slot": "^1.1.0", 2152 + "iterator.prototype": "^1.1.5", 2153 + "safe-array-concat": "^1.1.3" 2154 + }, 2155 + "engines": { 2156 + "node": ">= 0.4" 2157 + } 2158 + }, 2159 + "node_modules/es-object-atoms": { 2160 + "version": "1.1.1", 2161 + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 2162 + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 2163 + "dev": true, 2164 + "license": "MIT", 2165 + "dependencies": { 2166 + "es-errors": "^1.3.0" 2167 + }, 2168 + "engines": { 2169 + "node": ">= 0.4" 2170 + } 2171 + }, 2172 + "node_modules/es-set-tostringtag": { 2173 + "version": "2.1.0", 2174 + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", 2175 + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", 2176 + "dev": true, 2177 + "license": "MIT", 2178 + "dependencies": { 2179 + "es-errors": "^1.3.0", 2180 + "get-intrinsic": "^1.2.6", 2181 + "has-tostringtag": "^1.0.2", 2182 + "hasown": "^2.0.2" 2183 + }, 2184 + "engines": { 2185 + "node": ">= 0.4" 2186 + } 2187 + }, 2188 + "node_modules/es-shim-unscopables": { 2189 + "version": "1.1.0", 2190 + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", 2191 + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", 2192 + "dev": true, 2193 + "license": "MIT", 2194 + "dependencies": { 2195 + "hasown": "^2.0.2" 2196 + }, 2197 + "engines": { 2198 + "node": ">= 0.4" 2199 + } 2200 + }, 2201 + "node_modules/es-to-primitive": { 2202 + "version": "1.3.0", 2203 + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", 2204 + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", 2205 + "dev": true, 2206 + "license": "MIT", 2207 + "dependencies": { 2208 + "is-callable": "^1.2.7", 2209 + "is-date-object": "^1.0.5", 2210 + "is-symbol": "^1.0.4" 2211 + }, 2212 + "engines": { 2213 + "node": ">= 0.4" 2214 + }, 2215 + "funding": { 2216 + "url": "https://github.com/sponsors/ljharb" 2217 + } 2218 + }, 1330 2219 "node_modules/esbuild": { 1331 2220 "version": "0.25.12", 1332 2221 "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", ··· 1379 2268 "node": ">=6" 1380 2269 } 1381 2270 }, 2271 + "node_modules/escape-string-regexp": { 2272 + "version": "4.0.0", 2273 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 2274 + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 2275 + "dev": true, 2276 + "license": "MIT", 2277 + "engines": { 2278 + "node": ">=10" 2279 + }, 2280 + "funding": { 2281 + "url": "https://github.com/sponsors/sindresorhus" 2282 + } 2283 + }, 2284 + "node_modules/eslint": { 2285 + "version": "9.39.2", 2286 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", 2287 + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", 2288 + "dev": true, 2289 + "license": "MIT", 2290 + "peer": true, 2291 + "dependencies": { 2292 + "@eslint-community/eslint-utils": "^4.8.0", 2293 + "@eslint-community/regexpp": "^4.12.1", 2294 + "@eslint/config-array": "^0.21.1", 2295 + "@eslint/config-helpers": "^0.4.2", 2296 + "@eslint/core": "^0.17.0", 2297 + "@eslint/eslintrc": "^3.3.1", 2298 + "@eslint/js": "9.39.2", 2299 + "@eslint/plugin-kit": "^0.4.1", 2300 + "@humanfs/node": "^0.16.6", 2301 + "@humanwhocodes/module-importer": "^1.0.1", 2302 + "@humanwhocodes/retry": "^0.4.2", 2303 + "@types/estree": "^1.0.6", 2304 + "ajv": "^6.12.4", 2305 + "chalk": "^4.0.0", 2306 + "cross-spawn": "^7.0.6", 2307 + "debug": "^4.3.2", 2308 + "escape-string-regexp": "^4.0.0", 2309 + "eslint-scope": "^8.4.0", 2310 + "eslint-visitor-keys": "^4.2.1", 2311 + "espree": "^10.4.0", 2312 + "esquery": "^1.5.0", 2313 + "esutils": "^2.0.2", 2314 + "fast-deep-equal": "^3.1.3", 2315 + "file-entry-cache": "^8.0.0", 2316 + "find-up": "^5.0.0", 2317 + "glob-parent": "^6.0.2", 2318 + "ignore": "^5.2.0", 2319 + "imurmurhash": "^0.1.4", 2320 + "is-glob": "^4.0.0", 2321 + "json-stable-stringify-without-jsonify": "^1.0.1", 2322 + "lodash.merge": "^4.6.2", 2323 + "minimatch": "^3.1.2", 2324 + "natural-compare": "^1.4.0", 2325 + "optionator": "^0.9.3" 2326 + }, 2327 + "bin": { 2328 + "eslint": "bin/eslint.js" 2329 + }, 2330 + "engines": { 2331 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2332 + }, 2333 + "funding": { 2334 + "url": "https://eslint.org/donate" 2335 + }, 2336 + "peerDependencies": { 2337 + "jiti": "*" 2338 + }, 2339 + "peerDependenciesMeta": { 2340 + "jiti": { 2341 + "optional": true 2342 + } 2343 + } 2344 + }, 2345 + "node_modules/eslint-plugin-react": { 2346 + "version": "7.37.5", 2347 + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", 2348 + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", 2349 + "dev": true, 2350 + "license": "MIT", 2351 + "dependencies": { 2352 + "array-includes": "^3.1.8", 2353 + "array.prototype.findlast": "^1.2.5", 2354 + "array.prototype.flatmap": "^1.3.3", 2355 + "array.prototype.tosorted": "^1.1.4", 2356 + "doctrine": "^2.1.0", 2357 + "es-iterator-helpers": "^1.2.1", 2358 + "estraverse": "^5.3.0", 2359 + "hasown": "^2.0.2", 2360 + "jsx-ast-utils": "^2.4.1 || ^3.0.0", 2361 + "minimatch": "^3.1.2", 2362 + "object.entries": "^1.1.9", 2363 + "object.fromentries": "^2.0.8", 2364 + "object.values": "^1.2.1", 2365 + "prop-types": "^15.8.1", 2366 + "resolve": "^2.0.0-next.5", 2367 + "semver": "^6.3.1", 2368 + "string.prototype.matchall": "^4.0.12", 2369 + "string.prototype.repeat": "^1.0.0" 2370 + }, 2371 + "engines": { 2372 + "node": ">=4" 2373 + }, 2374 + "peerDependencies": { 2375 + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" 2376 + } 2377 + }, 2378 + "node_modules/eslint-plugin-react-hooks": { 2379 + "version": "7.0.1", 2380 + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", 2381 + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", 2382 + "dev": true, 2383 + "license": "MIT", 2384 + "dependencies": { 2385 + "@babel/core": "^7.24.4", 2386 + "@babel/parser": "^7.24.4", 2387 + "hermes-parser": "^0.25.1", 2388 + "zod": "^3.25.0 || ^4.0.0", 2389 + "zod-validation-error": "^3.5.0 || ^4.0.0" 2390 + }, 2391 + "engines": { 2392 + "node": ">=18" 2393 + }, 2394 + "peerDependencies": { 2395 + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" 2396 + } 2397 + }, 2398 + "node_modules/eslint-plugin-react-refresh": { 2399 + "version": "0.4.26", 2400 + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", 2401 + "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", 2402 + "dev": true, 2403 + "license": "MIT", 2404 + "peerDependencies": { 2405 + "eslint": ">=8.40" 2406 + } 2407 + }, 2408 + "node_modules/eslint-scope": { 2409 + "version": "8.4.0", 2410 + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", 2411 + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", 2412 + "dev": true, 2413 + "license": "BSD-2-Clause", 2414 + "dependencies": { 2415 + "esrecurse": "^4.3.0", 2416 + "estraverse": "^5.2.0" 2417 + }, 2418 + "engines": { 2419 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2420 + }, 2421 + "funding": { 2422 + "url": "https://opencollective.com/eslint" 2423 + } 2424 + }, 2425 + "node_modules/eslint-visitor-keys": { 2426 + "version": "4.2.1", 2427 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", 2428 + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", 2429 + "dev": true, 2430 + "license": "Apache-2.0", 2431 + "engines": { 2432 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2433 + }, 2434 + "funding": { 2435 + "url": "https://opencollective.com/eslint" 2436 + } 2437 + }, 2438 + "node_modules/espree": { 2439 + "version": "10.4.0", 2440 + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", 2441 + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", 2442 + "dev": true, 2443 + "license": "BSD-2-Clause", 2444 + "dependencies": { 2445 + "acorn": "^8.15.0", 2446 + "acorn-jsx": "^5.3.2", 2447 + "eslint-visitor-keys": "^4.2.1" 2448 + }, 2449 + "engines": { 2450 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2451 + }, 2452 + "funding": { 2453 + "url": "https://opencollective.com/eslint" 2454 + } 2455 + }, 2456 + "node_modules/esquery": { 2457 + "version": "1.7.0", 2458 + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", 2459 + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", 2460 + "dev": true, 2461 + "license": "BSD-3-Clause", 2462 + "dependencies": { 2463 + "estraverse": "^5.1.0" 2464 + }, 2465 + "engines": { 2466 + "node": ">=0.10" 2467 + } 2468 + }, 2469 + "node_modules/esrecurse": { 2470 + "version": "4.3.0", 2471 + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 2472 + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 2473 + "dev": true, 2474 + "license": "BSD-2-Clause", 2475 + "dependencies": { 2476 + "estraverse": "^5.2.0" 2477 + }, 2478 + "engines": { 2479 + "node": ">=4.0" 2480 + } 2481 + }, 2482 + "node_modules/estraverse": { 2483 + "version": "5.3.0", 2484 + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 2485 + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 2486 + "dev": true, 2487 + "license": "BSD-2-Clause", 2488 + "engines": { 2489 + "node": ">=4.0" 2490 + } 2491 + }, 2492 + "node_modules/esutils": { 2493 + "version": "2.0.3", 2494 + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 2495 + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 2496 + "dev": true, 2497 + "license": "BSD-2-Clause", 2498 + "engines": { 2499 + "node": ">=0.10.0" 2500 + } 2501 + }, 2502 + "node_modules/fast-deep-equal": { 2503 + "version": "3.1.3", 2504 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 2505 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 2506 + "dev": true, 2507 + "license": "MIT" 2508 + }, 2509 + "node_modules/fast-json-stable-stringify": { 2510 + "version": "2.1.0", 2511 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 2512 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 2513 + "dev": true, 2514 + "license": "MIT" 2515 + }, 2516 + "node_modules/fast-levenshtein": { 2517 + "version": "2.0.6", 2518 + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 2519 + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 2520 + "dev": true, 2521 + "license": "MIT" 2522 + }, 1382 2523 "node_modules/fdir": { 1383 2524 "version": "6.5.0", 1384 2525 "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", ··· 1397 2538 } 1398 2539 } 1399 2540 }, 2541 + "node_modules/file-entry-cache": { 2542 + "version": "8.0.0", 2543 + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 2544 + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 2545 + "dev": true, 2546 + "license": "MIT", 2547 + "dependencies": { 2548 + "flat-cache": "^4.0.0" 2549 + }, 2550 + "engines": { 2551 + "node": ">=16.0.0" 2552 + } 2553 + }, 2554 + "node_modules/find-up": { 2555 + "version": "5.0.0", 2556 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 2557 + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 2558 + "dev": true, 2559 + "license": "MIT", 2560 + "dependencies": { 2561 + "locate-path": "^6.0.0", 2562 + "path-exists": "^4.0.0" 2563 + }, 2564 + "engines": { 2565 + "node": ">=10" 2566 + }, 2567 + "funding": { 2568 + "url": "https://github.com/sponsors/sindresorhus" 2569 + } 2570 + }, 2571 + "node_modules/flat-cache": { 2572 + "version": "4.0.1", 2573 + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", 2574 + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 2575 + "dev": true, 2576 + "license": "MIT", 2577 + "dependencies": { 2578 + "flatted": "^3.2.9", 2579 + "keyv": "^4.5.4" 2580 + }, 2581 + "engines": { 2582 + "node": ">=16" 2583 + } 2584 + }, 2585 + "node_modules/flatted": { 2586 + "version": "3.3.3", 2587 + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", 2588 + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", 2589 + "dev": true, 2590 + "license": "ISC" 2591 + }, 2592 + "node_modules/for-each": { 2593 + "version": "0.3.5", 2594 + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", 2595 + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", 2596 + "dev": true, 2597 + "license": "MIT", 2598 + "dependencies": { 2599 + "is-callable": "^1.2.7" 2600 + }, 2601 + "engines": { 2602 + "node": ">= 0.4" 2603 + }, 2604 + "funding": { 2605 + "url": "https://github.com/sponsors/ljharb" 2606 + } 2607 + }, 1400 2608 "node_modules/fsevents": { 1401 2609 "version": "2.3.3", 1402 2610 "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", ··· 1412 2620 "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1413 2621 } 1414 2622 }, 2623 + "node_modules/function-bind": { 2624 + "version": "1.1.2", 2625 + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 2626 + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 2627 + "dev": true, 2628 + "license": "MIT", 2629 + "funding": { 2630 + "url": "https://github.com/sponsors/ljharb" 2631 + } 2632 + }, 2633 + "node_modules/function.prototype.name": { 2634 + "version": "1.1.8", 2635 + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", 2636 + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", 2637 + "dev": true, 2638 + "license": "MIT", 2639 + "dependencies": { 2640 + "call-bind": "^1.0.8", 2641 + "call-bound": "^1.0.3", 2642 + "define-properties": "^1.2.1", 2643 + "functions-have-names": "^1.2.3", 2644 + "hasown": "^2.0.2", 2645 + "is-callable": "^1.2.7" 2646 + }, 2647 + "engines": { 2648 + "node": ">= 0.4" 2649 + }, 2650 + "funding": { 2651 + "url": "https://github.com/sponsors/ljharb" 2652 + } 2653 + }, 2654 + "node_modules/functions-have-names": { 2655 + "version": "1.2.3", 2656 + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 2657 + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 2658 + "dev": true, 2659 + "license": "MIT", 2660 + "funding": { 2661 + "url": "https://github.com/sponsors/ljharb" 2662 + } 2663 + }, 2664 + "node_modules/generator-function": { 2665 + "version": "2.0.1", 2666 + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", 2667 + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", 2668 + "dev": true, 2669 + "license": "MIT", 2670 + "engines": { 2671 + "node": ">= 0.4" 2672 + } 2673 + }, 1415 2674 "node_modules/gensync": { 1416 2675 "version": "1.0.0-beta.2", 1417 2676 "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", ··· 1422 2681 "node": ">=6.9.0" 1423 2682 } 1424 2683 }, 2684 + "node_modules/get-intrinsic": { 2685 + "version": "1.3.0", 2686 + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", 2687 + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 2688 + "dev": true, 2689 + "license": "MIT", 2690 + "dependencies": { 2691 + "call-bind-apply-helpers": "^1.0.2", 2692 + "es-define-property": "^1.0.1", 2693 + "es-errors": "^1.3.0", 2694 + "es-object-atoms": "^1.1.1", 2695 + "function-bind": "^1.1.2", 2696 + "get-proto": "^1.0.1", 2697 + "gopd": "^1.2.0", 2698 + "has-symbols": "^1.1.0", 2699 + "hasown": "^2.0.2", 2700 + "math-intrinsics": "^1.1.0" 2701 + }, 2702 + "engines": { 2703 + "node": ">= 0.4" 2704 + }, 2705 + "funding": { 2706 + "url": "https://github.com/sponsors/ljharb" 2707 + } 2708 + }, 2709 + "node_modules/get-proto": { 2710 + "version": "1.0.1", 2711 + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 2712 + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 2713 + "dev": true, 2714 + "license": "MIT", 2715 + "dependencies": { 2716 + "dunder-proto": "^1.0.1", 2717 + "es-object-atoms": "^1.0.0" 2718 + }, 2719 + "engines": { 2720 + "node": ">= 0.4" 2721 + } 2722 + }, 2723 + "node_modules/get-symbol-description": { 2724 + "version": "1.1.0", 2725 + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", 2726 + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", 2727 + "dev": true, 2728 + "license": "MIT", 2729 + "dependencies": { 2730 + "call-bound": "^1.0.3", 2731 + "es-errors": "^1.3.0", 2732 + "get-intrinsic": "^1.2.6" 2733 + }, 2734 + "engines": { 2735 + "node": ">= 0.4" 2736 + }, 2737 + "funding": { 2738 + "url": "https://github.com/sponsors/ljharb" 2739 + } 2740 + }, 2741 + "node_modules/glob-parent": { 2742 + "version": "6.0.2", 2743 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 2744 + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 2745 + "dev": true, 2746 + "license": "ISC", 2747 + "dependencies": { 2748 + "is-glob": "^4.0.3" 2749 + }, 2750 + "engines": { 2751 + "node": ">=10.13.0" 2752 + } 2753 + }, 2754 + "node_modules/globals": { 2755 + "version": "17.0.0", 2756 + "resolved": "https://registry.npmjs.org/globals/-/globals-17.0.0.tgz", 2757 + "integrity": "sha512-gv5BeD2EssA793rlFWVPMMCqefTlpusw6/2TbAVMy0FzcG8wKJn4O+NqJ4+XWmmwrayJgw5TzrmWjFgmz1XPqw==", 2758 + "dev": true, 2759 + "license": "MIT", 2760 + "engines": { 2761 + "node": ">=18" 2762 + }, 2763 + "funding": { 2764 + "url": "https://github.com/sponsors/sindresorhus" 2765 + } 2766 + }, 2767 + "node_modules/globalthis": { 2768 + "version": "1.0.4", 2769 + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", 2770 + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", 2771 + "dev": true, 2772 + "license": "MIT", 2773 + "dependencies": { 2774 + "define-properties": "^1.2.1", 2775 + "gopd": "^1.0.1" 2776 + }, 2777 + "engines": { 2778 + "node": ">= 0.4" 2779 + }, 2780 + "funding": { 2781 + "url": "https://github.com/sponsors/ljharb" 2782 + } 2783 + }, 2784 + "node_modules/gopd": { 2785 + "version": "1.2.0", 2786 + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 2787 + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 2788 + "dev": true, 2789 + "license": "MIT", 2790 + "engines": { 2791 + "node": ">= 0.4" 2792 + }, 2793 + "funding": { 2794 + "url": "https://github.com/sponsors/ljharb" 2795 + } 2796 + }, 2797 + "node_modules/has-bigints": { 2798 + "version": "1.1.0", 2799 + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", 2800 + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", 2801 + "dev": true, 2802 + "license": "MIT", 2803 + "engines": { 2804 + "node": ">= 0.4" 2805 + }, 2806 + "funding": { 2807 + "url": "https://github.com/sponsors/ljharb" 2808 + } 2809 + }, 2810 + "node_modules/has-flag": { 2811 + "version": "4.0.0", 2812 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2813 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2814 + "dev": true, 2815 + "license": "MIT", 2816 + "engines": { 2817 + "node": ">=8" 2818 + } 2819 + }, 2820 + "node_modules/has-property-descriptors": { 2821 + "version": "1.0.2", 2822 + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 2823 + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 2824 + "dev": true, 2825 + "license": "MIT", 2826 + "dependencies": { 2827 + "es-define-property": "^1.0.0" 2828 + }, 2829 + "funding": { 2830 + "url": "https://github.com/sponsors/ljharb" 2831 + } 2832 + }, 2833 + "node_modules/has-proto": { 2834 + "version": "1.2.0", 2835 + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", 2836 + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", 2837 + "dev": true, 2838 + "license": "MIT", 2839 + "dependencies": { 2840 + "dunder-proto": "^1.0.0" 2841 + }, 2842 + "engines": { 2843 + "node": ">= 0.4" 2844 + }, 2845 + "funding": { 2846 + "url": "https://github.com/sponsors/ljharb" 2847 + } 2848 + }, 2849 + "node_modules/has-symbols": { 2850 + "version": "1.1.0", 2851 + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 2852 + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 2853 + "dev": true, 2854 + "license": "MIT", 2855 + "engines": { 2856 + "node": ">= 0.4" 2857 + }, 2858 + "funding": { 2859 + "url": "https://github.com/sponsors/ljharb" 2860 + } 2861 + }, 2862 + "node_modules/has-tostringtag": { 2863 + "version": "1.0.2", 2864 + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", 2865 + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 2866 + "dev": true, 2867 + "license": "MIT", 2868 + "dependencies": { 2869 + "has-symbols": "^1.0.3" 2870 + }, 2871 + "engines": { 2872 + "node": ">= 0.4" 2873 + }, 2874 + "funding": { 2875 + "url": "https://github.com/sponsors/ljharb" 2876 + } 2877 + }, 2878 + "node_modules/hasown": { 2879 + "version": "2.0.2", 2880 + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 2881 + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 2882 + "dev": true, 2883 + "license": "MIT", 2884 + "dependencies": { 2885 + "function-bind": "^1.1.2" 2886 + }, 2887 + "engines": { 2888 + "node": ">= 0.4" 2889 + } 2890 + }, 2891 + "node_modules/hermes-estree": { 2892 + "version": "0.25.1", 2893 + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", 2894 + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", 2895 + "dev": true, 2896 + "license": "MIT" 2897 + }, 2898 + "node_modules/hermes-parser": { 2899 + "version": "0.25.1", 2900 + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", 2901 + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", 2902 + "dev": true, 2903 + "license": "MIT", 2904 + "dependencies": { 2905 + "hermes-estree": "0.25.1" 2906 + } 2907 + }, 2908 + "node_modules/ignore": { 2909 + "version": "5.3.2", 2910 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 2911 + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 2912 + "dev": true, 2913 + "license": "MIT", 2914 + "engines": { 2915 + "node": ">= 4" 2916 + } 2917 + }, 2918 + "node_modules/import-fresh": { 2919 + "version": "3.3.1", 2920 + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", 2921 + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 2922 + "dev": true, 2923 + "license": "MIT", 2924 + "dependencies": { 2925 + "parent-module": "^1.0.0", 2926 + "resolve-from": "^4.0.0" 2927 + }, 2928 + "engines": { 2929 + "node": ">=6" 2930 + }, 2931 + "funding": { 2932 + "url": "https://github.com/sponsors/sindresorhus" 2933 + } 2934 + }, 2935 + "node_modules/imurmurhash": { 2936 + "version": "0.1.4", 2937 + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 2938 + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 2939 + "dev": true, 2940 + "license": "MIT", 2941 + "engines": { 2942 + "node": ">=0.8.19" 2943 + } 2944 + }, 2945 + "node_modules/internal-slot": { 2946 + "version": "1.1.0", 2947 + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", 2948 + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", 2949 + "dev": true, 2950 + "license": "MIT", 2951 + "dependencies": { 2952 + "es-errors": "^1.3.0", 2953 + "hasown": "^2.0.2", 2954 + "side-channel": "^1.1.0" 2955 + }, 2956 + "engines": { 2957 + "node": ">= 0.4" 2958 + } 2959 + }, 2960 + "node_modules/is-array-buffer": { 2961 + "version": "3.0.5", 2962 + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", 2963 + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", 2964 + "dev": true, 2965 + "license": "MIT", 2966 + "dependencies": { 2967 + "call-bind": "^1.0.8", 2968 + "call-bound": "^1.0.3", 2969 + "get-intrinsic": "^1.2.6" 2970 + }, 2971 + "engines": { 2972 + "node": ">= 0.4" 2973 + }, 2974 + "funding": { 2975 + "url": "https://github.com/sponsors/ljharb" 2976 + } 2977 + }, 2978 + "node_modules/is-async-function": { 2979 + "version": "2.1.1", 2980 + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", 2981 + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", 2982 + "dev": true, 2983 + "license": "MIT", 2984 + "dependencies": { 2985 + "async-function": "^1.0.0", 2986 + "call-bound": "^1.0.3", 2987 + "get-proto": "^1.0.1", 2988 + "has-tostringtag": "^1.0.2", 2989 + "safe-regex-test": "^1.1.0" 2990 + }, 2991 + "engines": { 2992 + "node": ">= 0.4" 2993 + }, 2994 + "funding": { 2995 + "url": "https://github.com/sponsors/ljharb" 2996 + } 2997 + }, 2998 + "node_modules/is-bigint": { 2999 + "version": "1.1.0", 3000 + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", 3001 + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", 3002 + "dev": true, 3003 + "license": "MIT", 3004 + "dependencies": { 3005 + "has-bigints": "^1.0.2" 3006 + }, 3007 + "engines": { 3008 + "node": ">= 0.4" 3009 + }, 3010 + "funding": { 3011 + "url": "https://github.com/sponsors/ljharb" 3012 + } 3013 + }, 3014 + "node_modules/is-boolean-object": { 3015 + "version": "1.2.2", 3016 + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", 3017 + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", 3018 + "dev": true, 3019 + "license": "MIT", 3020 + "dependencies": { 3021 + "call-bound": "^1.0.3", 3022 + "has-tostringtag": "^1.0.2" 3023 + }, 3024 + "engines": { 3025 + "node": ">= 0.4" 3026 + }, 3027 + "funding": { 3028 + "url": "https://github.com/sponsors/ljharb" 3029 + } 3030 + }, 3031 + "node_modules/is-callable": { 3032 + "version": "1.2.7", 3033 + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 3034 + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 3035 + "dev": true, 3036 + "license": "MIT", 3037 + "engines": { 3038 + "node": ">= 0.4" 3039 + }, 3040 + "funding": { 3041 + "url": "https://github.com/sponsors/ljharb" 3042 + } 3043 + }, 3044 + "node_modules/is-core-module": { 3045 + "version": "2.16.1", 3046 + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 3047 + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 3048 + "dev": true, 3049 + "license": "MIT", 3050 + "dependencies": { 3051 + "hasown": "^2.0.2" 3052 + }, 3053 + "engines": { 3054 + "node": ">= 0.4" 3055 + }, 3056 + "funding": { 3057 + "url": "https://github.com/sponsors/ljharb" 3058 + } 3059 + }, 3060 + "node_modules/is-data-view": { 3061 + "version": "1.0.2", 3062 + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", 3063 + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", 3064 + "dev": true, 3065 + "license": "MIT", 3066 + "dependencies": { 3067 + "call-bound": "^1.0.2", 3068 + "get-intrinsic": "^1.2.6", 3069 + "is-typed-array": "^1.1.13" 3070 + }, 3071 + "engines": { 3072 + "node": ">= 0.4" 3073 + }, 3074 + "funding": { 3075 + "url": "https://github.com/sponsors/ljharb" 3076 + } 3077 + }, 3078 + "node_modules/is-date-object": { 3079 + "version": "1.1.0", 3080 + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", 3081 + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", 3082 + "dev": true, 3083 + "license": "MIT", 3084 + "dependencies": { 3085 + "call-bound": "^1.0.2", 3086 + "has-tostringtag": "^1.0.2" 3087 + }, 3088 + "engines": { 3089 + "node": ">= 0.4" 3090 + }, 3091 + "funding": { 3092 + "url": "https://github.com/sponsors/ljharb" 3093 + } 3094 + }, 3095 + "node_modules/is-extglob": { 3096 + "version": "2.1.1", 3097 + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 3098 + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 3099 + "dev": true, 3100 + "license": "MIT", 3101 + "engines": { 3102 + "node": ">=0.10.0" 3103 + } 3104 + }, 3105 + "node_modules/is-finalizationregistry": { 3106 + "version": "1.1.1", 3107 + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", 3108 + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", 3109 + "dev": true, 3110 + "license": "MIT", 3111 + "dependencies": { 3112 + "call-bound": "^1.0.3" 3113 + }, 3114 + "engines": { 3115 + "node": ">= 0.4" 3116 + }, 3117 + "funding": { 3118 + "url": "https://github.com/sponsors/ljharb" 3119 + } 3120 + }, 3121 + "node_modules/is-generator-function": { 3122 + "version": "1.1.2", 3123 + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", 3124 + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", 3125 + "dev": true, 3126 + "license": "MIT", 3127 + "dependencies": { 3128 + "call-bound": "^1.0.4", 3129 + "generator-function": "^2.0.0", 3130 + "get-proto": "^1.0.1", 3131 + "has-tostringtag": "^1.0.2", 3132 + "safe-regex-test": "^1.1.0" 3133 + }, 3134 + "engines": { 3135 + "node": ">= 0.4" 3136 + }, 3137 + "funding": { 3138 + "url": "https://github.com/sponsors/ljharb" 3139 + } 3140 + }, 3141 + "node_modules/is-glob": { 3142 + "version": "4.0.3", 3143 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 3144 + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 3145 + "dev": true, 3146 + "license": "MIT", 3147 + "dependencies": { 3148 + "is-extglob": "^2.1.1" 3149 + }, 3150 + "engines": { 3151 + "node": ">=0.10.0" 3152 + } 3153 + }, 3154 + "node_modules/is-map": { 3155 + "version": "2.0.3", 3156 + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", 3157 + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", 3158 + "dev": true, 3159 + "license": "MIT", 3160 + "engines": { 3161 + "node": ">= 0.4" 3162 + }, 3163 + "funding": { 3164 + "url": "https://github.com/sponsors/ljharb" 3165 + } 3166 + }, 3167 + "node_modules/is-negative-zero": { 3168 + "version": "2.0.3", 3169 + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", 3170 + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", 3171 + "dev": true, 3172 + "license": "MIT", 3173 + "engines": { 3174 + "node": ">= 0.4" 3175 + }, 3176 + "funding": { 3177 + "url": "https://github.com/sponsors/ljharb" 3178 + } 3179 + }, 3180 + "node_modules/is-number-object": { 3181 + "version": "1.1.1", 3182 + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", 3183 + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", 3184 + "dev": true, 3185 + "license": "MIT", 3186 + "dependencies": { 3187 + "call-bound": "^1.0.3", 3188 + "has-tostringtag": "^1.0.2" 3189 + }, 3190 + "engines": { 3191 + "node": ">= 0.4" 3192 + }, 3193 + "funding": { 3194 + "url": "https://github.com/sponsors/ljharb" 3195 + } 3196 + }, 3197 + "node_modules/is-regex": { 3198 + "version": "1.2.1", 3199 + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", 3200 + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", 3201 + "dev": true, 3202 + "license": "MIT", 3203 + "dependencies": { 3204 + "call-bound": "^1.0.2", 3205 + "gopd": "^1.2.0", 3206 + "has-tostringtag": "^1.0.2", 3207 + "hasown": "^2.0.2" 3208 + }, 3209 + "engines": { 3210 + "node": ">= 0.4" 3211 + }, 3212 + "funding": { 3213 + "url": "https://github.com/sponsors/ljharb" 3214 + } 3215 + }, 3216 + "node_modules/is-set": { 3217 + "version": "2.0.3", 3218 + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", 3219 + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", 3220 + "dev": true, 3221 + "license": "MIT", 3222 + "engines": { 3223 + "node": ">= 0.4" 3224 + }, 3225 + "funding": { 3226 + "url": "https://github.com/sponsors/ljharb" 3227 + } 3228 + }, 3229 + "node_modules/is-shared-array-buffer": { 3230 + "version": "1.0.4", 3231 + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", 3232 + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", 3233 + "dev": true, 3234 + "license": "MIT", 3235 + "dependencies": { 3236 + "call-bound": "^1.0.3" 3237 + }, 3238 + "engines": { 3239 + "node": ">= 0.4" 3240 + }, 3241 + "funding": { 3242 + "url": "https://github.com/sponsors/ljharb" 3243 + } 3244 + }, 3245 + "node_modules/is-string": { 3246 + "version": "1.1.1", 3247 + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", 3248 + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", 3249 + "dev": true, 3250 + "license": "MIT", 3251 + "dependencies": { 3252 + "call-bound": "^1.0.3", 3253 + "has-tostringtag": "^1.0.2" 3254 + }, 3255 + "engines": { 3256 + "node": ">= 0.4" 3257 + }, 3258 + "funding": { 3259 + "url": "https://github.com/sponsors/ljharb" 3260 + } 3261 + }, 3262 + "node_modules/is-symbol": { 3263 + "version": "1.1.1", 3264 + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", 3265 + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", 3266 + "dev": true, 3267 + "license": "MIT", 3268 + "dependencies": { 3269 + "call-bound": "^1.0.2", 3270 + "has-symbols": "^1.1.0", 3271 + "safe-regex-test": "^1.1.0" 3272 + }, 3273 + "engines": { 3274 + "node": ">= 0.4" 3275 + }, 3276 + "funding": { 3277 + "url": "https://github.com/sponsors/ljharb" 3278 + } 3279 + }, 3280 + "node_modules/is-typed-array": { 3281 + "version": "1.1.15", 3282 + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", 3283 + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", 3284 + "dev": true, 3285 + "license": "MIT", 3286 + "dependencies": { 3287 + "which-typed-array": "^1.1.16" 3288 + }, 3289 + "engines": { 3290 + "node": ">= 0.4" 3291 + }, 3292 + "funding": { 3293 + "url": "https://github.com/sponsors/ljharb" 3294 + } 3295 + }, 3296 + "node_modules/is-weakmap": { 3297 + "version": "2.0.2", 3298 + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", 3299 + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", 3300 + "dev": true, 3301 + "license": "MIT", 3302 + "engines": { 3303 + "node": ">= 0.4" 3304 + }, 3305 + "funding": { 3306 + "url": "https://github.com/sponsors/ljharb" 3307 + } 3308 + }, 3309 + "node_modules/is-weakref": { 3310 + "version": "1.1.1", 3311 + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", 3312 + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", 3313 + "dev": true, 3314 + "license": "MIT", 3315 + "dependencies": { 3316 + "call-bound": "^1.0.3" 3317 + }, 3318 + "engines": { 3319 + "node": ">= 0.4" 3320 + }, 3321 + "funding": { 3322 + "url": "https://github.com/sponsors/ljharb" 3323 + } 3324 + }, 3325 + "node_modules/is-weakset": { 3326 + "version": "2.0.4", 3327 + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", 3328 + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", 3329 + "dev": true, 3330 + "license": "MIT", 3331 + "dependencies": { 3332 + "call-bound": "^1.0.3", 3333 + "get-intrinsic": "^1.2.6" 3334 + }, 3335 + "engines": { 3336 + "node": ">= 0.4" 3337 + }, 3338 + "funding": { 3339 + "url": "https://github.com/sponsors/ljharb" 3340 + } 3341 + }, 3342 + "node_modules/isarray": { 3343 + "version": "2.0.5", 3344 + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 3345 + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 3346 + "dev": true, 3347 + "license": "MIT" 3348 + }, 3349 + "node_modules/isexe": { 3350 + "version": "2.0.0", 3351 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 3352 + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 3353 + "dev": true, 3354 + "license": "ISC" 3355 + }, 3356 + "node_modules/iterator.prototype": { 3357 + "version": "1.1.5", 3358 + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", 3359 + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", 3360 + "dev": true, 3361 + "license": "MIT", 3362 + "dependencies": { 3363 + "define-data-property": "^1.1.4", 3364 + "es-object-atoms": "^1.0.0", 3365 + "get-intrinsic": "^1.2.6", 3366 + "get-proto": "^1.0.0", 3367 + "has-symbols": "^1.1.0", 3368 + "set-function-name": "^2.0.2" 3369 + }, 3370 + "engines": { 3371 + "node": ">= 0.4" 3372 + } 3373 + }, 1425 3374 "node_modules/js-tokens": { 1426 3375 "version": "4.0.0", 1427 3376 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1428 3377 "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1429 3378 "license": "MIT" 1430 3379 }, 3380 + "node_modules/js-yaml": { 3381 + "version": "4.1.1", 3382 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", 3383 + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", 3384 + "dev": true, 3385 + "license": "MIT", 3386 + "dependencies": { 3387 + "argparse": "^2.0.1" 3388 + }, 3389 + "bin": { 3390 + "js-yaml": "bin/js-yaml.js" 3391 + } 3392 + }, 1431 3393 "node_modules/jsesc": { 1432 3394 "version": "3.1.0", 1433 3395 "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", ··· 1441 3403 "node": ">=6" 1442 3404 } 1443 3405 }, 3406 + "node_modules/json-buffer": { 3407 + "version": "3.0.1", 3408 + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 3409 + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 3410 + "dev": true, 3411 + "license": "MIT" 3412 + }, 3413 + "node_modules/json-schema-traverse": { 3414 + "version": "0.4.1", 3415 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 3416 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 3417 + "dev": true, 3418 + "license": "MIT" 3419 + }, 3420 + "node_modules/json-stable-stringify-without-jsonify": { 3421 + "version": "1.0.1", 3422 + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 3423 + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 3424 + "dev": true, 3425 + "license": "MIT" 3426 + }, 1444 3427 "node_modules/json5": { 1445 3428 "version": "2.2.3", 1446 3429 "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", ··· 1454 3437 "node": ">=6" 1455 3438 } 1456 3439 }, 3440 + "node_modules/jsx-ast-utils": { 3441 + "version": "3.3.5", 3442 + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", 3443 + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", 3444 + "dev": true, 3445 + "license": "MIT", 3446 + "dependencies": { 3447 + "array-includes": "^3.1.6", 3448 + "array.prototype.flat": "^1.3.1", 3449 + "object.assign": "^4.1.4", 3450 + "object.values": "^1.1.6" 3451 + }, 3452 + "engines": { 3453 + "node": ">=4.0" 3454 + } 3455 + }, 3456 + "node_modules/keyv": { 3457 + "version": "4.5.4", 3458 + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 3459 + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 3460 + "dev": true, 3461 + "license": "MIT", 3462 + "dependencies": { 3463 + "json-buffer": "3.0.1" 3464 + } 3465 + }, 3466 + "node_modules/levn": { 3467 + "version": "0.4.1", 3468 + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 3469 + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 3470 + "dev": true, 3471 + "license": "MIT", 3472 + "dependencies": { 3473 + "prelude-ls": "^1.2.1", 3474 + "type-check": "~0.4.0" 3475 + }, 3476 + "engines": { 3477 + "node": ">= 0.8.0" 3478 + } 3479 + }, 3480 + "node_modules/locate-path": { 3481 + "version": "6.0.0", 3482 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 3483 + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 3484 + "dev": true, 3485 + "license": "MIT", 3486 + "dependencies": { 3487 + "p-locate": "^5.0.0" 3488 + }, 3489 + "engines": { 3490 + "node": ">=10" 3491 + }, 3492 + "funding": { 3493 + "url": "https://github.com/sponsors/sindresorhus" 3494 + } 3495 + }, 3496 + "node_modules/lodash.merge": { 3497 + "version": "4.6.2", 3498 + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 3499 + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 3500 + "dev": true, 3501 + "license": "MIT" 3502 + }, 1457 3503 "node_modules/loose-envify": { 1458 3504 "version": "1.4.0", 1459 3505 "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", ··· 1485 3531 "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" 1486 3532 } 1487 3533 }, 3534 + "node_modules/math-intrinsics": { 3535 + "version": "1.1.0", 3536 + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 3537 + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 3538 + "dev": true, 3539 + "license": "MIT", 3540 + "engines": { 3541 + "node": ">= 0.4" 3542 + } 3543 + }, 3544 + "node_modules/minimatch": { 3545 + "version": "3.1.2", 3546 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 3547 + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 3548 + "dev": true, 3549 + "license": "ISC", 3550 + "dependencies": { 3551 + "brace-expansion": "^1.1.7" 3552 + }, 3553 + "engines": { 3554 + "node": "*" 3555 + } 3556 + }, 1488 3557 "node_modules/ms": { 1489 3558 "version": "2.1.3", 1490 3559 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", ··· 1511 3580 "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1512 3581 } 1513 3582 }, 3583 + "node_modules/natural-compare": { 3584 + "version": "1.4.0", 3585 + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 3586 + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 3587 + "dev": true, 3588 + "license": "MIT" 3589 + }, 1514 3590 "node_modules/node-releases": { 1515 3591 "version": "2.0.27", 1516 3592 "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", 1517 3593 "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", 3594 + "dev": true, 3595 + "license": "MIT" 3596 + }, 3597 + "node_modules/object-assign": { 3598 + "version": "4.1.1", 3599 + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 3600 + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 3601 + "dev": true, 3602 + "license": "MIT", 3603 + "engines": { 3604 + "node": ">=0.10.0" 3605 + } 3606 + }, 3607 + "node_modules/object-inspect": { 3608 + "version": "1.13.4", 3609 + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", 3610 + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", 3611 + "dev": true, 3612 + "license": "MIT", 3613 + "engines": { 3614 + "node": ">= 0.4" 3615 + }, 3616 + "funding": { 3617 + "url": "https://github.com/sponsors/ljharb" 3618 + } 3619 + }, 3620 + "node_modules/object-keys": { 3621 + "version": "1.1.1", 3622 + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 3623 + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 3624 + "dev": true, 3625 + "license": "MIT", 3626 + "engines": { 3627 + "node": ">= 0.4" 3628 + } 3629 + }, 3630 + "node_modules/object.assign": { 3631 + "version": "4.1.7", 3632 + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", 3633 + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", 3634 + "dev": true, 3635 + "license": "MIT", 3636 + "dependencies": { 3637 + "call-bind": "^1.0.8", 3638 + "call-bound": "^1.0.3", 3639 + "define-properties": "^1.2.1", 3640 + "es-object-atoms": "^1.0.0", 3641 + "has-symbols": "^1.1.0", 3642 + "object-keys": "^1.1.1" 3643 + }, 3644 + "engines": { 3645 + "node": ">= 0.4" 3646 + }, 3647 + "funding": { 3648 + "url": "https://github.com/sponsors/ljharb" 3649 + } 3650 + }, 3651 + "node_modules/object.entries": { 3652 + "version": "1.1.9", 3653 + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", 3654 + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", 3655 + "dev": true, 3656 + "license": "MIT", 3657 + "dependencies": { 3658 + "call-bind": "^1.0.8", 3659 + "call-bound": "^1.0.4", 3660 + "define-properties": "^1.2.1", 3661 + "es-object-atoms": "^1.1.1" 3662 + }, 3663 + "engines": { 3664 + "node": ">= 0.4" 3665 + } 3666 + }, 3667 + "node_modules/object.fromentries": { 3668 + "version": "2.0.8", 3669 + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", 3670 + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", 3671 + "dev": true, 3672 + "license": "MIT", 3673 + "dependencies": { 3674 + "call-bind": "^1.0.7", 3675 + "define-properties": "^1.2.1", 3676 + "es-abstract": "^1.23.2", 3677 + "es-object-atoms": "^1.0.0" 3678 + }, 3679 + "engines": { 3680 + "node": ">= 0.4" 3681 + }, 3682 + "funding": { 3683 + "url": "https://github.com/sponsors/ljharb" 3684 + } 3685 + }, 3686 + "node_modules/object.values": { 3687 + "version": "1.2.1", 3688 + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", 3689 + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", 3690 + "dev": true, 3691 + "license": "MIT", 3692 + "dependencies": { 3693 + "call-bind": "^1.0.8", 3694 + "call-bound": "^1.0.3", 3695 + "define-properties": "^1.2.1", 3696 + "es-object-atoms": "^1.0.0" 3697 + }, 3698 + "engines": { 3699 + "node": ">= 0.4" 3700 + }, 3701 + "funding": { 3702 + "url": "https://github.com/sponsors/ljharb" 3703 + } 3704 + }, 3705 + "node_modules/optionator": { 3706 + "version": "0.9.4", 3707 + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 3708 + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 3709 + "dev": true, 3710 + "license": "MIT", 3711 + "dependencies": { 3712 + "deep-is": "^0.1.3", 3713 + "fast-levenshtein": "^2.0.6", 3714 + "levn": "^0.4.1", 3715 + "prelude-ls": "^1.2.1", 3716 + "type-check": "^0.4.0", 3717 + "word-wrap": "^1.2.5" 3718 + }, 3719 + "engines": { 3720 + "node": ">= 0.8.0" 3721 + } 3722 + }, 3723 + "node_modules/own-keys": { 3724 + "version": "1.0.1", 3725 + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", 3726 + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", 3727 + "dev": true, 3728 + "license": "MIT", 3729 + "dependencies": { 3730 + "get-intrinsic": "^1.2.6", 3731 + "object-keys": "^1.1.1", 3732 + "safe-push-apply": "^1.0.0" 3733 + }, 3734 + "engines": { 3735 + "node": ">= 0.4" 3736 + }, 3737 + "funding": { 3738 + "url": "https://github.com/sponsors/ljharb" 3739 + } 3740 + }, 3741 + "node_modules/p-limit": { 3742 + "version": "3.1.0", 3743 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 3744 + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 3745 + "dev": true, 3746 + "license": "MIT", 3747 + "dependencies": { 3748 + "yocto-queue": "^0.1.0" 3749 + }, 3750 + "engines": { 3751 + "node": ">=10" 3752 + }, 3753 + "funding": { 3754 + "url": "https://github.com/sponsors/sindresorhus" 3755 + } 3756 + }, 3757 + "node_modules/p-locate": { 3758 + "version": "5.0.0", 3759 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 3760 + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 3761 + "dev": true, 3762 + "license": "MIT", 3763 + "dependencies": { 3764 + "p-limit": "^3.0.2" 3765 + }, 3766 + "engines": { 3767 + "node": ">=10" 3768 + }, 3769 + "funding": { 3770 + "url": "https://github.com/sponsors/sindresorhus" 3771 + } 3772 + }, 3773 + "node_modules/parent-module": { 3774 + "version": "1.0.1", 3775 + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 3776 + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 3777 + "dev": true, 3778 + "license": "MIT", 3779 + "dependencies": { 3780 + "callsites": "^3.0.0" 3781 + }, 3782 + "engines": { 3783 + "node": ">=6" 3784 + } 3785 + }, 3786 + "node_modules/path-exists": { 3787 + "version": "4.0.0", 3788 + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 3789 + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 3790 + "dev": true, 3791 + "license": "MIT", 3792 + "engines": { 3793 + "node": ">=8" 3794 + } 3795 + }, 3796 + "node_modules/path-key": { 3797 + "version": "3.1.1", 3798 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 3799 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 3800 + "dev": true, 3801 + "license": "MIT", 3802 + "engines": { 3803 + "node": ">=8" 3804 + } 3805 + }, 3806 + "node_modules/path-parse": { 3807 + "version": "1.0.7", 3808 + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 3809 + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1518 3810 "dev": true, 1519 3811 "license": "MIT" 1520 3812 }, ··· 1539 3831 "url": "https://github.com/sponsors/jonschlinkert" 1540 3832 } 1541 3833 }, 3834 + "node_modules/possible-typed-array-names": { 3835 + "version": "1.1.0", 3836 + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", 3837 + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", 3838 + "dev": true, 3839 + "license": "MIT", 3840 + "engines": { 3841 + "node": ">= 0.4" 3842 + } 3843 + }, 1542 3844 "node_modules/postcss": { 1543 3845 "version": "8.5.6", 1544 3846 "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", ··· 1568 3870 "node": "^10 || ^12 || >=14" 1569 3871 } 1570 3872 }, 3873 + "node_modules/prelude-ls": { 3874 + "version": "1.2.1", 3875 + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 3876 + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 3877 + "dev": true, 3878 + "license": "MIT", 3879 + "engines": { 3880 + "node": ">= 0.8.0" 3881 + } 3882 + }, 3883 + "node_modules/prop-types": { 3884 + "version": "15.8.1", 3885 + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", 3886 + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", 3887 + "dev": true, 3888 + "license": "MIT", 3889 + "dependencies": { 3890 + "loose-envify": "^1.4.0", 3891 + "object-assign": "^4.1.1", 3892 + "react-is": "^16.13.1" 3893 + } 3894 + }, 3895 + "node_modules/punycode": { 3896 + "version": "2.3.1", 3897 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 3898 + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 3899 + "dev": true, 3900 + "license": "MIT", 3901 + "engines": { 3902 + "node": ">=6" 3903 + } 3904 + }, 1571 3905 "node_modules/react": { 1572 3906 "version": "18.3.1", 1573 3907 "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", ··· 1604 3938 "react": "*" 1605 3939 } 1606 3940 }, 3941 + "node_modules/react-is": { 3942 + "version": "16.13.1", 3943 + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 3944 + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", 3945 + "dev": true, 3946 + "license": "MIT" 3947 + }, 1607 3948 "node_modules/react-refresh": { 1608 3949 "version": "0.17.0", 1609 3950 "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", ··· 1615 3956 } 1616 3957 }, 1617 3958 "node_modules/react-router": { 1618 - "version": "6.30.2", 1619 - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.2.tgz", 1620 - "integrity": "sha512-H2Bm38Zu1bm8KUE5NVWRMzuIyAV8p/JrOaBJAwVmp37AXG72+CZJlEBw6pdn9i5TBgLMhNDgijS4ZlblpHyWTA==", 3959 + "version": "6.30.3", 3960 + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz", 3961 + "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", 1621 3962 "license": "MIT", 1622 3963 "dependencies": { 1623 - "@remix-run/router": "1.23.1" 3964 + "@remix-run/router": "1.23.2" 1624 3965 }, 1625 3966 "engines": { 1626 3967 "node": ">=14.0.0" ··· 1630 3971 } 1631 3972 }, 1632 3973 "node_modules/react-router-dom": { 1633 - "version": "6.30.2", 1634 - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.2.tgz", 1635 - "integrity": "sha512-l2OwHn3UUnEVUqc6/1VMmR1cvZryZ3j3NzapC2eUXO1dB0sYp5mvwdjiXhpUbRb21eFow3qSxpP8Yv6oAU824Q==", 3974 + "version": "6.30.3", 3975 + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", 3976 + "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", 1636 3977 "license": "MIT", 1637 3978 "dependencies": { 1638 - "@remix-run/router": "1.23.1", 1639 - "react-router": "6.30.2" 3979 + "@remix-run/router": "1.23.2", 3980 + "react-router": "6.30.3" 1640 3981 }, 1641 3982 "engines": { 1642 3983 "node": ">=14.0.0" ··· 1646 3987 "react-dom": ">=16.8" 1647 3988 } 1648 3989 }, 3990 + "node_modules/reflect.getprototypeof": { 3991 + "version": "1.0.10", 3992 + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", 3993 + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", 3994 + "dev": true, 3995 + "license": "MIT", 3996 + "dependencies": { 3997 + "call-bind": "^1.0.8", 3998 + "define-properties": "^1.2.1", 3999 + "es-abstract": "^1.23.9", 4000 + "es-errors": "^1.3.0", 4001 + "es-object-atoms": "^1.0.0", 4002 + "get-intrinsic": "^1.2.7", 4003 + "get-proto": "^1.0.1", 4004 + "which-builtin-type": "^1.2.1" 4005 + }, 4006 + "engines": { 4007 + "node": ">= 0.4" 4008 + }, 4009 + "funding": { 4010 + "url": "https://github.com/sponsors/ljharb" 4011 + } 4012 + }, 4013 + "node_modules/regexp.prototype.flags": { 4014 + "version": "1.5.4", 4015 + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", 4016 + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", 4017 + "dev": true, 4018 + "license": "MIT", 4019 + "dependencies": { 4020 + "call-bind": "^1.0.8", 4021 + "define-properties": "^1.2.1", 4022 + "es-errors": "^1.3.0", 4023 + "get-proto": "^1.0.1", 4024 + "gopd": "^1.2.0", 4025 + "set-function-name": "^2.0.2" 4026 + }, 4027 + "engines": { 4028 + "node": ">= 0.4" 4029 + }, 4030 + "funding": { 4031 + "url": "https://github.com/sponsors/ljharb" 4032 + } 4033 + }, 4034 + "node_modules/resolve": { 4035 + "version": "2.0.0-next.5", 4036 + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", 4037 + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", 4038 + "dev": true, 4039 + "license": "MIT", 4040 + "dependencies": { 4041 + "is-core-module": "^2.13.0", 4042 + "path-parse": "^1.0.7", 4043 + "supports-preserve-symlinks-flag": "^1.0.0" 4044 + }, 4045 + "bin": { 4046 + "resolve": "bin/resolve" 4047 + }, 4048 + "funding": { 4049 + "url": "https://github.com/sponsors/ljharb" 4050 + } 4051 + }, 4052 + "node_modules/resolve-from": { 4053 + "version": "4.0.0", 4054 + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 4055 + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 4056 + "dev": true, 4057 + "license": "MIT", 4058 + "engines": { 4059 + "node": ">=4" 4060 + } 4061 + }, 1649 4062 "node_modules/rollup": { 1650 4063 "version": "4.54.0", 1651 4064 "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.54.0.tgz", ··· 1688 4101 "fsevents": "~2.3.2" 1689 4102 } 1690 4103 }, 4104 + "node_modules/safe-array-concat": { 4105 + "version": "1.1.3", 4106 + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", 4107 + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", 4108 + "dev": true, 4109 + "license": "MIT", 4110 + "dependencies": { 4111 + "call-bind": "^1.0.8", 4112 + "call-bound": "^1.0.2", 4113 + "get-intrinsic": "^1.2.6", 4114 + "has-symbols": "^1.1.0", 4115 + "isarray": "^2.0.5" 4116 + }, 4117 + "engines": { 4118 + "node": ">=0.4" 4119 + }, 4120 + "funding": { 4121 + "url": "https://github.com/sponsors/ljharb" 4122 + } 4123 + }, 4124 + "node_modules/safe-push-apply": { 4125 + "version": "1.0.0", 4126 + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", 4127 + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", 4128 + "dev": true, 4129 + "license": "MIT", 4130 + "dependencies": { 4131 + "es-errors": "^1.3.0", 4132 + "isarray": "^2.0.5" 4133 + }, 4134 + "engines": { 4135 + "node": ">= 0.4" 4136 + }, 4137 + "funding": { 4138 + "url": "https://github.com/sponsors/ljharb" 4139 + } 4140 + }, 4141 + "node_modules/safe-regex-test": { 4142 + "version": "1.1.0", 4143 + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", 4144 + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", 4145 + "dev": true, 4146 + "license": "MIT", 4147 + "dependencies": { 4148 + "call-bound": "^1.0.2", 4149 + "es-errors": "^1.3.0", 4150 + "is-regex": "^1.2.1" 4151 + }, 4152 + "engines": { 4153 + "node": ">= 0.4" 4154 + }, 4155 + "funding": { 4156 + "url": "https://github.com/sponsors/ljharb" 4157 + } 4158 + }, 1691 4159 "node_modules/scheduler": { 1692 4160 "version": "0.23.2", 1693 4161 "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", ··· 1707 4175 "semver": "bin/semver.js" 1708 4176 } 1709 4177 }, 4178 + "node_modules/set-function-length": { 4179 + "version": "1.2.2", 4180 + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 4181 + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 4182 + "dev": true, 4183 + "license": "MIT", 4184 + "dependencies": { 4185 + "define-data-property": "^1.1.4", 4186 + "es-errors": "^1.3.0", 4187 + "function-bind": "^1.1.2", 4188 + "get-intrinsic": "^1.2.4", 4189 + "gopd": "^1.0.1", 4190 + "has-property-descriptors": "^1.0.2" 4191 + }, 4192 + "engines": { 4193 + "node": ">= 0.4" 4194 + } 4195 + }, 4196 + "node_modules/set-function-name": { 4197 + "version": "2.0.2", 4198 + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", 4199 + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", 4200 + "dev": true, 4201 + "license": "MIT", 4202 + "dependencies": { 4203 + "define-data-property": "^1.1.4", 4204 + "es-errors": "^1.3.0", 4205 + "functions-have-names": "^1.2.3", 4206 + "has-property-descriptors": "^1.0.2" 4207 + }, 4208 + "engines": { 4209 + "node": ">= 0.4" 4210 + } 4211 + }, 4212 + "node_modules/set-proto": { 4213 + "version": "1.0.0", 4214 + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", 4215 + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", 4216 + "dev": true, 4217 + "license": "MIT", 4218 + "dependencies": { 4219 + "dunder-proto": "^1.0.1", 4220 + "es-errors": "^1.3.0", 4221 + "es-object-atoms": "^1.0.0" 4222 + }, 4223 + "engines": { 4224 + "node": ">= 0.4" 4225 + } 4226 + }, 4227 + "node_modules/shebang-command": { 4228 + "version": "2.0.0", 4229 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 4230 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 4231 + "dev": true, 4232 + "license": "MIT", 4233 + "dependencies": { 4234 + "shebang-regex": "^3.0.0" 4235 + }, 4236 + "engines": { 4237 + "node": ">=8" 4238 + } 4239 + }, 4240 + "node_modules/shebang-regex": { 4241 + "version": "3.0.0", 4242 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 4243 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 4244 + "dev": true, 4245 + "license": "MIT", 4246 + "engines": { 4247 + "node": ">=8" 4248 + } 4249 + }, 4250 + "node_modules/side-channel": { 4251 + "version": "1.1.0", 4252 + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", 4253 + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", 4254 + "dev": true, 4255 + "license": "MIT", 4256 + "dependencies": { 4257 + "es-errors": "^1.3.0", 4258 + "object-inspect": "^1.13.3", 4259 + "side-channel-list": "^1.0.0", 4260 + "side-channel-map": "^1.0.1", 4261 + "side-channel-weakmap": "^1.0.2" 4262 + }, 4263 + "engines": { 4264 + "node": ">= 0.4" 4265 + }, 4266 + "funding": { 4267 + "url": "https://github.com/sponsors/ljharb" 4268 + } 4269 + }, 4270 + "node_modules/side-channel-list": { 4271 + "version": "1.0.0", 4272 + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", 4273 + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 4274 + "dev": true, 4275 + "license": "MIT", 4276 + "dependencies": { 4277 + "es-errors": "^1.3.0", 4278 + "object-inspect": "^1.13.3" 4279 + }, 4280 + "engines": { 4281 + "node": ">= 0.4" 4282 + }, 4283 + "funding": { 4284 + "url": "https://github.com/sponsors/ljharb" 4285 + } 4286 + }, 4287 + "node_modules/side-channel-map": { 4288 + "version": "1.0.1", 4289 + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", 4290 + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", 4291 + "dev": true, 4292 + "license": "MIT", 4293 + "dependencies": { 4294 + "call-bound": "^1.0.2", 4295 + "es-errors": "^1.3.0", 4296 + "get-intrinsic": "^1.2.5", 4297 + "object-inspect": "^1.13.3" 4298 + }, 4299 + "engines": { 4300 + "node": ">= 0.4" 4301 + }, 4302 + "funding": { 4303 + "url": "https://github.com/sponsors/ljharb" 4304 + } 4305 + }, 4306 + "node_modules/side-channel-weakmap": { 4307 + "version": "1.0.2", 4308 + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", 4309 + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", 4310 + "dev": true, 4311 + "license": "MIT", 4312 + "dependencies": { 4313 + "call-bound": "^1.0.2", 4314 + "es-errors": "^1.3.0", 4315 + "get-intrinsic": "^1.2.5", 4316 + "object-inspect": "^1.13.3", 4317 + "side-channel-map": "^1.0.1" 4318 + }, 4319 + "engines": { 4320 + "node": ">= 0.4" 4321 + }, 4322 + "funding": { 4323 + "url": "https://github.com/sponsors/ljharb" 4324 + } 4325 + }, 1710 4326 "node_modules/source-map-js": { 1711 4327 "version": "1.2.1", 1712 4328 "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", ··· 1717 4333 "node": ">=0.10.0" 1718 4334 } 1719 4335 }, 4336 + "node_modules/stop-iteration-iterator": { 4337 + "version": "1.1.0", 4338 + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", 4339 + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", 4340 + "dev": true, 4341 + "license": "MIT", 4342 + "dependencies": { 4343 + "es-errors": "^1.3.0", 4344 + "internal-slot": "^1.1.0" 4345 + }, 4346 + "engines": { 4347 + "node": ">= 0.4" 4348 + } 4349 + }, 4350 + "node_modules/string.prototype.matchall": { 4351 + "version": "4.0.12", 4352 + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", 4353 + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", 4354 + "dev": true, 4355 + "license": "MIT", 4356 + "dependencies": { 4357 + "call-bind": "^1.0.8", 4358 + "call-bound": "^1.0.3", 4359 + "define-properties": "^1.2.1", 4360 + "es-abstract": "^1.23.6", 4361 + "es-errors": "^1.3.0", 4362 + "es-object-atoms": "^1.0.0", 4363 + "get-intrinsic": "^1.2.6", 4364 + "gopd": "^1.2.0", 4365 + "has-symbols": "^1.1.0", 4366 + "internal-slot": "^1.1.0", 4367 + "regexp.prototype.flags": "^1.5.3", 4368 + "set-function-name": "^2.0.2", 4369 + "side-channel": "^1.1.0" 4370 + }, 4371 + "engines": { 4372 + "node": ">= 0.4" 4373 + }, 4374 + "funding": { 4375 + "url": "https://github.com/sponsors/ljharb" 4376 + } 4377 + }, 4378 + "node_modules/string.prototype.repeat": { 4379 + "version": "1.0.0", 4380 + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", 4381 + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", 4382 + "dev": true, 4383 + "license": "MIT", 4384 + "dependencies": { 4385 + "define-properties": "^1.1.3", 4386 + "es-abstract": "^1.17.5" 4387 + } 4388 + }, 4389 + "node_modules/string.prototype.trim": { 4390 + "version": "1.2.10", 4391 + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", 4392 + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", 4393 + "dev": true, 4394 + "license": "MIT", 4395 + "dependencies": { 4396 + "call-bind": "^1.0.8", 4397 + "call-bound": "^1.0.2", 4398 + "define-data-property": "^1.1.4", 4399 + "define-properties": "^1.2.1", 4400 + "es-abstract": "^1.23.5", 4401 + "es-object-atoms": "^1.0.0", 4402 + "has-property-descriptors": "^1.0.2" 4403 + }, 4404 + "engines": { 4405 + "node": ">= 0.4" 4406 + }, 4407 + "funding": { 4408 + "url": "https://github.com/sponsors/ljharb" 4409 + } 4410 + }, 4411 + "node_modules/string.prototype.trimend": { 4412 + "version": "1.0.9", 4413 + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", 4414 + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", 4415 + "dev": true, 4416 + "license": "MIT", 4417 + "dependencies": { 4418 + "call-bind": "^1.0.8", 4419 + "call-bound": "^1.0.2", 4420 + "define-properties": "^1.2.1", 4421 + "es-object-atoms": "^1.0.0" 4422 + }, 4423 + "engines": { 4424 + "node": ">= 0.4" 4425 + }, 4426 + "funding": { 4427 + "url": "https://github.com/sponsors/ljharb" 4428 + } 4429 + }, 4430 + "node_modules/string.prototype.trimstart": { 4431 + "version": "1.0.8", 4432 + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", 4433 + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", 4434 + "dev": true, 4435 + "license": "MIT", 4436 + "dependencies": { 4437 + "call-bind": "^1.0.7", 4438 + "define-properties": "^1.2.1", 4439 + "es-object-atoms": "^1.0.0" 4440 + }, 4441 + "engines": { 4442 + "node": ">= 0.4" 4443 + }, 4444 + "funding": { 4445 + "url": "https://github.com/sponsors/ljharb" 4446 + } 4447 + }, 4448 + "node_modules/strip-json-comments": { 4449 + "version": "3.1.1", 4450 + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 4451 + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 4452 + "dev": true, 4453 + "license": "MIT", 4454 + "engines": { 4455 + "node": ">=8" 4456 + }, 4457 + "funding": { 4458 + "url": "https://github.com/sponsors/sindresorhus" 4459 + } 4460 + }, 4461 + "node_modules/supports-color": { 4462 + "version": "7.2.0", 4463 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 4464 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 4465 + "dev": true, 4466 + "license": "MIT", 4467 + "dependencies": { 4468 + "has-flag": "^4.0.0" 4469 + }, 4470 + "engines": { 4471 + "node": ">=8" 4472 + } 4473 + }, 4474 + "node_modules/supports-preserve-symlinks-flag": { 4475 + "version": "1.0.0", 4476 + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 4477 + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 4478 + "dev": true, 4479 + "license": "MIT", 4480 + "engines": { 4481 + "node": ">= 0.4" 4482 + }, 4483 + "funding": { 4484 + "url": "https://github.com/sponsors/ljharb" 4485 + } 4486 + }, 1720 4487 "node_modules/tinyglobby": { 1721 4488 "version": "0.2.15", 1722 4489 "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", ··· 1734 4501 "url": "https://github.com/sponsors/SuperchupuDev" 1735 4502 } 1736 4503 }, 4504 + "node_modules/type-check": { 4505 + "version": "0.4.0", 4506 + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 4507 + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 4508 + "dev": true, 4509 + "license": "MIT", 4510 + "dependencies": { 4511 + "prelude-ls": "^1.2.1" 4512 + }, 4513 + "engines": { 4514 + "node": ">= 0.8.0" 4515 + } 4516 + }, 4517 + "node_modules/typed-array-buffer": { 4518 + "version": "1.0.3", 4519 + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", 4520 + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", 4521 + "dev": true, 4522 + "license": "MIT", 4523 + "dependencies": { 4524 + "call-bound": "^1.0.3", 4525 + "es-errors": "^1.3.0", 4526 + "is-typed-array": "^1.1.14" 4527 + }, 4528 + "engines": { 4529 + "node": ">= 0.4" 4530 + } 4531 + }, 4532 + "node_modules/typed-array-byte-length": { 4533 + "version": "1.0.3", 4534 + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", 4535 + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", 4536 + "dev": true, 4537 + "license": "MIT", 4538 + "dependencies": { 4539 + "call-bind": "^1.0.8", 4540 + "for-each": "^0.3.3", 4541 + "gopd": "^1.2.0", 4542 + "has-proto": "^1.2.0", 4543 + "is-typed-array": "^1.1.14" 4544 + }, 4545 + "engines": { 4546 + "node": ">= 0.4" 4547 + }, 4548 + "funding": { 4549 + "url": "https://github.com/sponsors/ljharb" 4550 + } 4551 + }, 4552 + "node_modules/typed-array-byte-offset": { 4553 + "version": "1.0.4", 4554 + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", 4555 + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", 4556 + "dev": true, 4557 + "license": "MIT", 4558 + "dependencies": { 4559 + "available-typed-arrays": "^1.0.7", 4560 + "call-bind": "^1.0.8", 4561 + "for-each": "^0.3.3", 4562 + "gopd": "^1.2.0", 4563 + "has-proto": "^1.2.0", 4564 + "is-typed-array": "^1.1.15", 4565 + "reflect.getprototypeof": "^1.0.9" 4566 + }, 4567 + "engines": { 4568 + "node": ">= 0.4" 4569 + }, 4570 + "funding": { 4571 + "url": "https://github.com/sponsors/ljharb" 4572 + } 4573 + }, 4574 + "node_modules/typed-array-length": { 4575 + "version": "1.0.7", 4576 + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", 4577 + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", 4578 + "dev": true, 4579 + "license": "MIT", 4580 + "dependencies": { 4581 + "call-bind": "^1.0.7", 4582 + "for-each": "^0.3.3", 4583 + "gopd": "^1.0.1", 4584 + "is-typed-array": "^1.1.13", 4585 + "possible-typed-array-names": "^1.0.0", 4586 + "reflect.getprototypeof": "^1.0.6" 4587 + }, 4588 + "engines": { 4589 + "node": ">= 0.4" 4590 + }, 4591 + "funding": { 4592 + "url": "https://github.com/sponsors/ljharb" 4593 + } 4594 + }, 4595 + "node_modules/unbox-primitive": { 4596 + "version": "1.1.0", 4597 + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", 4598 + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", 4599 + "dev": true, 4600 + "license": "MIT", 4601 + "dependencies": { 4602 + "call-bound": "^1.0.3", 4603 + "has-bigints": "^1.0.2", 4604 + "has-symbols": "^1.1.0", 4605 + "which-boxed-primitive": "^1.1.1" 4606 + }, 4607 + "engines": { 4608 + "node": ">= 0.4" 4609 + }, 4610 + "funding": { 4611 + "url": "https://github.com/sponsors/ljharb" 4612 + } 4613 + }, 1737 4614 "node_modules/update-browserslist-db": { 1738 4615 "version": "1.2.3", 1739 4616 "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", ··· 1763 4640 }, 1764 4641 "peerDependencies": { 1765 4642 "browserslist": ">= 4.21.0" 4643 + } 4644 + }, 4645 + "node_modules/uri-js": { 4646 + "version": "4.4.1", 4647 + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 4648 + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 4649 + "dev": true, 4650 + "license": "BSD-2-Clause", 4651 + "dependencies": { 4652 + "punycode": "^2.1.0" 1766 4653 } 1767 4654 }, 1768 4655 "node_modules/vite": { ··· 1841 4728 } 1842 4729 } 1843 4730 }, 4731 + "node_modules/which": { 4732 + "version": "2.0.2", 4733 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 4734 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 4735 + "dev": true, 4736 + "license": "ISC", 4737 + "dependencies": { 4738 + "isexe": "^2.0.0" 4739 + }, 4740 + "bin": { 4741 + "node-which": "bin/node-which" 4742 + }, 4743 + "engines": { 4744 + "node": ">= 8" 4745 + } 4746 + }, 4747 + "node_modules/which-boxed-primitive": { 4748 + "version": "1.1.1", 4749 + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", 4750 + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", 4751 + "dev": true, 4752 + "license": "MIT", 4753 + "dependencies": { 4754 + "is-bigint": "^1.1.0", 4755 + "is-boolean-object": "^1.2.1", 4756 + "is-number-object": "^1.1.1", 4757 + "is-string": "^1.1.1", 4758 + "is-symbol": "^1.1.1" 4759 + }, 4760 + "engines": { 4761 + "node": ">= 0.4" 4762 + }, 4763 + "funding": { 4764 + "url": "https://github.com/sponsors/ljharb" 4765 + } 4766 + }, 4767 + "node_modules/which-builtin-type": { 4768 + "version": "1.2.1", 4769 + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", 4770 + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", 4771 + "dev": true, 4772 + "license": "MIT", 4773 + "dependencies": { 4774 + "call-bound": "^1.0.2", 4775 + "function.prototype.name": "^1.1.6", 4776 + "has-tostringtag": "^1.0.2", 4777 + "is-async-function": "^2.0.0", 4778 + "is-date-object": "^1.1.0", 4779 + "is-finalizationregistry": "^1.1.0", 4780 + "is-generator-function": "^1.0.10", 4781 + "is-regex": "^1.2.1", 4782 + "is-weakref": "^1.0.2", 4783 + "isarray": "^2.0.5", 4784 + "which-boxed-primitive": "^1.1.0", 4785 + "which-collection": "^1.0.2", 4786 + "which-typed-array": "^1.1.16" 4787 + }, 4788 + "engines": { 4789 + "node": ">= 0.4" 4790 + }, 4791 + "funding": { 4792 + "url": "https://github.com/sponsors/ljharb" 4793 + } 4794 + }, 4795 + "node_modules/which-collection": { 4796 + "version": "1.0.2", 4797 + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", 4798 + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", 4799 + "dev": true, 4800 + "license": "MIT", 4801 + "dependencies": { 4802 + "is-map": "^2.0.3", 4803 + "is-set": "^2.0.3", 4804 + "is-weakmap": "^2.0.2", 4805 + "is-weakset": "^2.0.3" 4806 + }, 4807 + "engines": { 4808 + "node": ">= 0.4" 4809 + }, 4810 + "funding": { 4811 + "url": "https://github.com/sponsors/ljharb" 4812 + } 4813 + }, 4814 + "node_modules/which-typed-array": { 4815 + "version": "1.1.20", 4816 + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", 4817 + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", 4818 + "dev": true, 4819 + "license": "MIT", 4820 + "dependencies": { 4821 + "available-typed-arrays": "^1.0.7", 4822 + "call-bind": "^1.0.8", 4823 + "call-bound": "^1.0.4", 4824 + "for-each": "^0.3.5", 4825 + "get-proto": "^1.0.1", 4826 + "gopd": "^1.2.0", 4827 + "has-tostringtag": "^1.0.2" 4828 + }, 4829 + "engines": { 4830 + "node": ">= 0.4" 4831 + }, 4832 + "funding": { 4833 + "url": "https://github.com/sponsors/ljharb" 4834 + } 4835 + }, 4836 + "node_modules/word-wrap": { 4837 + "version": "1.2.5", 4838 + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 4839 + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 4840 + "dev": true, 4841 + "license": "MIT", 4842 + "engines": { 4843 + "node": ">=0.10.0" 4844 + } 4845 + }, 1844 4846 "node_modules/yallist": { 1845 4847 "version": "3.1.1", 1846 4848 "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 1847 4849 "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 1848 4850 "dev": true, 1849 4851 "license": "ISC" 4852 + }, 4853 + "node_modules/yocto-queue": { 4854 + "version": "0.1.0", 4855 + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 4856 + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 4857 + "dev": true, 4858 + "license": "MIT", 4859 + "engines": { 4860 + "node": ">=10" 4861 + }, 4862 + "funding": { 4863 + "url": "https://github.com/sponsors/sindresorhus" 4864 + } 4865 + }, 4866 + "node_modules/zod": { 4867 + "version": "4.3.5", 4868 + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", 4869 + "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", 4870 + "dev": true, 4871 + "license": "MIT", 4872 + "peer": true, 4873 + "funding": { 4874 + "url": "https://github.com/sponsors/colinhacks" 4875 + } 4876 + }, 4877 + "node_modules/zod-validation-error": { 4878 + "version": "4.0.2", 4879 + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", 4880 + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", 4881 + "dev": true, 4882 + "license": "MIT", 4883 + "engines": { 4884 + "node": ">=18.0.0" 4885 + }, 4886 + "peerDependencies": { 4887 + "zod": "^3.25.0 || ^4.0.0" 4888 + } 1850 4889 } 1851 4890 } 1852 4891 }
+7
web/package.json
··· 6 6 "scripts": { 7 7 "dev": "vite", 8 8 "build": "vite build", 9 + "lint": "eslint .", 9 10 "preview": "vite preview" 10 11 }, 11 12 "dependencies": { ··· 16 17 "react-router-dom": "^6.28.0" 17 18 }, 18 19 "devDependencies": { 20 + "@eslint/js": "^9.39.2", 19 21 "@types/react": "^18.3.12", 20 22 "@types/react-dom": "^18.3.1", 21 23 "@vitejs/plugin-react": "^4.3.3", 24 + "eslint": "^9.39.2", 25 + "eslint-plugin-react": "^7.37.5", 26 + "eslint-plugin-react-hooks": "^7.0.1", 27 + "eslint-plugin-react-refresh": "^0.4.26", 28 + "globals": "^17.0.0", 22 29 "vite": "^6.0.3" 23 30 } 24 31 }
+3
web/src/App.jsx
··· 18 18 19 19 import Terms from "./pages/Terms"; 20 20 21 + import ScrollToTop from "./components/ScrollToTop"; 22 + 21 23 function AppContent() { 22 24 return ( 23 25 <div className="layout"> 26 + <ScrollToTop /> 24 27 <Sidebar /> 25 28 <div className="main-layout"> 26 29 <main className="main-content-wrapper">
+4 -4
web/src/components/AddToCollectionModal.jsx
··· 1 - import { useState, useEffect } from "react"; 1 + import { useState, useEffect, useCallback } from "react"; 2 2 import { X, Plus, Check, Folder } from "lucide-react"; 3 3 import { 4 4 getCollections, ··· 30 30 loadCollections(); 31 31 setError(null); 32 32 } 33 - }, [isOpen, user, annotationUri]); 33 + }, [isOpen, user, annotationUri, loadCollections]); 34 34 35 - const loadCollections = async () => { 35 + const loadCollections = useCallback(async () => { 36 36 try { 37 37 setLoading(true); 38 38 const [data, existingURIs] = await Promise.all([ ··· 49 49 } finally { 50 50 setLoading(false); 51 51 } 52 - }; 52 + }, [user?.did, annotationUri]); 53 53 54 54 const handleAdd = async (collectionUri) => { 55 55 if (addedTo.has(collectionUri)) return;
+37 -49
web/src/components/AnnotationCard.jsx
··· 5 5 import { 6 6 normalizeAnnotation, 7 7 normalizeHighlight, 8 - normalizeBookmark, 9 - deleteAnnotation, 10 8 likeAnnotation, 11 9 unlikeAnnotation, 12 10 getReplies, 13 11 createReply, 14 12 deleteReply, 15 - getLikeCount, 16 13 updateAnnotation, 17 14 updateHighlight, 18 - updateBookmark, 19 15 getEditHistory, 16 + deleteAnnotation, 20 17 } from "../api/client"; 21 18 import { 22 - HeartIcon, 23 - MessageIcon, 24 - TrashIcon, 25 - ExternalLinkIcon, 26 - HighlightIcon, 27 - BookmarkIcon, 28 - } from "./Icons"; 29 - import { Folder, Edit2, Save, X, Clock } from "lucide-react"; 19 + MessageSquare, 20 + Heart, 21 + Trash2, 22 + Folder, 23 + Edit2, 24 + Save, 25 + X, 26 + Clock, 27 + } from "lucide-react"; 28 + import { HighlightIcon, TrashIcon } from "./Icons"; 30 29 import ShareMenu from "./ShareMenu"; 31 30 32 31 function buildTextFragmentUrl(baseUrl, selector) { ··· 90 89 91 90 const [hasEditHistory, setHasEditHistory] = useState(false); 92 91 93 - useEffect(() => {}, []); 92 + useEffect(() => { 93 + if (data.uri && !data.color && !data.description) { 94 + getEditHistory(data.uri) 95 + .then((history) => { 96 + if (history && history.length > 0) { 97 + setHasEditHistory(true); 98 + } 99 + }) 100 + .catch(() => {}); 101 + } 102 + }, [data.uri, data.color, data.description]); 94 103 95 104 const fetchHistory = async () => { 96 105 if (showHistory) { ··· 216 225 } 217 226 }; 218 227 219 - const handleShare = async () => { 220 - const uriParts = data.uri.split("/"); 221 - const did = uriParts[2]; 222 - const rkey = uriParts[uriParts.length - 1]; 223 - const shareUrl = `${window.location.origin}/at/${did}/${rkey}`; 224 - 225 - if (navigator.share) { 226 - try { 227 - await navigator.share({ 228 - title: "Margin Annotation", 229 - text: data.text?.substring(0, 100), 230 - url: shareUrl, 231 - }); 232 - } catch (err) {} 233 - } else { 234 - try { 235 - await navigator.clipboard.writeText(shareUrl); 236 - alert("Link copied!"); 237 - } catch { 238 - prompt("Copy this link:", shareUrl); 239 - } 240 - } 241 - }; 242 - 243 228 const handleDelete = async () => { 244 229 if (!confirm("Delete this annotation? This cannot be undone.")) return; 245 230 try { ··· 324 309 disabled={deleting} 325 310 title="Delete" 326 311 > 327 - <TrashIcon size={16} /> 312 + <Trash2 size={16} /> 328 313 </button> 329 314 </> 330 315 )} ··· 386 371 borderLeftColor: data.color || "var(--accent)", 387 372 }} 388 373 > 389 - <mark>"{highlightedText}"</mark> 374 + <mark>&quot;{highlightedText}&quot;</mark> 390 375 </a> 391 376 )} 392 377 ··· 454 439 className={`annotation-action ${isLiked ? "liked" : ""}`} 455 440 onClick={handleLike} 456 441 > 457 - <HeartIcon filled={isLiked} size={16} /> 442 + <Heart filled={isLiked} size={16} /> 458 443 {likeCount > 0 && <span>{likeCount}</span>} 459 444 </button> 460 445 <button ··· 471 456 setShowReplies(!showReplies); 472 457 }} 473 458 > 474 - <MessageIcon size={16} /> 459 + <MessageSquare size={16} /> 475 460 <span>{replyCount > 0 ? `${replyCount}` : "Reply"}</span> 476 461 </button> 477 462 <ShareMenu ··· 561 546 onChange={(e) => setReplyText(e.target.value)} 562 547 onFocus={(e) => { 563 548 if (!user) { 564 - e.target.blur(); 565 - login(); 549 + e.preventDefault(); 550 + alert("Please sign in to like annotations"); 566 551 } 567 552 }} 568 553 rows={2} ··· 589 574 ); 590 575 } 591 576 592 - export function HighlightCard({ highlight, onDelete, onAddToCollection }) { 577 + export function HighlightCard({ 578 + highlight, 579 + onDelete, 580 + onAddToCollection, 581 + onUpdate, 582 + }) { 593 583 const { user, login } = useAuth(); 594 584 const data = normalizeHighlight(highlight); 595 585 const highlightedText = ··· 609 599 610 600 await updateHighlight(data.uri, editColor, tagList); 611 601 setIsEditing(false); 612 - 613 - if (highlight.color) highlight.color = editColor; 614 - if (highlight.tags) highlight.tags = tagList; 615 - else highlight.value = { ...highlight.value, tags: tagList }; 602 + if (typeof onUpdate === "function") 603 + onUpdate({ ...highlight, color: editColor, tags: tagList }); 616 604 } catch (err) { 617 605 alert("Failed to update: " + err.message); 618 606 } ··· 720 708 borderLeftColor: isEditing ? editColor : data.color || "#f59e0b", 721 709 }} 722 710 > 723 - <mark>"{highlightedText}"</mark> 711 + <mark>&quot;{highlightedText}&quot;</mark> 724 712 </a> 725 713 )} 726 714
-2
web/src/components/AnnotationSkeleton.jsx
··· 1 - import React from "react"; 2 - 3 1 export default function AnnotationSkeleton() { 4 2 return ( 5 3 <div className="skeleton-card">
+20 -10
web/src/components/BookmarkCard.jsx
··· 9 9 getLikeCount, 10 10 deleteBookmark, 11 11 } from "../api/client"; 12 - import { HeartIcon, TrashIcon, ExternalLinkIcon, BookmarkIcon } from "./Icons"; 12 + import { HeartIcon, TrashIcon, BookmarkIcon } from "./Icons"; 13 13 import { Folder } from "lucide-react"; 14 14 import ShareMenu from "./ShareMenu"; 15 15 16 - export default function BookmarkCard({ bookmark, onAddToCollection }) { 16 + export default function BookmarkCard({ 17 + bookmark, 18 + onAddToCollection, 19 + onDelete, 20 + }) { 17 21 const { user, login } = useAuth(); 18 22 const raw = bookmark; 19 23 const data = ··· 34 38 if (likeRes.count !== undefined) setLikeCount(likeRes.count); 35 39 if (likeRes.liked !== undefined) setIsLiked(likeRes.liked); 36 40 } 37 - } catch (err) { 38 - console.error("Failed to fetch data:", err); 41 + } catch { 42 + /* ignore */ 39 43 } 40 44 } 41 45 if (data.uri) fetchData(); ··· 60 64 const cid = data.cid || ""; 61 65 if (data.uri && cid) await likeAnnotation(data.uri, cid); 62 66 } 63 - } catch (err) { 67 + } catch { 64 68 setIsLiked(!isLiked); 65 69 setLikeCount((prev) => (isLiked ? prev + 1 : prev - 1)); 66 70 } 67 71 }; 68 72 69 73 const handleDelete = async () => { 74 + if (onDelete) { 75 + onDelete(data.uri); 76 + return; 77 + } 78 + 70 79 if (!confirm("Delete this bookmark?")) return; 71 80 try { 72 81 setDeleting(true); 73 82 const parts = data.uri.split("/"); 74 83 const rkey = parts[parts.length - 1]; 75 84 await deleteBookmark(rkey); 76 - if (onDelete) onDelete(data.uri); 77 - else window.location.reload(); 85 + window.location.reload(); 78 86 } catch (err) { 79 87 alert("Failed to delete: " + err.message); 80 88 } finally { ··· 100 108 let domain = ""; 101 109 try { 102 110 if (data.url) domain = new URL(data.url).hostname.replace("www.", ""); 103 - } catch {} 111 + } catch { 112 + /* ignore */ 113 + } 104 114 105 115 const authorDisplayName = data.author?.displayName || data.author?.handle; 106 116 const authorHandle = data.author?.handle; ··· 109 119 const marginProfileUrl = authorDid ? `/profile/${authorDid}` : null; 110 120 111 121 return ( 112 - <article className="card bookmark-card"> 122 + <article className="card annotation-card bookmark-card"> 113 123 <header className="annotation-header"> 114 124 <div className="annotation-header-left"> 115 125 <Link to={marginProfileUrl || "#"} className="annotation-avatar-link"> ··· 150 160 151 161 <div className="annotation-header-right"> 152 162 <div style={{ display: "flex", gap: "4px" }}> 153 - {isOwner && ( 163 + {(isOwner || onDelete) && ( 154 164 <button 155 165 className="annotation-action action-icon-only" 156 166 onClick={handleDelete}
-1
web/src/components/CollectionItemCard.jsx
··· 1 - import React from "react"; 2 1 import { Link } from "react-router-dom"; 3 2 import AnnotationCard, { HighlightCard } from "./AnnotationCard"; 4 3 import BookmarkCard from "./BookmarkCard";
-7
web/src/components/CollectionModal.jsx
··· 12 12 Camera, 13 13 Code, 14 14 Globe, 15 - Lock, 16 15 Flag, 17 16 Tag, 18 17 Box, ··· 21 20 Image, 22 21 Video, 23 22 Mail, 24 - Phone, 25 23 MapPin, 26 24 Calendar, 27 25 Clock, ··· 31 29 Users, 32 30 Home, 33 31 Briefcase, 34 - ShoppingBag, 35 32 Gift, 36 33 Award, 37 34 Target, 38 35 TrendingUp, 39 - BarChart, 40 - PieChart, 41 36 Activity, 42 37 Cpu, 43 38 Database, ··· 46 41 Moon, 47 42 Flame, 48 43 Leaf, 49 - Droplet, 50 - Snowflake, 51 44 } from "lucide-react"; 52 45 import { createCollection, updateCollection } from "../api/client"; 53 46
+1 -1
web/src/components/Composer.jsx
··· 91 91 × 92 92 </button> 93 93 <blockquote> 94 - <mark className="quote-exact">"{highlightedText}"</mark> 94 + <mark className="quote-exact">&quot;{highlightedText}&quot;</mark> 95 95 </blockquote> 96 96 </div> 97 97 )}
-1
web/src/components/ReplyList.jsx
··· 1 - import React from "react"; 2 1 import { Link } from "react-router-dom"; 3 2 import { MessageSquare, Trash2, Reply } from "lucide-react"; 4 3
+1 -6
web/src/components/RightSidebar.jsx
··· 1 1 import { useState, useEffect } from "react"; 2 2 import { Link } from "react-router-dom"; 3 - import { Download, ExternalLink } from "lucide-react"; 3 + import { ExternalLink } from "lucide-react"; 4 4 import { SiFirefox, SiGooglechrome, SiGithub, SiBluesky } from "react-icons/si"; 5 5 import { FaEdge } from "react-icons/fa"; 6 6 import { useAuth } from "../context/AuthContext"; 7 7 import { getTrendingTags } from "../api/client"; 8 - import tangledIcon from "../assets/tangled.svg"; 9 8 10 9 const isFirefox = 11 10 typeof navigator !== "undefined" && /Firefox/i.test(navigator.userAgent); 12 11 const isEdge = 13 12 typeof navigator !== "undefined" && /Edg/i.test(navigator.userAgent); 14 - const isChrome = 15 - typeof navigator !== "undefined" && 16 - /Chrome/i.test(navigator.userAgent) && 17 - !isEdge; 18 13 19 14 function getExtensionInfo() { 20 15 if (isFirefox) {
+12
web/src/components/ScrollToTop.jsx
··· 1 + import { useEffect } from "react"; 2 + import { useLocation } from "react-router-dom"; 3 + 4 + export default function ScrollToTop() { 5 + const { pathname } = useLocation(); 6 + 7 + useEffect(() => { 8 + window.scrollTo(0, 0); 9 + }, [pathname]); 10 + 11 + return null; 12 + }
+3 -1
web/src/components/ShareMenu.jsx
··· 171 171 text: text?.substring(0, 100), 172 172 url: shareUrl, 173 173 }); 174 - } catch {} 174 + } catch { 175 + /* ignore */ 176 + } 175 177 } 176 178 setIsOpen(false); 177 179 };
+4 -1
web/src/context/AuthContext.jsx
··· 48 48 const handleLogout = async () => { 49 49 try { 50 50 await logout(); 51 - } catch {} 51 + } catch (e) { 52 + console.warn("Logout failed", e); 53 + } 52 54 setUser(null); 53 55 }; 54 56 ··· 64 66 return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>; 65 67 } 66 68 69 + // eslint-disable-next-line react-refresh/only-export-components 67 70 export function useAuth() { 68 71 const context = useContext(AuthContext); 69 72 if (!context) {
+3
web/src/css/base.css
··· 41 41 html { 42 42 font-size: 16px; 43 43 -webkit-text-size-adjust: 100%; 44 + overflow-x: hidden; 44 45 } 45 46 46 47 body { ··· 51 52 min-height: 100vh; 52 53 -webkit-font-smoothing: antialiased; 53 54 -moz-osx-font-smoothing: grayscale; 55 + overflow-x: hidden; 56 + max-width: 100vw; 54 57 } 55 58 56 59 a {
+2
web/src/css/layout.css
··· 455 455 456 456 .main-content-wrapper { 457 457 padding: 20px 16px; 458 + max-width: 100%; 459 + overflow-x: hidden; 458 460 } 459 461 460 462 .mobile-nav {
+155 -155
web/src/css/profile.css
··· 1 1 .profile-header { 2 - display: flex; 3 - align-items: center; 4 - gap: 24px; 5 - margin-bottom: 32px; 6 - padding-bottom: 24px; 7 - border-bottom: 1px solid var(--border); 2 + display: flex; 3 + align-items: center; 4 + gap: 24px; 5 + margin-bottom: 32px; 6 + padding-bottom: 24px; 7 + border-bottom: 1px solid var(--border); 8 8 } 9 9 10 10 .profile-avatar { 11 - width: 80px; 12 - height: 80px; 13 - min-width: 80px; 14 - border-radius: 50%; 15 - background: var(--bg-tertiary); 16 - display: flex; 17 - align-items: center; 18 - justify-content: center; 19 - font-weight: 600; 20 - font-size: 2rem; 21 - color: var(--text-secondary); 22 - overflow: hidden; 23 - border: 1px solid var(--border); 11 + width: 80px; 12 + height: 80px; 13 + min-width: 80px; 14 + border-radius: 50%; 15 + background: var(--bg-tertiary); 16 + display: flex; 17 + align-items: center; 18 + justify-content: center; 19 + font-weight: 600; 20 + font-size: 2rem; 21 + color: var(--text-secondary); 22 + overflow: hidden; 23 + border: 1px solid var(--border); 24 24 } 25 25 26 26 .profile-avatar img { 27 - width: 100%; 28 - height: 100%; 29 - object-fit: cover; 27 + width: 100%; 28 + height: 100%; 29 + object-fit: cover; 30 30 } 31 31 32 32 .profile-avatar-link { 33 - text-decoration: none; 33 + text-decoration: none; 34 34 } 35 35 36 36 .profile-info { 37 - flex: 1; 38 - display: flex; 39 - flex-direction: column; 40 - gap: 4px; 37 + flex: 1; 38 + display: flex; 39 + flex-direction: column; 40 + gap: 4px; 41 41 } 42 42 43 43 .profile-name { 44 - font-size: 1.5rem; 45 - font-weight: 700; 46 - color: var(--text-primary); 47 - line-height: 1.2; 44 + font-size: 1.5rem; 45 + font-weight: 700; 46 + color: var(--text-primary); 47 + line-height: 1.2; 48 48 } 49 49 50 50 .profile-handle-row { 51 - display: flex; 52 - align-items: center; 53 - gap: 12px; 54 - margin-top: 4px; 55 - flex-wrap: wrap; 51 + display: flex; 52 + align-items: center; 53 + gap: 12px; 54 + margin-top: 4px; 55 + flex-wrap: wrap; 56 56 } 57 57 58 58 .profile-handle-link { 59 - color: var(--text-tertiary); 60 - text-decoration: none; 61 - font-size: 1rem; 62 - transition: color 0.15s; 59 + color: var(--text-tertiary); 60 + text-decoration: none; 61 + font-size: 1rem; 62 + transition: color 0.15s; 63 63 } 64 64 65 65 .profile-handle-link:hover { 66 - color: var(--text-secondary); 66 + color: var(--text-secondary); 67 67 } 68 68 69 69 .profile-bluesky-link { 70 - display: inline-flex; 71 - align-items: center; 72 - gap: 6px; 73 - color: #3b82f6; 74 - text-decoration: none; 75 - font-size: 0.85rem; 76 - font-weight: 500; 77 - padding: 2px 8px; 78 - border-radius: var(--radius-sm); 79 - background: rgba(59, 130, 246, 0.1); 80 - transition: all 0.15s ease; 70 + display: inline-flex; 71 + align-items: center; 72 + gap: 6px; 73 + color: #3b82f6; 74 + text-decoration: none; 75 + font-size: 0.85rem; 76 + font-weight: 500; 77 + padding: 2px 8px; 78 + border-radius: var(--radius-sm); 79 + background: rgba(59, 130, 246, 0.1); 80 + transition: all 0.15s ease; 81 81 } 82 82 83 83 .profile-bluesky-link:hover { 84 - background: rgba(59, 130, 246, 0.15); 84 + background: rgba(59, 130, 246, 0.15); 85 85 } 86 86 87 87 .profile-stats { 88 - display: flex; 89 - gap: 24px; 90 - margin-top: 12px; 88 + display: flex; 89 + gap: 24px; 90 + margin-top: 12px; 91 91 } 92 92 93 93 .profile-stat { 94 - color: var(--text-tertiary); 95 - font-size: 0.9rem; 94 + color: var(--text-tertiary); 95 + font-size: 0.9rem; 96 96 } 97 97 98 98 .profile-stat strong { 99 - color: var(--text-primary); 100 - font-weight: 600; 99 + color: var(--text-primary); 100 + font-weight: 600; 101 101 } 102 102 103 103 .profile-tabs { 104 - display: flex; 105 - gap: 24px; 106 - margin-bottom: 24px; 107 - border-bottom: 1px solid var(--border); 104 + display: flex; 105 + gap: 24px; 106 + margin-bottom: 24px; 107 + border-bottom: 1px solid var(--border); 108 108 } 109 109 110 110 .profile-tab { 111 - padding: 12px 0; 112 - font-size: 0.95rem; 113 - font-weight: 500; 114 - color: var(--text-tertiary); 115 - background: transparent; 116 - border: none; 117 - cursor: pointer; 118 - transition: all 0.15s ease; 119 - position: relative; 111 + padding: 12px 0; 112 + font-size: 0.95rem; 113 + font-weight: 500; 114 + color: var(--text-tertiary); 115 + background: transparent; 116 + border: none; 117 + cursor: pointer; 118 + transition: all 0.15s ease; 119 + position: relative; 120 120 } 121 121 122 122 .profile-tab:hover { 123 - color: var(--text-primary); 123 + color: var(--text-primary); 124 124 } 125 125 126 126 .profile-tab.active { 127 - color: var(--text-primary); 127 + color: var(--text-primary); 128 128 } 129 129 130 130 .profile-tab.active::after { 131 - content: ""; 132 - position: absolute; 133 - bottom: -1px; 134 - left: 0; 135 - right: 0; 136 - height: 2px; 137 - background: var(--text-primary); 131 + content: ""; 132 + position: absolute; 133 + bottom: -1px; 134 + left: 0; 135 + right: 0; 136 + height: 2px; 137 + background: var(--text-primary); 138 138 } 139 139 140 140 .profile-badge-wrapper { 141 - display: inline-flex; 142 - align-items: center; 141 + display: inline-flex; 142 + align-items: center; 143 143 } 144 144 145 145 .profile-badge-clickable { 146 - position: relative; 147 - display: inline-flex; 148 - align-items: center; 149 - cursor: pointer; 150 - margin-left: 8px; 146 + position: relative; 147 + display: inline-flex; 148 + align-items: center; 149 + cursor: pointer; 150 + margin-left: 8px; 151 151 } 152 152 153 153 .badge-info-popover { 154 - position: absolute; 155 - top: calc(100% + 8px); 156 - left: 50%; 157 - transform: translateX(-50%); 158 - padding: 16px; 159 - background: var(--bg-elevated); 160 - border: 1px solid var(--border); 161 - border-radius: var(--radius-md); 162 - box-shadow: var(--shadow-lg); 163 - font-size: 0.85rem; 164 - white-space: nowrap; 165 - z-index: 100; 166 - min-width: 200px; 154 + position: absolute; 155 + top: calc(100% + 8px); 156 + left: 50%; 157 + transform: translateX(-50%); 158 + padding: 16px; 159 + background: var(--bg-elevated); 160 + border: 1px solid var(--border); 161 + border-radius: var(--radius-md); 162 + box-shadow: var(--shadow-lg); 163 + font-size: 0.85rem; 164 + white-space: nowrap; 165 + z-index: 100; 166 + min-width: 200px; 167 167 } 168 168 169 169 .badge-info-title { 170 - font-weight: 600; 171 - color: var(--text-primary); 172 - margin-bottom: 8px; 170 + font-weight: 600; 171 + color: var(--text-primary); 172 + margin-bottom: 8px; 173 173 } 174 174 175 175 .verifier-link { 176 - display: flex; 177 - align-items: center; 178 - gap: 8px; 179 - padding: 8px; 180 - background: var(--bg-tertiary); 181 - border-radius: var(--radius-sm); 182 - text-decoration: none; 183 - transition: background 0.15s ease; 176 + display: flex; 177 + align-items: center; 178 + gap: 8px; 179 + padding: 8px; 180 + background: var(--bg-tertiary); 181 + border-radius: var(--radius-sm); 182 + text-decoration: none; 183 + transition: background 0.15s ease; 184 184 } 185 185 186 186 .verifier-link:hover { 187 - background: var(--bg-hover); 187 + background: var(--bg-hover); 188 188 } 189 189 190 190 .verifier-avatar { 191 - width: 24px; 192 - height: 24px; 193 - border-radius: 50%; 194 - object-fit: cover; 191 + width: 24px; 192 + height: 24px; 193 + border-radius: 50%; 194 + object-fit: cover; 195 195 } 196 196 197 197 .verifier-name { 198 - color: var(--text-primary); 199 - font-size: 0.85rem; 200 - font-weight: 500; 198 + color: var(--text-primary); 199 + font-size: 0.85rem; 200 + font-weight: 500; 201 201 } 202 202 203 203 .profile-suspended { 204 - display: flex; 205 - flex-direction: column; 206 - align-items: center; 207 - justify-content: center; 208 - padding: 60px 20px; 209 - text-align: center; 210 - background: var(--bg-secondary); 211 - border-radius: var(--radius-lg); 212 - margin-top: 20px; 213 - border: 1px solid var(--border); 204 + display: flex; 205 + flex-direction: column; 206 + align-items: center; 207 + justify-content: center; 208 + padding: 60px 20px; 209 + text-align: center; 210 + background: var(--bg-secondary); 211 + border-radius: var(--radius-lg); 212 + margin-top: 20px; 213 + border: 1px solid var(--border); 214 214 } 215 215 216 216 .suspended-icon { 217 - font-size: 40px; 218 - margin-bottom: 16px; 219 - color: var(--text-tertiary); 217 + font-size: 40px; 218 + margin-bottom: 16px; 219 + color: var(--text-tertiary); 220 220 } 221 221 222 222 .profile-suspended h2 { 223 - color: var(--text-primary); 224 - margin-bottom: 8px; 225 - font-size: 1.25rem; 223 + color: var(--text-primary); 224 + margin-bottom: 8px; 225 + font-size: 1.25rem; 226 226 } 227 227 228 228 @media (max-width: 640px) { 229 - .profile-header { 230 - flex-direction: column; 231 - text-align: center; 232 - } 229 + .profile-header { 230 + flex-direction: column; 231 + text-align: center; 232 + } 233 233 234 - .profile-info { 235 - align-items: center; 236 - } 234 + .profile-info { 235 + align-items: center; 236 + } 237 237 238 - .profile-handle-row { 239 - justify-content: center; 240 - } 238 + .profile-handle-row { 239 + justify-content: center; 240 + } 241 241 242 - .profile-stats { 243 - justify-content: center; 244 - } 242 + .profile-stats { 243 + justify-content: center; 244 + } 245 245 246 - .profile-tabs { 247 - justify-content: center; 248 - gap: 16px; 249 - } 250 - } 246 + .profile-tabs { 247 + justify-content: center; 248 + gap: 16px; 249 + } 250 + }
+7 -7
web/src/pages/Bookmarks.jsx
··· 1 - import { useState, useEffect } from "react"; 1 + import { useState, useEffect, useCallback } from "react"; 2 2 import { Link } from "react-router-dom"; 3 3 import { Plus } from "lucide-react"; 4 4 import { useAuth } from "../context/AuthContext"; ··· 22 22 const [submitting, setSubmitting] = useState(false); 23 23 const [fetchingTitle, setFetchingTitle] = useState(false); 24 24 25 - const loadBookmarks = async () => { 25 + const loadBookmarks = useCallback(async () => { 26 26 if (!user?.did) return; 27 27 28 28 try { ··· 35 35 } finally { 36 36 setLoadingBookmarks(false); 37 37 } 38 - }; 38 + }, [user]); 39 39 40 40 useEffect(() => { 41 41 if (isAuthenticated && user) { 42 42 loadBookmarks(); 43 43 } 44 - }, [isAuthenticated, user]); 44 + }, [isAuthenticated, user, loadBookmarks]); 45 45 46 46 const handleDelete = async (uri) => { 47 47 if (!confirm("Delete this bookmark?")) return; ··· 133 133 > 134 134 <div> 135 135 <h1 className="page-title">My Bookmarks</h1> 136 - <p className="page-description">Pages you've saved for later</p> 136 + <p className="page-description">Pages you&apos;ve saved for later</p> 137 137 </div> 138 138 <button 139 139 onClick={() => setShowAddForm(!showAddForm)} ··· 274 274 </div> 275 275 <h3 className="empty-state-title">No bookmarks yet</h3> 276 276 <p className="empty-state-text"> 277 - Click "Add Bookmark" above to save a page, or use the browser 278 - extension. 277 + Click &quot;Add Bookmark&quot; above to save a page, or use the 278 + browser extension. 279 279 </p> 280 280 </div> 281 281 ) : (
+4 -4
web/src/pages/CollectionDetail.jsx
··· 1 - import { useState, useEffect } from "react"; 1 + import { useState, useEffect, useCallback } from "react"; 2 2 import { useParams, useNavigate, Link, useLocation } from "react-router-dom"; 3 3 import { ArrowLeft, Edit2, Trash2, Plus } from "lucide-react"; 4 4 import { ··· 34 34 user?.did && 35 35 (collection?.creator?.did === user.did || paramAuthorDid === user.did); 36 36 37 - const fetchContext = async () => { 37 + const fetchContext = useCallback(async () => { 38 38 try { 39 39 setLoading(true); 40 40 ··· 96 96 } finally { 97 97 setLoading(false); 98 98 } 99 - }; 99 + }, [paramAuthorDid, user, handle, rkey, wildcardPath]); 100 100 101 101 useEffect(() => { 102 102 fetchContext(); 103 - }, [rkey, wildcardPath, handle, paramAuthorDid, user?.did]); 103 + }, [fetchContext]); 104 104 105 105 const handleEditSuccess = () => { 106 106 fetchContext();
+5 -6
web/src/pages/Collections.jsx
··· 1 - import { useState, useEffect } from "react"; 2 - import { Link } from "react-router-dom"; 3 - import { Folder, Plus, Edit2, ChevronRight } from "lucide-react"; 1 + import { useState, useEffect, useCallback } from "react"; 2 + import { Folder, Plus } from "lucide-react"; 4 3 import { getCollections } from "../api/client"; 5 4 import { useAuth } from "../context/AuthContext"; 6 5 import CollectionModal from "../components/CollectionModal"; ··· 14 13 const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); 15 14 const [editingCollection, setEditingCollection] = useState(null); 16 15 17 - const fetchCollections = async () => { 16 + const fetchCollections = useCallback(async () => { 18 17 try { 19 18 setLoading(true); 20 19 const data = await getCollections(user.did); ··· 25 24 } finally { 26 25 setLoading(false); 27 26 } 28 - }; 27 + }, [user]); 29 28 30 29 useEffect(() => { 31 30 if (user) { 32 31 fetchCollections(); 33 32 } 34 - }, [user]); 33 + }, [user, fetchCollections]); 35 34 36 35 const handleCreateSuccess = () => { 37 36 fetchCollections();
+1 -1
web/src/pages/Highlights.jsx
··· 77 77 <div className="page-header"> 78 78 <h1 className="page-title">My Highlights</h1> 79 79 <p className="page-description"> 80 - Text you've highlighted across the web 80 + Text you&apos;ve highlighted across the web 81 81 </p> 82 82 </div> 83 83
+24 -22
web/src/pages/Login.jsx
··· 23 23 const isSelectionRef = useRef(false); 24 24 25 25 useEffect(() => { 26 - if (handle.length < 3) { 27 - setSuggestions([]); 28 - setShowSuggestions(false); 29 - return; 30 - } 26 + if (handle.length >= 3) { 27 + if (isSelectionRef.current) { 28 + isSelectionRef.current = false; 29 + return; 30 + } 31 31 32 - if (isSelectionRef.current) { 33 - isSelectionRef.current = false; 34 - return; 32 + const timer = setTimeout(async () => { 33 + try { 34 + const data = await searchActors(handle); 35 + setSuggestions(data.actors || []); 36 + setShowSuggestions(true); 37 + setSelectedIndex(-1); 38 + } catch (e) { 39 + console.error("Search failed:", e); 40 + } 41 + }, 300); 42 + return () => clearTimeout(timer); 35 43 } 36 - 37 - const timer = setTimeout(async () => { 38 - try { 39 - const data = await searchActors(handle); 40 - setSuggestions(data.actors || []); 41 - setShowSuggestions(true); 42 - setSelectedIndex(-1); 43 - } catch (e) { 44 - console.error("Search failed:", e); 45 - } 46 - }, 300); 47 - 48 - return () => clearTimeout(timer); 49 44 }, [handle]); 50 45 51 46 useEffect(() => { ··· 178 173 className="login-input" 179 174 placeholder="yourname.bsky.social" 180 175 value={handle} 181 - onChange={(e) => setHandle(e.target.value)} 176 + onChange={(e) => { 177 + const val = e.target.value; 178 + setHandle(val); 179 + if (val.length < 3) { 180 + setSuggestions([]); 181 + setShowSuggestions(false); 182 + } 183 + }} 182 184 onKeyDown={handleKeyDown} 183 185 onFocus={() => 184 186 handle.length >= 3 &&
+2 -1
web/src/pages/Notifications.jsx
··· 156 156 <BellIcon size={48} /> 157 157 <h3>No notifications yet</h3> 158 158 <p> 159 - When someone likes or replies to your content, you'll see it here 159 + When someone likes or replies to your content, you&apos;ll see it 160 + here 160 161 </p> 161 162 </div> 162 163 )}
+7 -7
web/src/pages/Privacy.jsx
··· 16 16 <section> 17 17 <h2>Overview</h2> 18 18 <p> 19 - Margin ("we", "our", or "us") is a web annotation tool that lets you 20 - highlight, annotate, and bookmark any webpage. Your data is stored 21 - on the decentralized AT Protocol network, giving you ownership and 22 - control over your content. 19 + Margin (&quot;we&quot;, &quot;our&quot;, or &quot;us&quot;) is a web 20 + annotation tool that lets you highlight, annotate, and bookmark any 21 + webpage. Your data is stored on the decentralized AT Protocol 22 + network, giving you ownership and control over your content. 23 23 </p> 24 24 </section> 25 25 ··· 111 111 <strong>Cookies:</strong> To maintain your logged-in session 112 112 </li> 113 113 <li> 114 - <strong>Tabs:</strong> To know which page you're viewing 114 + <strong>Tabs:</strong> To know which page you&apos;re viewing 115 115 </li> 116 116 </ul> 117 117 </section> ··· 121 121 <p>You can:</p> 122 122 <ul> 123 123 <li> 124 - Delete any annotation, highlight, or bookmark you've created 124 + Delete any annotation, highlight, or bookmark you&apos;ve created 125 125 </li> 126 126 <li>Delete your collections</li> 127 127 <li>Export your data from your PDS</li> 128 - <li>Revoke the extension's access at any time</li> 128 + <li>Revoke the extension&apos;s access at any time</li> 129 129 </ul> 130 130 </section> 131 131
+4 -4
web/src/pages/Profile.jsx
··· 89 89 </div> 90 90 <h3 className="empty-state-title">No annotations</h3> 91 91 <p className="empty-state-text"> 92 - This user hasn't posted any annotations. 92 + This user hasn&apos;t posted any annotations. 93 93 </p> 94 94 </div> 95 95 ); ··· 108 108 </div> 109 109 <h3 className="empty-state-title">No highlights</h3> 110 110 <p className="empty-state-text"> 111 - This user hasn't saved any highlights. 111 + This user hasn&apos;t saved any highlights. 112 112 </p> 113 113 </div> 114 114 ); ··· 125 125 </div> 126 126 <h3 className="empty-state-title">No bookmarks</h3> 127 127 <p className="empty-state-text"> 128 - This user hasn't bookmarked any pages. 128 + This user hasn&apos;t bookmarked any pages. 129 129 </p> 130 130 </div> 131 131 ); ··· 142 142 </div> 143 143 <h3 className="empty-state-title">No collections</h3> 144 144 <p className="empty-state-text"> 145 - This user hasn't created any collections. 145 + This user hasn&apos;t created any collections. 146 146 </p> 147 147 </div> 148 148 );
+7 -7
web/src/pages/Terms.jsx
··· 17 17 <h2>Overview</h2> 18 18 <p> 19 19 Margin is an open-source project. By using our service, you agree to 20 - these terms ("Terms"). If you do not agree to these Terms, please do 21 - not use the Service. 20 + these terms (&quot;Terms&quot;). If you do not agree to these Terms, 21 + please do not use the Service. 22 22 </p> 23 23 </section> 24 24 ··· 26 26 <h2>Open Source</h2> 27 27 <p> 28 28 Margin is open source software. The code is available publicly and 29 - is provided "as is", without warranty of any kind, express or 30 - implied. 29 + is provided &quot;as is&quot;, without warranty of any kind, express 30 + or implied. 31 31 </p> 32 32 </section> 33 33 ··· 62 62 <section> 63 63 <h2>Disclaimer</h2> 64 64 <p> 65 - THE SERVICE IS PROVIDED "AS IS" AND "AS AVAILABLE". WE DISCLAIM ALL 66 - CONDITIONS, REPRESENTATIONS AND WARRANTIES NOT EXPRESSLY SET OUT IN 67 - THESE TERMS. 65 + THE SERVICE IS PROVIDED &quot;AS IS&quot; AND &quot;AS 66 + AVAILABLE&quot;. WE DISCLAIM ALL CONDITIONS, REPRESENTATIONS AND 67 + WARRANTIES NOT EXPRESSLY SET OUT IN THESE TERMS. 68 68 </p> 69 69 </section> 70 70