cc23b76a1f2c7dc6a29c227661bfb0ce4d20eb54
lrnassar
  Fri Sep 4 13:43:48 2026 -0700
BLAT page polish from QA: Load example button, corrected input limits, wording fixes. refs #37996

Load example is a chip-style button with a mouseover instead of a hyperlink. Removed the
Show input limits modal; corrected the limits in hgTracksHelp.html, stale since 2013 (DNA is
75,000 bases per sequence and 187,500 combined, protein and translated 10,000 and 25,000),
added a #blatLimits anchor and pointed the two over-limit BLAT warnings and the form at it.
Genome selector: section title Target assembly, type-to-search hint in the dropdown,
Shortcuts: label, input and Query type select sized to match. Similar tools sidebar uses
house-style hyphens and corrects the findMotif name and description. Share and rename text
now states link lifetimes accurately (snapshot links last years, only sessions are
permanent). Alignment page buttons match .gbPill, summary strip spacing fixed, New BLAT
search button demoted from primary. Documents blatResultsGroup in ex.hg.conf.

diff --git src/hg/hgc/hgc.c src/hg/hgc/hgc.c
index c940dc698da..8c06da77d2f 100644
--- src/hg/hgc/hgc.c
+++ src/hg/hgc/hgc.c
@@ -9117,60 +9117,62 @@
 char *shareBb = blatContext ? blatFindPinnedBigPsl(cart) : NULL;
 boolean canShare = (shareBb != NULL);
 freeMem(shareBb);
 
 /* Colors imported from the BLAT Redesign (slide 3): grey page, steel-blue section-header bars, navy
  * links with maroon hover, slate text.  The <h2>/<hr> the shared alignment code emits are hidden; its
  * <h4> section headings become the steel-blue bars.  The page chrome is webStartGbNoBanner (a menubar
  * and <main>, no legacy section tables), so we draw our own gold title bar in plain HTML. */
 printf("<style>"
        "#main-menu-whole{margin-bottom:0}"   /* no gap between the menubar and the title bar */
        "#mainContent{background:#eef1f4}"     /* grey page behind the white alignment panel */
        ".blatTitleBar{background:#eaca92; color:#000; box-sizing:border-box; display:flex;"
        " align-items:center; justify-content:space-between; padding:8px 16px}"  /* gold title band */
        ".blatTitleBar .blatTtl{font-size:18px; font-weight:700}"
        ".blatTitleBar .blatBtns{display:flex; gap:8px; align-items:center}"
-       ".blatBtn{padding:4px 12px; font-size:13px; border:1px solid #999; border-radius:3px;"
-       " background:#e6e6e6; text-decoration:none; white-space:nowrap; cursor:pointer}"
+       /* same recipe as .gbPill in gbModern.css (not loaded on this page), so these read as the
+        * same buttons as on the BLAT results page */
+       ".blatBtn{padding:5px 12px; font-size:13px; font-weight:700; border:1px solid #999;"
+       " border-radius:0; background:#fff; text-decoration:none; white-space:nowrap; cursor:pointer}"
        /* nice_menu.css sets a:link blue (specificity 0,1,1); a.blatBtn:link (0,2,1) beats it */
-       "a.blatBtn:link, a.blatBtn:visited, a.blatBtn:hover{color:#000; text-decoration:none}"
-       ".blatBtn:hover{background:#d8d8d8}"
+       "a.blatBtn:link, a.blatBtn:visited, a.blatBtn:hover{color:#003a72; text-decoration:none}"
+       ".blatBtn:hover{background:#eef2f7}"
        "#blatAlnBody{font-family:'Helvetica Neue',Helvetica,Arial,sans-serif; color:#374a5e;"
        " display:grid; grid-template-columns:220px 1fr;"      /* full-height sidebar + content column */
        " background:#fff}"                                    /* edge to edge: no margin, no border */
        "#blatAlnBody a{color:#0a3a7a}"
        "#blatAlnBody a:hover{color:#8b1a1a}"
        "#blatAlnNav{grid-column:1; grid-row:1; background:#f4f7fb; border-right:1px solid #dde3ea}"
        /* keep the grey column full height, but pin the links so they stay visible while scrolling */
        "#blatAlnNavInner{position:sticky; top:0; padding:18px 20px; display:flex; flex-direction:column;"
        " gap:16px}"
        "#blatAlnNav a{font-weight:700; text-decoration:none}"   /* already obviously links; no underline */
        "#blatAlnBlocks{display:flex; flex-direction:column; gap:2px; margin:2px 0 0 14px}"  /* block links, tight list indented under genome sequence */
        "#blatAlnBlocks a{font-weight:400; font-size:13px}"
        "#blatAlnContent{grid-column:2; grid-row:1; min-width:0; padding:0 20px 14px}"
        "#blatAlnContent h2{display:none}"
        "#blatAlnContent hr{display:none}"
        "#blatAlnContent h4{margin:16px -20px 0; padding:8px 20px; background:#4c759c; color:#fff;"
        " font-size:15px; font-weight:700}"                     /* -20px: bar spans full content width */
        "#blatAlnContent h4:first-child{margin-top:0}"          /* Alignment Summary flush at top */
        "#blatAlnContent h4 a{color:#fff}"
        /* undo bootstrap.css (pulled in by webStartGbNoBanner's gbHeader) on the sequence blocks:
         * it would give <pre> a grey box, a border and word-break that mangles the alignment */
        "#blatAlnContent pre{margin:0; padding:2px 0 12px; line-height:1.4; background:none; border:0;"
        " border-radius:0; color:#374a5e; white-space:pre; word-break:normal; word-wrap:normal}"
        /* key-value summary strip, mirroring hgBlat's .blatStrip (label over value, thin dividers) */
-       ".blatAlnStrip{display:flex; align-items:center; gap:24px; flex-wrap:wrap; margin:2px 0 14px}"
+       ".blatAlnStrip{display:flex; align-items:center; gap:24px; flex-wrap:wrap; margin:12px 0 14px}"
        ".blatAlnStat{display:flex; flex-direction:column; gap:1px}"
        ".blatAlnStat .k{font-size:12px; color:#5b6572; font-weight:700}"
        ".blatAlnStat .v{font-size:14px; color:#1e2833; font-weight:700}"
        ".blatAlnStrip .d{width:1px; height:28px; background:#d0d0d0}"
        "</style>\n");
 
 /* gold title bar, drawn directly (no framework subheadingBar, no JS): title on the left, then (in
  * the hgBlat context) a "Back to results" and, when a durable track backs the results, a "Share a
  * link" button; in a plain track click, a "Back to Genome Browser" button that returns to hgTracks
  * at this alignment's location. */
 printf("<div class='blatTitleBar'>");
 char *asmLabel = blatAsmLabel(database);   // may carry a hub's genomes.txt organism string
 char *asmLabelHtml = htmlEncode(asmLabel);
 printf("<span class='blatTtl'>%sBase Alignment: %s</span>",
        blatContext ? "BLAT " : "", asmLabelHtml);
