{
    "id": 41,
    "slug": "sitemap",
    "page_content": "{{-- ============================================================================\n     PAGE CONTENT — Peta Laman (Sitemap)\n     Site  : nres  ·  Page slug: sitemap  ·  Page ID: 41\n     URL   : /nres/sitemap\n\n     Konsep: peta laman penuh, dijana AUTOMATIK daripada menu navbar publik\n             ($menuTree dari PortalHandler) — jadi ia sentiasa selari dengan\n             struktur navigasi sebenar tanpa penyelenggaraan manual.\n\n     Sumber data:\n       · $menuTree  → pokok menu publik (navbar) — nama sudah diterjemah via t()\n       · $sitePages → senarai halaman site (untuk seksyen \"Halaman Lain\")\n\n     Item tanpa menu_link dipaparkan sebagai teks biasa (struktur sahaja).\n     BM/EN ikut sesi. CSS sendiri (kelas .sm-*).\n     ============================================================================ --}}\n\n@php\n    $smLang = ($lang ?? session('locale', 'ms')) === 'en' ? 'en' : 'ms';\n    $smTree = is_array($menuTree ?? null) ? $menuTree : [];\n\n    // Kumpul laluan dalaman yang sudah ada dalam menu\n    $smLinked = [];\n\n    $smCollect = function ($items) use (&$smCollect, &$smLinked) {\n        foreach ($items as $it) {\n            $link = trim((string) ($it['menu_link'] ?? ''));\n\n            if (str_starts_with($link, '/')) {\n                $smLinked[] = rtrim(strtok($link, '?'), '/');\n            }\n\n            if (! empty($it['children'])) {\n                $smCollect($it['children']);\n            }\n        }\n    };\n\n    $smCollect($smTree);\n\n    // Halaman yang TIDAK dipautkan dalam menu (dan bukan halaman ini sendiri)\n    $smSelf = trim(request()->path(), '/');\n\n    $smOther = collect($sitePages ?? [])\n        ->filter(function ($p) use ($smLinked, $siteSlug, $smSelf) {\n            $path = '/'.($siteSlug ?? 'nres').'/'.$p['slug'];\n\n            if ($smSelf === ($siteSlug ?? 'nres').'/'.$p['slug']) {\n                return false;\n            }\n\n            return ! in_array(rtrim($path, '/'), $smLinked, true);\n        })\n        ->values();\n\n    // Kira pautan sebenar\n    $smLinks = 0;\n\n    $smCount = function ($items) use (&$smCount, &$smLinks) {\n        foreach ($items as $it) {\n            if (trim((string) ($it['menu_link'] ?? '')) !== '') {\n                $smLinks++;\n            }\n\n            if (! empty($it['children'])) {\n                $smCount($it['children']);\n            }\n        }\n    };\n\n    $smCount($smTree);\n\n    $smTotal = $smLinks + $smOther->count();\n@endphp\n\n<section class=\"py-4 py-lg-5\">\n  <div class=\"container-xl\">\n\n    <div class=\"text-center mb-4\">\n      <h1 class=\"sm-title\">{{ $smLang === 'en' ? 'SITEMAP' : 'PETA LAMAN' }}</h1>\n      @php\n        $smNote = $smLang === 'en'\n            ? 'Full page index of the NRES Portal — '.$smTotal.' links.'\n            : 'Indeks penuh halaman Portal NRES — '.$smTotal.' pautan.';\n      @endphp\n      <p class=\"sm-sub\">{{ $smNote }}</p>\n    </div>\n\n    <ul class=\"sm-tree\">\n      @foreach ($smTree as $smSec)\n        @php\n          $smSecLink = trim((string) ($smSec['menu_link'] ?? ''));\n          $smKids    = $smSec['children'] ?? [];\n        @endphp\n        <li>\n          @if ($smSecLink !== '')\n            <a class=\"sm-top\" href=\"{{ $smSecLink }}\">{{ $smSec['menu_name'] }}</a>\n          @else\n            <span class=\"sm-top\">{{ $smSec['menu_name'] }}</span>\n          @endif\n\n          @if ($smKids)\n            <ul>\n              @foreach ($smKids as $smKid)\n                @php $smKidLink = trim((string) ($smKid['menu_link'] ?? '')); @endphp\n                <li>\n                  @if ($smKidLink !== '')\n                    <a href=\"{{ $smKidLink }}\">{{ $smKid['menu_name'] }}</a>\n                  @else\n                    <span>{{ $smKid['menu_name'] }}</span>\n                  @endif\n\n                  @if (! empty($smKid['children']))\n                    <ul>\n                      @foreach ($smKid['children'] as $smG)\n                        @php $smGLink = trim((string) ($smG['menu_link'] ?? '')); @endphp\n                        <li>\n                          @if ($smGLink !== '')\n                            <a href=\"{{ $smGLink }}\">{{ $smG['menu_name'] }}</a>\n                          @else\n                            <span>{{ $smG['menu_name'] }}</span>\n                          @endif\n                        </li>\n                      @endforeach\n                    </ul>\n                  @endif\n                </li>\n              @endforeach\n            </ul>\n          @endif\n        </li>\n      @endforeach\n    </ul>\n\n    @if ($smOther->isNotEmpty())\n      <h2 class=\"sm-h2\">{{ $smLang === 'en' ? 'Other Links' : 'Pautan Lain' }}</h2>\n      <ul class=\"sm-tree sm-tree--flat\">\n        @foreach ($smOther as $smP)\n          <li><a href=\"/{{ $siteSlug }}/{{ $smP['slug'] }}\">{{ t($smP['name']) }}</a></li>\n        @endforeach\n      </ul>\n    @endif\n\n    <p class=\"sm-foot\">\n      {{ $smLang === 'en'\n          ? 'This sitemap is generated automatically from the portal navigation menu. Last updated: '\n          : 'Peta laman ini dijana secara automatik daripada menu navigasi portal. Tarikh kemaskini: ' }}\n      {{ \\Carbon\\Carbon::now()->locale($smLang === 'en' ? 'en' : 'ms')->translatedFormat('d F Y') }}\n    </p>\n\n  </div>\n</section>\n\n<style>\n.sm-title{font-weight:800;color:var(--deep);letter-spacing:.3px;font-size:clamp(1.2rem,2.6vw,1.85rem);margin:0 0 .35rem;text-transform:uppercase}\n.sm-sub{font-size:.85rem;color:var(--bs-secondary-color);margin:0}\n.sm-h2{position:relative;font-weight:700;color:var(--green);font-size:.92rem;margin:1.7rem 0 .9rem;padding:0 0 .55rem .7rem;text-transform:uppercase;letter-spacing:.3px;border-bottom:1px solid var(--line)}\n.sm-h2::before{content:\"\";position:absolute;left:0;top:.12em;bottom:.72rem;width:4px;border-radius:3px;background:linear-gradient(180deg,var(--teal),var(--green))}\n\n/* Pokok sitemap — senarai bersarang (konsep portal asal) */\n.sm-tree{list-style:none;margin:0;padding:0;columns:2;column-gap:2.6rem}\n.sm-tree>li{break-inside:avoid;margin:0 0 1.15rem}\n.sm-top{display:inline-flex;align-items:center;gap:.45rem;font-weight:700;font-size:.84rem;letter-spacing:.35px;text-transform:uppercase;color:var(--green);text-decoration:none;line-height:1.3}\n.sm-top::before{content:\"\";flex:0 0 auto;width:8px;height:8px;border-radius:2px;background:linear-gradient(135deg,var(--teal),var(--green))}\na.sm-top:hover{color:var(--teal)}\n.sm-tree ul{list-style:none;margin:.3rem 0 0;padding:0 0 0 1.15rem;border-left:1px solid var(--line)}\n.sm-tree ul li{position:relative;padding:.15rem 0;font-size:.845rem;line-height:1.5}\n.sm-tree ul li::before{content:\"\";position:absolute;left:-1.15rem;top:.78em;width:.75rem;height:1px;background:var(--line)}\n.sm-tree ul li>span{color:var(--ink);opacity:.68;font-weight:600}\n.sm-tree ul a{color:var(--teal);font-weight:500;text-decoration:none;transition:color .18s ease}\n.sm-tree ul a:hover{color:var(--deep);text-decoration:underline}\n.sm-tree ul ul{margin-top:.15rem;padding-left:1rem}\n.sm-tree ul ul li{font-size:.815rem}\n.sm-tree--flat{columns:3;margin-top:0}\n.sm-tree--flat>li{margin:0;padding:.2rem 0;font-size:.845rem}\n.sm-tree--flat a{color:var(--teal);font-weight:500;text-decoration:none}\n.sm-tree--flat a:hover{color:var(--deep);text-decoration:underline}\n.sm-tree--flat a::before{content:\"\";display:inline-block;width:6px;height:6px;margin-right:.5rem;border-radius:50%;background:var(--teal);opacity:.5;vertical-align:middle}\n.sm-foot{font-size:.72rem;color:var(--bs-secondary-color);text-align:center;margin:1.8rem 0 0}\n@media(max-width:991.98px){\n.sm-tree{columns:1}\n.sm-tree--flat{columns:2}\n}\n@media(max-width:575.98px){\n.sm-h2{font-size:.85rem}\n.sm-tree--flat{columns:1}\n}\n</style>\n"
}