diff --git a/public/content.css b/public/content.css index 6f121e84..065cb759 100644 --- a/public/content.css +++ b/public/content.css @@ -594,7 +594,7 @@ input::-webkit-inner-spin-button { color: white; } -.sponsorBlockTooltip::after { +.sponsorBlockTooltip.sbTriangle::after { content: " "; position: absolute; top: 100%; diff --git a/src/components/CategoryPillComponent.tsx b/src/components/CategoryPillComponent.tsx index b753bc5b..7d46d0aa 100644 --- a/src/components/CategoryPillComponent.tsx +++ b/src/components/CategoryPillComponent.tsx @@ -8,6 +8,7 @@ import { downvoteButtonColor, SkipNoticeAction } from "../utils/noticeUtils"; import { VoteResponse } from "../messageTypes"; import { AnimationUtils } from "../utils/animationUtils"; import { GenericUtils } from "../utils/genericUtils"; +import { Tooltip } from "../render/Tooltip"; export interface CategoryPillProps { vote: (type: number, UUID: SegmentUUID, category?: Category) => Promise; @@ -21,6 +22,8 @@ export interface CategoryPillState { class CategoryPillComponent extends React.Component { + tooltip?: Tooltip; + constructor(props: CategoryPillProps) { super(props); @@ -41,8 +44,10 @@ class CategoryPillComponent extends React.Component this.toggleOpen(e)}> + aria-label={this.getTitleText()} + onClick={(e) => this.toggleOpen(e)} + onMouseEnter={() => this.openTooltip()} + onMouseLeave={() => this.closeTooltip()}> @@ -134,6 +139,26 @@ class CategoryPillComponent extends React.Component #container") as HTMLElement; + if (tooltipMount) { + this.tooltip = new Tooltip({ + text: this.getTitleText(), + referenceNode: tooltipMount, + bottomOffset: "70px", + opacity: 0.95, + displayTriangle: false, + showLogo: false, + showGotIt: false + }); + } + } + + private closeTooltip(): void { + this.tooltip?.close(); + this.tooltip = null; + } + getTitleText(): string { const shortDescription = chrome.i18n.getMessage(`category_${this.state.segment?.category}_pill`); return (shortDescription ? shortDescription + ". ": "") + chrome.i18n.getMessage("categoryPillTitleText"); diff --git a/src/components/TooltipComponent.tsx b/src/components/TooltipComponent.tsx new file mode 100644 index 00000000..5e2cacb2 --- /dev/null +++ b/src/components/TooltipComponent.tsx @@ -0,0 +1,37 @@ +import * as React from "react"; +import Config from "../config"; +import { Category, SegmentUUID, SponsorTime } from "../types"; + +export interface TooltipProps { + text: string; + show: boolean; +} + +export interface TooltipState { + +} + +class TooltipComponent extends React.Component { + + constructor(props: TooltipProps) { + super(props); + } + + render(): React.ReactElement { + const style: React.CSSProperties = { + display: this.props.show ? "flex" : "none", + position: "absolute", + } + + return ( + + + {this.props.text} + + + ); + } +} + +export default TooltipComponent; diff --git a/src/render/Tooltip.tsx b/src/render/Tooltip.tsx index 3fe14410..fa32d915 100644 --- a/src/render/Tooltip.tsx +++ b/src/render/Tooltip.tsx @@ -9,6 +9,9 @@ export interface TooltipProps { bottomOffset?: string timeout?: number; opacity?: number; + displayTriangle?: boolean; + showLogo: boolean; + showGotIt: boolean; } export class Tooltip { @@ -20,6 +23,9 @@ export class Tooltip { constructor(props: TooltipProps) { props.bottomOffset ??= "70px"; props.opacity ??= 0.7; + props.displayTriangle ??= true; + props.showLogo ??= true; + props.showGotIt ??= true; this.text = props.text; this.container = document.createElement('div'); @@ -40,11 +46,13 @@ export class Tooltip { ReactDOM.render(
+ className={"sponsorBlockTooltip" + (props.displayTriangle ? " sbTriangle" : "")} >
- - + {props.showLogo ? + + + : null} {this.text + (props.link ? ". " : "")} {props.link ? @@ -53,16 +61,18 @@ export class Tooltip { rel="noopener noreferrer" href={props.link}> {chrome.i18n.getMessage("LearnMore")} - + : null}
- + {chrome.i18n.getMessage("GotIt")} + + : null}
, this.container )