Commit ·
490748b
1
Parent(s): 9ae74c8
Refine compact viewer chrome and tooltips
Browse files- index.html +1 -1
- space-shell.js +79 -26
index.html
CHANGED
|
@@ -10345,7 +10345,7 @@ body.sx-viewer-open { overflow: hidden; }
|
|
| 10345 |
})();
|
| 10346 |
</script>
|
| 10347 |
|
| 10348 |
-
<script src="space-shell.js?v=
|
| 10349 |
<script type="module" src="space-auth.js"></script>
|
| 10350 |
|
| 10351 |
</body>
|
|
|
|
| 10345 |
})();
|
| 10346 |
</script>
|
| 10347 |
|
| 10348 |
+
<script src="space-shell.js?v=481f3f1371de"></script>
|
| 10349 |
<script type="module" src="space-auth.js"></script>
|
| 10350 |
|
| 10351 |
</body>
|
space-shell.js
CHANGED
|
@@ -16,6 +16,11 @@
|
|
| 16 |
var viewerRetryMutationExpected = false;
|
| 17 |
var compactHeaderState = null;
|
| 18 |
var compactDiffMenu = null;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
|
| 20 |
function installCompactHeaderStyles() {
|
| 21 |
if (document.getElementById("sx-compact-header-styles")) return;
|
|
@@ -27,17 +32,12 @@
|
|
| 27 |
"#sx-header .sx-brand span{display:none!important}" +
|
| 28 |
"#sx-header .sx-logo{width:22px;height:22px}" +
|
| 29 |
"#sx-back{height:34px;padding:0 10px;border-radius:8px;font-size:12px;white-space:nowrap}" +
|
| 30 |
-
".sx-model-context{display:none;align-items:center;min-width:0;gap:5px;padding-left:8px;border-left:1px solid #302740}" +
|
| 31 |
-
"body.sx-viewer-open .sx-model-context{display:flex}" +
|
| 32 |
-
".sx-model-owner,.sx-model-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}" +
|
| 33 |
-
".sx-model-owner{color:#aeb9cc;font-size:12px;font-weight:600}" +
|
| 34 |
-
".sx-model-slash{color:#5f5871;font-size:12px}" +
|
| 35 |
-
".sx-model-name{color:#f3effa;font-size:13px;font-weight:700;max-width:min(27vw,360px)}" +
|
| 36 |
".sx-model-actions{display:none;align-items:center;gap:5px;margin-left:auto}" +
|
| 37 |
"body.sx-viewer-open .sx-model-actions{display:flex}" +
|
| 38 |
".sx-compact-action{height:32px;min-width:32px;display:inline-flex;align-items:center;justify-content:center;gap:5px;padding:0 9px;border:1px solid #352b47;border-radius:8px;background:#1b1626;color:#ded7eb;font:600 11.5px/1 Inter,system-ui,sans-serif;text-decoration:none;cursor:pointer;white-space:nowrap}" +
|
| 39 |
".sx-compact-action:hover,.sx-compact-action:focus-visible{border-color:#645378;background:#241d31;color:#fff;outline:none}" +
|
| 40 |
".sx-compact-action svg{width:14px;height:14px;display:block;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}" +
|
|
|
|
| 41 |
".sx-compact-action.is-bookmarked{color:#9cff63;border-color:rgba(156,255,99,.42);background:rgba(156,255,99,.08)}" +
|
| 42 |
".sx-compact-action--primary{border-color:rgba(156,255,99,.35);background:rgba(156,255,99,.09);color:#dfffd0}" +
|
| 43 |
".sx-diff-counts{display:inline-flex;flex-direction:column;align-items:flex-end;font-size:8px;line-height:.82;font-weight:800}" +
|
|
@@ -47,8 +47,12 @@
|
|
| 47 |
".sx-compact-diff-menu[hidden]{display:none}" +
|
| 48 |
".sx-compact-diff-option{width:100%;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:9px 10px;border:0;border-radius:7px;background:transparent;color:#e9e3f2;font:600 12px/1.25 Inter,system-ui,sans-serif;text-align:left;cursor:pointer}" +
|
| 49 |
".sx-compact-diff-option:hover{background:#241d31}" +
|
| 50 |
-
"
|
| 51 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
document.head.appendChild(style);
|
| 53 |
}
|
| 54 |
|
|
@@ -57,24 +61,79 @@
|
|
| 57 |
button.type = "button";
|
| 58 |
button.className = "sx-compact-action";
|
| 59 |
button.dataset.action = action;
|
|
|
|
| 60 |
button.setAttribute("aria-label", label);
|
| 61 |
-
button.innerHTML = icon + '<span class="sx-action-label"></span>';
|
| 62 |
button.querySelector(".sx-action-label").textContent = label;
|
| 63 |
return button;
|
| 64 |
}
|
| 65 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 66 |
function installCompactViewerHeader() {
|
| 67 |
var header = document.getElementById("sx-header");
|
| 68 |
var back = document.getElementById("sx-back");
|
| 69 |
var open = document.getElementById("sx-open");
|
| 70 |
-
if (!header || !back || !open || document.getElementById("sx-model-
|
| 71 |
installCompactHeaderStyles();
|
| 72 |
header.querySelector(".sx-brand span")?.remove();
|
| 73 |
|
| 74 |
-
var context = document.createElement("div");
|
| 75 |
-
context.id = "sx-model-context";
|
| 76 |
-
context.className = "sx-model-context";
|
| 77 |
-
context.innerHTML = '<span class="sx-model-owner"></span><span class="sx-model-slash">/</span><span class="sx-model-name"></span>';
|
| 78 |
var actions = document.createElement("div");
|
| 79 |
actions.id = "sx-model-actions";
|
| 80 |
actions.className = "sx-model-actions";
|
|
@@ -83,10 +142,10 @@
|
|
| 83 |
compactAction("hugging-face", "Hugging Face", '<svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M8.5 10h.01M15.5 10h.01M8.5 14c2.1 2 4.9 2 7 0"/></svg>'),
|
| 84 |
compactAction("embed", "Embed", '<svg viewBox="0 0 24 24" aria-hidden="true"><rect x="8" y="8" width="12" height="12" rx="2"/><path d="M4 16H3a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v1"/></svg>'),
|
| 85 |
compactAction("bookmark", "Bookmark", '<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 3h12v18l-6-4-6 4z"/></svg>'),
|
| 86 |
-
compactAction("primary", "Discuss",
|
| 87 |
);
|
| 88 |
-
header.insertBefore(context, back.nextSibling);
|
| 89 |
header.insertBefore(actions, open);
|
|
|
|
| 90 |
compactDiffMenu = document.createElement("div");
|
| 91 |
compactDiffMenu.className = "sx-compact-diff-menu";
|
| 92 |
compactDiffMenu.hidden = true;
|
|
@@ -107,7 +166,6 @@
|
|
| 107 |
compactDiffMenu.hidden = true;
|
| 108 |
}
|
| 109 |
});
|
| 110 |
-
renderCompactHeaderFromModel(modelFromLocation());
|
| 111 |
}
|
| 112 |
|
| 113 |
function postHeaderAction(action, extra) {
|
|
@@ -120,17 +178,8 @@
|
|
| 120 |
}, extra || {}), WEBSITE_ORIGIN);
|
| 121 |
}
|
| 122 |
|
| 123 |
-
function renderCompactHeaderFromModel(repoId) {
|
| 124 |
-
var context = document.getElementById("sx-model-context");
|
| 125 |
-
if (!context) return;
|
| 126 |
-
var parts = String(repoId || "").split("/");
|
| 127 |
-
context.querySelector(".sx-model-owner").textContent = parts[0] || "";
|
| 128 |
-
context.querySelector(".sx-model-name").textContent = parts.slice(1).join("/") || repoId || "Model";
|
| 129 |
-
}
|
| 130 |
-
|
| 131 |
function renderCompactHeader(state) {
|
| 132 |
compactHeaderState = state;
|
| 133 |
-
renderCompactHeaderFromModel(state.repoId || [state.owner, state.model].filter(Boolean).join("/"));
|
| 134 |
var actions = document.getElementById("sx-model-actions");
|
| 135 |
if (!actions) return;
|
| 136 |
["report", "embed", "bookmark", "primary"].forEach(function (name) {
|
|
@@ -148,7 +197,11 @@
|
|
| 148 |
if (primary) {
|
| 149 |
var label = primaryState.label || (primaryState.mode === "diff" ? "Diff" : "Discuss");
|
| 150 |
primary.querySelector(".sx-action-label").textContent = label;
|
|
|
|
|
|
|
|
|
|
| 151 |
primary.setAttribute("aria-label", label);
|
|
|
|
| 152 |
primary.classList.toggle("sx-compact-action--primary", primaryState.mode === "diff");
|
| 153 |
primary.querySelector(".sx-diff-counts")?.remove();
|
| 154 |
if (primaryState.mode === "diff") {
|
|
|
|
| 16 |
var viewerRetryMutationExpected = false;
|
| 17 |
var compactHeaderState = null;
|
| 18 |
var compactDiffMenu = null;
|
| 19 |
+
var compactTooltip = null;
|
| 20 |
+
var compactTooltipTarget = null;
|
| 21 |
+
|
| 22 |
+
var COMPACT_DISCUSS_ICON = '<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M21 12a8 8 0 0 1-8 8H7l-4 2 1.6-4A9 9 0 1 1 21 12z"/></svg>';
|
| 23 |
+
var COMPACT_INSTALL_ICON = '<svg viewBox="0 0 24 24" aria-hidden="true"><rect x="3.5" y="3.5" width="17" height="17" rx="5.25"/></svg>';
|
| 24 |
|
| 25 |
function installCompactHeaderStyles() {
|
| 26 |
if (document.getElementById("sx-compact-header-styles")) return;
|
|
|
|
| 32 |
"#sx-header .sx-brand span{display:none!important}" +
|
| 33 |
"#sx-header .sx-logo{width:22px;height:22px}" +
|
| 34 |
"#sx-back{height:34px;padding:0 10px;border-radius:8px;font-size:12px;white-space:nowrap}" +
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
".sx-model-actions{display:none;align-items:center;gap:5px;margin-left:auto}" +
|
| 36 |
"body.sx-viewer-open .sx-model-actions{display:flex}" +
|
| 37 |
".sx-compact-action{height:32px;min-width:32px;display:inline-flex;align-items:center;justify-content:center;gap:5px;padding:0 9px;border:1px solid #352b47;border-radius:8px;background:#1b1626;color:#ded7eb;font:600 11.5px/1 Inter,system-ui,sans-serif;text-decoration:none;cursor:pointer;white-space:nowrap}" +
|
| 38 |
".sx-compact-action:hover,.sx-compact-action:focus-visible{border-color:#645378;background:#241d31;color:#fff;outline:none}" +
|
| 39 |
".sx-compact-action svg{width:14px;height:14px;display:block;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}" +
|
| 40 |
+
".sx-action-icon{display:inline-grid;place-items:center;flex:0 0 auto}" +
|
| 41 |
".sx-compact-action.is-bookmarked{color:#9cff63;border-color:rgba(156,255,99,.42);background:rgba(156,255,99,.08)}" +
|
| 42 |
".sx-compact-action--primary{border-color:rgba(156,255,99,.35);background:rgba(156,255,99,.09);color:#dfffd0}" +
|
| 43 |
".sx-diff-counts{display:inline-flex;flex-direction:column;align-items:flex-end;font-size:8px;line-height:.82;font-weight:800}" +
|
|
|
|
| 47 |
".sx-compact-diff-menu[hidden]{display:none}" +
|
| 48 |
".sx-compact-diff-option{width:100%;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:9px 10px;border:0;border-radius:7px;background:transparent;color:#e9e3f2;font:600 12px/1.25 Inter,system-ui,sans-serif;text-align:left;cursor:pointer}" +
|
| 49 |
".sx-compact-diff-option:hover{background:#241d31}" +
|
| 50 |
+
".sx-compact-tooltip{position:fixed;z-index:5100;left:0;top:0;max-width:min(240px,calc(100vw - 20px));padding:7px 9px;border:1px solid rgba(156,255,99,.24);border-radius:8px;background:linear-gradient(180deg,rgba(35,28,48,.98),rgba(20,16,29,.98));color:#f1ebf8;font:600 11px/1.25 Inter,system-ui,sans-serif;letter-spacing:.01em;white-space:nowrap;box-shadow:0 10px 28px rgba(0,0,0,.42),inset 0 1px 0 rgba(255,255,255,.055);pointer-events:none;opacity:0;transform:translateY(-3px);transition:opacity 110ms ease,transform 110ms ease}" +
|
| 51 |
+
".sx-compact-tooltip::before{content:'';position:absolute;top:-4px;left:var(--sx-tooltip-arrow,50%);width:7px;height:7px;border-left:1px solid rgba(156,255,99,.24);border-top:1px solid rgba(156,255,99,.24);background:#231c30;transform:translateX(-50%) rotate(45deg)}" +
|
| 52 |
+
".sx-compact-tooltip.is-visible{opacity:1;transform:translateY(0)}" +
|
| 53 |
+
"@media(prefers-reduced-motion:reduce){.sx-compact-tooltip{transition:none}}" +
|
| 54 |
+
"@media(max-width:900px){.sx-action-label{display:none}.sx-compact-action{padding:0;min-width:32px}.sx-compact-action--primary .sx-action-label{display:inline}.sx-compact-action--primary{padding:0 7px}}" +
|
| 55 |
+
"@media(max-width:640px){#sx-header{padding:6px 8px;gap:5px}#sx-header .sx-brand strong{display:none}#sx-back{width:32px;min-width:32px;padding:0;font-size:0}#sx-back::before{content:'←';font-size:16px}.sx-model-actions{margin-left:auto}.sx-compact-action[data-action='report'],.sx-compact-action[data-action='hugging-face']{display:none!important}#sx-open{width:32px;min-width:32px;padding:0}.sx-open-label{display:none}.sx-compact-diff-menu{right:8px;left:8px;min-width:0}}";
|
| 56 |
document.head.appendChild(style);
|
| 57 |
}
|
| 58 |
|
|
|
|
| 61 |
button.type = "button";
|
| 62 |
button.className = "sx-compact-action";
|
| 63 |
button.dataset.action = action;
|
| 64 |
+
button.dataset.sxTooltip = label;
|
| 65 |
button.setAttribute("aria-label", label);
|
| 66 |
+
button.innerHTML = '<span class="sx-action-icon">' + icon + '</span><span class="sx-action-label"></span>';
|
| 67 |
button.querySelector(".sx-action-label").textContent = label;
|
| 68 |
return button;
|
| 69 |
}
|
| 70 |
|
| 71 |
+
function hideCompactTooltip() {
|
| 72 |
+
compactTooltipTarget = null;
|
| 73 |
+
compactTooltip?.classList.remove("is-visible");
|
| 74 |
+
}
|
| 75 |
+
|
| 76 |
+
function positionCompactTooltip(target) {
|
| 77 |
+
if (!compactTooltip || compactTooltipTarget !== target || !target?.isConnected) return;
|
| 78 |
+
var rect = target.getBoundingClientRect();
|
| 79 |
+
var width = compactTooltip.offsetWidth || 120;
|
| 80 |
+
var margin = 10;
|
| 81 |
+
var left = Math.max(margin, Math.min(rect.left + rect.width / 2 - width / 2, window.innerWidth - width - margin));
|
| 82 |
+
var top = rect.bottom + 8;
|
| 83 |
+
var arrow = Math.max(9, Math.min(width - 9, rect.left + rect.width / 2 - left));
|
| 84 |
+
compactTooltip.style.left = Math.round(left) + "px";
|
| 85 |
+
compactTooltip.style.top = Math.round(top) + "px";
|
| 86 |
+
compactTooltip.style.setProperty("--sx-tooltip-arrow", Math.round(arrow) + "px");
|
| 87 |
+
}
|
| 88 |
+
|
| 89 |
+
function showCompactTooltip(target) {
|
| 90 |
+
var label = String(target?.dataset?.sxTooltip || "").trim();
|
| 91 |
+
if (!label) return;
|
| 92 |
+
if (!compactTooltip) {
|
| 93 |
+
compactTooltip = document.createElement("div");
|
| 94 |
+
compactTooltip.className = "sx-compact-tooltip";
|
| 95 |
+
compactTooltip.setAttribute("role", "tooltip");
|
| 96 |
+
document.body.appendChild(compactTooltip);
|
| 97 |
+
}
|
| 98 |
+
compactTooltipTarget = target;
|
| 99 |
+
compactTooltip.textContent = label;
|
| 100 |
+
positionCompactTooltip(target);
|
| 101 |
+
compactTooltip.classList.add("is-visible");
|
| 102 |
+
window.requestAnimationFrame(function () { positionCompactTooltip(target); });
|
| 103 |
+
}
|
| 104 |
+
|
| 105 |
+
function installCompactHeaderTooltips(header, back, open) {
|
| 106 |
+
back.dataset.sxTooltip = "Back to all models";
|
| 107 |
+
open.dataset.sxTooltip = "Open on hfviewer.com";
|
| 108 |
+
header.addEventListener("pointerover", function (event) {
|
| 109 |
+
var target = event.target.closest?.("[data-sx-tooltip]");
|
| 110 |
+
if (!target || !header.contains(target) || target.contains(event.relatedTarget)) return;
|
| 111 |
+
showCompactTooltip(target);
|
| 112 |
+
});
|
| 113 |
+
header.addEventListener("pointerout", function (event) {
|
| 114 |
+
var target = event.target.closest?.("[data-sx-tooltip]");
|
| 115 |
+
if (!target || target.contains(event.relatedTarget)) return;
|
| 116 |
+
hideCompactTooltip();
|
| 117 |
+
});
|
| 118 |
+
header.addEventListener("focusin", function (event) {
|
| 119 |
+
var target = event.target.closest?.("[data-sx-tooltip]");
|
| 120 |
+
if (target && header.contains(target)) showCompactTooltip(target);
|
| 121 |
+
});
|
| 122 |
+
header.addEventListener("focusout", function (event) {
|
| 123 |
+
if (!event.target.closest?.("[data-sx-tooltip]")?.contains(event.relatedTarget)) hideCompactTooltip();
|
| 124 |
+
});
|
| 125 |
+
window.addEventListener("resize", hideCompactTooltip);
|
| 126 |
+
window.addEventListener("scroll", hideCompactTooltip, true);
|
| 127 |
+
}
|
| 128 |
+
|
| 129 |
function installCompactViewerHeader() {
|
| 130 |
var header = document.getElementById("sx-header");
|
| 131 |
var back = document.getElementById("sx-back");
|
| 132 |
var open = document.getElementById("sx-open");
|
| 133 |
+
if (!header || !back || !open || document.getElementById("sx-model-actions")) return;
|
| 134 |
installCompactHeaderStyles();
|
| 135 |
header.querySelector(".sx-brand span")?.remove();
|
| 136 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 137 |
var actions = document.createElement("div");
|
| 138 |
actions.id = "sx-model-actions";
|
| 139 |
actions.className = "sx-model-actions";
|
|
|
|
| 142 |
compactAction("hugging-face", "Hugging Face", '<svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M8.5 10h.01M15.5 10h.01M8.5 14c2.1 2 4.9 2 7 0"/></svg>'),
|
| 143 |
compactAction("embed", "Embed", '<svg viewBox="0 0 24 24" aria-hidden="true"><rect x="8" y="8" width="12" height="12" rx="2"/><path d="M4 16H3a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v1"/></svg>'),
|
| 144 |
compactAction("bookmark", "Bookmark", '<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 3h12v18l-6-4-6 4z"/></svg>'),
|
| 145 |
+
compactAction("primary", "Discuss", COMPACT_DISCUSS_ICON)
|
| 146 |
);
|
|
|
|
| 147 |
header.insertBefore(actions, open);
|
| 148 |
+
installCompactHeaderTooltips(header, back, open);
|
| 149 |
compactDiffMenu = document.createElement("div");
|
| 150 |
compactDiffMenu.className = "sx-compact-diff-menu";
|
| 151 |
compactDiffMenu.hidden = true;
|
|
|
|
| 166 |
compactDiffMenu.hidden = true;
|
| 167 |
}
|
| 168 |
});
|
|
|
|
| 169 |
}
|
| 170 |
|
| 171 |
function postHeaderAction(action, extra) {
|
|
|
|
| 178 |
}, extra || {}), WEBSITE_ORIGIN);
|
| 179 |
}
|
| 180 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 181 |
function renderCompactHeader(state) {
|
| 182 |
compactHeaderState = state;
|
|
|
|
| 183 |
var actions = document.getElementById("sx-model-actions");
|
| 184 |
if (!actions) return;
|
| 185 |
["report", "embed", "bookmark", "primary"].forEach(function (name) {
|
|
|
|
| 197 |
if (primary) {
|
| 198 |
var label = primaryState.label || (primaryState.mode === "diff" ? "Diff" : "Discuss");
|
| 199 |
primary.querySelector(".sx-action-label").textContent = label;
|
| 200 |
+
primary.querySelector(".sx-action-icon").innerHTML = primaryState.mode === "install"
|
| 201 |
+
? COMPACT_INSTALL_ICON
|
| 202 |
+
: COMPACT_DISCUSS_ICON;
|
| 203 |
primary.setAttribute("aria-label", label);
|
| 204 |
+
primary.dataset.sxTooltip = label;
|
| 205 |
primary.classList.toggle("sx-compact-action--primary", primaryState.mode === "diff");
|
| 206 |
primary.querySelector(".sx-diff-counts")?.remove();
|
| 207 |
if (primaryState.mode === "diff") {
|