{"id":2455,"date":"2026-01-30T17:04:59","date_gmt":"2026-01-30T09:04:59","guid":{"rendered":"https:\/\/sgps.visibleone.dev\/programmes\/bssc-in-data-science-and-policy-studies-2\/"},"modified":"2026-01-30T17:04:59","modified_gmt":"2026-01-30T09:04:59","slug":"bssc-in-data-science-and-policy-studies-2","status":"publish","type":"programmes","link":"https:\/\/sgps.visibleone.dev\/sc\/programmes\/bssc-in-data-science-and-policy-studies-2\/","title":{"rendered":"BSSc in Data Science and Policy Studies"},"content":{"rendered":"\n<section block-name=\"banner\" class=\"relative\">\n    <div class=\"bg-banner-gradient w-full h-full absolute left-0 top-0 z-[1]\"><\/div>\n\n    <img decoding=\"async\" src=\"https:\/\/sgps.visibleone.dev\/wp-content\/themes\/cuhk-sgps\/public\/images\/our-mission\/mission-banner.png\" alt=\"BSSc in Data Science and Policy Studies\"\n        class=\"w-full aspect-[1920\/480] object-cover min-h-[400px]\" \/>\n\n    <div class=\"container py-5 md:py-10 lg:py-[60px] w-full h-full flex items-end absolute left-0 bottom-0 z-[2]\">\n        <div class=\"container-lg\">\n            <h1 class=\"heading1 text-white pb-4 lg:pb-6\">\n                BSSc in Data Science and Policy Studies            <\/h1>\n\n            <div class=\"flex items-center flex-wrap breadcrumbs-row gap-3\">\n                <a href=\"https:\/\/sgps.visibleone.dev\/sc\/\" class=\"opacity-60 [&#038;.active]:opacity-100\">\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n                        <path\n                            d=\"M9.99863 19V14H13.9986V19C13.9986 19.55 14.4486 20 14.9986 20H17.9986C18.5486 20 18.9986 19.55 18.9986 19V12H20.6986C21.1586 12 21.3786 11.43 21.0286 11.13L12.6686 3.59997C12.2886 3.25997 11.7086 3.25997 11.3286 3.59997L2.96863 11.13C2.62863 11.43 2.83863 12 3.29863 12H4.99863V19C4.99863 19.55 5.44863 20 5.99863 20H8.99863C9.54863 20 9.99863 19.55 9.99863 19Z\"\n                            fill=\"white\" \/>\n                    <\/svg>\n                <\/a>\n\n                \n                <svg class=\"opacity-60 [&#038;.active]:opacity-100 active\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20\"\n                    height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n                    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n                        d=\"M5.83594 15L10.8359 9.99996L5.83594 4.99996L7.5026 3.33329L14.1693 9.99996L7.5026 16.6666L5.83594 15Z\"\n                        fill=\"white\" \/>\n                <\/svg>\n\n                <p class=\"text-body-1 text-white opacity-100 active\">\n                    BSSc in Data Science and Policy Studies                <\/p>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/section>\n\n\n<style>\n    .sidebar-wrapper ul,\n    .sidebar-wrapper li {\n        list-style: none !important;\n        list-style-type: none !important;\n        margin: 0 !important;\n        padding: 0 !important;\n    }\n\n    .sidebar-wrapper li::before,\n    .sidebar-wrapper li::after {\n        display: none !important;\n        content: none !important;\n    }\n<\/style>\n\n<section class=\"programme-container container py-[60px] md:py-[100px]\">\n    <div class=\"container-lg\">\n        <div class=\"flex flex-col md:flex-row gap-10 xl:gap-20\">\n\n            <div class=\"md:flex-[0_1_25%] md:max-w-[25%]\">\n                <div\n                    class=\"bg-[#F9F9F7] sidebar-wrapper sticky top-24 transition-all duration-300 rounded-sm overflow-hidden shadow-sm\">\n\n                    <div class=\"p-5 border-b border-gray-200\">\n                        <h6 class=\"heading6 text-primary font-bold leading-tight\">\n                            BSSc in Data Science and Policy Studies                        <\/h6>\n                    <\/div>\n\n                                    <\/div>\n            <\/div>\n\n            <div class=\"md:flex-[0_1_75%] md:max-w-[75%]\">\n\n                \n            <\/div>\n        <\/div>\n    <\/div>\n<\/section>\n\n<script>\n    document.addEventListener(\"DOMContentLoaded\", function () {\n\n        if (typeof Swiper !== \"undefined\") {\n            try {\n                new Swiper(\".programme-media-swiper\", {\n                    slidesPerView: 1,\n                    spaceBetween: 20,\n                    loop: true,\n                    pagination: { el: \".media-swiper-pagination\", clickable: true },\n                    navigation: { nextEl: \".media-swiper-button-next\", prevEl: \".media-swiper-button-prev\" },\n                });\n            } catch (e) {\n                console.error(\"Swiper Init Error:\", e);\n            }\n        }\n\n        const sidebarToggles = document.querySelectorAll(\".sidebar-toggle\");\n\n        sidebarToggles.forEach((btn) => {\n            btn.addEventListener(\"click\", function (e) {\n                e.preventDefault();\n                e.stopImmediatePropagation();\n\n                const menu = this.closest('li').querySelector('ul');\n                const arrow = this.querySelector(\"img\");\n                const wasActive = this.classList.contains(\"active\");\n\n                sidebarToggles.forEach(otherBtn => {\n                    if (otherBtn !== this) {\n                        otherBtn.classList.remove(\"active\", \"bg-primary\", \"text-white\");\n                        otherBtn.classList.add(\"text-dark\");\n\n                        const otherMenu = otherBtn.closest('li').querySelector('ul');\n                        if (otherMenu) otherMenu.classList.add(\"hidden\");\n\n                        const otherArrow = otherBtn.querySelector(\"img\");\n                        if (otherArrow) {\n                            otherArrow.style.transform = \"rotate(0deg)\";\n                            otherArrow.style.filter = \"\";\n                            otherArrow.classList.add(\"opacity-60\");\n                        }\n                    }\n                });\n\n                if (wasActive) {\n                    this.classList.remove(\"active\", \"bg-primary\", \"text-white\");\n                    this.classList.add(\"text-dark\");\n                    if (menu) menu.classList.add(\"hidden\");\n                    if (arrow) {\n                        arrow.style.transform = \"rotate(0deg)\";\n                        arrow.style.filter = \"\";\n                        arrow.classList.add(\"opacity-60\");\n                    }\n                } else {\n                    \/\/ Clear any standalone active links when opening a toggle\n                    subLinks.forEach(link => {\n                        if (!link.closest('.sidebar-sub-menu')) {\n                            link.classList.remove(\"bg-primary\", \"text-white\");\n                            link.classList.add(\"text-dark\");\n                        }\n                    });\n\n                    this.classList.add(\"active\", \"bg-primary\", \"text-white\");\n                    this.classList.remove(\"text-dark\");\n                    if (menu) menu.classList.remove(\"hidden\");\n                    if (arrow) {\n                        arrow.style.transform = \"rotate(180deg)\";\n                        arrow.style.filter = \"brightness(0) invert(1)\";\n                        arrow.classList.remove(\"opacity-60\");\n                    }\n\n                    \/\/ --- Navigation Logic ---\n                    const href = this.getAttribute(\"data-href\");\n                    if (menu) {\n                        let subLinkToClick = null;\n                        if (href && href !== \"#\") {\n                            \/\/ Find child that matches parent's link\n                            subLinkToClick = menu.querySelector(`.sidebar-sub-link[href=\"${href}\"]`);\n                        }\n\n                        \/\/ Fallback to first child if no match or no href\n                        if (!subLinkToClick) {\n                            subLinkToClick = menu.querySelector(\".sidebar-sub-link\");\n                        }\n\n                        if (subLinkToClick) {\n                            subLinkToClick.click();\n                        }\n                    } else if (href && href !== \"#\") {\n                        switchTab(href);\n                        history.pushState(null, null, href);\n                    }\n                }\n            });\n        });\n\n        const subLinks = document.querySelectorAll(\".sidebar-sub-link\");\n        const tabContents = document.querySelectorAll(\".program-tab-content\");\n\n        function switchTab(targetId) {\n            tabContents.forEach(content => content.classList.add('hidden'));\n            if (targetId && targetId.startsWith('#')) {\n                try {\n                    const targetContent = document.querySelector(targetId);\n                    if (targetContent) {\n                        targetContent.classList.remove('hidden');\n                        setTimeout(() => {\n                            window.scrollTo({ top: 0, behavior: 'smooth' });\n                        }, 0);\n                    }\n                } catch (e) { }\n            }\n        }\n\n        function setActiveLink(clickedLink) {\n            const isStandalone = !clickedLink.closest('.sidebar-sub-menu');\n\n            subLinks.forEach((link) => {\n                link.classList.remove(\"bg-[#D1F0E9]\", \"bg-primary\", \"text-primary\", \"text-white\");\n                link.classList.add(\"text-dark\");\n\n                const dot = link.querySelector(\".dot-indicator\");\n                if (dot) {\n                    dot.classList.remove(\"bg-primary\");\n                    dot.classList.add(\"bg-dark\");\n                }\n            });\n\n            clickedLink.classList.remove(\"text-dark\");\n            if (isStandalone) {\n                clickedLink.classList.add(\"bg-primary\", \"text-white\");\n\n                \/\/ Close other toggles when a standalone item is active\n                sidebarToggles.forEach(btn => {\n                    btn.classList.remove(\"active\", \"bg-primary\", \"text-white\");\n                    btn.classList.add(\"text-dark\");\n                    const menu = btn.closest('li').querySelector('ul');\n                    if (menu) menu.classList.add(\"hidden\");\n                    const arrow = btn.querySelector(\"img\");\n                    if (arrow) {\n                        arrow.style.transform = \"rotate(0deg)\";\n                        arrow.style.filter = \"\";\n                        arrow.classList.add(\"opacity-60\");\n                    }\n                });\n            } else {\n                clickedLink.classList.add(\"bg-[#D1F0E9]\", \"text-primary\");\n            }\n\n            const activeDot = clickedLink.querySelector(\".dot-indicator\");\n            if (activeDot) {\n                activeDot.classList.remove(\"bg-dark\");\n                activeDot.classList.add(\"bg-primary\");\n            }\n        }\n\n        subLinks.forEach((link) => {\n            link.addEventListener(\"click\", function (e) {\n                const href = this.getAttribute(\"href\");\n                if (href && href.startsWith(\"#\")) {\n                    e.preventDefault();\n                    e.stopImmediatePropagation();\n                    setActiveLink(this);\n                    switchTab(href);\n                    history.pushState(null, null, href);\n                }\n            });\n        });\n\n        const hash = window.location.hash;\n        if (hash && hash !== '#') {\n            let targetLink = null;\n            try {\n                targetLink = document.querySelector(`.sidebar-sub-link[href=\"${CSS.escape(hash)}\"]`);\n            } catch (e) { }\n\n            if (targetLink) {\n                const parentUl = targetLink.closest('ul');\n                if (parentUl && parentUl.classList.contains('hidden')) {\n                    const parentLi = parentUl.closest('li');\n                    const parentBtn = parentLi ? parentLi.querySelector('.sidebar-toggle') : null;\n\n                    if (parentBtn) {\n                        parentBtn.classList.add(\"active\", \"bg-primary\", \"text-white\");\n                        parentBtn.classList.remove(\"text-dark\");\n                        parentUl.classList.remove(\"hidden\");\n                        const arrow = parentBtn.querySelector(\"img\");\n                        if (arrow) {\n                            arrow.style.transform = \"rotate(180deg)\";\n                            arrow.style.filter = \"brightness(0) invert(1)\";\n                            arrow.classList.remove(\"opacity-60\");\n                        }\n                    }\n                }\n                setActiveLink(targetLink);\n                switchTab(hash);\n            }\n        } else if (subLinks.length > 0) {\n            const firstLink = subLinks[0];\n            const parentUl = firstLink.closest('ul');\n            if (parentUl && parentUl.classList.contains('hidden')) {\n                const parentLi = parentUl.closest('li');\n                const parentBtn = parentLi ? parentLi.querySelector('.sidebar-toggle') : null;\n                if (parentBtn) {\n                    parentBtn.classList.add(\"active\", \"bg-primary\", \"text-white\");\n                    parentBtn.classList.remove(\"text-dark\");\n                    parentUl.classList.remove(\"hidden\");\n                    const arrow = parentBtn.querySelector(\"img\");\n                    if (arrow) {\n                        arrow.style.transform = \"rotate(180deg)\";\n                        arrow.style.filter = \"brightness(0) invert(1)\";\n                        arrow.classList.remove(\"opacity-60\");\n                    }\n                }\n            }\n            setActiveLink(firstLink);\n        }\n    });\n<\/script>","protected":false},"excerpt":{"rendered":"","protected":false},"featured_media":0,"template":"","department":[],"programme_cat":[69],"class_list":["post-2455","programmes","type-programmes","status-publish","hentry","programme_cat-undergraduate_programmes"],"acf":[],"_links":{"self":[{"href":"https:\/\/sgps.visibleone.dev\/sc\/wp-json\/wp\/v2\/programmes\/2455","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sgps.visibleone.dev\/sc\/wp-json\/wp\/v2\/programmes"}],"about":[{"href":"https:\/\/sgps.visibleone.dev\/sc\/wp-json\/wp\/v2\/types\/programmes"}],"version-history":[{"count":0,"href":"https:\/\/sgps.visibleone.dev\/sc\/wp-json\/wp\/v2\/programmes\/2455\/revisions"}],"wp:attachment":[{"href":"https:\/\/sgps.visibleone.dev\/sc\/wp-json\/wp\/v2\/media?parent=2455"}],"wp:term":[{"taxonomy":"department","embeddable":true,"href":"https:\/\/sgps.visibleone.dev\/sc\/wp-json\/wp\/v2\/department?post=2455"},{"taxonomy":"programme_cat","embeddable":true,"href":"https:\/\/sgps.visibleone.dev\/sc\/wp-json\/wp\/v2\/programme_cat?post=2455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}