starRating.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import { cLog } from "./utils";
  2. function createStarRating(rating, isMobile) {
  3. let starRating = document.createElement("label");
  4. let starSlider = document.createElement("input");
  5. starSlider.setAttribute("class", "rating");
  6. starSlider.setAttribute("max", "5");
  7. starSlider.setAttribute("readonly", "");
  8. starSlider.setAttribute(
  9. "style",
  10. `--fill:rgb(255, 215, 0);--value:${rating.toString()};};background-color: transparent;`
  11. );
  12. starSlider.setAttribute("type", "range");
  13. starRating.appendChild(starSlider);
  14. let YTLikeButton;
  15. if (isMobile) {
  16. YTLikeButton = document.querySelector(
  17. "#app > div.page-container > ytm-watch > ytm-single-column-watch-next-results-renderer > ytm-slim-video-metadata-section-renderer > ytm-slim-video-action-bar-renderer > div > ytm-slim-metadata-toggle-button-renderer:nth-child(1)"
  18. );
  19. } else {
  20. YTLikeButton = document.querySelector(
  21. "#top-level-buttons-computed > ytd-toggle-button-renderer:nth-child(1)"
  22. );
  23. }
  24. YTLikeButton.insertAdjacentElement("afterend", starRating);
  25. try {
  26. let YTBar = document.querySelector("#ryd-bar-container");
  27. YTBar.setAttribute("style", "width: 190%; height: 2px;");
  28. } catch (err) {
  29. cLog("RateBar Not Present");
  30. }
  31. let style = `<style>
  32. .rating {
  33. --dir: right;
  34. --fill: gold;
  35. --fillbg: rgba(100, 100, 100, 0.15);
  36. --star: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 17.25l-6.188 3.75 1.641-7.031-5.438-4.734 7.172-0.609 2.813-6.609 2.813 6.609 7.172 0.609-5.438 4.734 1.641 7.031z"/></svg>');
  37. --stars: 5;
  38. --starSize: 2.8rem;
  39. --symbol: var(--star);
  40. --value: 1;
  41. --w: calc(var(--stars) * var(--starSize));
  42. --x: calc(100% * (var(--value) / var(--stars)));
  43. block-size: var(--starSize);
  44. inline-size: var(--w);
  45. position: relative;
  46. touch-action: manipulation;
  47. -webkit-appearance: none;
  48. }
  49. [dir="rtl"] .rating {
  50. --dir: left;
  51. }
  52. .rating::-moz-range-track {
  53. background: linear-gradient(to var(--dir), var(--fill) 0 var(--x), var(--fillbg) 0 var(--x));
  54. block-size: 100%;
  55. mask: repeat left center/var(--starSize) var(--symbol);
  56. }
  57. .rating::-webkit-slider-runnable-track {
  58. background: linear-gradient(to var(--dir), var(--fill) 0 var(--x), var(--fillbg) 0 var(--x));
  59. block-size: 100%;
  60. mask: repeat left center/var(--starSize) var(--symbol);
  61. -webkit-mask: repeat left center/var(--starSize) var(--symbol);
  62. }
  63. .rating::-moz-range-thumb {
  64. height: var(--starSize);
  65. opacity: 0;
  66. width: var(--starSize);
  67. }
  68. .rating::-webkit-slider-thumb {
  69. height: var(--starSize);
  70. opacity: 0;
  71. width: var(--starSize);
  72. -webkit-appearance: none;
  73. }
  74. .rating,
  75. .rating-label {
  76. display: block;
  77. font-family: ui-sans-serif, system-ui, sans-serif;
  78. }
  79. .rating-label {
  80. margin-block-end: 1rem;
  81. }
  82. </style>`;
  83. document.head.insertAdjacentHTML("beforeend", style);
  84. }
  85. export { createStarRating };