{"id":6867,"date":"2026-06-10T05:31:09","date_gmt":"2026-06-10T05:31:09","guid":{"rendered":"https:\/\/fpmipati.upgris.ac.id\/?page_id=6867"},"modified":"2026-08-10T03:27:14","modified_gmt":"2026-08-10T03:27:14","slug":"curriculum","status":"publish","type":"page","link":"https:\/\/fpmipati.upgris.ac.id\/index.php\/curriculum\/","title":{"rendered":"Curriculum"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\"><strong>Mathematics Education<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The curriculum for the Bachelor of Mathematics Education Study Programme is the 2025 curriculum, which was implemented starting in the 2025\/2026 Academic Year based on Rector&#8217;s Decree No. 068.a\/SK\/UPGRIS\/X\/2025. Under this curriculum, the total Semester Credit Units (SKS) required by students is 144 credits. This 144 credits can be completed over eight semesters.<br>More detailed information, including the Curriculum Book, can be found below:<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-995f960e wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"pdf-cover-wrapper-bme\">\n    <canvas id=\"pdf-cover-bme\"><\/canvas>\n<\/div>\n\n<style>\n.pdf-cover-wrapper-bme {\n    width: 100%;\n    max-width: 850px;\n    margin: 0 auto;\n    overflow: hidden;\n    background: #f5f5f5;\n    border-radius: 10px;\n    box-shadow: 0 5px 20px rgba(0, 0, 0, 0.12);\n    text-align: center;\n    line-height: 0;\n}\n\n#pdf-cover-bme {\n    display: block;\n    width: 100% !important;\n    height: auto !important;\n    max-width: 100%;\n    margin: 0 auto;\n    user-select: none;\n    -webkit-user-select: none;\n    -webkit-user-drag: none;\n}\n<\/style>\n\n<!-- PDF.js -->\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.11.174\/pdf.min.js\"><\/script>\n\n<script>\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n\n    const pdfUrl =\n        \"https:\/\/fpmipati.upgris.ac.id\/wp-content\/uploads\/2026\/06\/BME-Handbook-Study-Programme.pdf\";\n\n    const wrapper =\n        document.querySelector(\".pdf-cover-wrapper-bme\");\n\n    const canvas =\n        document.getElementById(\"pdf-cover-bme\");\n\n    const ctx =\n        canvas.getContext(\"2d\");\n\n    \/*\n     * PDF.js Worker\n     *\/\n    pdfjsLib.GlobalWorkerOptions.workerSrc =\n        \"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.11.174\/pdf.worker.min.js\";\n\n    let pdfPage = null;\n    let rendering = false;\n    let renderAgain = false;\n    let lastWidth = 0;\n\n    \/*\n     * Render cover sesuai ukuran container\n     *\/\n    async function renderCover() {\n\n        if (!pdfPage) {\n            return;\n        }\n\n        \/*\n         * Jika sedang render, tunggu sampai selesai\n         *\/\n        if (rendering) {\n            renderAgain = true;\n            return;\n        }\n\n        rendering = true;\n\n        try {\n\n            const containerWidth =\n                wrapper.getBoundingClientRect().width;\n\n            \/*\n             * Container belum memiliki ukuran\n             *\/\n            if (containerWidth <= 0) {\n                rendering = false;\n                return;\n            }\n\n            \/*\n             * Tidak perlu render ulang jika ukuran\n             * belum berubah\n             *\/\n            if (Math.abs(containerWidth - lastWidth) < 1) {\n                rendering = false;\n                return;\n            }\n\n            lastWidth = containerWidth;\n\n            \/*\n             * Ukuran asli halaman PDF\n             *\/\n            const originalViewport =\n                pdfPage.getViewport({\n                    scale: 1\n                });\n\n            \/*\n             * Scale berdasarkan lebar container\n             *\/\n            const scale =\n                containerWidth \/\n                originalViewport.width;\n\n            const viewport =\n                pdfPage.getViewport({\n                    scale: scale\n                });\n\n            \/*\n             * Support Retina \/ HiDPI\n             *\/\n            const outputScale =\n                window.devicePixelRatio || 1;\n\n            \/*\n             * Ukuran pixel canvas\n             *\/\n            canvas.width =\n                Math.floor(\n                    viewport.width *\n                    outputScale\n                );\n\n            canvas.height =\n                Math.floor(\n                    viewport.height *\n                    outputScale\n                );\n\n            \/*\n             * Ukuran tampilan canvas\n             * selalu mengikuti container\n             *\/\n            canvas.style.width = \"100%\";\n            canvas.style.height = \"auto\";\n\n            \/*\n             * Bersihkan render sebelumnya\n             *\/\n            ctx.clearRect(\n                0,\n                0,\n                canvas.width,\n                canvas.height\n            );\n\n            \/*\n             * Render halaman pertama\n             *\/\n            await pdfPage.render({\n                canvasContext: ctx,\n                viewport: viewport,\n                transform:\n                    outputScale !== 1\n                        ? [\n                            outputScale,\n                            0,\n                            0,\n                            outputScale,\n                            0,\n                            0\n                        ]\n                        : null\n            }).promise;\n\n        } catch (error) {\n\n            console.error(\n                \"Gagal render cover BME:\",\n                error\n            );\n\n        } finally {\n\n            rendering = false;\n\n            \/*\n             * Jika ukuran berubah ketika proses render,\n             * render ulang dengan ukuran terbaru\n             *\/\n            if (renderAgain) {\n\n                renderAgain = false;\n\n                renderCover();\n            }\n        }\n    }\n\n    \/*\n     * Load PDF\n     *\/\n    pdfjsLib.getDocument({\n        url: pdfUrl\n    }).promise\n\n    .then(function (pdf) {\n\n        \/*\n         * HANYA halaman pertama\n         *\/\n        return pdf.getPage(1);\n\n    })\n\n    .then(function (page) {\n\n        pdfPage = page;\n\n        \/*\n         * Render pertama\n         *\/\n        renderCover();\n\n        \/*\n         * Pantau perubahan ukuran container.\n         * Penting untuk Elementor dan responsive layout.\n         *\/\n        if (window.ResizeObserver) {\n\n            const resizeObserver =\n                new ResizeObserver(function () {\n\n                    renderCover();\n\n                });\n\n            resizeObserver.observe(wrapper);\n\n        } else {\n\n            \/*\n             * Fallback browser lama\n             *\/\n            window.addEventListener(\n                \"resize\",\n                renderCover\n            );\n        }\n\n    })\n\n    .catch(function (error) {\n\n        console.error(\n            \"PDF gagal dimuat:\",\n            error\n        );\n\n        wrapper.innerHTML =\n            \"<p style='padding:30px;line-height:1.5;'>Cover dokumen tidak dapat ditampilkan.<\/p>\";\n\n    });\n\n});\n<\/script>\n\n<script>\n\/*\n * Blokir klik kanan pada cover BME\n *\/\ndocument.addEventListener(\n    \"contextmenu\",\n    function (e) {\n\n        if (\n            e.target.id ===\n            \"pdf-cover-bme\"\n        ) {\n            e.preventDefault();\n        }\n\n    }\n);\n\n\/*\n * Blokir drag canvas\n *\/\ndocument.addEventListener(\n    \"dragstart\",\n    function (e) {\n\n        if (\n            e.target.id ===\n            \"pdf-cover-bme\"\n        ) {\n            e.preventDefault();\n        }\n\n    }\n);\n<\/script>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Biology Education<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The curriculum for the Bachelor of Biology Education Study Programme is the 2025 curriculum, which was implemented starting in the 2025\/2026 Academic Year based on Rector&#8217;s Decree No. 068.a\/SK\/UPGRIS\/X\/2025. Under this curriculum, the total Semester Credit Units (SKS) required by students is 144 credits. This 144 credits can be completed over eight semesters.<br>More detailed information, including the Curriculum Book, can be found below:<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-995f960e wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"pdf-cover-wrapper-handbook\">\n    <canvas id=\"pdf-cover-handbook\"><\/canvas>\n<\/div>\n\n<style>\n.pdf-cover-wrapper-handbook {\n    width: 100%;\n    max-width: 850px;\n    margin: 0 auto;\n    overflow: hidden;\n    background: #f5f5f5;\n    border-radius: 10px;\n    box-shadow: 0 5px 20px rgba(0, 0, 0, 0.12);\n    text-align: center;\n    line-height: 0;\n}\n\n#pdf-cover-handbook {\n    display: block;\n    width: 100% !important;\n    height: auto !important;\n    max-width: 100%;\n    margin: 0 auto;\n    user-select: none;\n    -webkit-user-select: none;\n    -webkit-user-drag: none;\n}\n<\/style>\n\n<!-- PDF.js -->\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.11.174\/pdf.min.js\"><\/script>\n\n<script>\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n\n    const pdfUrl =\n        \"https:\/\/fpmipati.upgris.ac.id\/wp-content\/uploads\/2026\/06\/Handbook-Study-Programme.pdf\";\n\n    const wrapper =\n        document.querySelector(\".pdf-cover-wrapper-handbook\");\n\n    const canvas =\n        document.getElementById(\"pdf-cover-handbook\");\n\n    const ctx =\n        canvas.getContext(\"2d\");\n\n    \/*\n     * PDF.js Worker\n     *\/\n    pdfjsLib.GlobalWorkerOptions.workerSrc =\n        \"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.11.174\/pdf.worker.min.js\";\n\n    let pdfPage = null;\n    let rendering = false;\n    let renderAgain = false;\n    let lastWidth = 0;\n\n    \/*\n     * Render cover sesuai ukuran container\n     *\/\n    async function renderCover() {\n\n        if (!pdfPage) {\n            return;\n        }\n\n        \/*\n         * Jika sedang render, tandai agar\n         * dirender kembali setelah selesai\n         *\/\n        if (rendering) {\n            renderAgain = true;\n            return;\n        }\n\n        rendering = true;\n\n        try {\n\n            const containerWidth =\n                wrapper.getBoundingClientRect().width;\n\n            \/*\n             * Container belum memiliki ukuran\n             *\/\n            if (containerWidth <= 0) {\n                rendering = false;\n                return;\n            }\n\n            \/*\n             * Hindari render ulang jika ukuran\n             * belum berubah\n             *\/\n            if (Math.abs(containerWidth - lastWidth) < 1) {\n                rendering = false;\n                return;\n            }\n\n            lastWidth = containerWidth;\n\n            \/*\n             * Ukuran asli halaman PDF\n             *\/\n            const originalViewport =\n                pdfPage.getViewport({\n                    scale: 1\n                });\n\n            \/*\n             * Scale mengikuti lebar container\n             *\/\n            const scale =\n                containerWidth \/\n                originalViewport.width;\n\n            const viewport =\n                pdfPage.getViewport({\n                    scale: scale\n                });\n\n            \/*\n             * Support Retina \/ HiDPI\n             *\/\n            const outputScale =\n                window.devicePixelRatio || 1;\n\n            \/*\n             * Ukuran pixel canvas\n             *\/\n            canvas.width =\n                Math.floor(\n                    viewport.width *\n                    outputScale\n                );\n\n            canvas.height =\n                Math.floor(\n                    viewport.height *\n                    outputScale\n                );\n\n            \/*\n             * Ukuran visual selalu mengikuti\n             * lebar container\n             *\/\n            canvas.style.width = \"100%\";\n            canvas.style.height = \"auto\";\n\n            \/*\n             * Bersihkan canvas sebelumnya\n             *\/\n            ctx.clearRect(\n                0,\n                0,\n                canvas.width,\n                canvas.height\n            );\n\n            \/*\n             * Render halaman pertama\n             *\/\n            await pdfPage.render({\n                canvasContext: ctx,\n                viewport: viewport,\n                transform:\n                    outputScale !== 1\n                        ? [\n                            outputScale,\n                            0,\n                            0,\n                            outputScale,\n                            0,\n                            0\n                        ]\n                        : null\n            }).promise;\n\n        } catch (error) {\n\n            console.error(\n                \"Gagal render cover Handbook:\",\n                error\n            );\n\n        } finally {\n\n            rendering = false;\n\n            \/*\n             * Jika ukuran berubah ketika render,\n             * render ulang dengan ukuran terbaru\n             *\/\n            if (renderAgain) {\n\n                renderAgain = false;\n\n                renderCover();\n            }\n        }\n    }\n\n    \/*\n     * Load PDF\n     *\/\n    pdfjsLib.getDocument({\n        url: pdfUrl\n    }).promise\n\n    .then(function (pdf) {\n\n        \/*\n         * HANYA mengambil halaman pertama\n         *\/\n        return pdf.getPage(1);\n\n    })\n\n    .then(function (page) {\n\n        pdfPage = page;\n\n        \/*\n         * Render pertama\n         *\/\n        renderCover();\n\n        \/*\n         * Pantau perubahan ukuran container.\n         * Sangat berguna untuk Elementor.\n         *\/\n        if (window.ResizeObserver) {\n\n            const resizeObserver =\n                new ResizeObserver(function () {\n\n                    renderCover();\n\n                });\n\n            resizeObserver.observe(wrapper);\n\n        } else {\n\n            \/*\n             * Fallback browser lama\n             *\/\n            window.addEventListener(\n                \"resize\",\n                renderCover\n            );\n        }\n\n    })\n\n    .catch(function (error) {\n\n        console.error(\n            \"PDF gagal dimuat:\",\n            error\n        );\n\n        wrapper.innerHTML =\n            \"<p style='padding:30px;line-height:1.5;'>Cover dokumen tidak dapat ditampilkan.<\/p>\";\n\n    });\n\n});\n<\/script>\n\n<script>\n\/*\n * Blokir klik kanan pada cover\n *\/\ndocument.addEventListener(\n    \"contextmenu\",\n    function (e) {\n\n        if (\n            e.target.id ===\n            \"pdf-cover-handbook\"\n        ) {\n            e.preventDefault();\n        }\n\n    }\n);\n\n\/*\n * Blokir drag pada canvas\n *\/\ndocument.addEventListener(\n    \"dragstart\",\n    function (e) {\n\n        if (\n            e.target.id ===\n            \"pdf-cover-handbook\"\n        ) {\n            e.preventDefault();\n        }\n\n    }\n);\n<\/script>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Physics Education<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The curriculum for the Bachelor of Physics Education Study Programme is the 2025 curriculum, which was implemented starting in the 2025\/2026 Academic Year based on Rector&#8217;s Decree No. 068.a\/SK\/UPGRIS\/X\/2025. Under this curriculum, the total Semester Credit Units (SKS) required by students is 144 credits. This 144 credits can be completed over eight semesters.<br>More detailed information, including the Curriculum Book, can be found below:<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-995f960e wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"pdf-cover-wrapper-bpe\">\n    <canvas id=\"pdf-cover-bpe\"><\/canvas>\n<\/div>\n\n<style>\n.pdf-cover-wrapper-bpe {\n    width: 100%;\n    max-width: 850px;\n    margin: 0 auto;\n    overflow: hidden;\n    background: #f5f5f5;\n    border-radius: 10px;\n    box-shadow: 0 5px 20px rgba(0, 0, 0, 0.12);\n    text-align: center;\n    line-height: 0;\n}\n\n#pdf-cover-bpe {\n    display: block;\n    width: 100% !important;\n    height: auto !important;\n    max-width: 100%;\n    margin: 0 auto;\n    user-select: none;\n    -webkit-user-select: none;\n    -webkit-user-drag: none;\n}\n<\/style>\n\n<!-- PDF.js -->\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.11.174\/pdf.min.js\"><\/script>\n\n<script>\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n\n    const pdfUrl =\n        \"https:\/\/fpmipati.upgris.ac.id\/wp-content\/uploads\/2026\/06\/BPE-Handbook-Study-Programme.pdf\";\n\n    const wrapper =\n        document.querySelector(\".pdf-cover-wrapper-bpe\");\n\n    const canvas =\n        document.getElementById(\"pdf-cover-bpe\");\n\n    const ctx =\n        canvas.getContext(\"2d\");\n\n    \/*\n     * PDF.js Worker\n     *\/\n    pdfjsLib.GlobalWorkerOptions.workerSrc =\n        \"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.11.174\/pdf.worker.min.js\";\n\n    let pdfPage = null;\n    let rendering = false;\n    let renderAgain = false;\n    let lastWidth = 0;\n\n    \/*\n     * Render cover sesuai ukuran container\n     *\/\n    async function renderCover() {\n\n        if (!pdfPage) {\n            return;\n        }\n\n        \/*\n         * Jika sedang render, tunggu sampai selesai\n         *\/\n        if (rendering) {\n            renderAgain = true;\n            return;\n        }\n\n        rendering = true;\n\n        try {\n\n            const containerWidth =\n                wrapper.getBoundingClientRect().width;\n\n            \/*\n             * Container belum memiliki ukuran\n             *\/\n            if (containerWidth <= 0) {\n                rendering = false;\n                return;\n            }\n\n            \/*\n             * Hindari render ulang jika ukuran\n             * belum berubah\n             *\/\n            if (Math.abs(containerWidth - lastWidth) < 1) {\n                rendering = false;\n                return;\n            }\n\n            lastWidth = containerWidth;\n\n            \/*\n             * Ukuran asli halaman PDF\n             *\/\n            const originalViewport =\n                pdfPage.getViewport({\n                    scale: 1\n                });\n\n            \/*\n             * Scale mengikuti lebar container\n             *\/\n            const scale =\n                containerWidth \/\n                originalViewport.width;\n\n            const viewport =\n                pdfPage.getViewport({\n                    scale: scale\n                });\n\n            \/*\n             * Support Retina \/ HiDPI\n             *\/\n            const outputScale =\n                window.devicePixelRatio || 1;\n\n            \/*\n             * Ukuran pixel asli canvas\n             *\/\n            canvas.width =\n                Math.floor(\n                    viewport.width *\n                    outputScale\n                );\n\n            canvas.height =\n                Math.floor(\n                    viewport.height *\n                    outputScale\n                );\n\n            \/*\n             * Ukuran visual canvas selalu\n             * mengikuti container\n             *\/\n            canvas.style.width = \"100%\";\n            canvas.style.height = \"auto\";\n\n            \/*\n             * Bersihkan canvas sebelumnya\n             *\/\n            ctx.clearRect(\n                0,\n                0,\n                canvas.width,\n                canvas.height\n            );\n\n            \/*\n             * Render halaman pertama\n             *\/\n            await pdfPage.render({\n                canvasContext: ctx,\n                viewport: viewport,\n                transform:\n                    outputScale !== 1\n                        ? [\n                            outputScale,\n                            0,\n                            0,\n                            outputScale,\n                            0,\n                            0\n                        ]\n                        : null\n            }).promise;\n\n        } catch (error) {\n\n            console.error(\n                \"Gagal render cover BPE:\",\n                error\n            );\n\n        } finally {\n\n            rendering = false;\n\n            \/*\n             * Jika ukuran container berubah\n             * ketika sedang render\n             *\/\n            if (renderAgain) {\n\n                renderAgain = false;\n\n                renderCover();\n            }\n        }\n    }\n\n    \/*\n     * Load PDF\n     *\/\n    pdfjsLib.getDocument({\n        url: pdfUrl\n    }).promise\n\n    .then(function (pdf) {\n\n        \/*\n         * HANYA mengambil halaman pertama\n         *\/\n        return pdf.getPage(1);\n\n    })\n\n    .then(function (page) {\n\n        pdfPage = page;\n\n        \/*\n         * Render pertama\n         *\/\n        renderCover();\n\n        \/*\n         * Pantau perubahan ukuran container.\n         * Cocok untuk Elementor responsive.\n         *\/\n        if (window.ResizeObserver) {\n\n            const resizeObserver =\n                new ResizeObserver(function () {\n\n                    renderCover();\n\n                });\n\n            resizeObserver.observe(wrapper);\n\n        } else {\n\n            \/*\n             * Fallback untuk browser lama\n             *\/\n            window.addEventListener(\n                \"resize\",\n                renderCover\n            );\n        }\n\n    })\n\n    .catch(function (error) {\n\n        console.error(\n            \"PDF gagal dimuat:\",\n            error\n        );\n\n        wrapper.innerHTML =\n            \"<p style='padding:30px;line-height:1.5;'>Cover dokumen tidak dapat ditampilkan.<\/p>\";\n\n    });\n\n});\n<\/script>\n\n<script>\n\/*\n * Blokir klik kanan pada cover BPE\n *\/\ndocument.addEventListener(\n    \"contextmenu\",\n    function (e) {\n\n        if (\n            e.target.id ===\n            \"pdf-cover-bpe\"\n        ) {\n            e.preventDefault();\n        }\n\n    }\n);\n\n\/*\n * Blokir drag pada canvas\n *\/\ndocument.addEventListener(\n    \"dragstart\",\n    function (e) {\n\n        if (\n            e.target.id ===\n            \"pdf-cover-bpe\"\n        ) {\n            e.preventDefault();\n        }\n\n    }\n);\n<\/script>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Information Technology Education<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The curriculum for the Bachelor of Information Technology Education Study Programme is the 2025 curriculum, which was implemented starting in the 2025\/2026 Academic Year based on Rector&#8217;s Decree No. 068.a\/SK\/UPGRIS\/X\/2025. Under this curriculum, the total Semester Credit Units (SKS) required by students is 144 credits. This 144 credits can be completed over eight semesters.<br>More detailed information, including the Curriculum Book, can be found below:<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-995f960e wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"pdf-cover-wrapper-bite\">\n    <canvas id=\"pdf-cover-bite\"><\/canvas>\n<\/div>\n\n<style>\n.pdf-cover-wrapper-bite {\n    width: 100%;\n    max-width: 850px;\n    margin: 0 auto;\n    overflow: hidden;\n    background: #f5f5f5;\n    border-radius: 10px;\n    box-shadow: 0 5px 20px rgba(0, 0, 0, 0.12);\n    text-align: center;\n    line-height: 0;\n}\n\n#pdf-cover-bite {\n    display: block;\n    width: 100% !important;\n    height: auto !important;\n    max-width: 100%;\n    margin: 0 auto;\n    user-select: none;\n    -webkit-user-select: none;\n    -webkit-user-drag: none;\n}\n<\/style>\n\n<!-- PDF.js -->\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.11.174\/pdf.min.js\"><\/script>\n\n<script>\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n\n    const pdfUrl =\n        \"https:\/\/fpmipati.upgris.ac.id\/wp-content\/uploads\/2026\/06\/BITE-Handbook-Study-Programme.pdf\";\n\n    const wrapper =\n        document.querySelector(\".pdf-cover-wrapper-bite\");\n\n    const canvas =\n        document.getElementById(\"pdf-cover-bite\");\n\n    const ctx =\n        canvas.getContext(\"2d\");\n\n    if (!wrapper || !canvas) {\n        return;\n    }\n\n    \/*\n     * PDF.js Worker\n     *\/\n    pdfjsLib.GlobalWorkerOptions.workerSrc =\n        \"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.11.174\/pdf.worker.min.js\";\n\n    let pdfPage = null;\n    let rendering = false;\n    let renderAgain = false;\n    let lastWidth = 0;\n\n    \/*\n     * Render halaman pertama sesuai\n     * ukuran container\n     *\/\n    async function renderCover() {\n\n        \/*\n         * PDF belum selesai dimuat\n         *\/\n        if (!pdfPage) {\n            return;\n        }\n\n        \/*\n         * Jangan menjalankan dua render sekaligus\n         *\/\n        if (rendering) {\n            renderAgain = true;\n            return;\n        }\n\n        rendering = true;\n\n        try {\n\n            const containerWidth =\n                wrapper.getBoundingClientRect().width;\n\n            \/*\n             * Container belum terlihat \/ belum memiliki ukuran\n             *\/\n            if (containerWidth <= 0) {\n                return;\n            }\n\n            \/*\n             * Tidak perlu render jika ukuran\n             * belum berubah\n             *\/\n            if (Math.abs(containerWidth - lastWidth) < 1) {\n                return;\n            }\n\n            lastWidth = containerWidth;\n\n            \/*\n             * Ukuran asli halaman PDF\n             *\/\n            const originalViewport =\n                pdfPage.getViewport({\n                    scale: 1\n                });\n\n            \/*\n             * Scale berdasarkan lebar container\n             *\/\n            const scale =\n                containerWidth \/\n                originalViewport.width;\n\n            const viewport =\n                pdfPage.getViewport({\n                    scale: scale\n                });\n\n            \/*\n             * Support Retina \/ HiDPI\n             *\/\n            const outputScale =\n                window.devicePixelRatio || 1;\n\n            \/*\n             * Ukuran internal canvas\n             * dibuat lebih tajam pada layar Retina\n             *\/\n            canvas.width =\n                Math.floor(\n                    viewport.width *\n                    outputScale\n                );\n\n            canvas.height =\n                Math.floor(\n                    viewport.height *\n                    outputScale\n                );\n\n            \/*\n             * Ukuran visual canvas\n             * selalu mengikuti container\n             *\/\n            canvas.style.width = \"100%\";\n            canvas.style.height = \"auto\";\n\n            \/*\n             * Render halaman pertama\n             *\/\n            await pdfPage.render({\n                canvasContext: ctx,\n                viewport: viewport,\n                transform:\n                    outputScale !== 1\n                        ? [\n                            outputScale,\n                            0,\n                            0,\n                            outputScale,\n                            0,\n                            0\n                        ]\n                        : null\n            }).promise;\n\n        } catch (error) {\n\n            console.error(\n                \"Gagal render cover BITE:\",\n                error\n            );\n\n        } finally {\n\n            rendering = false;\n\n            \/*\n             * Jika ukuran berubah ketika\n             * render sedang berlangsung,\n             * render ulang dengan ukuran terbaru\n             *\/\n            if (renderAgain) {\n\n                renderAgain = false;\n\n                requestAnimationFrame(function () {\n                    renderCover();\n                });\n            }\n        }\n    }\n\n    \/*\n     * Load PDF\n     *\/\n    pdfjsLib.getDocument({\n        url: pdfUrl\n    }).promise\n\n    .then(function (pdf) {\n\n        \/*\n         * HANYA mengambil halaman pertama\n         *\/\n        return pdf.getPage(1);\n\n    })\n\n    .then(function (page) {\n\n        pdfPage = page;\n\n        \/*\n         * Render pertama\n         *\/\n        requestAnimationFrame(function () {\n            renderCover();\n        });\n\n        \/*\n         * Pantau perubahan ukuran container\n         *\/\n        if (\"ResizeObserver\" in window) {\n\n            const resizeObserver =\n                new ResizeObserver(function () {\n\n                    renderCover();\n\n                });\n\n            resizeObserver.observe(wrapper);\n\n        } else {\n\n            \/*\n             * Fallback browser lama\n             *\/\n            window.addEventListener(\n                \"resize\",\n                renderCover\n            );\n        }\n\n    })\n\n    .catch(function (error) {\n\n        console.error(\n            \"PDF BITE gagal dimuat:\",\n            error\n        );\n\n        wrapper.innerHTML =\n            \"<p style='padding:30px;line-height:1.5;'>Cover dokumen tidak dapat ditampilkan.<\/p>\";\n\n    });\n\n});\n<\/script>\n\n<script>\n\/*\n * Blokir klik kanan pada cover BITE\n *\/\ndocument.addEventListener(\n    \"contextmenu\",\n    function (e) {\n\n        if (\n            e.target.id === \"pdf-cover-bite\"\n        ) {\n            e.preventDefault();\n        }\n\n    }\n);\n\n\/*\n * Blokir drag pada canvas\n *\/\ndocument.addEventListener(\n    \"dragstart\",\n    function (e) {\n\n        if (\n            e.target.id === \"pdf-cover-bite\"\n        ) {\n            e.preventDefault();\n        }\n\n    }\n);\n<\/script>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Mathematics Education The curriculum for the Bachelor of Mathematics Education Study Programme is the 2025 curriculum, which was implemented starting in the 2025\/2026 Academic Year based on Rector&#8217;s Decree No. 068.a\/SK\/UPGRIS\/X\/2025. Under this curriculum, the total Semester Credit Units (SKS) required by students is 144 credits. This 144 credits can be completed over eight semesters.More [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-6867","page","type-page","status-publish","hentry"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":7}},"rttpg_featured_image_url":null,"rttpg_author":{"display_name":"admin","author_link":"https:\/\/fpmipati.upgris.ac.id\/index.php\/author\/upttik\/"},"rttpg_comment":0,"rttpg_category":null,"rttpg_excerpt":"Mathematics Education The curriculum for the Bachelor of Mathematics Education Study Programme is the 2025 curriculum, which was implemented starting in the 2025\/2026 Academic Year based on Rector&#8217;s Decree No. 068.a\/SK\/UPGRIS\/X\/2025. Under this curriculum, the total Semester Credit Units (SKS) required by students is 144 credits. This 144 credits can be completed over eight semesters.More&hellip;","_links":{"self":[{"href":"https:\/\/fpmipati.upgris.ac.id\/index.php\/wp-json\/wp\/v2\/pages\/6867","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fpmipati.upgris.ac.id\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/fpmipati.upgris.ac.id\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/fpmipati.upgris.ac.id\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fpmipati.upgris.ac.id\/index.php\/wp-json\/wp\/v2\/comments?post=6867"}],"version-history":[{"count":15,"href":"https:\/\/fpmipati.upgris.ac.id\/index.php\/wp-json\/wp\/v2\/pages\/6867\/revisions"}],"predecessor-version":[{"id":7319,"href":"https:\/\/fpmipati.upgris.ac.id\/index.php\/wp-json\/wp\/v2\/pages\/6867\/revisions\/7319"}],"wp:attachment":[{"href":"https:\/\/fpmipati.upgris.ac.id\/index.php\/wp-json\/wp\/v2\/media?parent=6867"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}