{
    "id": 41,
    "name": "Sitemap",
    "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    // Seksyen yang ADA anak → kad grid; tanpa anak → baris chip\n    $smHasKids = fn ($s) => ! empty($s['children']);\n\n    $smGrid = collect($smTree)->filter($smHasKids)->values();\n    $smSolo = collect($smTree)->reject($smHasKids)->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    <div class=\"row g-3 g-lg-4\">\n      @foreach ($smGrid as $smSec)\n        @php\n          $smSecLink = trim((string) ($smSec['menu_link'] ?? ''));\n          $smKids    = $smSec['children'] ?? [];\n        @endphp\n        <div class=\"col-12 col-lg-6\">\n          <div class=\"sm-card\">\n            <h2 class=\"sm-h2\">\n              @if ($smSecLink !== '')\n                <a href=\"{{ $smSecLink }}\">{{ $smSec['menu_name'] }}</a>\n              @else\n                {{ $smSec['menu_name'] }}\n              @endif\n            </h2>\n\n            @if ($smKids)\n              <ul class=\"sm-list\">\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 class=\"sm-plain\">{{ $smKid['menu_name'] }}</span>\n                    @endif\n\n                    @if (! empty($smKid['children']))\n                      <ul class=\"sm-sub-list\">\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 class=\"sm-plain\">{{ $smG['menu_name'] }}</span>\n                            @endif\n                          </li>\n                        @endforeach\n                      </ul>\n                    @endif\n                  </li>\n                @endforeach\n              </ul>\n            @endif\n          </div>\n        </div>\n      @endforeach\n    </div>\n\n    @if ($smSolo->isNotEmpty() || $smOther->isNotEmpty())\n      <div class=\"sm-card sm-card--wide mt-3 mt-lg-4\">\n        <h2 class=\"sm-h2\">{{ $smLang === 'en' ? 'Other Links' : 'Pautan Lain' }}</h2>\n        <ul class=\"sm-chips\">\n          @foreach ($smSolo as $smS)\n            @php $smSLink = trim((string) ($smS['menu_link'] ?? '')); @endphp\n            <li>\n              @if ($smSLink !== '')\n                <a href=\"{{ $smSLink }}\">{{ $smS['menu_name'] }}</a>\n              @else\n                <span class=\"sm-chip-plain\">{{ $smS['menu_name'] }}</span>\n              @endif\n            </li>\n          @endforeach\n          @foreach ($smOther as $smP)\n            <li><a href=\"/{{ $siteSlug }}/{{ $smP['slug'] }}\">{{ t($smP['name']) }}</a></li>\n          @endforeach\n        </ul>\n      </div>\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-card{background:var(--bs-body-bg);border:1px solid var(--line);border-radius:16px;padding:1.05rem 1.15rem 1.15rem;height:100%;box-shadow:0 4px 14px rgba(17,128,143,.06);transition:box-shadow .25s ease,border-color .25s ease}\n.sm-card:hover{box-shadow:0 8px 24px rgba(17,128,143,.12)}\n.sm-card--wide{height:auto}\n.sm-h2{position:relative;font-weight:700;color:var(--green);font-size:.92rem;margin:0 0 .8rem;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.sm-h2 a{color:inherit;text-decoration:none}\n.sm-h2 a:hover{color:var(--teal)}\n.sm-list,.sm-sub-list{list-style:none;margin:0;padding:0}\n.sm-list>li{padding:.3rem 0;font-size:.86rem}\n.sm-list>li+li{border-top:1px dashed var(--line)}\n.sm-list a,.sm-sub-list a{display:inline-flex;align-items:center;gap:.42rem;color:var(--teal);font-weight:600;text-decoration:none;transition:color .2s ease,gap .2s ease}\n.sm-list a::before{content:\"\";flex:0 0 auto;width:6px;height:6px;border-radius:50%;background:var(--teal);opacity:.5;transition:opacity .2s ease,background .2s ease}\n.sm-list a:hover,.sm-sub-list a:hover{color:var(--deep);gap:.62rem}\n.sm-list a:hover::before{opacity:1;background:var(--green)}\n.sm-plain{color:var(--ink);opacity:.62;font-weight:600}\n.sm-sub-list{margin:.32rem 0 .38rem 1rem;padding-left:.72rem;border-left:1px solid var(--line)}\n.sm-sub-list li{padding:.16rem 0;font-size:.81rem}\n.sm-sub-list a{font-weight:500}\n.sm-sub-list a::before{content:\"\";flex:0 0 auto;width:5px;height:5px;border-radius:50%;background:var(--teal);opacity:.4}\n.sm-empty{font-size:.8rem;color:var(--bs-secondary-color);opacity:.7;font-style:italic;margin:.15rem 0 0}\n.sm-chips{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:.5rem}\n.sm-chips a{display:inline-block;padding:.4rem .85rem;border-radius:999px;background:var(--fade);border:1px solid var(--line);color:var(--deep);font-size:.8rem;font-weight:600;text-decoration:none;transition:background .2s ease,color .2s ease,transform .2s ease}\n.sm-chips a:hover{background:var(--teal);color:var(--bs-body-bg);transform:translateY(-2px)}\n.sm-chips .sm-chip-plain{display:inline-block;padding:.4rem .85rem;border-radius:999px;background:var(--fade);border:1px dashed var(--line);color:var(--bs-secondary-color);font-size:.8rem;font-weight:600}\n.sm-foot{font-size:.72rem;color:var(--bs-secondary-color);text-align:center;margin:1.5rem 0 0}\n@media(max-width:575.98px){\n.sm-card{padding:.9rem 1rem 1rem;border-radius:14px}\n.sm-h2{font-size:.85rem}\n.sm-list>li{font-size:.82rem}\n.sm-sub-list li{font-size:.78rem}\n}\n</style>\n"
}