{"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/up-connector/dist/chunk-UHBHVPXI.cjs","../src/backup-modal.ts"],"names":[],"mappings":"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","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/up-connector/dist/chunk-UHBHVPXI.cjs","sourcesContent":[null,"/**\n * Backup Modal - Lit Component\n *\n * Framework-agnostic backup modal for wallet data export.\n * Uses lukso-modal from @lukso/web-components for consistent UI.\n */\n\nimport { safeCustomElement } from '@lukso/core/utils'\nimport type { BackupFile } from '@lukso/passkey-auth'\nimport { downloadBackup } from '@lukso/passkey-auth'\nimport { html, nothing } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport zxcvbn from 'zxcvbn'\nimport { CoreLitElement } from './styles'\n\n// Import lukso web components\nimport '@lukso/web-components/dist/components/lukso-modal'\nimport '@lukso/web-components/dist/components/lukso-button'\nimport '@lukso/web-components/dist/components/lukso-input'\n\nenum Step {\n  CHOICE = 1,\n  PASSWORD = 2,\n  DOWNLOAD = 3,\n}\n\ninterface PasswordStrength {\n  level: string\n  label: string\n  color: string\n  bgColor: string\n  width: number\n  feedback: string\n  crackTime: string | number\n}\n\n@safeCustomElement('backup-modal')\nexport class BackupModal extends CoreLitElement {\n  // Public properties\n  @property({ type: Boolean, reflect: true }) open = false\n  @property({ type: String }) theme: 'light' | 'dark' | 'auto' = 'auto'\n\n  // Private state - wizard flow\n  @state() private currentStep: Step = Step.CHOICE\n  @state() private useEncryption = true\n  @state() private password = ''\n  @state() private passwordConfirm = ''\n  @state() private passwordErrors: string[] = []\n  @state() private isCreatingBackup = false\n  @state() private generatedBackup: BackupFile | null = null\n\n  /**\n   * Public method for parent to set backup result\n   * Called after parent handles the 'create' event\n   */\n  public setBackupResult(\n    backupFile: BackupFile | null,\n    options?: {\n      error?: string\n    }\n  ) {\n    this.isCreatingBackup = false\n\n    if (options?.error) {\n      this.passwordErrors = [options.error]\n      this.generatedBackup = null\n    } else if (backupFile) {\n      this.generatedBackup = backupFile\n      this.currentStep = Step.DOWNLOAD\n    }\n  }\n\n  render() {\n    return html`\n      <lukso-modal\n        ?is-open=${this.open}\n        size=\"medium\"\n        @on-backdrop-click=${this.close}\n      >\n        <div class=\"p-6\">\n          <!-- Header -->\n          <h2 class=\"m-0 mb-6 text-neutral-20 dark:text-white heading-inter-21-semi-bold\">\n            ${this.getStepTitle()}\n          </h2>\n\n          <!-- Step content -->\n          ${this.renderStep()}\n        </div>\n      </lukso-modal>\n    `\n  }\n\n  private renderStep() {\n    switch (this.currentStep) {\n      case Step.CHOICE:\n        return this.renderChoiceStep()\n      case Step.PASSWORD:\n        return this.renderPasswordStep()\n      case Step.DOWNLOAD:\n        return this.renderDownloadStep()\n      default:\n        return nothing\n    }\n  }\n\n  private renderChoiceStep() {\n    return html`\n      <div class=\"flex flex-col gap-3 mb-6\">\n        <!-- Encrypted option (recommended) -->\n        <div\n          class=\"border-2 border-neutral-90 dark:border-neutral-70 rounded-lg p-4 cursor-pointer transition-all hover:border-neutral-60 dark:hover:border-neutral-60\"\n          @click=${() => this.selectBackupType(true)}\n        >\n          <div class=\"flex items-center gap-3 mb-2\">\n            <span class=\"text-neutral-10 dark:text-white heading-inter-16-semi-bold flex-1\">\n              Encrypt backup file\n            </span>\n            <span class=\"text-xs text-neutral-50 dark:text-neutral-60 uppercase tracking-wide\">\n              Recommended\n            </span>\n          </div>\n          <p class=\"m-0 text-neutral-40 dark:text-neutral-50 paragraph-inter-14-regular\">\n            Uses password-based encryption to protect the secrets in this file.\n          </p>\n        </div>\n\n        <!-- Unencrypted option -->\n        <div\n          class=\"border-2 border-neutral-90 dark:border-neutral-70 rounded-lg p-4 cursor-pointer transition-all hover:border-neutral-60 dark:hover:border-neutral-60\"\n          @click=${() => this.selectBackupType(false)}\n        >\n          <div class=\"flex items-center gap-3 mb-2\">\n            <span class=\"text-neutral-10 dark:text-white heading-inter-16-semi-bold flex-1\">\n              Plain text backup\n            </span>\n            <span class=\"text-xs text-neutral-50 dark:text-neutral-60 uppercase tracking-wide\">\n              For development only\n            </span>\n          </div>\n          <p class=\"m-0 text-neutral-40 dark:text-neutral-50 paragraph-inter-14-regular\">\n            Secrets will be stored in plain text.\n          </p>\n        </div>\n      </div>\n\n      <div class=\"flex justify-between gap-3\">\n        <lukso-button variant=\"text\" @click=${this.close}>\n          Cancel\n        </lukso-button>\n      </div>\n    `\n  }\n\n  private renderPasswordStep() {\n    const passwordStrength = this.password\n      ? this.calculatePasswordStrength()\n      : null\n    const passwordsMatch =\n      this.password &&\n      this.passwordConfirm &&\n      this.password === this.passwordConfirm\n    const canProceed = this.password && this.passwordConfirm && passwordsMatch\n\n    return html`\n      <p class=\"mb-6 text-neutral-40 dark:text-neutral-50 paragraph-inter-16-regular\">\n        Choose a strong password to encrypt your backup. You'll need this password to restore your wallet.\n      </p>\n\n      <div class=\"space-y-4\">\n        <lukso-input\n          type=\"password\"\n          label=\"Password\"\n          placeholder=\"Enter a strong password\"\n          .value=${this.password}\n          @on-input=${(e: CustomEvent) => {\n            this.password = e.detail.value\n          }}\n          is-full-width\n          autofocus\n        ></lukso-input>\n\n        ${this.passwordErrors.map(\n          (error) => html`\n          <div class=\"mt-1 text-red-55 paragraph-inter-13-regular\">${error}</div>\n        `\n        )}\n\n        ${\n          passwordStrength\n            ? html`\n          <div class=\"mt-3\">\n            <div class=\"flex items-center justify-between mb-1\">\n              <span class=\"paragraph-inter-13-regular text-neutral-40\">Password strength:</span>\n              <span class=\"paragraph-inter-13-semi-bold ${passwordStrength.color}\">${passwordStrength.label}</span>\n            </div>\n            <div class=\"h-1.5 bg-neutral-90 dark:bg-neutral-70 rounded-full overflow-hidden\">\n              <div\n                class=\"h-full ${passwordStrength.bgColor} transition-all duration-300\"\n                style=\"width: ${passwordStrength.width}%\"\n              ></div>\n            </div>\n            <p class=\"mt-1 mb-0 text-neutral-40 paragraph-inter-12-regular\">\n              Time to crack: ${passwordStrength.crackTime}\n            </p>\n            ${\n              passwordStrength.feedback\n                ? html`\n              <p class=\"mt-2 mb-0 text-neutral-40 paragraph-inter-12-regular\">${passwordStrength.feedback}</p>\n            `\n                : nothing\n            }\n          </div>\n        `\n            : nothing\n        }\n\n        <lukso-input\n          type=\"password\"\n          label=\"Confirm Password\"\n          placeholder=\"Re-enter your password\"\n          .value=${this.passwordConfirm}\n          @on-input=${(e: CustomEvent) => {\n            this.passwordConfirm = e.detail.value\n          }}\n          is-full-width\n        ></lukso-input>\n\n        ${\n          this.passwordConfirm\n            ? html`\n          <div class=\"flex items-center justify-between mt-2\">\n            <span class=\"paragraph-inter-13-regular text-neutral-40\">Passwords match:</span>\n            <span class=\"paragraph-inter-13-semi-bold ${passwordsMatch ? 'text-green-54' : 'text-red-55'}\">\n              ${passwordsMatch ? 'Yes' : 'No'}\n            </span>\n          </div>\n        `\n            : nothing\n        }\n      </div>\n\n      <div class=\"flex justify-between gap-3 mt-6\">\n        <div class=\"flex gap-3\">\n          <lukso-button variant=\"text\" @click=${this.close}>\n            Cancel\n          </lukso-button>\n          <lukso-button variant=\"secondary\" @click=${this.goBack}>\n            Back\n          </lukso-button>\n        </div>\n        <lukso-button\n          variant=\"primary\"\n          ?disabled=${!canProceed || this.isCreatingBackup}\n          ?is-loading=${this.isCreatingBackup}\n          @click=${this.createBackup}\n        >\n          Create Backup\n        </lukso-button>\n      </div>\n    `\n  }\n\n  private renderDownloadStep() {\n    return html`\n      <p class=\"mb-6 text-neutral-40 dark:text-neutral-50 paragraph-inter-16-regular\">\n        Your backup has been created${this.useEncryption ? ' and encrypted' : ''}. Download it and keep it in a safe place.\n      </p>\n\n      ${\n        !this.useEncryption\n          ? html`\n        <p class=\"mb-6 text-neutral-40 dark:text-neutral-50 paragraph-inter-14-regular\">\n          This unencrypted backup is intended for development purposes. Use it when creating dapps that need access to the profile for testing.\n        </p>\n      `\n          : nothing\n      }\n\n      <div class=\"flex justify-end gap-3\">\n        <lukso-button variant=\"primary\" @click=${this.handleDownload}>\n          Download Backup\n        </lukso-button>\n      </div>\n    `\n  }\n\n  private getStepTitle(): string {\n    switch (this.currentStep) {\n      case Step.CHOICE:\n        return 'Backup Wallet'\n      case Step.PASSWORD:\n        return 'Set Password'\n      case Step.DOWNLOAD:\n        return 'Download Backup'\n      default:\n        return 'Backup Wallet'\n    }\n  }\n\n  private selectBackupType(encrypted: boolean) {\n    this.useEncryption = encrypted\n    if (encrypted) {\n      this.currentStep = Step.PASSWORD\n    } else {\n      // Unencrypted backup - create immediately\n      this.createBackup()\n    }\n  }\n\n  private async createBackup() {\n    this.isCreatingBackup = true\n    this.passwordErrors = []\n\n    // Emit create event with password (if encrypted)\n    // Parent should handle backup creation\n    const createEvent = new CustomEvent('create', {\n      detail: {\n        password: this.useEncryption ? this.password : undefined,\n        encrypted: this.useEncryption,\n      },\n      bubbles: true,\n      composed: true,\n      cancelable: true,\n    })\n\n    this.dispatchEvent(createEvent)\n\n    // If parent didn't prevent default, show error\n    if (!createEvent.defaultPrevented) {\n      this.passwordErrors = [\n        'No backup handler configured. Please handle the \"create\" event.',\n      ]\n      this.isCreatingBackup = false\n    }\n    // Otherwise, parent will call setBackupResult()\n  }\n\n  private handleDownload() {\n    if (this.generatedBackup) {\n      downloadBackup(this.generatedBackup)\n\n      // Dispatch download event\n      this.dispatchEvent(\n        new CustomEvent('download', {\n          detail: this.generatedBackup,\n          bubbles: true,\n          composed: true,\n        })\n      )\n\n      // Close modal after download\n      setTimeout(() => {\n        this.close()\n      }, 100)\n    }\n  }\n\n  private goBack() {\n    if (this.currentStep === Step.PASSWORD) {\n      this.currentStep = Step.CHOICE\n      this.password = ''\n      this.passwordConfirm = ''\n      this.passwordErrors = []\n    }\n  }\n\n  private close() {\n    this.open = false\n    this.dispatchEvent(\n      new CustomEvent('close', { bubbles: true, composed: true })\n    )\n\n    // Reset state after animation\n    setTimeout(() => {\n      this.currentStep = Step.CHOICE\n      this.useEncryption = true\n      this.password = ''\n      this.passwordConfirm = ''\n      this.passwordErrors = []\n      this.isCreatingBackup = false\n      this.generatedBackup = null\n    }, 300)\n  }\n\n  private calculatePasswordStrength(): PasswordStrength {\n    const result = zxcvbn(this.password)\n\n    const strengthMap = [\n      {\n        level: 'very-weak',\n        label: 'Very Weak',\n        color: 'text-red-55',\n        bgColor: 'bg-red-55',\n        width: 20,\n      },\n      {\n        level: 'weak',\n        label: 'Weak',\n        color: 'text-red-65',\n        bgColor: 'bg-red-65',\n        width: 40,\n      },\n      {\n        level: 'fair',\n        label: 'Fair',\n        color: 'text-yellow-55',\n        bgColor: 'bg-yellow-55',\n        width: 60,\n      },\n      {\n        level: 'good',\n        label: 'Good',\n        color: 'text-green-54',\n        bgColor: 'bg-green-54',\n        width: 80,\n      },\n      {\n        level: 'strong',\n        label: 'Strong',\n        color: 'text-green-45',\n        bgColor: 'bg-green-45',\n        width: 100,\n      },\n    ]\n\n    const strength = strengthMap[result.score]\n    const feedback =\n      result.feedback.suggestions.join(' ') || result.feedback.warning || ''\n    const crackTime =\n      result.crack_times_display.offline_slow_hashing_1e4_per_second\n\n    return {\n      ...strength,\n      feedback,\n      crackTime,\n    }\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'backup-modal': BackupModal\n  }\n}\n"]}