import { Component } from "../../util/Component.js"; export default class RecoveryCodesView extends Component { static PROPERTIES = { values: { description: 'The recovery codes to display', } } static CSS = /*css*/` .recovery-codes { display: flex; flex-direction: column; gap: 10px; border: 1px solid #ccc; padding: 20px; margin: 20px auto; width: 90%; max-width: 600px; background-color: #f9f9f9; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } .recovery-codes h2 { text-align: center; font-size: 18px; color: #333; margin-bottom: 15px; } .recovery-codes-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); gap: 10px; /* Adds space between grid items */ padding: 0; } .recovery-code { background-color: #fff; border: 1px solid #ddd; padding: 10px; text-align: center; font-family: 'Courier New', Courier, monospace; font-size: 12px; letter-spacing: 1px; } .actions { flex-direction: row-reverse; display: flex; gap: 10px; } ` create_template ({ template }) { $(template).html(`
`); } on_ready ({ listen }) { listen('values', values => { for ( const value of values ) { $(this.dom_).find('.recovery-codes-list').append(`
${html_encode(value)}
`); } }); $(this.dom_).find('[data-action="copy"]').on('click', () => { const codes = this.get('values').join('\n'); navigator.clipboard.writeText(codes); }); $(this.dom_).find('[data-action="print"]').on('click', () => { const target = $(this.dom_).find('.recovery-codes-list')[0]; const print_frame = $(this.dom_).find('iframe[name="print_frame"]')[0]; print_frame.contentWindow.document.body.innerHTML = target.outerHTML; print_frame.contentWindow.window.focus(); print_frame.contentWindow.window.print(); }); } } // TODO: This is necessary because files can be loaded from // both `/src/UI` and `/UI` in the URL; we need to fix that if ( ! window.__component_recoveryCodesView ) { window.__component_recoveryCodesView = true; customElements.define('c-recovery-codes-view', RecoveryCodesView); }