HannesVonEssen commited on
Commit
490748b
·
1 Parent(s): 9ae74c8

Refine compact viewer chrome and tooltips

Browse files
Files changed (2) hide show
  1. index.html +1 -1
  2. 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=64dc8c6965a6"></script>
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
- "@media(max-width:900px){.sx-model-name{max-width:22vw}.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}}" +
51
- "@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-context{padding-left:5px}.sx-model-owner{display:none}.sx-model-slash{display:none}.sx-model-name{max-width:none;flex:1;font-size:12px}.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}}";
 
 
 
 
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-context")) return;
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", '<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>')
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") {