← back to Consulting Designerwallcoverings Com

public/signin.html

94 lines

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
<title>Designer Wallcoverings · Consulting Portal</title>
<style>
  :root{--ink:#14110e;--paper:#f6f2ec;--gold:#a9884f;--line:#dcd3c5}
  *{box-sizing:border-box}
  body{margin:0;font-family:'Georgia',serif;background:var(--paper);color:var(--ink);min-height:100vh;display:grid;place-items:center;padding:32px}
  .card{max-width:560px;width:100%;background:#fff;border:1px solid var(--line);box-shadow:0 24px 60px rgba(20,17,14,.08);padding:44px 48px}
  .eyebrow{letter-spacing:.32em;text-transform:uppercase;font-size:11px;color:var(--gold);font-family:system-ui,sans-serif}
  h1{font-size:34px;margin:.35em 0 .1em;font-weight:400;letter-spacing:.01em}
  .sub{color:#6b6357;font-style:italic;margin:0 0 24px}
  .grid{display:grid;grid-template-columns:1fr 1fr;gap:14px 22px;border-top:1px solid var(--line);border-bottom:1px solid var(--line);padding:20px 0;margin:20px 0;font-family:system-ui,sans-serif;font-size:14px}
  .grid b{display:block;font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:#9a9082;font-weight:600;margin-bottom:2px}
  .creds{background:#faf7f1;border:1px dashed var(--gold);padding:16px 18px;margin:18px 0;font-family:'SF Mono',ui-monospace,monospace;font-size:13px}
  .creds .row{display:flex;justify-content:space-between;padding:3px 0}
  .creds .k{color:#9a9082}
  a.enter{display:inline-block;margin-top:10px;background:var(--ink);color:#f6f2ec;text-decoration:none;padding:13px 26px;letter-spacing:.16em;text-transform:uppercase;font-size:12px;font-family:system-ui,sans-serif}
  a.enter:hover{background:var(--gold)}
  .foot{margin-top:22px;font-size:12px;color:#9a9082;font-family:system-ui,sans-serif}
  .foot a{color:var(--gold)}
  .gwrap{margin-top:16px;display:flex;align-items:center;gap:12px;flex-wrap:wrap;font-family:system-ui,sans-serif}
  .gbtn{display:inline-flex;align-items:center;gap:10px;background:#fff;border:1px solid var(--line);color:#3c4043;padding:11px 18px;font-size:13px;border-radius:4px;cursor:not-allowed;opacity:.65}
  .soon{font-size:11px;color:#9a9082;letter-spacing:.04em;text-transform:uppercase}
</style>
</head>
<body>
  <div class="card">
    <div class="eyebrow">Consulting Engagement</div>
    <h1 id="biz">Designer Wallcoverings</h1>
    <p class="sub" id="tagline"></p>

    <div class="grid" id="meta">
      <div><b>Industry</b><span id="m-industry">Luxury wallcoverings & designer fabrics — e-commerce + to-the-trade</span></div>
      <div><b>Location</b><span id="m-location">Los Angeles, CA</span></div>
      <div><b>Current Site</b><span id="m-site">none yet</span></div>
      <div><b>Engagement Opened</b><span id="m-opened">2026-07-26</span></div>
      <div><b>Primary Contact</b><span id="m-contact">Steve Abrams</span></div>
      <div><b>Reach</b><span id="m-reach">steve@designerwallcoverings.com</span></div>
    </div>

    <!-- Steve's standing rule: the initial sign-in page CARRIES the credentials. -->
    <!-- SECURITY: never render the fleet-master credential in HTML. On a PUBLIC
         page the whole block is suppressed (scaffold sets CREDS_BLOCK to a note);
         a gated per-client portal renders only the client login. -->
    <div class="creds"><div class="row"><span class="k">Portal</span><span>/portal &amp; /admin</span></div><div class="row"><span class="k">Access</span><span>credentials delivered separately</span></div></div>

    <a class="enter" href="/portal">Enter the deliverable →</a>
    &nbsp;
    <a class="enter" style="background:transparent;color:var(--ink);border:1px solid var(--ink)" href="/admin">Growth command center</a>

    <!-- Google login is a FUTURE upgrade; standard protection (Basic Auth) is live now. -->
    <div class="gwrap">
      <button class="gbtn" disabled title="Google sign-in is coming soon — credentials delivered separately">
        <svg width="16" height="16" viewBox="0 0 48 48" aria-hidden="true"><path fill="#4285F4" d="M45 24.5c0-1.6-.1-2.8-.4-4H24v7.3h11.9c-.2 1.9-1.5 4.7-4.3 6.6l6.6 5.1C42 41.9 45 33.9 45 24.5z"/><path fill="#34A853" d="M24 46c5.7 0 10.5-1.9 14-5.1l-6.6-5.1c-1.8 1.2-4.2 2.1-7.4 2.1-5.7 0-10.5-3.8-12.2-9l-6.8 5.3C8.5 41.2 15.7 46 24 46z"/><path fill="#FBBC05" d="M11.8 28.9C11.3 27.5 11 26 11 24.5s.3-3 0.8-4.4l-6.8-5.3C3.7 17.6 3 20.9 3 24.5s.7 6.9 2 9.7l6.8-5.3z"/><path fill="#EA4335" d="M24 12.5c3.2 0 5.3 1.4 6.6 2.5l5.8-5.7C33 5.9 28.4 4 24 4 15.7 4 8.5 8.8 5 15.1l6.8 5.3C13.5 15.3 18.3 12.5 24 12.5z"/></svg>
        Continue with Google
      </button>
      <span class="soon">coming soon · standard protection is active now</span>
    </div>

    <div class="foot">
      New client, or no website yet? <a href="/intake">Start the intake questionnaire →</a>
    </div>
  </div>

  <!-- Hydrate the front door from /api/client (server.js:90 serves this as the
       "public-safe summary for signin page"). Fixes the previously-stale static
       HTML (empty tagline, dangling "Reach: …·"). Static markup above is the
       graceful fallback if the fetch fails — the page never renders empty. -->
  <script>
  (function(){
    function set(id,v){ if(v==null||v==='')return; var el=document.getElementById(id); if(el)el.textContent=v; }
    // client.json stores the tagline HTML-escaped (e.g. "&amp;"); decode for text.
    function decode(s){ if(!s)return s; var t=document.createElement('textarea'); t.innerHTML=s; return t.value; }
    fetch('/api/client').then(function(r){ return r.ok?r.json():null; }).then(function(c){
      if(!c||typeof c!=='object') return;
      set('biz', c.business_name);
      if(c.business_name) document.title = c.business_name + ' · Consulting Portal';
      set('tagline', decode(c.tagline));
      set('m-industry', decode(c.industry));
      set('m-location', c.location);
      set('m-site', c.current_website || 'none yet');
      set('m-opened', c.generated_at);
      var ct = c.contact || {};
      set('m-contact', ct.name);
      var reach = [ct.email, ct.phone].filter(Boolean).join(' · ');
      set('m-reach', reach);
    }).catch(function(){ /* keep static fallback */ });
  })();
  </script>
</body>
</html>