SIMON Master Console Rebuild
True command center for SIMON + WEB360
This rebuild gives you a cleaner production spine: interactive tree, live viewer, guarded editor, dynamic graphics, architecture map, and note storage. It is designed to sit beside your existing
console.php
and become the stronger replacement path.
Dashboard
Tree
Viewer
System Map
File Registry
Notes
Files
15,025
Folders
377
Scanned Size
3.79 GB
PHP Files
791
Editable Text Files
12,309
File viewer
guarded to /htdocs
/home/index.php
<!doctype html> <html lang="en" data-site="gaylord-sinclair" data-system="simon"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>GAYLORD SINCLAIR — Books • Art • SIMON • KOSMOS • Web Systems</title> <meta name="description" content="A living archive of books, art, comics, SIMON intelligence, Kosmos Network, GayLord Chat, and web systems."> <meta name="keywords" content="Gaylord Sinclair, SIMON, Kosmos Network, KOSMOS, GayLord Chat, books, art, comics, Web360, AI systems, publishing"> <meta name="author" content="Gaylord Sinclair"> <meta name="publisher" content="Gaylord Sinclair"> <meta name="copyright" content="© 2026 Gaylord Sinclair"> <meta name="robots" content="index,follow,max-image-preview:large,max-snippet:-1,max-video-preview:-1"> <meta name="googlebot" content="index,follow"> <meta name="theme-color" content="#070818"> <meta name="color-scheme" content="dark"> <meta name="application-name" content="Gaylord Sinclair"> <meta name="apple-mobile-web-app-title" content="Gaylord Sinclair"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> <meta name="mobile-web-app-capable" content="yes"> <meta name="format-detection" content="telephone=no,email=no,address=no"> <meta name="referrer" content="strict-origin-when-cross-origin"> <meta name="impact-site-verification" content="e8ec6683-663c-421a-a30d-f8c0fe517345"> <link rel="canonical" href="https://www.gaylordsinclair.com/"> <meta property="og:locale" content="en_US"> <meta property="og:type" content="website"> <meta property="og:site_name" content="Gaylord Sinclair"> <meta property="og:title" content="GAYLORD SINCLAIR — Books • Art • SIMON • KOSMOS • Web Systems"> <meta property="og:description" content="Books, art, comics, SIMON intelligence, Kosmos Network, GayLord Chat, and web systems by Gaylord Sinclair."> <meta property="og:url" content="https://www.gaylordsinclair.com/"> <meta property="og:image" content="https://www.gaylordsinclair.com/assets/og/gaylord-sinclair-home.jpg"> <meta property="og:image:alt" content="Gaylord Sinclair homepage with SIMON and Kosmos spatial interface"> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:title" content="GAYLORD SINCLAIR — Books • Art • SIMON • KOSMOS"> <meta name="twitter:description" content="A living archive and intelligence layer for Gaylord Sinclair, SIMON, Web360, and Kosmos Network."> <meta name="twitter:image" content="https://www.gaylordsinclair.com/assets/og/gaylord-sinclair-home.jpg"> <link rel="icon" href="/favicon.ico" sizes="any"> <link rel="icon" type="image/png" sizes="32x32" href="/assets/icons/favicon-32.png"> <link rel="icon" type="image/png" sizes="192x192" href="/assets/icons/icon-192.png"> <link rel="apple-touch-icon" href="/assets/icons/apple-touch-icon.png"> <link rel="manifest" href="/manifest.json"> <link rel="mask-icon" href="/assets/icons/safari-pinned-tab.svg" color="#8b5cf6"> <link rel="dns-prefetch" href="//www.googletagmanager.com"> <link rel="dns-prefetch" href="//www.google-analytics.com"> <link rel="dns-prefetch" href="//api.open-meteo.com"> <link rel="preconnect" href="https://www.googletagmanager.com" crossorigin> <link rel="preconnect" href="https://www.google-analytics.com" crossorigin> <link rel="preconnect" href="https://api.open-meteo.com" crossorigin> <script> window.SIMON_CONFIG = { SITE_NAME: 'Gaylord Sinclair', APP_NAME: 'Gaylord Sinclair Homepage', PAGE_TITLE: 'GAYLORD SINCLAIR — Books • Art • SIMON • KOSMOS • Web Systems', PAGE_URL: 'https://www.gaylordsinclair.com/', GA4_ID: 'G-S6MEHB4BEY', IMPACT_SITE_VERIFICATION: 'e8ec6683-663c-421a-a30d-f8c0fe517345', WEBHOOK_BASE: '/connlink/test1/ui/webhook_inbox.php', VISIT_STREAM: 'visits', PULSE_STREAM: 'default', KEY: '', FEED_PROXY: '/connlink/test1/ui/feed_proxy.php', NEWSAPI_PROXY: '/connlink/test1/ui/newsapi_proxy.php', GSEARCH_PROXY: '/connlink/test1/ui/gsearch_proxy.php', SEARCH_PROXY_BASE: '/connlink/test1/ui', SOURCE: 'index.php' }; </script> <!-- Google Analytics 4 --> <script async src="https://www.googletagmanager.com/gtag/js?id=G-S6MEHB4BEY"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){ dataLayer.push(arguments); } gtag('js', new Date()); gtag('config', 'G-S6MEHB4BEY', { anonymize_ip: true, send_page_view: true }); </script> <script type="application/ld+json"> { "@context":"https://schema.org", "@graph":[ { "@type":"Organization", "@id":"https://www.gaylordsinclair.com/#organization", "name":"Gaylord Sinclair", "url":"https://www.gaylordsinclair.com/", "logo":"https://www.gaylordsinclair.com/assets/icons/icon-512.png", "sameAs":["https://gaylordsinclair.substack.com/"] }, { "@type":"WebSite", "@id":"https://www.gaylordsinclair.com/#website", "name":"Gaylord Sinclair", "url":"https://www.gaylordsinclair.com/", "publisher":{"@id":"https://www.gaylordsinclair.com/#organization"}, "potentialAction":{ "@type":"SearchAction", "target":"https://www.gaylordsinclair.com/search/?q={search_term_string}", "query-input":"required name=search_term_string" } }, { "@type":"WebApplication", "@id":"https://www.gaylordsinclair.com/#simon-homepage", "name":"SIMON Homepage Interface", "applicationCategory":"BusinessApplication", "operatingSystem":"Web", "url":"https://www.gaylordsinclair.com/", "creator":{"@id":"https://www.gaylordsinclair.com/#organization"}, "description":"Spatial homepage interface connecting books, art, comics, SIMON intelligence, Kosmos Network, GayLord Chat, and Web360 systems." }, { "@type":"WebPage", "@id":"https://www.gaylordsinclair.com/#webpage", "url":"https://www.gaylordsinclair.com/", "name":"GAYLORD SINCLAIR — Books • Art • SIMON • KOSMOS • Web Systems", "description":"A living archive of books, art, comics, SIMON intelligence, Kosmos Network, GayLord Chat, and web systems.", "isPartOf":{"@id":"https://www.gaylordsinclair.com/#website"}, "about":{"@id":"https://www.gaylordsinclair.com/#simon-homepage"} } ] } </script> <style> :root{ --bg0:#02030a; --bg1:#080b1b; --panel:rgba(8,12,30,.72); --panel2:rgba(10,16,40,.56); --text:#eef4ff; --muted:#aeb8d8; --cyan:#6ae0ff; --violet:#8b5cf6; --indigo:#4f46e5; --indigo2:#312e81; --pink:#ff4fd6; --gold:#ffd36a; --good:#5affa8; --danger:#ff7a9a; --shadow:0 30px 100px rgba(0,0,0,.58); --safe-top:max(14px,env(safe-area-inset-top)); --safe-right:max(14px,env(safe-area-inset-right)); --safe-bottom:max(14px,env(safe-area-inset-bottom)); --safe-left:max(14px,env(safe-area-inset-left)); } *{box-sizing:border-box} html,body{width:100%;height:100%} body{ margin:0; overflow:hidden; color:var(--text); font-family:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; background: radial-gradient(1100px 760px at 50% 38%,rgba(79,70,229,.18),transparent 58%), radial-gradient(900px 660px at 18% 78%,rgba(106,224,255,.10),transparent 60%), radial-gradient(900px 660px at 84% 72%,rgba(255,79,214,.08),transparent 60%), linear-gradient(180deg,var(--bg0),var(--bg1) 54%,#040713); } body::before{ content:""; position:fixed; inset:0; z-index:2; pointer-events:none; background: linear-gradient(rgba(255,255,255,.015) 1px,transparent 1px), linear-gradient(90deg,rgba(255,255,255,.015) 1px,transparent 1px); background-size:52px 52px; opacity:.18; mask-image:linear-gradient(to bottom,black,transparent 82%); } .sceneWrap{ position:fixed; inset:0; z-index:0; overflow:hidden; background:#030611; } .scene{ position:absolute; inset:-2%; width:104%; height:104%; border:0; opacity:0; pointer-events:none; transform:scale(1.04); filter:saturate(1.12) contrast(1.06) brightness(.82); transition:opacity .9s ease,transform 1.2s ease,filter .9s ease; } .scene.on{opacity:1;transform:scale(1)} body.interact .scene.on{pointer-events:auto} .sceneGlass{ position:absolute; inset:0; pointer-events:none; background: radial-gradient(900px 560px at 50% 40%,rgba(79,70,229,.13),transparent 58%), linear-gradient(180deg,rgba(3,5,14,.16),rgba(3,5,14,.52)); } .indigoFloor{ position:fixed; left:-10vw; right:-10vw; bottom:-22vh; height:48vh; z-index:3; pointer-events:none; background: radial-gradient(ellipse at center,rgba(79,70,229,.44),rgba(49,46,129,.16) 38%,transparent 72%); filter:blur(26px); animation:floorPulse 6s ease-in-out infinite; } @keyframes floorPulse{ 0%,100%{transform:scaleX(.92);opacity:.62} 50%{transform:scaleX(1.08);opacity:.96} } #stars,#kosmosLayer{ position:fixed; inset:0; width:100%; height:100%; pointer-events:none; } #stars{z-index:4} #kosmosLayer{ z-index:5; mix-blend-mode:screen; opacity:.86; filter:saturate(1.18) contrast(1.08); } .kosmosRift{ position:fixed; left:50%;top:50%; z-index:6; width:min(88vw,920px);height:min(88vw,920px); transform:translate(-50%,-50%); pointer-events:none; border-radius:50%; background: conic-gradient(from 0deg,transparent 0 9%,rgba(106,224,255,.15) 13%,transparent 20%,rgba(255,79,214,.13) 30%,transparent 38%,rgba(255,211,106,.10) 46%,transparent 54%,rgba(139,92,246,.18) 68%,transparent 78%,rgba(106,224,255,.12) 90%,transparent), radial-gradient(circle at 50% 50%,transparent 0 42%,rgba(106,224,255,.10) 47%,transparent 58%,rgba(139,92,246,.10) 62%,transparent 72%); opacity:.56; filter:blur(.2px); animation:kosmosRift 18s linear infinite; } .kosmosRift::before,.kosmosRift::after{ content:"";position:absolute;inset:12%;border-radius:50%; border:1px solid rgba(106,224,255,.16); box-shadow:0 0 34px rgba(106,224,255,.12),inset 0 0 44px rgba(139,92,246,.12); animation:kosmosOrbit 9s ease-in-out infinite; } .kosmosRift::after{inset:25%;border-color:rgba(255,79,214,.14);animation-duration:13s;animation-direction:reverse} @keyframes kosmosRift{to{transform:translate(-50%,-50%) rotate(360deg)}} @keyframes kosmosOrbit{50%{transform:scale(.86) rotateX(35deg);opacity:.68}} .wrap{position:relative;z-index:10;width:100%;height:100%} .searchDock{ position:fixed; left:50%; top:calc(var(--safe-top) + 10px); transform:translateX(-50%); z-index:50; width:min(620px,calc(100vw - 250px)); border:1px solid rgba(255,255,255,.13); border-radius:999px; background:linear-gradient(180deg,rgba(10,14,34,.80),rgba(8,12,26,.60)); backdrop-filter:blur(18px); box-shadow: 0 16px 42px rgba(0,0,0,.40), 0 14px 28px rgba(49,46,129,.22), 0 1px 0 rgba(255,255,255,.08) inset; transition:.25s ease; } .searchDock:hover,.searchDock:focus-within{ border-color:rgba(139,92,246,.54); box-shadow: 0 22px 60px rgba(0,0,0,.48), 0 18px 44px rgba(79,70,229,.34), 0 0 30px rgba(106,224,255,.10); transform:translateX(-50%) translateY(-2px); } .searchField{display:flex;align-items:center;gap:8px;padding:6px 8px 6px 14px} .searchField svg{width:18px;height:18px;opacity:.74;flex:0 0 18px} .searchField input{ flex:1;min-width:0;border:0;outline:0;background:transparent;color:var(--text); padding:10px 4px;font:inherit;font-size:13px;letter-spacing:.04em; } .searchField input::placeholder{color:rgba(174,184,216,.74)} .searchGo{ border:1px solid rgba(255,255,255,.14); color:var(--text); border-radius:999px; padding:9px 15px; min-height:36px; cursor:pointer; font-size:11px; font-weight:900; letter-spacing:.14em; text-transform:uppercase; background:linear-gradient(135deg,rgba(106,224,255,.14),rgba(79,70,229,.34)); box-shadow:0 10px 24px rgba(49,46,129,.28); } .weatherDock{ position:fixed; left:var(--safe-left); top:calc(var(--safe-top) + 68px); z-index:44; width:min(320px,calc(100vw - 120px)); padding:14px 16px; border:1px solid rgba(255,255,255,.11); border-radius:24px; background:linear-gradient(180deg,rgba(10,14,34,.72),rgba(8,12,26,.50)); backdrop-filter:blur(18px); box-shadow:0 18px 46px rgba(0,0,0,.30),0 18px 38px rgba(49,46,129,.24); transition:.25s ease; } .weatherDock:hover{transform:translateY(-3px);border-color:rgba(139,92,246,.34)} .weatherTop{display:flex;justify-content:space-between;gap:12px} .weatherLabel{font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--muted)} .weatherCity{margin-top:4px;font-size:15px;font-weight:800} .weatherTime{font-size:28px;font-weight:1000} .weatherMeta{display:grid;grid-template-columns:52px 1fr;gap:12px;align-items:center;margin-top:10px} .weatherIcon{ width:52px;height:52px;border-radius:17px;display:grid;place-items:center;font-size:26px; border:1px solid rgba(255,255,255,.10); background:linear-gradient(180deg,rgba(255,255,255,.08),rgba(79,70,229,.10)); box-shadow:0 12px 24px rgba(49,46,129,.24); } .weatherNow{font-size:14px;font-weight:800} .weatherDate{margin-top:4px;font-size:12px;color:var(--muted)} .centerTitle{ position:fixed; left:50%; top:50%; transform:translate(-50%,-50%); z-index:18; width:min(1160px,calc(100vw - 24px)); text-align:center; pointer-events:none; user-select:none; perspective:1000px; } .titleHalo{ position:absolute; inset:-120px; border-radius:50%; background: radial-gradient(circle at 50% 52%,rgba(79,70,229,.30),transparent 48%), radial-gradient(circle at 50% 54%,rgba(106,224,255,.14),transparent 62%); filter:blur(14px); animation:titleHalo 5.6s ease-in-out infinite; } @keyframes titleHalo{ 0%,100%{transform:scale(.92);opacity:.62} 50%{transform:scale(1.08);opacity:1} } .titleFx{ position:relative; display:inline-block; max-width:100%; font-size:clamp(34px,6vw,100px); line-height:1; font-weight:1000; letter-spacing:.18em; text-transform:uppercase; color:transparent; background: linear-gradient(90deg,#fff 0%,#6ae0ff 18%,#8b5cf6 34%,#ff4fd6 52%,#ffd36a 70%,#6ae0ff 86%,#fff 100%); background-size:240% 100%; -webkit-background-clip:text; background-clip:text; text-shadow: 0 2px 0 rgba(255,255,255,.18), 0 12px 0 rgba(30,27,75,.38), 0 20px 34px rgba(0,0,0,.56), 0 0 26px rgba(106,224,255,.18), 0 0 54px rgba(79,70,229,.28); transform-style:preserve-3d; animation: brandFlow 7s linear infinite, brandFloat 5s ease-in-out infinite; } .titleFx::after{ content:attr(data-text); position:absolute; inset:0; z-index:-1; color:rgba(49,46,129,.62); transform:translate3d(0,12px,-22px) skewX(-3deg); filter:blur(1px); } @keyframes brandFlow{to{background-position:-240% 0}} @keyframes brandFloat{ 0%,100%{transform:perspective(1000px) rotateX(2deg) rotateY(-2deg) translateY(0)} 50%{transform:perspective(1000px) rotateX(-2deg) rotateY(2deg) translateY(-8px)} } .sub{ margin-top:18px; color:rgba(222,228,249,.84); font-size:12px; letter-spacing:.22em; text-transform:uppercase; text-shadow:0 0 20px rgba(79,70,229,.40); } .orb{ position:fixed; top:calc(var(--safe-top) + 2px); right:calc(var(--safe-right) + 2px); z-index:60; width:78px;height:78px; border-radius:24px; border:1px solid rgba(255,255,255,.16); cursor:pointer; display:grid;place-items:center; color:white; background: radial-gradient(circle at 32% 26%,rgba(255,255,255,.22),transparent 26%), linear-gradient(145deg,rgba(106,224,255,.14),rgba(79,70,229,.34)); box-shadow: 0 24px 70px rgba(0,0,0,.50), 0 20px 40px rgba(49,46,129,.34), 0 0 32px rgba(106,224,255,.10); backdrop-filter:blur(16px); transition:transform .25s ease,box-shadow .25s ease,border-color .25s ease; overflow:hidden; } .orb::before{ content:""; position:absolute; inset:-40%; background:conic-gradient(from 0deg,transparent,rgba(106,224,255,.55),rgba(139,92,246,.58),transparent 56%); animation:orbSpin 6s linear infinite; } .orb::after{ content:""; position:absolute; inset:3px; border-radius:21px; background:linear-gradient(145deg,rgba(12,18,42,.92),rgba(10,12,30,.72)); } .orb span{position:relative;z-index:2;font-size:28px;font-weight:1000;letter-spacing:-.08em} .orb:hover,.orb:focus-visible{ transform:translateY(-3px) scale(1.04); border-color:rgba(139,92,246,.64); box-shadow: 0 30px 90px rgba(0,0,0,.56), 0 26px 54px rgba(79,70,229,.48), 0 0 44px rgba(106,224,255,.18); outline:none; } @keyframes orbSpin{to{transform:rotate(360deg)}} .menu{ position:fixed; left:50%; top:calc(var(--safe-top) + 92px); transform:translateX(-50%) translateY(14px) scale(.985); z-index:70; width:min(1180px,calc(100vw - 20px)); max-height:calc(100vh - 118px - var(--safe-bottom)); overflow:auto; display:grid; grid-template-columns:1.15fr .85fr; gap:18px; padding:22px; border:1px solid rgba(255,255,255,.14); border-radius:30px; background: linear-gradient(180deg,rgba(10,15,38,.88),rgba(5,8,22,.76)); backdrop-filter:blur(24px) saturate(1.1); box-shadow: var(--shadow), 0 24px 70px rgba(49,46,129,.34), 0 0 56px rgba(79,70,229,.12), inset 0 1px 0 rgba(255,255,255,.08); opacity:0; pointer-events:none; filter:blur(8px); transition:opacity .28s ease,transform .28s ease,filter .28s ease; } .menu.on,.menu.hover-open{ opacity:1; pointer-events:auto; filter:blur(0); transform:translateX(-50%) translateY(0) scale(1); } .panel{ position:relative; min-height:220px; padding:18px; border:1px solid rgba(255,255,255,.11); border-radius:24px; background: linear-gradient(180deg,rgba(255,255,255,.045),rgba(255,255,255,.018)); box-shadow: 0 16px 40px rgba(0,0,0,.24), 0 20px 34px rgba(49,46,129,.18), inset 0 1px 0 rgba(255,255,255,.05); overflow:hidden; } .panel::after{ content:""; position:absolute; left:12%;right:12%;bottom:-18px;height:26px; background:radial-gradient(ellipse,rgba(79,70,229,.58),transparent 72%); filter:blur(12px); pointer-events:none; } .panel h2{margin:0 0 10px;font-size:14px;letter-spacing:.16em;text-transform:uppercase} .panel p{margin:0;color:var(--muted);font-size:14px;line-height:1.55} .gridlinks{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:10px; margin-top:15px; } .a{ position:relative; isolation:isolate; display:flex; align-items:center; justify-content:space-between; gap:12px; min-height:54px; padding:12px 14px; border:1px solid rgba(255,255,255,.12); border-radius:17px; color:rgba(239,245,255,.96); text-decoration:none; overflow:hidden; background: linear-gradient(145deg,rgba(255,255,255,.055),rgba(255,255,255,.018)); box-shadow: 0 10px 24px rgba(0,0,0,.22), 0 12px 24px rgba(49,46,129,.14), inset 0 1px 0 rgba(255,255,255,.04); transform:translateZ(0); transition:transform .22s ease,border-color .22s ease,box-shadow .22s ease,background .22s ease; } .a::before{ content:""; position:absolute; top:-60%;bottom:-60%;left:-52%; width:36%; z-index:-1; transform:rotate(18deg); background:linear-gradient(90deg,transparent,rgba(255,255,255,.20),transparent); transition:left .55s ease; } .a::after{ content:""; position:absolute; left:10%;right:10%;bottom:-15px;height:24px; z-index:-2; background:radial-gradient(ellipse,rgba(79,70,229,.72),transparent 72%); filter:blur(12px); opacity:.56; transition:opacity .22s ease,transform .22s ease; } .a:hover,.a:focus-visible{ transform:translateY(-4px) rotateX(2deg) scale(1.015); border-color:rgba(139,92,246,.52); background:linear-gradient(145deg,rgba(106,224,255,.08),rgba(79,70,229,.16)); box-shadow: 0 18px 40px rgba(0,0,0,.30), 0 22px 44px rgba(79,70,229,.34), 0 0 26px rgba(106,224,255,.08), inset 0 1px 0 rgba(255,255,255,.08); outline:none; } .a:hover::before,.a:focus-visible::before{left:120%} .a:hover::after,.a:focus-visible::after{opacity:1;transform:scaleX(1.18)} .a i{font-style:normal;color:var(--cyan);text-shadow:0 0 14px rgba(106,224,255,.72)} .a span{min-width:0} .gaylord-chat-link{ grid-column:1/-1; min-height:74px; border-color:rgba(139,92,246,.50); background: radial-gradient(circle at 16% 50%,rgba(106,224,255,.18),transparent 34%), radial-gradient(circle at 84% 50%,rgba(255,79,214,.16),transparent 36%), linear-gradient(135deg,rgba(79,70,229,.28),rgba(49,46,129,.34)); box-shadow: 0 16px 38px rgba(0,0,0,.28), 0 24px 52px rgba(49,46,129,.40), 0 0 34px rgba(106,224,255,.08), inset 0 1px 0 rgba(255,255,255,.10); } .gaylord-chat-link .gl-copy{display:grid;gap:4px} .gaylord-chat-link strong{ font-size:15px; letter-spacing:.12em; text-transform:uppercase; color:transparent; background:linear-gradient(90deg,#fff,#6ae0ff,#8b5cf6,#ff4fd6,#ffd36a,#fff); background-size:220% 100%; -webkit-background-clip:text; background-clip:text; animation:brandFlow 5s linear infinite; text-shadow:0 0 24px rgba(79,70,229,.24); } .gaylord-chat-link small{ color:rgba(210,219,244,.78); font-size:10px; letter-spacing:.08em; line-height:1.35; text-transform:uppercase; } .gaylord-chat-link .launch{ flex:0 0 auto; width:42px;height:42px; border-radius:14px; display:grid;place-items:center; border:1px solid rgba(255,255,255,.14); background:rgba(255,255,255,.06); box-shadow:0 14px 28px rgba(49,46,129,.30); font-size:20px; } .signalGrid{display:grid;gap:10px;margin-top:14px} .signal{ display:flex;align-items:center;justify-content:space-between;gap:12px; padding:12px 14px; border:1px solid rgba(255,255,255,.10); border-radius:16px; background:linear-gradient(180deg,rgba(255,255,255,.035),rgba(255,255,255,.012)); box-shadow:0 10px 22px rgba(49,46,129,.12); } .signal b{font-size:11px;letter-spacing:.12em;text-transform:uppercase} .signal span{max-width:58%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size:12px} .auth-wrap{ margin-top:16px; padding:16px; border:1px solid rgba(255,255,255,.11); border-radius:20px; background:linear-gradient(180deg,rgba(79,70,229,.10),rgba(7,10,24,.32)); box-shadow:0 18px 36px rgba(49,46,129,.18); } .auth-kicker{font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:var(--muted)} .auth-title{margin-top:5px;font-size:18px;font-weight:900;letter-spacing:.08em;text-transform:uppercase} .auth-copy{margin-top:6px;color:var(--muted);font-size:13px;line-height:1.45} .auth-stack{display:grid;gap:10px;margin-top:14px} .auth-btn{ display:flex;align-items:center;gap:12px;min-height:54px;padding:11px 13px; border:1px solid rgba(255,255,255,.12);border-radius:17px;color:var(--text);text-decoration:none; background:linear-gradient(180deg,rgba(255,255,255,.055),rgba(255,255,255,.018)); box-shadow:0 12px 26px rgba(49,46,129,.16); transition:.22s ease; } .auth-btn:hover{transform:translateY(-2px);border-color:rgba(139,92,246,.46);box-shadow:0 18px 34px rgba(79,70,229,.28)} .auth-icon{ width:36px;height:36px;border-radius:12px;display:grid;place-items:center;flex:0 0 36px; border:1px solid rgba(255,255,255,.11);background:rgba(255,255,255,.06); } .auth-text{display:grid;gap:2px;min-width:0;flex:1} .auth-name{font-size:12px;font-weight:900;letter-spacing:.12em;text-transform:uppercase} .auth-meta{font-size:10px;color:var(--muted);letter-spacing:.07em;text-transform:uppercase} .controls{ position:fixed; left:50%; bottom:calc(var(--safe-bottom) + 8px); transform:translateX(-50%) translateY(20px); z-index:58; display:flex;align-items:center;justify-content:center;gap:8px;flex-wrap:wrap; width:min(92vw,720px); padding:8px 10px; border:1px solid rgba(255,255,255,.11); border-radius:999px; background:linear-gradient(180deg,rgba(12,16,38,.76),rgba(8,12,28,.60)); backdrop-filter:blur(18px); box-shadow:0 18px 52px rgba(0,0,0,.42),0 18px 36px rgba(49,46,129,.28); opacity:0;pointer-events:none; transition:.35s ease; } .controls.shown{opacity:.96;pointer-events:auto;transform:translateX(-50%) translateY(0)} .btn{ min-height:40px;padding:9px 13px;border-radius:999px;cursor:pointer; border:1px solid rgba(255,255,255,.11);color:var(--text); background:rgba(255,255,255,.035); font-size:10px;font-weight:800;letter-spacing:.12em;text-transform:uppercase; box-shadow:0 10px 22px rgba(49,46,129,.18); } .btn:hover{border-color:rgba(139,92,246,.46);transform:translateY(-2px);box-shadow:0 16px 30px rgba(79,70,229,.30)} .simonLive{ position:fixed; left:calc(var(--safe-left) + 4px); bottom:calc(var(--safe-bottom) + 70px); z-index:46; display:flex;align-items:center;gap:10px; padding:8px 14px 8px 10px; border:1px solid rgba(106,224,255,.22); border-radius:999px; color:var(--text);text-decoration:none; background:linear-gradient(180deg,rgba(10,16,32,.78),rgba(10,16,32,.52)); box-shadow:0 14px 30px rgba(49,46,129,.24); font-size:11px;letter-spacing:.14em;text-transform:uppercase; } .simonLive .dot{ width:9px;height:9px;border-radius:50%;background:var(--good); box-shadow:0 0 0 3px rgba(90,255,170,.18),0 0 14px rgba(90,255,170,.64); animation:blink 1.6s ease-in-out infinite; } .simonLive.off .dot{background:var(--danger);animation:none} .simonLive .count{color:var(--cyan);font-weight:900} @keyframes blink{50%{transform:scale(1.22);opacity:1}} .searchOverlay{ position:fixed; left:50%; top:calc(var(--safe-top) + 72px); transform:translateX(-50%) translateY(-8px); z-index:76; width:min(1120px,calc(100vw - 20px)); max-height:calc(100vh - 98px - var(--safe-bottom)); overflow:hidden; display:flex; flex-direction:column; border-radius:28px; border:1px solid rgba(255,255,255,.14); background:linear-gradient(180deg,rgba(7,10,28,.96),rgba(3,6,18,.90)); backdrop-filter:blur(26px) saturate(1.12); box-shadow:var(--shadow),0 28px 70px rgba(49,46,129,.34),0 0 52px rgba(106,224,255,.10); opacity:0; pointer-events:none; transition:.22s ease; } .searchOverlay.on{opacity:1;pointer-events:auto;transform:translateX(-50%) translateY(0)} .searchHead{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:14px 16px;border-bottom:1px solid rgba(255,255,255,.08)} .searchHead b{font-size:11px;letter-spacing:.18em;text-transform:uppercase} .searchClose{border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.04);color:white;border-radius:999px;padding:7px 11px;cursor:pointer} .searchStatus{padding:10px 16px;color:var(--muted);font-size:11px;border-bottom:1px solid rgba(255,255,255,.06)} .searchResults{padding:10px;overflow:auto;display:grid;gap:8px} .searchCard{display:block;text-decoration:none;padding:12px 14px;border-radius:16px;border:1px solid rgba(255,255,255,.09);background:rgba(255,255,255,.025);color:var(--text)} .searchCard:hover{border-color:rgba(106,224,255,.30);background:rgba(106,224,255,.045)} .searchCard b{font-size:13px} .searchCard small{display:block;margin-top:4px;color:var(--cyan)} .searchCard p{margin:7px 0 0;font-size:12px;line-height:1.45;color:var(--muted)} .searchEmpty{padding:32px;text-align:center;color:var(--muted);font-size:12px;letter-spacing:.12em;text-transform:uppercase} .kosmos-link{ grid-column:1/-1; min-height:76px; border-color:rgba(106,224,255,.42); background: radial-gradient(circle at 14% 45%,rgba(106,224,255,.20),transparent 32%), radial-gradient(circle at 78% 50%,rgba(255,211,106,.14),transparent 34%), linear-gradient(135deg,rgba(20,184,166,.12),rgba(79,70,229,.30),rgba(255,79,214,.12)); } .kosmos-link strong{display:block;font-size:15px;letter-spacing:.14em;text-transform:uppercase} .kosmos-link small{display:block;margin-top:4px;color:rgba(210,219,244,.78);font-size:10px;letter-spacing:.08em;line-height:1.35;text-transform:uppercase} @media (max-width:1020px){ .menu{grid-template-columns:1fr} } @media (max-width:760px){ .orb{width:60px;height:60px;border-radius:20px} .orb::after{border-radius:17px} .searchDock{ top:calc(var(--safe-top) + 2px); left:var(--safe-left); transform:none; width:calc(100vw - var(--safe-left) - var(--safe-right) - 70px); } .searchDock:hover,.searchDock:focus-within{transform:translateY(-1px)} .searchGo{padding:8px 11px} .weatherDock{top:calc(var(--safe-top) + 72px);width:calc(100vw - var(--safe-left) - var(--safe-right))} .weatherTime{font-size:24px} .titleFx{font-size:clamp(28px,10vw,56px);letter-spacing:.10em} .sub{font-size:9px;letter-spacing:.14em} .menu{ top:calc(var(--safe-top) + 142px); width:calc(100vw - 12px); max-height:calc(100vh - 160px - var(--safe-bottom)); padding:14px; border-radius:22px; } .gridlinks{grid-template-columns:1fr} .gaylord-chat-link{grid-column:auto} .controls{width:calc(100vw - 12px)} .simonLive{bottom:calc(var(--safe-bottom) + 64px)} } @media (prefers-reduced-motion:reduce){ *,*::before,*::after{animation:none !important;scroll-behavior:auto !important} } </style> </head> <body> <div class="sceneWrap" aria-hidden="true"> <iframe class="scene" id="sceneOne" src="about:blank" title="Background scene" tabindex="-1"></iframe> <div class="sceneGlass"></div> </div> <div class="indigoFloor" aria-hidden="true"></div> <canvas id="stars" aria-hidden="true"></canvas> <canvas id="kosmosLayer" aria-hidden="true"></canvas> <div class="kosmosRift" aria-hidden="true"></div> <main class="wrap"> <form class="searchDock" id="searchDock" role="search" autocomplete="off"> <div class="searchField"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <circle cx="11" cy="11" r="7"></circle> <path d="m20 20-3.5-3.5"></path> </svg> <input id="searchInput" type="search" placeholder="Search SIMON, Gay Central, KN, Kosmos, books, art, and the web" aria-label="Search"> <button class="searchGo" type="submit">Search</button> </div> </form> <a class="simonLive" id="simonLive" href="/web360/ui/simon_feed_helix.html" title="Open SIMON Feed Dashboard"> <span class="dot" aria-hidden="true"></span> <span>SIMON</span> <span class="count" id="simonLiveCount">0</span> </a> <section class="weatherDock" aria-label="Local time and weather"> <div class="weatherTop"> <div> <div class="weatherLabel">Local Weather</div> <div class="weatherCity" id="weatherCity">Waiting for location</div> </div> <div class="weatherTime" id="weatherTime">--:--</div> </div> <div class="weatherMeta"> <div class="weatherIcon" id="weatherIcon">◌</div> <div> <div class="weatherNow" id="weatherNow">Location not loaded</div> <div class="weatherDate" id="weatherDate">Loading…</div> </div> </div> </section> <section class="searchOverlay" id="searchOverlay" role="dialog" aria-hidden="true" aria-label="SIMON Unified Search"> <div class="searchHead"><b>SIMON Unified Search</b><button class="searchClose" id="searchClose" type="button">Close</button></div> <div class="searchStatus" id="searchStatus">Ready</div> <div class="searchResults" id="searchResults"><div class="searchEmpty">Enter a query to search the living network.</div></div> </section> <section class="centerTitle" aria-label="Gaylord Sinclair"> <div class="titleHalo"></div> <div class="titleFx" data-text="GAYLORD SINCLAIR">GAYLORD SINCLAIR</div> <div class="sub">Books • Art • SIMON • KOSMOS • GayLord Chat • Web Systems</div> </section> <button class="orb" id="orb" type="button" aria-controls="menu" aria-expanded="false" aria-label="Open navigation"> <span>GL</span> </button> <section class="menu" id="menu" aria-label="Site menu"> <div class="panel"> <h2>Gaylord Sinclair</h2> <p>A living archive of books, art, comics, publishing, GayLord Chat, KOSMOS Network, and SIMON intelligence systems.</p> <nav class="gridlinks" aria-label="Primary"> <a class="a sound-trigger" data-tone="mid" href="/books/index.php"><span>Books</span><i>→</i></a> <a class="a sound-trigger" data-tone="mid" href="/art/"><span>Art</span><i>→</i></a> <a class="a sound-trigger" data-tone="mid" href="/comics/"><span>Comics</span><i>→</i></a> <a class="a sound-trigger" data-tone="mid" href="/arcade/"><span>SIMON Arcade</span><i>→</i></a> <a class="a sound-trigger" data-tone="mid" href="/pressbox/"><span>Pressbox</span><i>→</i></a> <a class="a sound-trigger" data-tone="mid" href="/infinity/"><span>Infinity</span><i>→</i></a> <a class="a sound-trigger" data-tone="mid" href="/simon_ai/index.php"><span>SIMON AI</span><i>→</i></a> <a class="a kosmos-link sound-trigger" data-tone="high" href="/kosmos/kosmos_dimensions_forge.php" aria-label="Open Kosmos Dimensions Forge"><span><strong>KOSMOS Network</strong><small>Spatial body forge, nebula release, sound shields, galaxy effects</small></span><i>✦</i></a> <a class="a gaylord-chat-link sound-trigger" data-tone="high" href="https://gaylordsinclair.com/GayLord/" aria-label="Open GayLord Chat"> <span class="gl-copy"> <strong>GayLord Chat</strong> <small>Nearby profiles, spatial map, private messages, groups, reels, market, network, and KOSMOS access</small> </span> <span class="launch" aria-hidden="true">↗</span> </a> <a class="a sound-trigger" data-tone="mid" href="/web360/index.php"><span>Web360</span><i>→</i></a> <a class="a sound-trigger" data-tone="mid" href="/connlink/test1/ui/index.html"><span>SIMON Feed</span><i>→</i></a> <a class="a sound-trigger" data-tone="mid" href="/wicked/"><span>Wicked</span><i>→</i></a> <a class="a sound-trigger" data-tone="mid" href="/about.php"><span>About</span><i>→</i></a> <a class="a sound-trigger" data-tone="mid" href="/contacts.php"><span>Contact</span><i>→</i></a> <a class="a sound-trigger" data-tone="mid" href="/sitemap.php"><span>Sitemap</span><i>→</i></a> <a class="a sound-trigger" data-tone="mid" href="/privacy.php"><span>Privacy</span><i>→</i></a> <a class="a sound-trigger" data-tone="mid" href="/terms.php"><span>Terms</span><i>→</i></a> </nav> </div> <div class="panel"> <h2>SIMON Pulse</h2> <p>Live system signals, scene rotation, secure access, webhook monitoring, and indigo-lit interface state.</p> <div class="signalGrid"> <div class="signal"><b>Scene Count</b><span>47</span></div> <div class="signal"><b>Rotation</b><span id="rotationState">Playing</span></div> <div class="signal"><b>Interaction</b><span id="interactionState">Locked</span></div> <div class="signal"><b>Webhook Events</b><span id="pulseCount">Listening…</span></div> <div class="signal"><b>Last Signal</b><span id="pulseLast">Waiting…</span></div> </div> <div class="auth-wrap"> <div class="auth-kicker">Secure Access</div> <div class="auth-title">Guardian Login</div> <div class="auth-copy">Enter the protected SIMON layer through a trusted identity provider.</div> <div class="auth-stack"> <a class="auth-btn sound-trigger" data-tone="high" href="/api/auth/google_start.php"> <span class="auth-icon">G</span> <span class="auth-text"><span class="auth-name">Google</span><span class="auth-meta">Trusted identity bridge</span></span> <span>→</span> </a> <a class="auth-btn sound-trigger" data-tone="mid" href="/api/auth/apple_start.php"> <span class="auth-icon"></span> <span class="auth-text"><span class="auth-name">Apple</span><span class="auth-meta">Private device authentication</span></span> <span>→</span> </a> <a class="auth-btn sound-trigger" data-tone="low" href="/api/auth/passkey_start.php"> <span class="auth-icon">⌁</span> <span class="auth-text"><span class="auth-name">Passkey</span><span class="auth-meta">Biometric or security key</span></span> <span>→</span> </a> </div> </div> </div> </section> <div class="controls" id="controls" role="group" aria-label="Scene controls"> <button class="btn sound-trigger" data-tone="low" id="prevBtn" type="button">Prev</button> <button class="btn sound-trigger" data-tone="mid" id="nextBtn" type="button">Next</button> <button class="btn sound-trigger" data-tone="mid" id="pauseBtn" type="button">Pause</button> <button class="btn sound-trigger" data-tone="low" id="interactBtn" type="button">Interact Off</button> </div> </main> <script> (() => { 'use strict'; const CFG = window.SIMON_CONFIG || {}; const BASE = CFG.WEBHOOK_BASE || '/connlink/test1/ui/webhook_inbox.php'; const KEY = CFG.KEY ? '&key=' + encodeURIComponent(CFG.KEY) : ''; const PULSE_STREAM = CFG.PULSE_STREAM || 'default'; const VISIT_STREAM = CFG.VISIT_STREAM || 'visits'; const scenes = Array.from({length: 47}, (_, i) => `/assetts/bg/${i + 1}.html`); const scene = document.getElementById('sceneOne'); const orb = document.getElementById('orb'); const menu = document.getElementById('menu'); const controls = document.getElementById('controls'); const prevBtn = document.getElementById('prevBtn'); const nextBtn = document.getElementById('nextBtn'); const pauseBtn = document.getElementById('pauseBtn'); const interactBtn = document.getElementById('interactBtn'); const rotationState = document.getElementById('rotationState'); const interactionState = document.getElementById('interactionState'); let sceneIndex = Math.floor(Math.random() * scenes.length); let paused = false; let interacting = false; let hoverTimer = null; let rotateTimer = null; let audioCtx = null; const searchForm = document.getElementById('searchDock'); const searchInput = document.getElementById('searchInput'); const searchOverlay = document.getElementById('searchOverlay'); const searchResults = document.getElementById('searchResults'); const searchStatus = document.getElementById('searchStatus'); const searchClose = document.getElementById('searchClose'); const SEARCH_BASE = '/connlink/test1/ui'; function closeSearch() { searchOverlay.classList.remove('on'); searchOverlay.setAttribute('aria-hidden','true'); } function openSearch() { searchOverlay.classList.add('on'); searchOverlay.setAttribute('aria-hidden','false'); } searchClose.addEventListener('click', closeSearch); searchForm.addEventListener('submit', async (event) => { event.preventDefault(); const q = searchInput.value.trim(); if (!q) return; openSearch(); searchStatus.textContent = `Searching for “${q}”`; searchResults.innerHTML = '<div class="searchEmpty">SIMON is gathering proxy results.</div>'; const wikiUrl = 'https://en.wikipedia.org/w/api.php?origin=*&' + new URLSearchParams({ action:'query', format:'json', list:'search', srlimit:'6', srsearch:q }); const engines = [ fetch(`${SEARCH_BASE}/gsearch_proxy.php?q=${encodeURIComponent(q)}&num=8`).then(r => r.json()).then(j => j.results || []).catch(() => []), fetch(`${SEARCH_BASE}/bing_proxy.php?q=${encodeURIComponent(q)}&num=8`).then(r => r.json()).then(j => j.results || []).catch(() => []), fetch(`${SEARCH_BASE}/ddg_proxy.php?q=${encodeURIComponent(q)}&num=8`).then(r => r.json()).then(j => j.results || []).catch(() => []), fetch(wikiUrl).then(r => r.json()).then(j => (j.query?.search || []).map(x => ({ title:x.title, snippet:(x.snippet || '').replace(/<[^>]+>/g,''), url:'https://en.wikipedia.org/wiki/' + encodeURIComponent(x.title.replace(/ /g,'_')), source:'Wikipedia' }))).catch(() => []) ]; const groups = await Promise.all(engines); const seen = new Set(); const merged = []; groups.flat().forEach(item => { if (!item?.url || !item?.title) return; const key = item.url.split('#')[0].replace(/\/$/,''); if (seen.has(key)) return; seen.add(key); merged.push(item); }); searchStatus.textContent = `${merged.length} results for “${q}”`; searchResults.innerHTML = ''; if (!merged.length) { searchResults.innerHTML = '<div class="searchEmpty">No results returned. Check proxy endpoints or search again.</div>'; return; } merged.slice(0,30).forEach(item => { const card = document.createElement('a'); card.className = 'searchCard'; card.href = item.url; card.target = '_blank'; card.rel = 'noopener noreferrer'; const title = document.createElement('b'); title.textContent = item.title; const source = document.createElement('small'); source.textContent = item.source || (() => { try { return new URL(item.url).hostname; } catch (_) { return item.url; } })(); const snippet = document.createElement('p'); snippet.textContent = item.snippet || ''; card.append(title, source); if (item.snippet) card.append(snippet); searchResults.append(card); }); }); const shuffle = (arr) => { const copy = [...arr]; for (let i = copy.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [copy[i], copy[j]] = [copy[j], copy[i]]; } return copy; }; const shuffled = shuffle(scenes); function setScene(index) { sceneIndex = (index + shuffled.length) % shuffled.length; scene.classList.remove('on'); setTimeout(() => { scene.src = shuffled[sceneIndex]; setTimeout(() => scene.classList.add('on'), 90); }, 130); } function nextScene(){ setScene(sceneIndex + 1); } function prevScene(){ setScene(sceneIndex - 1); } function startRotation() { clearInterval(rotateTimer); rotateTimer = setInterval(() => { if (!paused && !menu.classList.contains('on') && !menu.classList.contains('hover-open')) { nextScene(); } }, 45000); } function setMenu(open) { menu.classList.toggle('on', open); orb.setAttribute('aria-expanded', open ? 'true' : 'false'); orb.setAttribute('aria-label', open ? 'Close navigation' : 'Open navigation'); } orb.addEventListener('click', () => setMenu(!menu.classList.contains('on'))); orb.addEventListener('mouseenter', () => { clearTimeout(hoverTimer); menu.classList.add('hover-open'); }); orb.addEventListener('mouseleave', () => { hoverTimer = setTimeout(() => { if (!menu.matches(':hover')) menu.classList.remove('hover-open'); }, 180); }); menu.addEventListener('mouseenter', () => { clearTimeout(hoverTimer); menu.classList.add('hover-open'); }); menu.addEventListener('mouseleave', () => { hoverTimer = setTimeout(() => { if (!menu.classList.contains('on')) menu.classList.remove('hover-open'); }, 180); }); prevBtn.addEventListener('click', prevScene); nextBtn.addEventListener('click', nextScene); pauseBtn.addEventListener('click', () => { paused = !paused; pauseBtn.textContent = paused ? 'Resume' : 'Pause'; rotationState.textContent = paused ? 'Paused' : 'Playing'; }); interactBtn.addEventListener('click', () => { interacting = !interacting; document.body.classList.toggle('interact', interacting); interactBtn.textContent = interacting ? 'Interact On' : 'Interact Off'; interactionState.textContent = interacting ? 'Interactive' : 'Locked'; }); document.addEventListener('keydown', (event) => { const tag = event.target && event.target.tagName ? event.target.tagName.toLowerCase() : ''; if (['input','textarea','select'].includes(tag)) return; if (event.key === 'Escape') { setMenu(false); closeSearch(); } if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') { event.preventDefault(); searchInput.focus(); searchInput.select(); } if (event.key === 'ArrowLeft') prevScene(); if (event.key === 'ArrowRight') nextScene(); if (event.key === ' ') { event.preventDefault(); pauseBtn.click(); } }); let controlsTimer = null; function showControls(ms = 2400) { controls.classList.add('shown'); clearTimeout(controlsTimer); controlsTimer = setTimeout(() => controls.classList.remove('shown'), ms); } document.addEventListener('mousemove', (event) => { if (window.innerHeight - event.clientY < 160) showControls(); }); document.addEventListener('touchstart', () => showControls(3200), {passive:true}); document.addEventListener('keydown', () => showControls()); setTimeout(() => showControls(2600), 600); function ensureAudio() { if (!audioCtx) { const AudioContextClass = window.AudioContext || window.webkitAudioContext; if (AudioContextClass) audioCtx = new AudioContextClass(); } if (audioCtx && audioCtx.state === 'suspended') audioCtx.resume().catch(() => {}); return audioCtx; } function tone(freq, duration = .05, gainValue = .016) { const ctx = ensureAudio(); if (!ctx) return; const osc = ctx.createOscillator(); const gain = ctx.createGain(); osc.type = 'triangle'; osc.frequency.value = freq; gain.gain.setValueAtTime(.0001, ctx.currentTime); gain.gain.exponentialRampToValueAtTime(gainValue, ctx.currentTime + .01); gain.gain.exponentialRampToValueAtTime(.0001, ctx.currentTime + duration); osc.connect(gain); gain.connect(ctx.destination); osc.start(); osc.stop(ctx.currentTime + duration + .02); } document.querySelectorAll('.sound-trigger').forEach((element) => { element.addEventListener('mouseenter', () => { const toneName = element.dataset.tone || 'mid'; tone(toneName === 'high' ? 740 : toneName === 'low' ? 320 : 520); }); }); window.addEventListener('pointerdown', ensureAudio, {once:true}); function updateClock() { const now = new Date(); document.getElementById('weatherTime').textContent = now.toLocaleTimeString([], { hour:'numeric', minute:'2-digit', hour12:true }); document.getElementById('weatherDate').textContent = now.toLocaleDateString([], { weekday:'short', month:'short', day:'numeric' }); } function weatherLabel(code) { if (code === 0) return ['☀','Clear']; if ([1,2,3].includes(code)) return ['☁','Cloudy']; if ([45,48].includes(code)) return ['〰','Fog']; if ([51,53,55,61,63,65,80,81,82].includes(code)) return ['☂','Rain']; if ([71,73,75,77,85,86].includes(code)) return ['❄','Snow']; if ([95,96,99].includes(code)) return ['⚡','Storm']; return ['◌','Weather']; } async function loadWeather(lat, lon) { try { const url = `https://api.open-meteo.com/v1/forecast?latitude=${encodeURIComponent(lat)}&longitude=${encodeURIComponent(lon)}¤t=temperature_2m,weather_code&temperature_unit=fahrenheit&timezone=auto`; const response = await fetch(url, {cache:'no-store'}); if (!response.ok) throw new Error('weather request failed'); const data = await response.json(); const temp = data?.current?.temperature_2m; const code = data?.current?.weather_code; const [icon, label] = weatherLabel(code); document.getElementById('weatherCity').textContent = 'Current Location'; document.getElementById('weatherIcon').textContent = icon; document.getElementById('weatherNow').textContent = Number.isFinite(temp) ? `${Math.round(temp)}°F ${label}` : label; } catch (error) { document.getElementById('weatherCity').textContent = 'Weather unavailable'; document.getElementById('weatherNow').textContent = 'Check connection'; } } updateClock(); setInterval(updateClock, 1000); if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( (position) => loadWeather(position.coords.latitude, position.coords.longitude), () => { document.getElementById('weatherCity').textContent = 'Location disabled'; document.getElementById('weatherNow').textContent = 'Local time active'; }, {enableHighAccuracy:false, timeout:5000, maximumAge:600000} ); } function sessionId() { try { let id = sessionStorage.getItem('simon_sess'); if (!id) { id = 's_' + Math.random().toString(36).slice(2) + Date.now().toString(36); sessionStorage.setItem('simon_sess', id); } return id; } catch (_) { return 's_' + Date.now(); } } function sendVisit() { fetch(`${BASE}?stream=${encodeURIComponent(VISIT_STREAM)}${KEY}`, { method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify({ title:`Visit · ${document.title}`, url:location.href, at:new Date().toISOString(), source:'index.php', session:sessionId(), screen:`${window.innerWidth}x${window.innerHeight}`, tz:Intl.DateTimeFormat().resolvedOptions().timeZone || 'Local', lang:navigator.language || '' }), keepalive:true }).catch(() => {}); } async function pollPulse() { try { const response = await fetch(`${BASE}?stream=${encodeURIComponent(PULSE_STREAM)}&limit=500${KEY}`, {cache:'no-store'}); if (!response.ok) throw new Error('pulse failed'); const data = await response.json(); const items = Array.isArray(data?.items) ? data.items : []; document.getElementById('simonLiveCount').textContent = String(items.length); document.getElementById('pulseCount').textContent = items.length ? `${items.length} tracked` : 'Listening…'; if (items[0]) { document.getElementById('pulseLast').textContent = items[0].title || '(event)'; } document.getElementById('simonLive').classList.remove('off'); } catch (error) { document.getElementById('simonLive').classList.add('off'); } } const canvas = document.getElementById('stars'); const ctx = canvas.getContext('2d', {alpha:true}); let width = 0; let height = 0; let dpr = Math.min(2, window.devicePixelRatio || 1); let stars = []; function resizeStars() { dpr = Math.min(2, window.devicePixelRatio || 1); width = Math.floor(window.innerWidth * dpr); height = Math.floor(window.innerHeight * dpr); canvas.width = width; canvas.height = height; canvas.style.width = `${window.innerWidth}px`; canvas.style.height = `${window.innerHeight}px`; const count = Math.max(28, Math.floor((window.innerWidth * window.innerHeight) / 18000)); stars = Array.from({length:count}, () => ({ x:Math.random() * width, y:Math.random() * height, r:(.55 + Math.random() * 1.5) * dpr, vx:(Math.random() * 8 - 4) * dpr, vy:(Math.random() * 10 - 5) * dpr, alpha:.08 + Math.random() * .22, hue:190 + Math.random() * 100 })); } function drawStars() { ctx.clearRect(0,0,width,height); for (const star of stars) { star.x += star.vx * .016; star.y += star.vy * .016; if (star.x < -30) star.x = width + 30; if (star.x > width + 30) star.x = -30; if (star.y < -30) star.y = height + 30; if (star.y > height + 30) star.y = -30; ctx.beginPath(); ctx.arc(star.x,star.y,star.r,0,Math.PI * 2); ctx.fillStyle = `hsla(${star.hue},98%,72%,${star.alpha})`; ctx.fill(); } requestAnimationFrame(drawStars); } window.addEventListener('resize', resizeStars); resizeStars(); drawStars(); const kosmosCanvas = document.getElementById('kosmosLayer'); const kctx = kosmosCanvas.getContext('2d', {alpha:true}); let kw = 0, kh = 0, kdpr = dpr, kParticles = [], kT = 0; function resizeKosmos() { kdpr = Math.min(2, window.devicePixelRatio || 1); kw = Math.floor(window.innerWidth * kdpr); kh = Math.floor(window.innerHeight * kdpr); kosmosCanvas.width = kw; kosmosCanvas.height = kh; kosmosCanvas.style.width = `${window.innerWidth}px`; kosmosCanvas.style.height = `${window.innerHeight}px`; const count = Math.max(90, Math.floor((window.innerWidth * window.innerHeight) / 9000)); kParticles = Array.from({length:count}, (_, i) => ({ seed:i * 17.13 + Math.random() * 100, radius:(42 + Math.random() * Math.min(kw, kh) * .42), angle:Math.random() * Math.PI * 2, speed:.00035 + Math.random() * .0012, size:(.7 + Math.random() * 2.8) * kdpr, hue:[190,262,306,43][i % 4] + Math.random() * 16, alpha:.10 + Math.random() * .30 })); } function drawKosmos() { kT += 16; kctx.clearRect(0,0,kw,kh); const cx = kw * .5; const cy = kh * .52; const breathe = 1 + Math.sin(kT * .0011) * .045; const neb = kctx.createRadialGradient(cx, cy, Math.min(kw,kh)*.05, cx, cy, Math.min(kw,kh)*.46); neb.addColorStop(0, 'rgba(106,224,255,.13)'); neb.addColorStop(.34, 'rgba(139,92,246,.08)'); neb.addColorStop(.68, 'rgba(255,79,214,.045)'); neb.addColorStop(1, 'rgba(0,0,0,0)'); kctx.fillStyle = neb; kctx.beginPath(); kctx.arc(cx, cy, Math.min(kw,kh)*.48*breathe, 0, Math.PI*2); kctx.fill(); for (const p of kParticles) { p.angle += p.speed * 16; const wave = Math.sin(kT * .001 + p.seed) * 24 * kdpr; const x = cx + Math.cos(p.angle) * (p.radius*breathe + wave); const y = cy + Math.sin(p.angle * 1.7 + p.seed) * (p.radius * .34) + Math.sin(p.angle) * p.radius * .28; kctx.beginPath(); kctx.arc(x, y, p.size, 0, Math.PI * 2); kctx.fillStyle = `hsla(${p.hue},100%,70%,${p.alpha})`; kctx.shadowColor = `hsla(${p.hue},100%,70%,.55)`; kctx.shadowBlur = 14 * kdpr; kctx.fill(); kctx.shadowBlur = 0; } requestAnimationFrame(drawKosmos); } window.addEventListener('resize', resizeKosmos); resizeKosmos(); drawKosmos(); setScene(sceneIndex); startRotation(); setTimeout(sendVisit, 500); setTimeout(pollPulse, 1200); setInterval(pollPulse, 30000); })(); </script> <script> /* ===== SIMON production telemetry: GA4 + webhook visit/click/search/error/performance ===== */ (() => { 'use strict'; const CFG = window.SIMON_CONFIG || {}; const base = CFG.WEBHOOK_BASE || '/connlink/test1/ui/webhook_inbox.php'; const visitStream = CFG.VISIT_STREAM || 'visits'; const pulseStream = CFG.PULSE_STREAM || 'default'; const key = CFG.KEY ? '&key=' + encodeURIComponent(CFG.KEY) : ''; function sessionId() { try { let id = sessionStorage.getItem('simon_session_id'); if (!id) { id = 's_' + Math.random().toString(36).slice(2) + Date.now().toString(36); sessionStorage.setItem('simon_session_id', id); } return id; } catch (_) { return 's_' + Date.now().toString(36); } } function payload(type, extra = {}) { return { type, title: extra.title || document.title, url: location.href, path: location.pathname, referrer: document.referrer || '', at: new Date().toISOString(), source: CFG.SOURCE || 'index.php', session: sessionId(), screen: window.innerWidth + 'x' + window.innerHeight, viewport: document.documentElement.clientWidth + 'x' + document.documentElement.clientHeight, dpr: window.devicePixelRatio || 1, tz: (Intl.DateTimeFormat().resolvedOptions().timeZone || 'Local'), lang: navigator.language || '', ua: navigator.userAgent || '', ...extra }; } function post(stream, data) { try { fetch(base + '?stream=' + encodeURIComponent(stream) + key, { method: 'POST', headers: {'Content-Type': 'application/json'}, keepalive: true, body: JSON.stringify(data) }).catch(() => {}); } catch (_) {} } function ga(eventName, params = {}) { try { if (typeof gtag === 'function') gtag('event', eventName, params); } catch (_) {} } function track(type, extra = {}, stream = visitStream) { const data = payload(type, extra); post(stream, data); ga('simon_' + type, { event_category: 'SIMON', event_label: extra.label || extra.title || type, page_path: location.pathname }); } window.SIMON_TRACK = track; track('page_view', {label: 'Gaylord Sinclair Homepage'}); let maxScroll = 0; const scrollSent = {}; function handleScroll() { const doc = document.documentElement; const total = Math.max(1, doc.scrollHeight - window.innerHeight); maxScroll = Math.max(maxScroll, Math.round((window.scrollY / total) * 100)); [25, 50, 75, 90, 100].forEach(mark => { if (maxScroll >= mark && !scrollSent[mark]) { scrollSent[mark] = true; track('scroll_depth', {label: mark + '%', percent: mark}, pulseStream); } }); } window.addEventListener('scroll', handleScroll, {passive: true}); document.addEventListener('click', (event) => { const target = event.target && event.target.closest ? event.target.closest('a,button,[data-track]') : null; if (!target) return; const isLink = target.tagName === 'A'; const href = isLink ? (target.getAttribute('href') || '') : ''; const text = (target.innerText || target.getAttribute('aria-label') || target.title || target.id || '').trim().slice(0, 140); const outbound = isLink && href && /^https?:\/\//i.test(href) && !href.includes(location.hostname); const download = isLink && /\.(pdf|zip|docx?|xlsx?|pptx?|epub|mp3|mp4|mov|jpg|jpeg|png|webp)$/i.test(href.split('?')[0]); track(download ? 'download_click' : outbound ? 'outbound_click' : 'ui_click', { label: text || href || target.id || 'click', href, outbound, download }, pulseStream); }, true); const searchForm = document.getElementById('searchDock'); const searchInput = document.getElementById('searchInput'); if (searchForm && searchInput) { searchForm.addEventListener('submit', () => { const q = (searchInput.value || '').trim(); if (q) track('search_submit', {label: q, query: q}, pulseStream); }, true); } window.addEventListener('error', (event) => { track('client_error', { label: event.message || 'script error', message: event.message || '', filename: event.filename || '', lineno: event.lineno || 0, colno: event.colno || 0 }, pulseStream); }); window.addEventListener('unhandledrejection', (event) => { track('promise_rejection', { label: 'unhandled promise rejection', message: String(event.reason && (event.reason.message || event.reason) || '') }, pulseStream); }); window.addEventListener('load', () => { setTimeout(() => { const nav = performance.getEntriesByType && performance.getEntriesByType('navigation')[0]; if (nav) { track('performance', { label: 'navigation', load_ms: Math.round(nav.loadEventEnd), dom_ms: Math.round(nav.domContentLoadedEventEnd), transfer_size: nav.transferSize || 0 }, pulseStream); } }, 800); }); window.addEventListener('beforeunload', () => { track('page_exit', { label: 'exit', seconds: Math.round(performance.now() / 1000), max_scroll: maxScroll }); }); })(); </script> <script defer src="https://ionos.ai-voice-receptionist.com/chat-scripts-MqGN74WP/web-chat.js" name="web-chat" data-client-secret="a3ed268b-8644-49dd-9506-9b4888d41714"></script> </body> </html>
Save file
Quick jump
open a path
Open