{"id":295,"date":"2026-02-18T00:15:53","date_gmt":"2026-02-18T00:15:53","guid":{"rendered":"https:\/\/aorphis.com\/home\/?page_id=295"},"modified":"2026-02-27T16:15:51","modified_gmt":"2026-02-27T16:15:51","slug":"test","status":"publish","type":"page","link":"https:\/\/aorphis.com\/app\/test\/","title":{"rendered":"TEST"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"295\" class=\"elementor elementor-295\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b0bbfbe e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"b0bbfbe\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8fa4f05 elementor-widget elementor-widget-html\" data-id=\"8fa4f05\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, viewport-fit=cover\">\r\n<meta name=\"theme-color\" content=\"#050505\">\r\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\r\n<title>P0 \/\/ GRIMOIRE<\/title>\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Orbitron:wght@400;700;900&family=Rajdhani:wght@300;400;500;600;700&family=Share+Tech+Mono&display=swap\" rel=\"stylesheet\">\r\n\r\n<style>\r\n\/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n   NECRO-GOLD SPEC\r\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n:root {\r\n  --void-black:  #050505;\r\n  --obsidian:    #0a0a0a;\r\n  --stone-dark:  #141414;\r\n  --gold-dim:    #7d6b49;\r\n  --gold-bright: #d4af37;\r\n  --magic-glow:  rgba(212, 175, 55, 0.2);\r\n  --border-width: 1px;\r\n}\r\n\r\nbody {\r\n  background-color: var(--void-black);\r\n  color: #a8a095;\r\n  font-family: 'Rajdhani', sans-serif;\r\n  overflow-x: hidden;\r\n  cursor: default;\r\n}\r\n\r\nh1, h2, h3, h4, h5, .tech-header {\r\n  font-family: 'Orbitron', sans-serif;\r\n  text-transform: uppercase;\r\n  letter-spacing: 0.05em;\r\n  color: var(--gold-bright);\r\n}\r\n\r\n.noise-bg {\r\n  position: fixed; inset: 0; pointer-events: none; z-index: 40; opacity: 0.04;\r\n  background-image: url(\"data:image\/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http:\/\/www.w3.org\/2000\/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.7' numOctaves='3' stitchTiles='stitch'\/%3E%3C\/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'\/%3E%3C\/svg%3E\");\r\n  animation: noiseShift 0.5s steps(10) infinite;\r\n}\r\n@keyframes noiseShift {\r\n  0%   { transform: translate(0, 0); }\r\n  100% { transform: translate(1%, 1%); }\r\n}\r\n\r\n.scanlines {\r\n  position: fixed; inset: 0; pointer-events: none; z-index: 50;\r\n  background: linear-gradient(to bottom,\r\n    rgba(255,255,255,0), rgba(255,255,255,0) 50%,\r\n    rgba(212,175,55,0.025) 50%, rgba(212,175,55,0.025));\r\n  background-size: 100% 4px;\r\n  animation: scanMove 90s linear infinite;\r\n}\r\n@keyframes scanMove {\r\n  0%   { background-position: 0 0; }\r\n  100% { background-position: 0 100%; }\r\n}\r\n\r\n.os-box {\r\n  position: relative;\r\n  background-color: var(--obsidian);\r\n  border: 1px solid var(--gold-dim);\r\n  transition: border-color 0.3s ease, box-shadow 0.3s ease;\r\n}\r\n.os-box:hover {\r\n  border-color: var(--gold-bright);\r\n  box-shadow: 0 0 30px var(--magic-glow);\r\n}\r\n\r\n.corner-marker::before, .corner-marker::after,\r\n.corner-marker-btm::before, .corner-marker-btm::after {\r\n  content: '';\r\n  position: absolute;\r\n  width: 6px; height: 6px;\r\n  background: var(--gold-bright);\r\n  box-shadow: 0 0 5px var(--gold-bright);\r\n  transition: all 0.3s ease;\r\n  z-index: 20;\r\n}\r\n.corner-marker::before  { top: -3px;    left: -3px;  transform: rotate(45deg); }\r\n.corner-marker::after   { top: -3px;    right: -3px; transform: rotate(45deg); }\r\n.corner-marker-btm::before { bottom: -3px; left: -3px;  transform: rotate(45deg); }\r\n.corner-marker-btm::after  { bottom: -3px; right: -3px; transform: rotate(45deg); }\r\n\r\n.tech-btn {\r\n  position: relative;\r\n  display: inline-flex; align-items: center; justify-content: center;\r\n  padding: 12px 32px;\r\n  font-family: 'Orbitron', sans-serif;\r\n  font-weight: 700; text-transform: uppercase; letter-spacing: 2px;\r\n  color: var(--gold-dim);\r\n  background: transparent;\r\n  border: 0.5px solid var(--gold-dim);\r\n  border-left: 4px solid var(--gold-dim);\r\n  transition: all 0.3s ease;\r\n  cursor: pointer;\r\n}\r\n.tech-btn:hover {\r\n  color: var(--gold-bright);\r\n  border-color: var(--gold-bright);\r\n  background: linear-gradient(90deg, rgba(212,175,55,0.1), transparent);\r\n  box-shadow: 0 0 20px var(--magic-glow);\r\n  padding-left: 36px;\r\n}\r\n\r\n.scan-line-anim {\r\n  position: absolute; top: 0; left: 0; width: 100%; height: 2px;\r\n  background: var(--gold-bright); box-shadow: 0 0 15px var(--gold-bright);\r\n  opacity: 0; z-index: 5; pointer-events: none;\r\n}\r\n.os-box:hover .scan-line-anim {\r\n  opacity: 1;\r\n  animation: scan 1.5s linear infinite;\r\n}\r\n@keyframes scan {\r\n  0%   { top: 0%;   opacity: 0; }\r\n  10%  { opacity: 1; }\r\n  90%  { opacity: 1; }\r\n  100% { top: 100%; opacity: 0; }\r\n}\r\n\r\n\/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n   RESET\r\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\r\n\r\n::-webkit-scrollbar { width: 3px; }\r\n::-webkit-scrollbar-track { background: var(--void-black); }\r\n::-webkit-scrollbar-thumb { background: rgba(125,107,73,0.4); }\r\n::selection { background: rgba(212,175,55,0.18); color: var(--gold-bright); }\r\n\r\n\/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n   GOLD FLASH \u2014 The Seal Ritual\r\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.gold-flash-overlay {\r\n  position: fixed; inset: 0; z-index: 9999;\r\n  background: var(--gold-bright);\r\n  pointer-events: none;\r\n  opacity: 0;\r\n}\r\n@keyframes goldFlash {\r\n  0%   { opacity: 0; }\r\n  8%   { opacity: 0.18; }\r\n  20%  { opacity: 0.06; }\r\n  35%  { opacity: 0.14; }\r\n  55%  { opacity: 0.03; }\r\n  75%  { opacity: 0.08; }\r\n  100% { opacity: 0; }\r\n}\r\n.gold-flash-overlay.firing {\r\n  animation: goldFlash 0.7s ease-out forwards;\r\n}\r\n\r\n\/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n   PAGE ENTRANCE\r\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n@keyframes riseUp {\r\n  from { opacity: 0; transform: translateY(20px); }\r\n  to   { opacity: 1; transform: translateY(0); }\r\n}\r\n.rise { animation: riseUp 0.7s cubic-bezier(0.22, 1, 0.36, 1) both; }\r\n.rise-2 { animation-delay: 0.1s; }\r\n.rise-3 { animation-delay: 0.2s; }\r\n.rise-4 { animation-delay: 0.3s; }\r\n\r\n\/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n   LAYOUT SHELL\r\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.grimoire-shell {\r\n  min-height: 100dvh;\r\n  max-width: 600px;\r\n  margin: 0 auto;\r\n  padding: 0 20px 80px;\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 24px;\r\n  position: relative;\r\n  z-index: 1;\r\n}\r\n\r\n\/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n   HEADER\r\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.g-header {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  padding: 22px 0 0;\r\n}\r\n.g-header-title {\r\n  font-family: 'Orbitron', sans-serif;\r\n  font-size: 0.85rem;\r\n  font-weight: 900;\r\n  letter-spacing: 0.22em;\r\n  color: var(--gold-bright);\r\n  text-shadow: 0 0 20px rgba(212,175,55,0.3);\r\n}\r\n.g-header-sub {\r\n  font-family: 'Share Tech Mono', monospace;\r\n  font-size: 0.42rem;\r\n  letter-spacing: 0.3em;\r\n  color: rgba(125,107,73,0.4);\r\n  display: block;\r\n  margin-top: 3px;\r\n}\r\n.vault-btn {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 8px;\r\n  background: transparent;\r\n  border: 1px solid rgba(125,107,73,0.25);\r\n  padding: 8px 14px;\r\n  cursor: pointer;\r\n  transition: all 0.25s;\r\n  position: relative;\r\n}\r\n.vault-btn:hover {\r\n  border-color: var(--gold-dim);\r\n  background: rgba(125,107,73,0.05);\r\n}\r\n.vault-icon {\r\n  font-size: 0.9rem;\r\n  color: var(--gold-dim);\r\n  transition: all 0.25s;\r\n}\r\n.vault-btn:hover .vault-icon {\r\n  color: var(--gold-bright);\r\n  text-shadow: 0 0 10px rgba(212,175,55,0.5);\r\n}\r\n.vault-label {\r\n  font-family: 'Share Tech Mono', monospace;\r\n  font-size: 0.5rem;\r\n  letter-spacing: 0.15em;\r\n  color: rgba(125,107,73,0.5);\r\n  text-transform: uppercase;\r\n  transition: color 0.25s;\r\n}\r\n.vault-btn:hover .vault-label { color: var(--gold-dim); }\r\n.vault-id-dot {\r\n  width: 5px; height: 5px;\r\n  border-radius: 50%;\r\n  background: rgba(74,200,120,0.7);\r\n  box-shadow: 0 0 5px rgba(74,200,120,0.5);\r\n  animation: vaultPulse 2.5s ease-in-out infinite;\r\n}\r\n@keyframes vaultPulse {\r\n  0%,100% { opacity: 0.6; }\r\n  50%      { opacity: 1; box-shadow: 0 0 8px rgba(74,200,120,0.7); }\r\n}\r\n\r\n\/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n   DIVIDER\r\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.g-rule {\r\n  height: 1px;\r\n  background: linear-gradient(90deg, transparent, rgba(125,107,73,0.3), transparent);\r\n  border: none;\r\n}\r\n\r\n\/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n   COMPOSER\r\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.composer-box {\r\n  padding: 28px 28px 22px;\r\n}\r\n.composer-label {\r\n  font-family: 'Share Tech Mono', monospace;\r\n  font-size: 0.45rem;\r\n  letter-spacing: 0.3em;\r\n  color: rgba(125,107,73,0.35);\r\n  text-transform: uppercase;\r\n  display: block;\r\n  margin-bottom: 16px;\r\n}\r\n.composer-textarea {\r\n  width: 100%;\r\n  background: transparent;\r\n  border: none;\r\n  outline: none;\r\n  resize: none;\r\n  font-family: 'Rajdhani', sans-serif;\r\n  font-size: 1.15rem;\r\n  font-weight: 400;\r\n  line-height: 1.8;\r\n  color: #d4c9b0;\r\n  caret-color: var(--gold-bright);\r\n  min-height: 160px;\r\n  cursor: text;\r\n  letter-spacing: 0.01em;\r\n}\r\n.composer-textarea::placeholder {\r\n  color: rgba(125,107,73,0.28);\r\n  font-style: italic;\r\n  font-weight: 300;\r\n}\r\n.composer-footer {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  margin-top: 18px;\r\n  padding-top: 16px;\r\n  border-top: 1px solid rgba(125,107,73,0.1);\r\n}\r\n.composer-char {\r\n  font-family: 'Share Tech Mono', monospace;\r\n  font-size: 0.48rem;\r\n  letter-spacing: 0.1em;\r\n  color: rgba(125,107,73,0.3);\r\n  transition: color 0.3s;\r\n}\r\n.composer-char.active { color: rgba(125,107,73,0.55); }\r\n\r\n.draft-indicator {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 6px;\r\n  opacity: 0;\r\n  transition: opacity 0.4s;\r\n}\r\n.draft-indicator.visible { opacity: 1; }\r\n.draft-dot {\r\n  width: 4px; height: 4px;\r\n  border-radius: 50%;\r\n  background: var(--gold-dim);\r\n  animation: draftBlink 1.8s ease-in-out infinite;\r\n}\r\n@keyframes draftBlink {\r\n  0%,100% { opacity: 0.3; }\r\n  50%      { opacity: 1; }\r\n}\r\n.draft-label {\r\n  font-family: 'Share Tech Mono', monospace;\r\n  font-size: 0.45rem;\r\n  letter-spacing: 0.15em;\r\n  color: rgba(125,107,73,0.4);\r\n  text-transform: uppercase;\r\n}\r\n\r\n\/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n   SEAL BUTTON\r\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.seal-section {\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: stretch;\r\n  gap: 0;\r\n}\r\n.seal-btn-wrap {\r\n  position: relative;\r\n}\r\n.seal-btn {\r\n  width: 100%;\r\n  padding: 18px 32px;\r\n  font-size: 0.75rem;\r\n  letter-spacing: 0.3em;\r\n  font-weight: 900;\r\n  justify-content: center;\r\n  gap: 14px;\r\n  border-left-width: 5px;\r\n  transition: all 0.3s ease;\r\n}\r\n.seal-btn:disabled {\r\n  opacity: 0.25;\r\n  pointer-events: none;\r\n}\r\n.seal-btn:not(:disabled):hover {\r\n  letter-spacing: 0.35em;\r\n}\r\n.seal-btn-glyph {\r\n  font-size: 1rem;\r\n  animation: glyphSpin 8s linear infinite;\r\n  display: inline-block;\r\n}\r\n@keyframes glyphSpin {\r\n  0%   { transform: rotate(0deg); }\r\n  100% { transform: rotate(360deg); }\r\n}\r\n.seal-btn:not(:disabled) .seal-btn-glyph {\r\n  animation: glyphPulse 2s ease-in-out infinite;\r\n}\r\n@keyframes glyphPulse {\r\n  0%,100% { opacity: 0.6; transform: scale(1); }\r\n  50%      { opacity: 1;   transform: scale(1.15); }\r\n}\r\n\r\n\/* Button shimmer on hover *\/\r\n.seal-btn::after {\r\n  content: '';\r\n  position: absolute;\r\n  inset: 0;\r\n  background: linear-gradient(105deg, transparent 40%, rgba(212,175,55,0.08) 50%, transparent 60%);\r\n  transform: translateX(-100%);\r\n  transition: transform 0s;\r\n}\r\n.seal-btn:not(:disabled):hover::after {\r\n  transform: translateX(100%);\r\n  transition: transform 0.5s ease;\r\n}\r\n\r\n\/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n   TOAST CONFIRM\r\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.g-toast {\r\n  position: fixed;\r\n  bottom: 28px;\r\n  left: 50%;\r\n  transform: translateX(-50%) translateY(10px);\r\n  background: var(--stone-dark);\r\n  border: 1px solid var(--gold-bright);\r\n  border-left: 4px solid var(--gold-bright);\r\n  padding: 10px 24px;\r\n  font-family: 'Share Tech Mono', monospace;\r\n  font-size: 0.6rem;\r\n  letter-spacing: 0.14em;\r\n  color: var(--gold-bright);\r\n  z-index: 9998;\r\n  opacity: 0;\r\n  pointer-events: none;\r\n  box-shadow: 0 0 30px rgba(212,175,55,0.12);\r\n  white-space: nowrap;\r\n  transition: all 0.35s cubic-bezier(0.22, 1, 0.36, 1);\r\n}\r\n.g-toast.show {\r\n  opacity: 1;\r\n  transform: translateX(-50%) translateY(0);\r\n}\r\n\r\n\/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n   SECTION LABEL\r\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.section-header {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n}\r\n.section-title {\r\n  font-family: 'Orbitron', sans-serif;\r\n  font-size: 0.58rem;\r\n  letter-spacing: 0.28em;\r\n  color: rgba(125,107,73,0.5);\r\n  text-transform: uppercase;\r\n}\r\n.section-count {\r\n  font-family: 'Share Tech Mono', monospace;\r\n  font-size: 0.48rem;\r\n  letter-spacing: 0.1em;\r\n  color: rgba(125,107,73,0.3);\r\n}\r\n\r\n\/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n   LOG CARDS\r\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.log-feed {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 10px;\r\n}\r\n\r\n.log-card {\r\n  padding: 20px 22px;\r\n  cursor: pointer;\r\n  transition: border-color 0.25s, box-shadow 0.25s, background 0.25s;\r\n  animation: cardSlideIn 0.45s cubic-bezier(0.22, 1, 0.36, 1) both;\r\n}\r\n@keyframes cardSlideIn {\r\n  from { opacity: 0; transform: translateY(-10px); }\r\n  to   { opacity: 1; transform: translateY(0); }\r\n}\r\n\r\n.log-card-top {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  justify-content: space-between;\r\n  gap: 12px;\r\n  margin-bottom: 10px;\r\n}\r\n.log-card-preview {\r\n  font-family: 'Rajdhani', sans-serif;\r\n  font-size: 1rem;\r\n  font-weight: 500;\r\n  color: #c0b898;\r\n  line-height: 1.4;\r\n  flex: 1;\r\n  overflow: hidden;\r\n  display: -webkit-box;\r\n  -webkit-line-clamp: 1;\r\n  -webkit-box-orient: vertical;\r\n}\r\n.log-card-date {\r\n  font-family: 'Share Tech Mono', monospace;\r\n  font-size: 0.5rem;\r\n  letter-spacing: 0.1em;\r\n  color: rgba(125,107,73,0.4);\r\n  white-space: nowrap;\r\n  flex-shrink: 0;\r\n  padding-top: 3px;\r\n}\r\n.log-card-hash {\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 8px;\r\n}\r\n.log-card-hash-label {\r\n  font-family: 'Share Tech Mono', monospace;\r\n  font-size: 0.42rem;\r\n  letter-spacing: 0.14em;\r\n  color: rgba(125,107,73,0.25);\r\n  text-transform: uppercase;\r\n}\r\n.log-card-hash-value {\r\n  font-family: 'Share Tech Mono', monospace;\r\n  font-size: 0.48rem;\r\n  letter-spacing: 0.06em;\r\n  color: rgba(125,107,73,0.35);\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n  white-space: nowrap;\r\n}\r\n.log-card-verified {\r\n  margin-left: auto;\r\n  font-family: 'Share Tech Mono', monospace;\r\n  font-size: 0.42rem;\r\n  letter-spacing: 0.1em;\r\n  color: rgba(74,160,100,0.5);\r\n}\r\n\r\n\/* Expanded card state *\/\r\n.log-card.expanded .log-card-preview {\r\n  -webkit-line-clamp: unset;\r\n  display: block;\r\n  color: #d4c9b0;\r\n}\r\n.log-card-full {\r\n  display: none;\r\n  margin-top: 14px;\r\n  padding-top: 14px;\r\n  border-top: 1px solid rgba(125,107,73,0.1);\r\n}\r\n.log-card.expanded .log-card-full { display: block; }\r\n.log-card-full-text {\r\n  font-family: 'Rajdhani', sans-serif;\r\n  font-size: 0.95rem;\r\n  line-height: 1.75;\r\n  color: #a09080;\r\n  white-space: pre-wrap;\r\n}\r\n.log-card-full-meta {\r\n  margin-top: 12px;\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 12px;\r\n}\r\n.log-card-phase {\r\n  font-family: 'Share Tech Mono', monospace;\r\n  font-size: 0.44rem;\r\n  letter-spacing: 0.15em;\r\n  padding: 2px 8px;\r\n  border: 1px solid rgba(125,107,73,0.2);\r\n  color: rgba(125,107,73,0.45);\r\n  text-transform: uppercase;\r\n}\r\n.log-card-delete {\r\n  margin-left: auto;\r\n  font-family: 'Share Tech Mono', monospace;\r\n  font-size: 0.44rem;\r\n  letter-spacing: 0.1em;\r\n  color: rgba(120,60,60,0.5);\r\n  background: none;\r\n  border: 1px solid rgba(120,60,60,0.2);\r\n  padding: 3px 10px;\r\n  cursor: pointer;\r\n  transition: all 0.2s;\r\n  text-transform: uppercase;\r\n}\r\n.log-card-delete:hover {\r\n  color: rgba(200,80,80,0.7);\r\n  border-color: rgba(200,80,80,0.35);\r\n}\r\n\r\n\/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n   EMPTY STATE\r\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.empty-feed {\r\n  display: flex;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  padding: 44px 20px;\r\n  gap: 12px;\r\n  border: 1px dashed rgba(125,107,73,0.15);\r\n}\r\n.empty-glyph {\r\n  font-size: 1.6rem;\r\n  color: rgba(125,107,73,0.2);\r\n  animation: emptyBreath 4s ease-in-out infinite;\r\n}\r\n@keyframes emptyBreath {\r\n  0%,100% { opacity: 0.3; transform: scale(1); }\r\n  50%      { opacity: 0.6; transform: scale(1.05); }\r\n}\r\n.empty-text {\r\n  font-family: 'Share Tech Mono', monospace;\r\n  font-size: 0.52rem;\r\n  letter-spacing: 0.2em;\r\n  color: rgba(125,107,73,0.25);\r\n  text-align: center;\r\n  line-height: 2;\r\n  text-transform: uppercase;\r\n}\r\n\r\n\/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n   VAULT PANEL (slide-up)\r\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n.vault-panel-backdrop {\r\n  display: none;\r\n  position: fixed; inset: 0;\r\n  background: rgba(5,5,5,0.88);\r\n  backdrop-filter: blur(8px);\r\n  z-index: 80;\r\n  align-items: flex-end;\r\n  justify-content: center;\r\n}\r\n.vault-panel-backdrop.open { display: flex; }\r\n\r\n.vault-panel {\r\n  width: 100%;\r\n  max-width: 600px;\r\n  background: var(--stone-dark);\r\n  border: 1px solid var(--gold-dim);\r\n  border-bottom: none;\r\n  padding: 0 0 env(safe-area-inset-bottom);\r\n  animation: slideUp 0.4s cubic-bezier(0.22, 1, 0.36, 1) both;\r\n  position: relative;\r\n}\r\n@keyframes slideUp {\r\n  from { transform: translateY(100%); }\r\n  to   { transform: translateY(0); }\r\n}\r\n.vault-panel-handle {\r\n  display: flex;\r\n  justify-content: center;\r\n  padding: 14px 0 0;\r\n}\r\n.vault-panel-handle-bar {\r\n  width: 36px; height: 3px;\r\n  background: rgba(125,107,73,0.3);\r\n  border-radius: 2px;\r\n}\r\n.vault-panel-header {\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  padding: 16px 24px 14px;\r\n  border-bottom: 1px solid rgba(125,107,73,0.15);\r\n}\r\n.vault-panel-title {\r\n  font-family: 'Orbitron', sans-serif;\r\n  font-size: 0.65rem;\r\n  letter-spacing: 0.2em;\r\n  color: var(--gold-bright);\r\n}\r\n.vault-panel-close {\r\n  width: 28px; height: 28px;\r\n  background: transparent;\r\n  border: 1px solid rgba(125,107,73,0.25);\r\n  color: rgba(125,107,73,0.5);\r\n  font-size: 0.65rem;\r\n  cursor: pointer;\r\n  display: flex; align-items: center; justify-content: center;\r\n  transition: all 0.2s;\r\n  font-family: 'Share Tech Mono', monospace;\r\n}\r\n.vault-panel-close:hover { border-color: var(--gold-bright); color: var(--gold-bright); }\r\n\r\n.vault-panel-body {\r\n  padding: 20px 24px 28px;\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 16px;\r\n}\r\n.vault-row {\r\n  display: flex;\r\n  flex-direction: column;\r\n  gap: 4px;\r\n}\r\n.vault-row-label {\r\n  font-family: 'Share Tech Mono', monospace;\r\n  font-size: 0.44rem;\r\n  letter-spacing: 0.22em;\r\n  color: rgba(125,107,73,0.4);\r\n  text-transform: uppercase;\r\n}\r\n.vault-row-value {\r\n  font-family: 'Share Tech Mono', monospace;\r\n  font-size: 0.6rem;\r\n  letter-spacing: 0.06em;\r\n  color: rgba(125,107,73,0.7);\r\n  word-break: break-all;\r\n  line-height: 1.7;\r\n}\r\n.vault-row-value.key-green { color: rgba(80,160,100,0.8); }\r\n.vault-rule {\r\n  height: 1px;\r\n  background: rgba(125,107,73,0.1);\r\n}\r\n.vault-unlock-btn {\r\n  width: 100%;\r\n  padding: 14px;\r\n  font-size: 0.62rem;\r\n  letter-spacing: 0.2em;\r\n  justify-content: center;\r\n  border-left-width: 4px;\r\n  margin-top: 4px;\r\n}\r\n\r\n\/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n   RESPONSIVE\r\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n@media (max-width: 480px) {\r\n  .grimoire-shell { padding: 0 16px 80px; gap: 20px; }\r\n  .composer-box   { padding: 22px 18px 18px; }\r\n  .composer-textarea { font-size: 1.05rem; }\r\n  .log-card       { padding: 16px 18px; }\r\n  .seal-btn       { font-size: 0.68rem; padding: 16px 24px; }\r\n}\r\n\r\n@media (min-width: 600px) {\r\n  .grimoire-shell { padding: 0 28px 80px; }\r\n  .composer-textarea { font-size: 1.2rem; }\r\n}\r\n<\/style>\r\n<\/head>\r\n\r\n<body>\r\n\r\n<!-- AMBIENT -->\r\n<div class=\"noise-bg\"><\/div>\r\n<div class=\"scanlines\"><\/div>\r\n<div class=\"gold-flash-overlay\" id=\"flashOverlay\"><\/div>\r\n<div class=\"g-toast\" id=\"toast\"><\/div>\r\n\r\n<!-- VAULT PANEL -->\r\n<div class=\"vault-panel-backdrop\" id=\"vaultBackdrop\" onclick=\"closeVault(event)\">\r\n  <div class=\"vault-panel corner-marker corner-marker-btm\">\r\n    <div class=\"scan-line-anim\"><\/div>\r\n    <div class=\"vault-panel-handle\"><div class=\"vault-panel-handle-bar\"><\/div><\/div>\r\n    <div class=\"vault-panel-header\">\r\n      <span class=\"vault-panel-title\">Vault \/\/ Identity<\/span>\r\n      <button class=\"vault-panel-close\" onclick=\"toggleVault()\">\u2715<\/button>\r\n    <\/div>\r\n    <div class=\"vault-panel-body\">\r\n      <div class=\"vault-row\">\r\n        <span class=\"vault-row-label\">Public Key (Ed25519)<\/span>\r\n        <span class=\"vault-row-value key-green\" id=\"vaultPubkey\">\u2014<\/span>\r\n      <\/div>\r\n      <div class=\"vault-rule\"><\/div>\r\n      <div class=\"vault-row\">\r\n        <span class=\"vault-row-label\">Key Status<\/span>\r\n        <span class=\"vault-row-value\" style=\"color:rgba(74,200,120,0.7);\">\u25cf Active \u00b7 Local Session<\/span>\r\n      <\/div>\r\n      <div class=\"vault-row\">\r\n        <span class=\"vault-row-label\">Entries Sealed<\/span>\r\n        <span class=\"vault-row-value\" id=\"vaultCount\">0<\/span>\r\n      <\/div>\r\n      <div class=\"vault-row\">\r\n        <span class=\"vault-row-label\">Relay Signal<\/span>\r\n        <span class=\"vault-row-value\" style=\"color:rgba(74,200,120,0.6);\">P0-MESH \u00b7 Sovereign<\/span>\r\n      <\/div>\r\n      <div class=\"vault-rule\"><\/div>\r\n      <button class=\"tech-btn vault-unlock-btn\" onclick=\"unlockVault()\">\r\n        \u2b21 &nbsp; Unlock Vault\r\n      <\/button>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- MAIN SHELL -->\r\n<div class=\"grimoire-shell\">\r\n\r\n  <!-- HEADER -->\r\n  <header class=\"g-header rise\">\r\n    <div>\r\n      <div class=\"g-header-title\">P0 \/\/ GRIMOIRE<\/div>\r\n      <span class=\"g-header-sub\">Digital Grimoire \u00b7 v0.1.0-\u03b1<\/span>\r\n    <\/div>\r\n    <button class=\"vault-btn\" onclick=\"toggleVault()\">\r\n      <span class=\"vault-id-dot\"><\/span>\r\n      <span class=\"vault-icon\">\u2b21<\/span>\r\n      <span class=\"vault-label\">Vault<\/span>\r\n    <\/button>\r\n  <\/header>\r\n\r\n  <hr class=\"g-rule rise rise-2\">\r\n\r\n  <!-- COMPOSER -->\r\n  <div class=\"composer-box os-box corner-marker corner-marker-btm rise rise-2\">\r\n    <div class=\"scan-line-anim\"><\/div>\r\n    <span class=\"composer-label\">New Log \/\/ Athame<\/span>\r\n    <textarea\r\n      id=\"compose\"\r\n      class=\"composer-textarea\"\r\n      placeholder=\"Enter Intent or Log Working...\"\r\n      oninput=\"onType(this)\"\r\n      rows=\"7\"\r\n    ><\/textarea>\r\n    <div class=\"composer-footer\">\r\n      <div class=\"draft-indicator\" id=\"draftIndicator\">\r\n        <div class=\"draft-dot\"><\/div>\r\n        <span class=\"draft-label\">Draft saved<\/span>\r\n      <\/div>\r\n      <span class=\"composer-char\" id=\"charCount\">0<\/span>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- SEAL BUTTON -->\r\n  <div class=\"seal-section rise rise-3\">\r\n    <button class=\"tech-btn seal-btn\" id=\"sealBtn\" onclick=\"sealLog()\" disabled>\r\n      <span class=\"seal-btn-glyph\">\u25c8<\/span>\r\n      Seal Log\r\n    <\/button>\r\n  <\/div>\r\n\r\n  <!-- HISTORY -->\r\n  <div class=\"rise rise-4\">\r\n    <div class=\"section-header\" style=\"margin-bottom:14px;\">\r\n      <span class=\"section-title\">Sealed Logs<\/span>\r\n      <span class=\"section-count\" id=\"entryCount\">0 entries<\/span>\r\n    <\/div>\r\n    <div class=\"log-feed\" id=\"logFeed\">\r\n      <!-- entries rendered here -->\r\n    <\/div>\r\n  <\/div>\r\n\r\n<\/div>\r\n\r\n<script>\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n   P0 GRIMOIRE \u2014 CORE SCRIPT\r\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n\r\nconst G = {\r\n  pubkey:  '',\r\n  entries: [],\r\n  autoSaveTimer: null,\r\n};\r\n\r\n\/* \u2500\u2500 CRYPTO \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nasync function sha256(str) {\r\n  const buf  = new TextEncoder().encode(str);\r\n  const hash = await crypto.subtle.digest('SHA-256', buf);\r\n  return Array.from(new Uint8Array(hash))\r\n    .map(b => b.toString(16).padStart(2, '0')).join('');\r\n}\r\nfunction randHex(n) {\r\n  const a = new Uint8Array(n);\r\n  crypto.getRandomValues(a);\r\n  return Array.from(a).map(b => b.toString(16).padStart(2, '0')).join('');\r\n}\r\nfunction trunc(hex, n) { return hex.slice(0, n); }\r\n\r\n\/* \u2500\u2500 IDENTITY \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nasync function initIdentity() {\r\n  let stored = localStorage.getItem('p0_pubkey');\r\n  if (!stored) {\r\n    stored = randHex(32);\r\n    localStorage.setItem('p0_pubkey', stored);\r\n  }\r\n  G.pubkey = stored;\r\n  document.getElementById('vaultPubkey').textContent = G.pubkey;\r\n  document.querySelector('.vault-label').textContent =\r\n    trunc(G.pubkey, 8).toUpperCase();\r\n}\r\n\r\n\/* \u2500\u2500 STORAGE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nfunction saveEntries() {\r\n  localStorage.setItem('p0_entries', JSON.stringify(G.entries));\r\n}\r\nfunction loadEntries() {\r\n  try {\r\n    const raw = localStorage.getItem('p0_entries');\r\n    G.entries = raw ? JSON.parse(raw) : [];\r\n  } catch(e) {\r\n    G.entries = [];\r\n  }\r\n}\r\nfunction saveDraft(val) {\r\n  localStorage.setItem('p0_draft', val);\r\n}\r\nfunction loadDraft() {\r\n  return localStorage.getItem('p0_draft') || '';\r\n}\r\nfunction clearDraft() {\r\n  localStorage.removeItem('p0_draft');\r\n}\r\n\r\n\/* \u2500\u2500 COMPOSE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nfunction onType(el) {\r\n  const val = el.value;\r\n  const len = val.length;\r\n\r\n  \/\/ char count\r\n  const cc = document.getElementById('charCount');\r\n  cc.textContent = len;\r\n  cc.classList.toggle('active', len > 0);\r\n\r\n  \/\/ seal button\r\n  document.getElementById('sealBtn').disabled = !val.trim();\r\n\r\n  \/\/ draft indicator\r\n  document.getElementById('draftIndicator').classList.toggle('visible', len > 0);\r\n\r\n  \/\/ auto-save debounce\r\n  clearTimeout(G.autoSaveTimer);\r\n  G.autoSaveTimer = setTimeout(() => saveDraft(val), 400);\r\n}\r\n\r\n\/* \u2500\u2500 SEAL LOG \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nasync function sealLog() {\r\n  const ta      = document.getElementById('compose');\r\n  const content = ta.value.trim();\r\n  if (!content) return;\r\n\r\n  \/\/ Haptic bridge\r\n  if ('vibrate' in navigator) navigator.vibrate([50, 30, 50]);\r\n\r\n  \/\/ Gold flash ritual\r\n  triggerFlash();\r\n\r\n  \/\/ Build entry\r\n  const now = new Date();\r\n  const ts  = Math.floor(now.getTime() \/ 1000);\r\n  const id  = await sha256(JSON.stringify([0, G.pubkey, ts, 731, content]));\r\n  const sig = randHex(64);\r\n\r\n  const entry = {\r\n    id, sig,\r\n    pubkey:     G.pubkey,\r\n    content,\r\n    created_at: ts,\r\n    date_str:   formatDate(now),\r\n    phase:      'sealed',\r\n  };\r\n\r\n  G.entries.unshift(entry);\r\n  saveEntries();\r\n\r\n  \/\/ Clear compose\r\n  ta.value = '';\r\n  onType(ta);\r\n  clearDraft();\r\n\r\n  \/\/ Update feed & vault\r\n  prependCard(entry);\r\n  updateCounts();\r\n\r\n  showToast('\u25c8  Log sealed \u00b7 ' + trunc(id, 8).toUpperCase() + '\u2026');\r\n}\r\n\r\n\/* \u2500\u2500 GOLD FLASH \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nfunction triggerFlash() {\r\n  const el = document.getElementById('flashOverlay');\r\n  el.classList.remove('firing');\r\n  void el.offsetWidth;\r\n  el.classList.add('firing');\r\n  setTimeout(() => el.classList.remove('firing'), 700);\r\n}\r\n\r\n\/* \u2500\u2500 RENDER FEED \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nfunction renderFeed() {\r\n  const feed = document.getElementById('logFeed');\r\n  feed.innerHTML = '';\r\n\r\n  if (G.entries.length === 0) {\r\n    feed.innerHTML = `\r\n      <div class=\"empty-feed\">\r\n        <div class=\"empty-glyph\">\u25c8<\/div>\r\n        <div class=\"empty-text\">\r\n          No sealed logs yet.<br>\r\n          Write your first working above.\r\n        <\/div>\r\n      <\/div>`;\r\n    return;\r\n  }\r\n\r\n  G.entries.forEach(e => feed.appendChild(buildCard(e)));\r\n}\r\n\r\nfunction prependCard(entry) {\r\n  const feed = document.getElementById('logFeed');\r\n  const empty = feed.querySelector('.empty-feed');\r\n  if (empty) empty.remove();\r\n  const card = buildCard(entry);\r\n  feed.insertBefore(card, feed.firstChild);\r\n}\r\n\r\nfunction buildCard(entry) {\r\n  const firstLine = entry.content.split('\\n')[0] || entry.content;\r\n  const hashShort = trunc(entry.id, 14) + '\u2026' + entry.id.slice(-6);\r\n\r\n  const card = document.createElement('div');\r\n  card.className = 'log-card os-box corner-marker corner-marker-btm';\r\n  card.id = 'card-' + entry.id;\r\n  card.onclick = () => toggleCard(card);\r\n\r\n  card.innerHTML = `\r\n    <div class=\"scan-line-anim\"><\/div>\r\n    <div class=\"log-card-top\">\r\n      <div class=\"log-card-preview\">${escHtml(firstLine)}<\/div>\r\n      <span class=\"log-card-date\">${entry.date_str}<\/span>\r\n    <\/div>\r\n    <div class=\"log-card-hash\">\r\n      <span class=\"log-card-hash-label\">ID<\/span>\r\n      <span class=\"log-card-hash-value\">${hashShort}<\/span>\r\n      <span class=\"log-card-verified\">\u2713 VERIFIED<\/span>\r\n    <\/div>\r\n    <div class=\"log-card-full\">\r\n      <div class=\"log-card-full-text\">${escHtml(entry.content)}<\/div>\r\n      <div class=\"log-card-full-meta\">\r\n        <span class=\"log-card-phase\">${entry.phase}<\/span>\r\n        <button class=\"log-card-delete\" onclick=\"deleteEntry(event, '${entry.id}')\">\r\n          Delete\r\n        <\/button>\r\n      <\/div>\r\n    <\/div>\r\n  `;\r\n  return card;\r\n}\r\n\r\nfunction toggleCard(card) {\r\n  card.classList.toggle('expanded');\r\n}\r\n\r\nfunction deleteEntry(e, id) {\r\n  e.stopPropagation();\r\n  G.entries = G.entries.filter(en => en.id !== id);\r\n  saveEntries();\r\n  const card = document.getElementById('card-' + id);\r\n  if (card) card.remove();\r\n  updateCounts();\r\n  if (G.entries.length === 0) renderFeed();\r\n}\r\n\r\n\/* \u2500\u2500 COUNTS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nfunction updateCounts() {\r\n  const n = G.entries.length;\r\n  document.getElementById('entryCount').textContent =\r\n    n + (n === 1 ? ' entry' : ' entries');\r\n  document.getElementById('vaultCount').textContent = n;\r\n}\r\n\r\n\/* \u2500\u2500 VAULT PANEL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nfunction toggleVault() {\r\n  const bd = document.getElementById('vaultBackdrop');\r\n  bd.classList.toggle('open');\r\n  document.body.style.overflow = bd.classList.contains('open') ? 'hidden' : '';\r\n}\r\nfunction closeVault(e) {\r\n  if (e.target === document.getElementById('vaultBackdrop')) {\r\n    document.getElementById('vaultBackdrop').classList.remove('open');\r\n    document.body.style.overflow = '';\r\n  }\r\n}\r\nfunction unlockVault() {\r\n  if ('vibrate' in navigator) navigator.vibrate([30, 20, 40]);\r\n  showToast('\u2b21  Vault authenticated \u00b7 Session key active');\r\n  toggleVault();\r\n}\r\n\r\n\/* \u2500\u2500 TOAST \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nlet _toastT;\r\nfunction showToast(msg) {\r\n  const t = document.getElementById('toast');\r\n  clearTimeout(_toastT);\r\n  t.textContent = msg;\r\n  t.classList.add('show');\r\n  _toastT = setTimeout(() => t.classList.remove('show'), 3000);\r\n}\r\n\r\n\/* \u2500\u2500 HELPERS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nfunction escHtml(str) {\r\n  return str\r\n    .replace(\/&\/g, '&amp;')\r\n    .replace(\/<\/g, '&lt;')\r\n    .replace(\/>\/g, '&gt;')\r\n    .replace(\/\"\/g, '&quot;');\r\n}\r\nfunction formatDate(d) {\r\n  const h  = String(d.getHours()).padStart(2, '0');\r\n  const m  = String(d.getMinutes()).padStart(2, '0');\r\n  const dd = String(d.getDate()).padStart(2, '0');\r\n  const mo = d.toLocaleString('en-GB', { month: 'short' }).toUpperCase();\r\n  return `${h}:${m} \u00b7 ${dd} ${mo}`;\r\n}\r\n\r\n\/* \u2500\u2500 INIT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nasync function init() {\r\n  await initIdentity();\r\n  loadEntries();\r\n  renderFeed();\r\n  updateCounts();\r\n\r\n  \/\/ Restore draft\r\n  const draft = loadDraft();\r\n  if (draft) {\r\n    const ta = document.getElementById('compose');\r\n    ta.value = draft;\r\n    onType(ta);\r\n  }\r\n}\r\n\r\ndocument.addEventListener('DOMContentLoaded', init);\r\n<\/script>\r\n\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>P0 \/\/ GRIMOIRE Vault \/\/ Identity \u2715 Public Key (Ed25519) \u2014 Key Status \u25cf Active \u00b7 Local Session Entries Sealed 0 Relay Signal P0-MESH \u00b7 Sovereign \u2b21 &nbsp; Unlock Vault P0 \/\/ GRIMOIRE Digital Grimoire \u00b7 v0.1.0-\u03b1 \u2b21 Vault New Log \/\/ Athame Draft saved 0 \u25c8 Seal Log Sealed Logs 0 entries<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"class_list":["post-295","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/aorphis.com\/app\/wp-json\/wp\/v2\/pages\/295","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aorphis.com\/app\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/aorphis.com\/app\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/aorphis.com\/app\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/aorphis.com\/app\/wp-json\/wp\/v2\/comments?post=295"}],"version-history":[{"count":34,"href":"https:\/\/aorphis.com\/app\/wp-json\/wp\/v2\/pages\/295\/revisions"}],"predecessor-version":[{"id":366,"href":"https:\/\/aorphis.com\/app\/wp-json\/wp\/v2\/pages\/295\/revisions\/366"}],"wp:attachment":[{"href":"https:\/\/aorphis.com\/app\/wp-json\/wp\/v2\/media?parent=295"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}