index.html

4.4 KB · raw

1<!DOCTYPE html>2<html lang="en">3  <head>4    <meta charset="UTF-8" />5    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />6    <link7      rel="preload"8      href="/fonts/CormorantGaramond-LightItalic.woff2"9      as="font"10      type="font/woff2"11      crossorigin12    />13    <link14      rel="preload"15      href="/fonts/IBMPlexMono-Light.woff2"16      as="font"17      type="font/woff2"18      crossorigin19    />20    <title>Peach</title>21    <script type="module" crossorigin src="/assets/index-NO7TZDKB.js"></script>22    <link rel="modulepreload" crossorigin href="/assets/chunk-CilyBKbf.js">23    <link rel="stylesheet" crossorigin href="/assets/index-6NB9xkqR.css">24  </head>25  <body>26<script>27(function() {28  // Capacitor shim: provides chrome.* APIs using Capacitor Plugins29  // so the mobile build works without a background service worker.30  if (!window.chrome) {31    window.chrome = {};32  }33  var _capStorage = null;34  function getCapStorage() {35    if (!_capStorage) {36      _capStorage = {37        _data: {},38        get: function(keys, cb) {39          var result = {};40          var keyArray = Array.isArray(keys) ? keys : [keys];41          var found = false;42          for (var i = 0; i < keyArray.length; i++) {43            var k = keyArray[i];44            if (this._data[k] !== undefined) {45              result[k] = this._data[k];46              found = true;47            }48          }49          cb(found ? result : {});50        },51        set: function(items, cb) {52          for (var k in items) {53            this._data[k] = items[k];54          }55          if (cb) cb();56        },57        remove: function(keys, cb) {58          var keyArray = Array.isArray(keys) ? keys : [keys];59          for (var i = 0; i < keyArray.length;i++) {60            delete this._data[keyArray[i]];61          }62          if (cb) cb();63        },64        clear: function(cb) {65          this._data = {};66          if (cb) cb();67        }68      };69    }70    return _capStorage;71  }72  chrome.storage = {73    local: {74      get: function(k,c){ getCapStorage().get(k, c||function(){}); },75      set: function(i,c){ getCapStorage().set(i, c||function(){}); },76      remove: function(k,c){ getCapStorage().remove(k, c||function(){}); },77      clear: function(c){ getCapStorage().clear(c||function(){}); }78    },79    session: {80      get: function(k,c){ getCapStorage().get(k, c||function(){}); },81      set: function(i,c){ getCapStorage().set(i, c||function(){}); },82      remove: function(k,c){ getCapStorage().remove(k, c||function(){}); }83    },84    onChanged: {85      addListener: function(){},86      removeListener: function(){}87    }88  };89  chrome.runtime = {90    sendMessage: function(msg, cb) {91      // Stub: messages go nowhere on mobile without SW92      if (cb) cb({ ok: false, error: "NO_SERVICE_WORKER" });93    },94    onMessage: { addListener: function(){}, removeListener: function(){} },95    connect: function() { return { disconnect: function(){} }; },96    lastError: null97  };98})();99</script>100    <div id="pre-lock">101      <section class="peach-screen peach-theme peach-screen-prelock">102        <div class="peach-screen-header">103          <span class="peach-wordmark-wrap">104            <svg class="peach-brand-mark" width="14" height="14" viewBox="0 0 64 64" fill="none" aria-hidden="true">105              <path d="M32 54C16 54 8 44 8 31C8 18 17 10 27 10C28 7 30 5.5 32 5.5C34 5.5 36 7 37 10C47 10 56 18 56 31C56 44 48 54 32 54Z" fill="#D96830"></path>106              <path d="M37 8.5C40.5 3.5 48 5 46 10.5C42 11 37 8.5 37 8.5Z" fill="#7B9060"></path>107              <path d="M32 5.5Q35.5 1 39 2.5" stroke="#7B9060" stroke-width="1.5" stroke-linecap="round"></path>108            </svg>109            <span class="peach-status-pip is-hidden"></span>110            <span class="peach-wordmark">peach</span>111          </span>112        </div>113        <h1 class="peach-unlock-headline">114          welcome115          <br />116          back.117        </h1>118        <p class="peach-subline">your vault is waiting</p>119        <div class="prelock-form">120          <input121            type="password"122            class="peach-underline-input peach-unlock-input"123            placeholder="master password"124            autocomplete="current-password"125          />126          <button class="peach-btn peach-btn--accent peach-btn--md peach-lock-submit">127            unlock128          </button>129        </div>130      </section>131    </div>132    <div id="app"></div>133  </body>134</html>