blob: 08f1d182906242a2e6bbccb52b866c28c31cead9 [file] [log] [blame]
Adrià Vilanova Martínez115e3d82023-01-10 21:50:06 +01001import '@material/web/button/tonal-button.js';
2
3import './QuoteAuthor.js';
4
5// Other components imported so they are also injected:
6import './ReplyButton.js';
7
8import * as DOMPurify from 'dompurify';
9import {css, html, LitElement} from 'lit';
10import {classMap} from 'lit/directives/class-map.js';
11import {unsafeHTML} from 'lit/directives/unsafe-html.js';
12
13import {SHARED_MD3_STYLES} from '../../../../common/styles/md3.js';
14
15export default class TwptFlattenThreadQuote extends LitElement {
16 static properties = {
17 prevMessage: {type: Object},
18 _expanded: {type: Boolean},
19 };
20
21 static styles = [
22 SHARED_MD3_STYLES,
23 css`
24 :host {
25 display: block;
26 }
27
28 .quote-container {
29 position: relative;
30 background-color: var(--TWPT-secondary-background, rgba(242, 242, 242, 0.502));
31 margin-bottom: 16px;
32 padding: 0 12px 12px 12px;
33 border-radius: 12px;
34 }
35
36 .payload-container {
37 padding-top: 12px;
38 }
39
40 .quote-container:not(.quote-container--expanded) .payload-container {
41 max-height: 4rem;
42 overflow: hidden;
43 }
44
45 .payload-container twpt-flatten-thread-quote-author {
46 float: right;
47 margin-left: 12px;
48 margin-top: -12px;
49 shape-outside: inset(0 10px 10px 0);
50 }
51
52 .payload {
53 display: inline;
54 }
55
56 .payload img {
57 max-width: 100%;
58 max-height: calc(100vh - 2*64px);
59 }
60
61 .payload blockquote {
62 border-left: 1px solid #757575;
63 margin: 0 0 0 4px;
64 padding: 0 0 0 4px;
65 }
66
67 .buttons-row {
68 position: absolute;
69 width: calc(100% - 24px);
70 display: flex;
71 flex-direction: row;
72 justify-content: center;
73 bottom: -20px;
74 transition: opacity .25s;
75 }
76
77 .quote-container:not(:hover) .buttons-row:not(:has(md-tonal-button:focus)) {
78 opacity: 0;
79 }
80
81 .buttons-row md-tonal-button {
82 --md-tonal-button-container-color: var(--TWPT-dark-flatten-replies-more-bg, rgba(222, 222, 222, 0.9));
83 --md-tonal-button-label-text-color: var(--TWPT-md-sys-color-on-surface);
84 --md-tonal-button-hover-label-text-color: var(--TWPT-md-sys-color-on-surface);
85 --md-tonal-button-focus-label-text-color: var(--TWPT-md-sys-color-on-surface);
86 --md-tonal-button-pressed-label-text-color: var(--TWPT-md-sys-color-on-surface);
87 --md-tonal-button-with-icon-icon-color: var(--TWPT-md-sys-color-on-surface);
88 --md-tonal-button-with-icon-hover-icon-color: var(--TWPT-md-sys-color-on-surface);
89 --md-tonal-button-with-icon-focus-icon-color: var(--TWPT-md-sys-color-on-surface);
90 --md-tonal-button-with-icon-pressed-icon-color: var(--TWPT-md-sys-color-on-surface);
91 }
92 `,
93 ];
94
95 constructor() {
96 super();
97 this.prevMessage = {};
98 this._expanded = false;
99 }
100
101 getTrustedPayload() {
102 return DOMPurify.sanitize(this.prevMessage?.payload ?? '');
103 }
104
105 render() {
106 const containerClasses = classMap({
107 'quote-container': true,
108 'quote-container--expanded': this._expanded,
109 });
110 return html`
111 <div class=${containerClasses}>
112 <div class="payload-container">
113 <twpt-flatten-thread-quote-author
114 .prevMessage=${this.prevMessage}>
115 </twpt-flatten-thread-quote-author>
116 <div class="payload">
117 ${unsafeHTML(this.getTrustedPayload())}
118 </div>
119 </div>
120 <div class="buttons-row">
121 <md-tonal-button
122 icon="${this._expanded ? 'expand_less' : 'expand_more'}"
123 label="${this._expanded ? 'Less' : 'More'}"
124 @click=${this.toggleExpanded}>
125 </md-tonal-button>
126 </div>
127 </div>
128 `;
129 }
130
131 toggleExpanded() {
132 this._expanded = !this._expanded;
133 }
134}
135window.customElements.define(
136 'twpt-flatten-thread-quote', TwptFlattenThreadQuote);