Simplify feature mapping interaction
Browse files- assets/feature_story.js +5 -6
- assets/styles.css +3 -28
assets/feature_story.js
CHANGED
|
@@ -176,9 +176,7 @@
|
|
| 176 |
attributionData.tied ? "Feature order" : "SHAP rank"
|
| 177 |
);
|
| 178 |
targetLabel.classList.add("target");
|
| 179 |
-
|
| 180 |
-
replay.type = "button";
|
| 181 |
-
playback.append(sourceLabel, slider, targetLabel, replay);
|
| 182 |
container.append(visual, playback);
|
| 183 |
|
| 184 |
const state = {
|
|
@@ -193,7 +191,6 @@
|
|
| 193 |
canvas,
|
| 194 |
svg,
|
| 195 |
slider,
|
| 196 |
-
replay,
|
| 197 |
progress: 1,
|
| 198 |
hovered: null,
|
| 199 |
locked: null,
|
|
@@ -776,7 +773,6 @@
|
|
| 776 |
state.animationFrame = null;
|
| 777 |
updatePositions(state, Number(state.slider.value));
|
| 778 |
}, { signal });
|
| 779 |
-
state.replay.addEventListener("click", () => replay(state), { signal });
|
| 780 |
state.container.addEventListener("keydown", (event) => {
|
| 781 |
if (!["ArrowDown", "ArrowUp", "Home", "End", "Enter", "Escape"].includes(event.key)) return;
|
| 782 |
event.preventDefault();
|
|
@@ -816,7 +812,10 @@
|
|
| 816 |
window.requestAnimationFrame(() => draw(state));
|
| 817 |
});
|
| 818 |
state.resizeObserver.observe(container);
|
| 819 |
-
window.requestAnimationFrame(() =>
|
|
|
|
|
|
|
|
|
|
| 820 |
detailNode.textContent = "Hover or tap a raster row or attribution dot to trace the same feature.";
|
| 821 |
return signature;
|
| 822 |
} catch (error) {
|
|
|
|
| 176 |
attributionData.tied ? "Feature order" : "SHAP rank"
|
| 177 |
);
|
| 178 |
targetLabel.classList.add("target");
|
| 179 |
+
playback.append(sourceLabel, slider, targetLabel);
|
|
|
|
|
|
|
| 180 |
container.append(visual, playback);
|
| 181 |
|
| 182 |
const state = {
|
|
|
|
| 191 |
canvas,
|
| 192 |
svg,
|
| 193 |
slider,
|
|
|
|
| 194 |
progress: 1,
|
| 195 |
hovered: null,
|
| 196 |
locked: null,
|
|
|
|
| 773 |
state.animationFrame = null;
|
| 774 |
updatePositions(state, Number(state.slider.value));
|
| 775 |
}, { signal });
|
|
|
|
| 776 |
state.container.addEventListener("keydown", (event) => {
|
| 777 |
if (!["ArrowDown", "ArrowUp", "Home", "End", "Enter", "Escape"].includes(event.key)) return;
|
| 778 |
event.preventDefault();
|
|
|
|
| 812 |
window.requestAnimationFrame(() => draw(state));
|
| 813 |
});
|
| 814 |
state.resizeObserver.observe(container);
|
| 815 |
+
window.requestAnimationFrame(() => {
|
| 816 |
+
draw(state);
|
| 817 |
+
window.requestAnimationFrame(() => replay(state));
|
| 818 |
+
});
|
| 819 |
detailNode.textContent = "Hover or tap a raster row or attribution dot to trace the same feature.";
|
| 820 |
return signature;
|
| 821 |
} catch (error) {
|
assets/styles.css
CHANGED
|
@@ -744,8 +744,8 @@ h2 {
|
|
| 744 |
|
| 745 |
.feature-story-playback {
|
| 746 |
display: grid;
|
| 747 |
-
grid-template-areas: "source slider target
|
| 748 |
-
grid-template-columns: auto minmax(150px, 1fr) auto
|
| 749 |
gap: 10px;
|
| 750 |
align-items: center;
|
| 751 |
min-height: 58px;
|
|
@@ -777,25 +777,6 @@ h2 {
|
|
| 777 |
cursor: ew-resize;
|
| 778 |
}
|
| 779 |
|
| 780 |
-
.feature-story-replay {
|
| 781 |
-
grid-area: replay;
|
| 782 |
-
min-height: 34px;
|
| 783 |
-
padding: 7px 12px;
|
| 784 |
-
border: 1px solid #b9accf;
|
| 785 |
-
border-radius: 6px;
|
| 786 |
-
background: #f4f1f8;
|
| 787 |
-
color: #4d3880;
|
| 788 |
-
cursor: pointer;
|
| 789 |
-
font: inherit;
|
| 790 |
-
font-size: 11px;
|
| 791 |
-
font-weight: 750;
|
| 792 |
-
}
|
| 793 |
-
|
| 794 |
-
.feature-story-replay:hover {
|
| 795 |
-
border-color: #846fa6;
|
| 796 |
-
background: #eee9f5;
|
| 797 |
-
}
|
| 798 |
-
|
| 799 |
.feature-story-render-token {
|
| 800 |
display: none;
|
| 801 |
}
|
|
@@ -1117,8 +1098,7 @@ h2 {
|
|
| 1117 |
.feature-story-playback {
|
| 1118 |
grid-template-areas:
|
| 1119 |
"source target"
|
| 1120 |
-
"slider slider"
|
| 1121 |
-
"replay replay";
|
| 1122 |
grid-template-columns: 1fr 1fr;
|
| 1123 |
gap: 8px 12px;
|
| 1124 |
padding: 11px 12px 12px;
|
|
@@ -1128,11 +1108,6 @@ h2 {
|
|
| 1128 |
text-align: right;
|
| 1129 |
}
|
| 1130 |
|
| 1131 |
-
.feature-story-replay {
|
| 1132 |
-
width: 100%;
|
| 1133 |
-
min-height: 40px;
|
| 1134 |
-
}
|
| 1135 |
-
|
| 1136 |
.site-nav {
|
| 1137 |
align-items: flex-start;
|
| 1138 |
padding: 15px 0;
|
|
|
|
| 744 |
|
| 745 |
.feature-story-playback {
|
| 746 |
display: grid;
|
| 747 |
+
grid-template-areas: "source slider target";
|
| 748 |
+
grid-template-columns: auto minmax(150px, 1fr) auto;
|
| 749 |
gap: 10px;
|
| 750 |
align-items: center;
|
| 751 |
min-height: 58px;
|
|
|
|
| 777 |
cursor: ew-resize;
|
| 778 |
}
|
| 779 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 780 |
.feature-story-render-token {
|
| 781 |
display: none;
|
| 782 |
}
|
|
|
|
| 1098 |
.feature-story-playback {
|
| 1099 |
grid-template-areas:
|
| 1100 |
"source target"
|
| 1101 |
+
"slider slider";
|
|
|
|
| 1102 |
grid-template-columns: 1fr 1fr;
|
| 1103 |
gap: 8px 12px;
|
| 1104 |
padding: 11px 12px 12px;
|
|
|
|
| 1108 |
text-align: right;
|
| 1109 |
}
|
| 1110 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1111 |
.site-nav {
|
| 1112 |
align-items: flex-start;
|
| 1113 |
padding: 15px 0;
|