@@ -347,6 +347,62 @@ a:focus-visible { outline: 2px solid var(--accent-light); outline-offset: 2px; b
347347 font-size: 15px;
348348 display: none;
349349}
350+ .no-results a { cursor: pointer; }
351+ .submit-box {
352+ max-width: 480px;
353+ margin: 16px auto 0;
354+ }
355+ .submit-label {
356+ font-size: 13px;
357+ color: var(--text-muted);
358+ margin-bottom: 6px;
359+ }
360+ .submit-row {
361+ display: flex;
362+ gap: 8px;
363+ }
364+ .submit-input {
365+ flex: 1;
366+ padding: 10px 14px;
367+ background: var(--bg-card);
368+ border: 1px solid var(--border);
369+ border-radius: var(--radius);
370+ color: var(--text);
371+ font-size: 14px;
372+ font-family: var(--mono);
373+ outline: none;
374+ transition: border-color 0.2s;
375+ }
376+ .submit-input:focus { border-color: var(--accent); }
377+ .submit-input::placeholder { color: var(--text-muted); font-family: var(--font); }
378+ .submit-btn {
379+ padding: 10px 20px;
380+ background: var(--accent);
381+ color: #fff;
382+ border: none;
383+ border-radius: var(--radius);
384+ font-size: 14px;
385+ font-weight: 600;
386+ font-family: inherit;
387+ cursor: pointer;
388+ white-space: nowrap;
389+ transition: background 0.2s;
390+ opacity: 0.4;
391+ pointer-events: none;
392+ }
393+ .submit-btn.active {
394+ opacity: 1;
395+ pointer-events: auto;
396+ }
397+ .submit-btn.active:hover { background: var(--accent-light); }
398+ .submit-preview {
399+ margin-top: 8px;
400+ font-size: 13px;
401+ color: var(--green);
402+ font-family: var(--mono);
403+ display: none;
404+ }
405+ .submit-preview.visible { display: block; }
350406@media (max-width: 768px) {
351407 .container { padding: 0 16px; }
352408 .hero { padding: 40px 0 32px; }
@@ -357,6 +413,9 @@ a:focus-visible { outline: 2px solid var(--accent-light); outline-offset: 2px; b
357413 .card { padding: 18px; }
358414 .section-title { font-size: 18px; }
359415 .site-footer { margin-top: 40px; padding: 24px 0; }
416+ .submit-row { flex-direction: column; }
417+ .submit-btn { width: 100%; }
418+ .site-nav { gap: 10px; flex-wrap: wrap; justify-content: flex-end; }
360419}
361420 </style>
362421</head>
@@ -399,9 +458,20 @@ a:focus-visible { outline: 2px solid var(--accent-light); outline-offset: 2px; b
399458 <svg class="search-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/></svg>
400459 <input type="text" class="search-input" id="search" placeholder="Search repositories..." autocomplete="off">
401460 </div>
461+ <div class="submit-box">
462+ <div class="submit-label">Don't see your repo? Paste a URL to generate arch docs:</div>
463+ <div class="submit-row">
464+ <input type="text" class="submit-input" id="submit-url" placeholder="https://github.com/owner/repo" autocomplete="off" spellcheck="false">
465+ <button class="submit-btn" id="submit-btn" type="button">Request</button>
466+ </div>
467+ <div class="submit-preview" id="submit-preview"></div>
468+ </div>
402469 </div>
403470
404- <div id="no-results" class="no-results">No repositories match your search.</div>
471+ <div id="no-results" class="no-results">
472+ No repositories match your search.
473+ <br><a id="no-results-request">Request docs for this repo →</a>
474+ </div>
405475
406476 {{range .Categories}}
407477 <div class="section" data-section="{{.Slug}}">
@@ -434,12 +504,19 @@ a:focus-visible { outline: 2px solid var(--accent-light); outline-offset: 2px; b
434504
435505 <script>
436506 (function() {
437- var input = document.getElementById('search');
507+ var searchInput = document.getElementById('search');
438508 var cards = document.querySelectorAll('.card');
439509 var sections = document.querySelectorAll('.section');
440510 var noResults = document.getElementById('no-results');
511+ var submitInput = document.getElementById('submit-url');
512+ var submitBtn = document.getElementById('submit-btn');
513+ var submitPreview = document.getElementById('submit-preview');
514+ var noResultsRequest = document.getElementById('no-results-request');
515+
516+ var issueBase = 'https://github.com/supermodeltools/supermodeltools.github.io/issues/new?template=request-repo.yml';
441517
442- input.addEventListener('input', function() {
518+ // --- Search ---
519+ searchInput.addEventListener('input', function() {
443520 var q = this.value.toLowerCase().trim();
444521 var anyVisible = false;
445522
@@ -458,6 +535,54 @@ a:focus-visible { outline: 2px solid var(--accent-light); outline-offset: 2px; b
458535
459536 noResults.style.display = anyVisible ? 'none' : 'block';
460537 });
538+
539+ // --- Submit form ---
540+ function parseRepo(val) {
541+ val = val.trim().replace(/\/+$/, '').replace(/\.git$/, '');
542+ var m = val.match(/github\.com\/([a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+)/);
543+ if (m) return m[1];
544+ m = val.match(/^([a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+)$/);
545+ if (m) return m[1];
546+ return null;
547+ }
548+
549+ submitInput.addEventListener('input', function() {
550+ var parsed = parseRepo(this.value);
551+ if (parsed) {
552+ var name = parsed.split('/')[1];
553+ submitPreview.textContent = '\u2192 Docs will be at repos.supermodeltools.com/' + name + '/';
554+ submitPreview.classList.add('visible');
555+ submitBtn.classList.add('active');
556+ } else {
557+ submitPreview.classList.remove('visible');
558+ submitBtn.classList.remove('active');
559+ }
560+ });
561+
562+ function submitRequest() {
563+ var parsed = parseRepo(submitInput.value);
564+ if (!parsed) return;
565+ var repoUrl = 'https://github.com/' + parsed;
566+ var name = parsed.split('/')[1];
567+ var url = issueBase
568+ + '&repo_url=' + encodeURIComponent(repoUrl)
569+ + '&title=' + encodeURIComponent('[Repo Request] ' + name);
570+ window.open(url, '_blank');
571+ }
572+
573+ submitBtn.addEventListener('click', submitRequest);
574+ submitInput.addEventListener('keydown', function(e) {
575+ if (e.key === 'Enter') submitRequest();
576+ });
577+
578+ // "No results" request link: pre-fill with search query as a guess
579+ noResultsRequest.addEventListener('click', function() {
580+ var q = searchInput.value.trim();
581+ submitInput.value = q;
582+ submitInput.dispatchEvent(new Event('input'));
583+ submitInput.focus();
584+ window.scrollTo({ top: 0, behavior: 'smooth' });
585+ });
461586 })();
462587 </script>
463588</body>
0 commit comments