@@ -27550,30 +27552,31 @@
 // group=blat (gated by hg.conf blatResultsGroup) puts BLAT results in their own "BLAT Results" track
 // group instead of Custom Tracks, so they are easy to find and clear as a set (see the group's
 // "Delete all" button in hgTracks).
 char *groupTag = cfgOptionBooleanDefault("blatResultsGroup", FALSE) ? "group=blat " : "";
 char *customTextTemplate = "track type=bigPsl blatResult=on %sindelDoubleInsert=on indelQueryInsert=on pslFile=%s visibility=pack showAll=on htmlUrl=http://%s/goldenPath/help/hgUserPsl.html %s bigDataUrl=%s name=\"%s\" description=\"%s\" colorByStrand=\"0,0,0 0,0,150\" mouseOver=\"${oChromStart}-${oChromEnd} of ${oChromSize} bp, strand ${oStrand}\"\n";
 char *extraForMismatch = "indelPolyA=on showDiffBasesAllScales=. baseColorUseSequence=lfExtra baseColorDefault=diffBases";
 
 if (isProt)
     extraForMismatch = "";
 char buffer[4096];
 safef(buffer, sizeof buffer, customTextTemplate, groupTag, bigBedTn.forCgi, host, extraForMismatch, bigBedTn.forCgi, trackName, trackDescription);
 
 struct customTrack *ctList = getCtList();
 struct customTrack *newCts = customFactoryParse(database, buffer, FALSE, NULL, NULL);
 
+
 /* Optionally clear PREVIOUS BLAT result tracks (those tagged blatResult=on) so the user is not
  * confused about which results are current.  hg.conf "blatOldTracks":
  *   keep   (default) - do nothing, every search's track stays as-is
  *   hide             - leave earlier BLAT tracks in the session but set them to hide
  *   delete           - remove earlier BLAT tracks from the session (their trash files age out)
  * Only BLAT-tagged tracks are touched; the track just made is left alone. */
 char *oldTracks = cfgOptionDefault("blatOldTracks", "keep");
 /* Fail safe on an unrecognized value (e.g. a typo in hg.conf): fall back to "keep" rather than to
  * the destructive "delete" branch below, so a misconfiguration never silently discards a user's
  * previous BLAT tracks. */
 if (differentString(oldTracks, "keep") && differentString(oldTracks, "hide")
     && differentString(oldTracks, "delete"))
     {
     warn("hg.conf blatOldTracks has unrecognized value '%s'; expected keep|hide|delete. "
          "Treating as 'keep'.", oldTracks);