Siteβ―Builder
Editing:
menu-main2.php
writable 0666
<?php /* βββββββββββββββββββββββββββββββββββββββββββββββ menu-main.php β autoβloads parts/nav/main.json Works from any depth by crawling upward until it finds 'parts/nav/'. If no active links β exits. βββββββββββββββββββββββββββββββββββββββββββββββ */ /* ---------- locate base dir that contains /parts/nav ---------- */ $dir = __DIR__; for ($up=0; $up<8; $up++) { // max 8 levels safety if (is_dir($dir.'/parts/nav')) { $baseDir = $dir; break; } $parent = dirname($dir); if ($parent === $dir) break; // reached filesystem root $dir = $parent; } if (!isset($baseDir)) return; // give up silently /* ---------- load JSON that matches this filename ---------- */ $menuKey = preg_replace('/^menu-|\.php$/i','', basename(__FILE__)); $jsonFile = $baseDir.'/parts/nav/'.$menuKey.'.json'; $items = is_file($jsonFile) ? json_decode(file_get_contents($jsonFile), true) ?? [] : []; $items = array_values(array_filter($items, fn($i)=>!empty($i['active']))); if (!$items) return; // nothing to show ?> <style> /* === neon glass menu β 2025 vibe ============================ */ :root{ --acc1:#ff4ecd; /* electric pink */ --acc2:#37e6ff; /* neon cyan */ --bg :rgba(28,29,39,.85); --txt:#e9e9f2; --blur:12px; --radius:14px } .maimenu{position:fixed;top:1.2rem;right:1.2rem;z-index:1000;font-family:Inter,system-ui,sans-serif} .maimenu summary{list-style:none;cursor:pointer} .maimenu summary::-webkit-details-marker{display:none} .maimenu .toggle{display:flex;flex-direction:column;align-items:center;gap:.25rem} .maimenu .toggle .label{font-size:.8rem;padding:.15rem .7rem;border-radius:8px 8px 0 0; background:var(--bg);backdrop-filter:blur(var(--blur));color:var(--txt);letter-spacing:.05em} .maimenu .toggle .bars, .maimenu .toggle .bars:before, .maimenu .toggle .bars:after{ content:'';display:block;width:28px;height:2px;border-radius:2px;background:var(--acc1); transition:.4s; } .maimenu .toggle .bars:before{transform:translateY(-8px)} .maimenu .toggle .bars:after {transform:translateY(6px)} .maimenu[open] .bars{background:transparent} .maimenu[open] .bars:before{transform:rotate(45deg)} .maimenu[open] .bars:after {transform:rotate(-45deg)} .maimenu nav{position:absolute;top:calc(100% + .8rem);right:0;min-width:180px; background:var(--bg);backdrop-filter:blur(var(--blur));border-radius:var(--radius); padding:1rem 1.4rem;box-shadow:0 10px 30px rgba(0,0,0,.45);animation:fade .35s ease} @keyframes fade{from{opacity:0;transform:translateY(-8px)} to{opacity:1;transform:translateY(0)}} .maimenu nav a{display:block;color:var(--txt);text-decoration:none;padding:.45rem 0; border-bottom:1px solid rgba(255,255,255,.07);transition:color .25s} .maimenu nav a:last-child{border-bottom:none} .maimenu nav a:hover{color:var(--acc2)} @media (max-width:600px){ .maimenu .label{display:none} } </style> <details class="maimenu"> <summary class="toggle"> <span class="label">Menu</span> <span class="bars"></span> </summary> <nav> <?php foreach($items as $it): ?> <a href="<?=htmlspecialchars($it['path'])?>"><?=htmlspecialchars($it['label'])?></a> <?php endforeach; ?> </nav> </details> <script> /* Close the menu after a click (mobile friendliness) */ document.querySelectorAll('.maimenu nav a').forEach(a=>{ a.addEventListener('click',()=>a.closest('details').removeAttribute('open')); }); </script>
Save changes
Create folder
writable 0777
Create
Cancel