Commit df12e0e
authored
UI/UX Enhancement: Interactive Hover Tooltips on Customize Page Monolith Preview (JhaSourav07#1770)
## Description
Fixes JhaSourav07#1730
### Summary of Changes:
* **SVG Interactive Layers, DRY Styles & Sanitization (`lib/svg/`)**:
- Embedded `data-date`, `data-count`, and `data-metric` attributes
directly onto the SVG towers.
- XML-escaped interpolated attributes (`escapeXML`) to ensure total SVG
validity and XSS safety.
- Disabled pointer-events on ambient heat particles so they do not steal
hover/touch actions from the underlying columns.
- Scoped hover transition rules inside SVG `<style>` stylesheets to
raise columns by `4px` and add matching alpha glows on cursor hover.
Created a DRY helper function `getInteractiveTowerCSS` to generate and
apply these interactive styles cleanly across both static and
auto-themed badges.
* **Inline Dynamic Preview & Secure Input (`app/customize/page.tsx`)**:
- Swapped out the static `<img>` preview wrapper for inline SVG text
dynamically fetched on parameter change and injected using a sanitized
DOM updater to block any custom script tags or event handlers.
- Decoupled rate limiting (HTTP 429) cleanly from not found states,
providing helpful rate-limit warnings.
- Ensured deterministic error state transitions by resetting
`errorMessage` directly at the start of the `useEffect` body.
* **React Portal & High-Frequency Performance Optimization
(`components/InteractiveViewer.tsx`)**:
- Implemented high-performance event delegation listeners
(`onPointerMove`, `onPointerDown`, `onPointerUp`, `onPointerLeave`) to
detect hover/tap actions on columns.
- Optimized the move handler utilizing a React `useRef` to track
`activeTooltipRef`. Renders and bounds calculation are triggered **only
when the hovered column date actually changes**, eliminating redundant
layout thrashing and continuous state updates.
- Resolved mobile touch-taps using `document.elementFromPoint(clientX,
clientY)` to bypass pointer capture limitations on `pointerup`.
- Positioned the premium glassy `<VisualizationTooltip>` utilizing a
**React Portal** (`createPortal`), ensuring it renders directly under
`document.body` to completely bypass transformed containers' local
stacking coordinate misalignments.
- Refactored `formatDate` to be extremely robust against empty or
malformed inputs, verifying date pieces before parsing.
* **TypeScript Compilation Fix (`lib/export3d.test.ts`)**:
- Integrated mock `date` fields across all test mock `TowerData` objects
in `lib/export3d.test.ts` to fully resolve the compiler and type-checker
warnings.
---
## Pillar
- [ ] 🎨 Pillar 1 – New Theme Design
- [x] 📐 Pillar 2 – Geometric SVG Improvement
- [ ] ⚙️ Pillar 3 – Timezone Logic Optimization
- [ ] 🛠️ Other (Bug fix, refactoring, docs)
---
## Visual Preview
| Desktop Hover Interaction | Mobile Tap / Touch Interaction |
| --- | --- |
| *(Hovering centers the glassy tooltip perfectly above the tower,
applying a subtle elevation rise and accent glow)* | *(Tapping the
columns triggers responsive tooltips instantly, with touch-drag panning
correctly hiding the tooltip)* |
---
## Checklist before requesting a review:
- [x] I have read the `CONTRIBUTING.md` file.
- [x] I have tested these changes locally
(`localhost:3000/api/streak?user=YOUR_USERNAME`).
- [x] I have run `npm run format` and `npm run lint` locally and
resolved all errors (CI will fail otherwise).
- [x] My commits follow the Conventional Commits format (e.g.,
`feat(themes): ...`, `fix(calculate): ...`).
- [x] I have updated `README.md` if I added a new theme or URL
parameter.
- [x] I have started the repo.
- [x] I have made sure that I have only one commit to merge in this PR.
- [x] The SVG output matches the CommitPulse "premium quality" aesthetic
standard (no raw elements, smooth animation: ...).
- [x] (Recommended) I joined the CommitPulse Discord server for faster
collaboration, mentorship, and PR support.6 files changed
Lines changed: 288 additions & 21 deletions
File tree
- app/customize
- components
- lib
- svg
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
46 | 46 | | |
47 | 47 | | |
48 | 48 | | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
49 | 52 | | |
50 | 53 | | |
51 | 54 | | |
| |||
156 | 159 | | |
157 | 160 | | |
158 | 161 | | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
159 | 211 | | |
160 | 212 | | |
161 | 213 | | |
| |||
371 | 423 | | |
372 | 424 | | |
373 | 425 | | |
374 | | - | |
375 | | - | |
376 | | - | |
377 | | - | |
378 | | - | |
379 | | - | |
380 | | - | |
381 | | - | |
382 | | - | |
383 | | - | |
384 | | - | |
| 426 | + | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
| 452 | + | |
| 453 | + | |
| 454 | + | |
| 455 | + | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
| 462 | + | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + | |
| 479 | + | |
| 480 | + | |
| 481 | + | |
385 | 482 | | |
386 | 483 | | |
387 | 484 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
4 | 7 | | |
5 | 8 | | |
6 | 9 | | |
| |||
45 | 48 | | |
46 | 49 | | |
47 | 50 | | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
48 | 80 | | |
49 | 81 | | |
50 | 82 | | |
| |||
66 | 98 | | |
67 | 99 | | |
68 | 100 | | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
69 | 109 | | |
70 | 110 | | |
71 | 111 | | |
| |||
131 | 171 | | |
132 | 172 | | |
133 | 173 | | |
| 174 | + | |
134 | 175 | | |
135 | 176 | | |
136 | 177 | | |
| |||
145 | 186 | | |
146 | 187 | | |
147 | 188 | | |
148 | | - | |
149 | | - | |
150 | | - | |
151 | | - | |
152 | | - | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
153 | 228 | | |
154 | 229 | | |
155 | 230 | | |
156 | 231 | | |
157 | 232 | | |
158 | 233 | | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
159 | 263 | | |
160 | 264 | | |
161 | 265 | | |
| |||
164 | 268 | | |
165 | 269 | | |
166 | 270 | | |
| 271 | + | |
| 272 | + | |
167 | 273 | | |
168 | 274 | | |
169 | 275 | | |
| |||
278 | 384 | | |
279 | 385 | | |
280 | 386 | | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
| 412 | + | |
| 413 | + | |
| 414 | + | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + | |
| 423 | + | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
281 | 433 | | |
282 | 434 | | |
283 | 435 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
| 18 | + | |
18 | 19 | | |
19 | 20 | | |
20 | 21 | | |
| |||
32 | 33 | | |
33 | 34 | | |
34 | 35 | | |
| 36 | + | |
35 | 37 | | |
36 | 38 | | |
37 | 39 | | |
| |||
63 | 65 | | |
64 | 66 | | |
65 | 67 | | |
| 68 | + | |
66 | 69 | | |
67 | 70 | | |
68 | 71 | | |
| |||
111 | 114 | | |
112 | 115 | | |
113 | 116 | | |
| 117 | + | |
114 | 118 | | |
115 | 119 | | |
116 | 120 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1099 | 1099 | | |
1100 | 1100 | | |
1101 | 1101 | | |
1102 | | - | |
| 1102 | + | |
1103 | 1103 | | |
1104 | 1104 | | |
1105 | 1105 | | |
| |||
0 commit comments