| import {css, html, LitElement} from 'lit'; |
| import {map} from 'lit/directives/map.js'; |
| import {unsafeHTML} from 'lit/directives/unsafe-html.js'; |
| |
| import {msg} from '../../../common/i18n'; |
| import credits from '../../credits.json5'; |
| import i18nCredits from '../../i18n-credits.json5'; |
| import {DIALOG_STYLES} from '../../shared/dialog-styles'; |
| import {SHARED_STYLES} from '../../shared/shared-styles'; |
| |
| export class CreditsDialog extends LitElement { |
| static get styles() { |
| return [ |
| SHARED_STYLES, |
| DIALOG_STYLES, |
| css` |
| dialog { |
| max-height: 430px; |
| width: 400px; |
| } |
| |
| dialog[open] { |
| display: flex; |
| flex-direction: column; |
| } |
| |
| .content_area h4 { |
| margin-bottom: 0; |
| } |
| |
| .entry { |
| position: relative; |
| } |
| |
| .entry a.homepage { |
| position: absolute; |
| inset-inline-end: 16px; |
| font-size: 14px; |
| } |
| |
| p, |
| span { |
| font-size: 14px; |
| } |
| |
| p.author { |
| margin-top: 7px; |
| } |
| |
| #translators .name { |
| font-weight: bold; |
| } |
| |
| .createdby { |
| font-style: italic; |
| } |
| `, |
| ]; |
| } |
| |
| constructor() { |
| super(); |
| this.addEventListener('show-credits-dialog', this.showDialog); |
| } |
| |
| render() { |
| let translators = map(i18nCredits, contributor => { |
| let languagesArray = |
| contributor?.languages?.map?.(lang => lang?.name ?? 'undefined'); |
| let languages = |
| languagesArray.length > 0 ? ': ' + languagesArray.join(', ') : ''; |
| return html` |
| <li> |
| <span class="name">${contributor?.name}</span>${languages} |
| </li> |
| `; |
| }); |
| |
| let homepageMsg = msg('options_credits_homepage'); |
| let creditsByMsg = msg('options_credits_by'); |
| |
| let otherCredits = map(credits, c => { |
| let url = c.url ? html` |
| <a href=${c?.url} target="_blank" class="homepage"> |
| ${homepageMsg} |
| </a>` : |
| undefined; |
| let license = c.license ? ' - ' + c.license : ''; |
| let author = c.author ? html` |
| <p class="author"> |
| ${creditsByMsg} ${c.author}${license} |
| </p> |
| ` : |
| undefined; |
| |
| return html` |
| <div class="entry"> |
| ${url} |
| <h4>${c?.name}</h4> |
| ${author} |
| </div> |
| `; |
| }); |
| |
| return html` |
| <dialog> |
| <div class="scrollable"> |
| <h3>${msg('options_credits')}</h3> |
| <div class="entry createdby"> |
| <div>${unsafeHTML(msg('options_credits_createdby'))}</div> |
| </div> |
| <div class="entry"> |
| <a href="https://gtranslate.avm99963.com/" class="homepage" target="_blank"> |
| ${msg('options_credits_homepage')} |
| </a> |
| <h4>${msg('options_credits_translations')}</h4> |
| <div>${msg('options_credits_translations_paragraph')}</div> |
| <ul id="translators"> |
| ${translators} |
| </ul> |
| </div> |
| <div class="content_area"> |
| ${otherCredits} |
| </div> |
| </div> |
| <div class="action_buttons"> |
| <button id="credits_ok" @click="${this.closeDialog}"> |
| ${msg('options_ok')} |
| </button> |
| </div> |
| </dialog> |
| `; |
| } |
| |
| showDialog() { |
| let dialog = this.renderRoot.querySelector('dialog'); |
| dialog.showModal(); |
| dialog.querySelector('.scrollable').scrollTo(0, 0); |
| dialog.querySelector('#credits_ok').focus(); |
| } |
| |
| closeDialog() { |
| this.renderRoot.querySelector('dialog').close(); |
| } |
| } |
| customElements.define('credits-dialog', CreditsDialog); |