summaryrefslogtreecommitdiffstats
path: root/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.ts
blob: 681378dda4d60567ea3b799fd87aa72abe379dd2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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
80
81
82
83
84
85
86
87
88
89
90
91
92
/**
 * @license
 * Copyright 2016 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import {sharedStyles} from '../../../styles/shared-styles';
import {LitElement, css, html} from 'lit';
import {customElement, property} from 'lit/decorators.js';
import {styleMap} from 'lit/directives/style-map.js';

declare global {
  interface HTMLElementTagNameMap {
    'gr-tooltip': GrTooltip;
  }
}

@customElement('gr-tooltip')
export class GrTooltip extends LitElement {
  @property({type: String})
  text = '';

  @property({type: String})
  maxWidth = '';

  @property({type: String})
  arrowCenterOffset = '0';

  @property({type: Boolean, reflect: true, attribute: 'position-below'})
  positionBelow = false;

  static override get styles() {
    return [
      sharedStyles,
      css`
        :host {
          --gr-tooltip-arrow-size: 0.5em;

          background-color: var(--tooltip-background-color);
          box-shadow: var(--elevation-level-2);
          color: var(--tooltip-text-color);
          font-size: var(--font-size-small);
          position: absolute;
          z-index: 1000;
        }
        :host .tooltip {
          padding: var(--spacing-m) var(--spacing-l);
        }
        :host .arrowPositionBelow,
        :host([position-below]) .arrowPositionAbove {
          display: none;
        }
        :host([position-below]) .arrowPositionBelow {
          display: initial;
        }
        .arrow {
          border-left: var(--gr-tooltip-arrow-size) solid transparent;
          border-right: var(--gr-tooltip-arrow-size) solid transparent;
          height: 0;
          position: absolute;
          left: calc(50% - var(--gr-tooltip-arrow-size));
          width: 0;
        }
        .arrowPositionAbove {
          border-top: var(--gr-tooltip-arrow-size) solid
            var(--tooltip-background-color);
          bottom: calc(-1 * var(--gr-tooltip-arrow-size));
        }
        .arrowPositionBelow {
          border-bottom: var(--gr-tooltip-arrow-size) solid
            var(--tooltip-background-color);
          top: calc(-1 * var(--gr-tooltip-arrow-size));
        }
      `,
    ];
  }

  override render() {
    this.style.maxWidth = this.maxWidth;

    return html` <div class="tooltip">
      <i
        class="arrowPositionBelow arrow"
        style=${styleMap({marginLeft: this.arrowCenterOffset})}
      ></i>
      ${this.text}
      <i
        class="arrowPositionAbove arrow"
        style=${styleMap({marginLeft: this.arrowCenterOffset})}
      ></i>
    </div>`;
  }
}