Lewati ke konten utama
Logo
PGSD
Logo PGSD
Universitas Palangka Raya
PROGRAM STUDI PENDIDIKAN GURU SEKOLAH DASAR
WELCOME TO

PROGRAM STUDI PENDIDIKAN GURU SEKOLAH DASAR

Program Studi Pendidikan Guru Sekolah Dasar (PGSD) Universitas Palangka Raya merupakan program akademik yang dirancang untuk menyiapkan calon pendidik profesional pada jenjang sekolah dasar. Program ini menekankan penguasaan kompetensi pedagogik, profesional, sosial, dan kepribadian yang diperlukan dalam melaksanakan pembelajaran yang efektif, inovatif, dan berkarakter. 

berita

Mahasiswa dan Dosen PGSD UPR Laksanakan Kerja Bakti untuk Menjaga Kebersihan Lingkungan Program Studi

Palangka Raya – Mahasiswa dan dosen Program Studi Pendidikan Guru Sekolah Dasar (PGSD), Universitas Palangka Raya (UPR), melaksanakan kegiatan kerja bakti di lingkungan program studi pada Jumat, 30 Oktober 2026.Kegiatan ini merupakan bagian dari kerja bakti bersama yang diselenggarakan oleh Fakultas Keguruan dan Ilmu Pendidikan (FKIP) UPR. Kegiatan tersebut bertujuan menjaga kebersihan, kerapian, dan kenyamanan lingkungan fakultas sekaligus meningkatkan kepedulian serta kebersamaan seluruh sivitas akademika.Di lingkungan PGSD, dosen dan mahasiswa bersama-sama membersihkan area program studi serta merapikan lingkungan kerja. Partisipasi mahasiswa dan dosen dalam kegiatan ini mencerminkan semangat gotong royong dan kepedulian terhadap kebersihan fasilitas bersama.Melalui kegiatan kerja bakti ini, PGSD UPR berupaya menciptakan lingkungan akademik yang bersih, sehat, rapi, dan nyaman. Lingkungan yang terawat diharapkan dapat mendukung kelancaran kegiatan perkuliahan serta aktivitas akademik lainnya.Kegiatan ini juga menjadi momentum untuk mempererat kebersamaan antara dosen dan mahasiswa dalam menjaga lingkungan program studi sebagai tanggung jawab bersama.

Baca Artikel → Diterbitkan: 30 Oct 2026
berita

Dosen PGSD UPR Ikuti Monitoring dan Evaluasi Magang Guru Muda di Yayasan Bina Harati Pama (YBHP)

Palangka Raya – Jane Arantika, M.Pd., salah satu dosen Program Studi Pendidikan Guru Sekolah Dasar (PGSD), Universitas Palangka Raya (UPR), turut berpartisipasi dalam kegiatan Monitoring dan Evaluasi (Monev) Magang Guru Muda hasil kerja sama dengan Yayasan Bina Harati Pama (YBHP).Kegiatan monitoring dan evaluasi dilaksanakan di Kabupaten Kapuas dan Kabupaten Barito Utara. Kegiatan ini merupakan bagian dari upaya pemantauan pelaksanaan program Magang Guru Muda yang melibatkan kerja sama antara UPR dan YBHP.Melalui kegiatan Monev, pelaksanaan program magang dapat ditinjau secara langsung untuk memperoleh gambaran mengenai perkembangan kegiatan, pengalaman peserta, serta pelaksanaan tugas di lokasi penempatan. Kegiatan ini juga menjadi bagian dari evaluasi terhadap pelaksanaan kerja sama dalam mendukung pengembangan kompetensi calon pendidik.Partisipasi Jane Arantika, M.Pd., sebagai dosen PGSD UPR menunjukkan keterlibatan dosen dalam mendukung pelaksanaan program kerja sama dan penguatan pengalaman profesional calon guru. Kegiatan ini diharapkan dapat memberikan kontribusi terhadap peningkatan kualitas pendidikan serta pengembangan kompetensi guru muda di Kalimantan Tengah.

Baca Artikel → Diterbitkan: 30 Oct 2026
berita

PGSD UPR Kembali Terapkan Perkuliahan Tatap Muka Mulai 2 November 2026

Palangka Raya – Program Studi Pendidikan Guru Sekolah Dasar (PGSD), Universitas Palangka Raya (UPR), kembali melaksanakan perkuliahan secara tatap muka mulai Senin, 2 November 2026. Kebijakan ini mengikuti Pengumuman Rektor Universitas Palangka Raya Nomor 8330/UN24/DT/2026 tentang Pemberlakuan Kembali Perkuliahan Secara Tatap Muka di Lingkungan Universitas Palangka Raya.Pemberlakuan kembali perkuliahan tatap muka dilakukan seiring membaiknya kondisi kebakaran hutan dan lahan (karhutla) di Kota Palangka Raya dan sekitarnya. Turunnya hujan dalam beberapa hari terakhir turut diikuti penurunan intensitas kabut asap serta perbaikan kualitas udara dan jarak pandang.Melalui kebijakan tersebut, kegiatan perkuliahan di lingkungan PGSD UPR kembali dilaksanakan secara luring sesuai jadwal dan durasi perkuliahan yang berlaku. Dosen dan mahasiswa diharapkan mempersiapkan diri untuk mengikuti kegiatan pembelajaran secara langsung di kelas.Rektor UPR juga menetapkan bahwa kegiatan perkuliahan daring yang telah dilaksanakan pada 31 Agustus hingga 1 November 2026 tetap dinyatakan sah. Kegiatan tersebut diperhitungkan sebagai pemenuhan jumlah pertemuan dan beban belajar mahasiswa pada Semester Ganjil Tahun Akademik 2026/2027, termasuk pelaksanaan Ujian Tengah Semester (UTS) secara daring.Dengan berlakunya kembali perkuliahan tatap muka, sivitas akademika PGSD UPR diharapkan dapat melaksanakan kegiatan akademik secara optimal, tertib, dan sesuai ketentuan yang berlaku. Mahasiswa dan dosen diimbau untuk memperhatikan jadwal perkuliahan masing-masing serta mengikuti kegiatan pembelajaran mulai 2 November 2026.Pengumuman ini menjadi acuan bagi pelaksanaan kegiatan akademik di lingkungan PGSD UPR dalam mendukung kelancaran proses pembelajaran Semester Ganjil Tahun Akademik 2026/2027.

Baca Artikel → Diterbitkan: 29 Oct 2026
berita

PGSD FKIP UPR Ucapkan Selamat atas Pelantikan Prof. Bhayu Rhama sebagai Rektor Periode 2026–2030

Palangka Raya — Keluarga besar Program Studi Pendidikan Guru Sekolah Dasar (PGSD), Fakultas Keguruan dan Ilmu Pendidikan (FKIP), Universitas Palangka Raya, mengucapkan selamat dan sukses kepada Prof. Bhayu Rhama, S.T., M.B.A., Ph.D. atas pelantikan sebagai Rektor Universitas Palangka Raya periode 2026–2030.Pelantikan ini menjadi momentum penting untuk melanjutkan pengembangan Universitas Palangka Raya sebagai institusi pendidikan tinggi yang unggul, inovatif, dan berdaya saing.Keluarga besar PGSD FKIP UPR berharap kepemimpinan beliau dapat membawa semangat baru dalam memperkuat kualitas pendidikan, penelitian, dan pengabdian kepada masyarakat. Semoga beliau senantiasa diberikan kebijaksanaan, kesehatan, dan kelancaran dalam menjalankan amanah demi kemajuan Universitas Palangka Raya.

Baca Artikel → Diterbitkan: 29 Oct 2026
berita

PGSD FKIP UPR Sampaikan Apresiasi atas Dedikasi Prof. Dr. Ir. Salampak sebagai Rektor Periode 2022–2026

Palangka Raya — Keluarga besar Program Studi Pendidikan Guru Sekolah Dasar (PGSD), Fakultas Keguruan dan Ilmu Pendidikan (FKIP), Universitas Palangka Raya, menyampaikan terima kasih dan penghargaan setinggi-tingginya kepada Prof. Dr. Ir. Salampak, M.S., IPU., ASEAN Eng. atas dedikasi dan pengabdian beliau selama menjabat sebagai Rektor Universitas Palangka Raya periode 2022–2026.Kepemimpinan dan kontribusi yang telah diberikan menjadi bagian penting dalam perjalanan Universitas Palangka Raya. Berbagai upaya untuk mendukung pengembangan institusi dan peningkatan kualitas pendidikan diharapkan dapat terus memberikan manfaat bagi seluruh sivitas akademika.Keluarga besar PGSD FKIP UPR mengapresiasi segala dedikasi dan kerja keras yang telah dicurahkan. Semoga pengabdian yang telah diberikan menjadi warisan berharga bagi kemajuan Universitas Palangka Raya di masa mendatang.

Baca Artikel → Diterbitkan: 29 Oct 2026
PRODI • PGSD

Mengapa Memilih Kami

PROGRAM STUDI PENDIDIKAN GURU SEKOLAH DASAR

Program Studi Pendidikan Guru Sekolah Dasar (PGSD) Universitas Palangka Raya merupakan program akademik yang dirancang untuk menyiapkan calon pendidik profesional pada jenjang sekolah dasar. Program ini menekankan penguasaan kompetensi pedagogik, profesional, sosial, dan kepribadian yang diperlukan dalam melaksanakan pembelajaran yang efektif, inovatif, dan berkarakter. 

pgsd.upr.ac.id ↗
pgsd@fkip.upr.ac.id
082221391681
 Jl. Yos Sudarso, Palangka, Kec. Jekan Raya, Kota Palangka Raya, Kalimantan Tengah 74874 
PROGRAM STUDI PENDIDIKAN GURU SEKOLAH DASAR
Logo
B
Akreditasi
BAN-PT

Mitra Strategis & Kerjasama

Bersinergi bersama institusi, kementerian, dan industri terkemuka.

18 Mitra Terhubung

Upcoming Events

Agenda Kampus
01 JUL

Isi Kuisioner

⏱ 11:47 - 11:47 WIB • 📍 Kampus UPR
Isi Kuisioner
02 JUL

Isi KRS

⏱ 00:00 - 23:59 WIB • 📍 Kampus UPR
Isi KRS
02 JUL

Regitrasi MBKM

⏱ 00:00 - 23:59 WIB • 📍 Kampus UPR
Regitrasi MBKM

Layanan & Pengumuman TIK

Panduan Chatbot UPA TIK
TIK

Panduan Chatbot UPA TIK

   Halo Civitas Akademika Universitas Palangka Raya!Untuk mempercepat layanan informasi teknis terkait Email Institusi, WiFi (Eduroam), SIAKAD, dan Laboratorium, kini telah hadir layanan Chatbot WhatsApp yang aktif 24 jam.🚀 Akses Layanan Chatbot: 👉 https://wa.me/6283165334564📋 Isi Survei Kepuasan: Mohon bantu kami meningkatkan kualitas layanan dengan mengisi survei singkat berikut: 👉 https://bit.ly/Survei-ChatbotTerima kasih atas kerja samanya.#TIKUPR #TeknologiInformasi #DigitalCampus #ChatbotWhatsApp #LayananMahasiswa #universitaspalangkaraya 

Apr 25 • 1 min read Detail →
Pusat Informasi & Layanan

TIK Helpdesk Center

Apabila pengguna mengalami kendala atau permasalahan sistem, laporan dapat disampaikan melalui link tik.upr.ac.id/helpdesk agar dapat ditindaklanjuti dan terdokumentasi dengan baik. Setiap laporan yang masuk akan diproses oleh tim teknis sesuai dengan jenis dan tingkat prioritas permasalahan.

Visit Us

 Jl. Yos Sudarso, Palangka, Kec. Jekan Raya, Kota Palangka Raya, Kalimantan Tengah 74874 

Pusat Bantuan

Hubungi kami melalui kanal berikut.

Helpdesk TIKKirim tiket permohonan WhatsApp ResmiChat langsung layanan
c + c).join(''); const num = parseInt(clean, 16); return { r: (num >> 16) & 255, g: (num >> 8) & 255, b: num & 255 }; }, rgbToHex(r, g, b) { const clamp = v => Math.max(0, Math.min(255, Math.round(v))); return '#' + [clamp(r), clamp(g), clamp(b)].map(x => x.toString(16).padStart(2, '0')).join(''); }, rgbToHsl(r, g, b) { r /= 255; g /= 255; b /= 255; const max = Math.max(r, g, b), min = Math.min(r, g, b); let h = 0, s = 0, l = (max + min) / 2; if (max !== min) { const d = max - min; s = l > 0.5 ? d / (2 - max - min) : d / (max + min); switch (max) { case r: h = ((g - b) / d + (g < b ? 6 : 0)); break; case g: h = ((b - r) / d + 2); break; case b: h = ((r - g) / d + 4); break; } h *= 60; } return { h: Math.round(h), s: Math.round(s * 100), l: Math.round(l * 100) }; }, hslToHex(h, s, l) { h = ((h % 360) + 360) % 360; s /= 100; l /= 100; const k = n => (n + h / 30) % 12; const a = s * Math.min(l, 1 - l); const f = n => l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1))); return this.rgbToHex(Math.round(f(0) * 255), Math.round(f(8) * 255), Math.round(f(4) * 255)); }, init() { this.darkMode = document.documentElement.classList.contains('dark'); window.addEventListener('dark-mode-toggled', (e) => { if (e.detail && typeof e.detail.darkMode !== 'undefined') { this.darkMode = e.detail.darkMode; } }); const userCustomized = localStorage.getItem('theme_user_customized') === 'true'; const savedOrgCode = localStorage.getItem('theme_org_code'); if (userCustomized && savedOrgCode === this.orgCode) { const savedWheel = localStorage.getItem('theme_color_wheel_palette'); if (savedWheel) { try { const parsed = JSON.parse(savedWheel); if (parsed.primaryHex && /^#[0-9A-Fa-f]{3,8}$/.test(parsed.primaryHex)) this.primaryHex = parsed.primaryHex; if (parsed.secondaryHex && /^#[0-9A-Fa-f]{3,8}$/.test(parsed.secondaryHex)) this.secondaryHex = parsed.secondaryHex; if (parsed.harmonyType) this.harmonyType = parsed.harmonyType; if (parsed.secondaryMode) this.secondaryMode = parsed.secondaryMode; if (parsed.currentTheme) this.currentTheme = parsed.currentTheme; } catch (e) {} } else if (localStorage.getItem('customAccentColor')) { this.primaryHex = localStorage.getItem('customAccentColor'); this.currentTheme = localStorage.getItem('currentTheme') || 'theme-custom'; } } else { this.primaryHex = this.defaultColor; this.harmonyType = 'complementary'; this.secondaryMode = 'harmony'; this.currentTheme = 'theme-custom'; } const rgb = this.hexToRgb(this.primaryHex); const hsl = this.rgbToHsl(rgb.r, rgb.g, rgb.b); this.primaryHue = hsl.h; this.primarySat = hsl.s; this.primaryLit = hsl.l; this.applyAll(userCustomized && savedOrgCode === this.orgCode); window.addEventListener('open-theme-customizer', () => { this.open = true; this.$nextTick(() => this.drawWheel()); }); this.$watch('open', value => { if (value) { this.$nextTick(() => this.drawWheel()); } }); }, toggleDarkMode() { this.darkMode = !this.darkMode; if (this.darkMode) { document.documentElement.classList.add('dark'); localStorage.setItem('darkMode', 'true'); } else { document.documentElement.classList.remove('dark'); localStorage.setItem('darkMode', 'false'); } localStorage.setItem('theme_user_customized', 'true'); localStorage.setItem('theme_org_code', this.orgCode); window.dispatchEvent(new CustomEvent('dark-mode-toggled', { detail: { darkMode: this.darkMode } })); }, // Canva Color Wheel Canvas Drawing drawWheel() { const canvas = document.getElementById('canvaColorWheel'); if (!canvas) return; const ctx = canvas.getContext('2d'); const cx = canvas.width / 2; const cy = canvas.height / 2; const radius = canvas.width / 2 - 10; ctx.clearRect(0, 0, canvas.width, canvas.height); // 1. Draw Hue Spectrum (Conic Gradient) for (let angle = 0; angle < 360; angle += 1) { const startAngle = (angle - 1.5) * Math.PI / 180; const endAngle = (angle + 1.5) * Math.PI / 180; ctx.beginPath(); ctx.moveTo(cx, cy); ctx.arc(cx, cy, radius, startAngle, endAngle); ctx.closePath(); ctx.fillStyle = `hsl(${angle}, 100%, 50%)`; ctx.fill(); } // 2. Center Radial Gradient (White in center to full saturation on edge) const radGrad = ctx.createRadialGradient(cx, cy, 0, cx, cy, radius); radGrad.addColorStop(0, 'rgba(255, 255, 255, 0.85)'); radGrad.addColorStop(0.65, 'rgba(255, 255, 255, 0.15)'); radGrad.addColorStop(1, 'rgba(255, 255, 255, 0)'); ctx.fillStyle = radGrad; ctx.beginPath(); ctx.arc(cx, cy, radius, 0, Math.PI * 2); ctx.fill(); // 3. Wheel Outline Border ctx.strokeStyle = 'rgba(255, 255, 255, 0.5)'; ctx.lineWidth = 3; ctx.beginPath(); ctx.arc(cx, cy, radius, 0, Math.PI * 2); ctx.stroke(); const dist = radius * 0.76; // 4. Draw Harmony Points (Circles on wheel) const harmonyHues = this.getHarmonyHues(); harmonyHues.forEach(h => { const hRad = h * Math.PI / 180; const hx = cx + dist * Math.cos(hRad); const hy = cy + dist * Math.sin(hRad); ctx.beginPath(); ctx.arc(hx, hy, 8, 0, Math.PI * 2); ctx.fillStyle = this.hslToHex(h, 90, 50); ctx.fill(); ctx.strokeStyle = '#FFFFFF'; ctx.lineWidth = 3; ctx.stroke(); }); // 5. Draw Primary Pointer Marker (Large ring with white stroke, like Canva) const primaryRad = this.primaryHue * Math.PI / 180; const px = cx + dist * Math.cos(primaryRad); const py = cy + dist * Math.sin(primaryRad); ctx.beginPath(); ctx.arc(px, py, 11, 0, Math.PI * 2); ctx.fillStyle = this.primaryHex; ctx.fill(); ctx.strokeStyle = '#FFFFFF'; ctx.lineWidth = 4; ctx.stroke(); // Shadow for primary marker ctx.beginPath(); ctx.arc(px, py, 13, 0, Math.PI * 2); ctx.strokeStyle = 'rgba(0, 0, 0, 0.25)'; ctx.lineWidth = 1.5; ctx.stroke(); }, getHarmonyHues() { const h = this.primaryHue; switch (this.harmonyType) { case 'complementary': return [(h + 180) % 360]; case 'analogous': return [(h - 35 + 360) % 360, (h + 35) % 360]; case 'triadic': return [(h + 120) % 360, (h + 240) % 360]; case 'tetradic': return [(h + 60) % 360, (h + 180) % 360, (h + 240) % 360]; case 'monochromatic': return [h]; default: return []; } }, handleWheelEvent(e) { const canvas = document.getElementById('canvaColorWheel'); if (!canvas) return; const rect = canvas.getBoundingClientRect(); const clientX = e.touches ? e.touches[0].clientX : e.clientX; const clientY = e.touches ? e.touches[0].clientY : e.clientY; const x = clientX - rect.left - canvas.width / 2; const y = clientY - rect.top - canvas.height / 2; let angle = Math.atan2(y, x) * (180 / Math.PI); if (angle < 0) angle += 360; this.primaryHue = Math.round(angle); this.primaryHex = this.hslToHex(this.primaryHue, 88, 48); this.currentTheme = 'theme-custom'; this.applyAll(true); this.drawWheel(); }, onWheelMouseDown(e) { this.isDraggingWheel = true; this.handleWheelEvent(e); }, onWheelMouseMove(e) { if (!this.isDraggingWheel) return; this.handleWheelEvent(e); }, onWheelMouseUp() { this.isDraggingWheel = false; }, setPrimaryFromHex(hex) { if (!/^#[0-9A-Fa-f]{6}$/.test(hex)) return; this.primaryHex = hex; const rgb = this.hexToRgb(hex); const hsl = this.rgbToHsl(rgb.r, rgb.g, rgb.b); this.primaryHue = hsl.h; this.primarySat = hsl.s; this.primaryLit = hsl.l; this.currentTheme = 'theme-custom'; this.applyAll(true); this.drawWheel(); }, setHarmony(type) { this.harmonyType = type; this.applyAll(true); this.drawWheel(); }, setSecondaryMode(mode) { this.secondaryMode = mode; this.applyAll(true); this.drawWheel(); }, selectPreset(p) { this.primaryHex = p.hex; this.currentTheme = p.theme; const rgb = this.hexToRgb(p.hex); const hsl = this.rgbToHsl(rgb.r, rgb.g, rgb.b); this.primaryHue = hsl.h; this.primarySat = hsl.s; this.primaryLit = hsl.l; const isDefaultPreset = (p.hex.toLowerCase() === this.defaultColor.toLowerCase()); this.applyAll(!isDefaultPreset); if (isDefaultPreset) { localStorage.removeItem('theme_user_customized'); localStorage.removeItem('theme_color_wheel_palette'); localStorage.removeItem('customAccentColor'); localStorage.setItem('theme_org_code', this.orgCode); } this.drawWheel(); }, applyAll(isUserAction = true) { const pRgb = this.hexToRgb(this.primaryHex); const pHsl = this.rgbToHsl(pRgb.r, pRgb.g, pRgb.b); // Hitung warna sekunder if (this.secondaryMode === 'harmony') { if (this.harmonyType === 'complementary') { this.secondaryHex = this.hslToHex((pHsl.h + 180) % 360, Math.min(Math.max(pHsl.s, 65), 90), Math.min(Math.max(pHsl.l, 46), 54)); } else if (this.harmonyType === 'analogous') { this.secondaryHex = this.hslToHex((pHsl.h + 35) % 360, pHsl.s, pHsl.l); } else if (this.harmonyType === 'triadic') { this.secondaryHex = this.hslToHex((pHsl.h + 120) % 360, Math.min(Math.max(pHsl.s, 60), 90), Math.min(Math.max(pHsl.l, 46), 54)); } else if (this.harmonyType === 'tetradic') { this.secondaryHex = this.hslToHex((pHsl.h + 180) % 360, Math.min(Math.max(pHsl.s, 60), 90), Math.min(Math.max(pHsl.l, 46), 54)); } else if (this.harmonyType === 'monochromatic') { this.secondaryHex = this.hslToHex(pHsl.h, Math.max(30, pHsl.s - 15), pHsl.l > 50 ? Math.max(25, pHsl.l - 25) : Math.min(75, pHsl.l + 25)); } else { this.secondaryHex = this.hslToHex((pHsl.h + 180) % 360, 85, 50); } } else { this.secondaryHex = '#EA580C'; // Fixed pekat orange } const sRgb = this.hexToRgb(this.secondaryHex); const pHoverHex = this.rgbToHex(pRgb.r * 0.85, pRgb.g * 0.85, pRgb.b * 0.85); const sHoverHex = this.rgbToHex(sRgb.r * 0.85, sRgb.g * 0.85, sRgb.b * 0.85); const sDarkHex = this.rgbToHex(sRgb.r * 0.65, sRgb.g * 0.65, sRgb.b * 0.65); // Dynamic Themed Topbar & Footer Tokens const isGrayScale = pHsl.s < 20; let surfaceDark, cardDark, cardAltDark, borderDark; let topbarBg, footerBg, footerCard, footerCardAlt, footerBorder, footerInput; if (isGrayScale) { surfaceDark = '#0B0F17'; cardDark = '#111827'; cardAltDark = '#1E293B'; borderDark = '#1E293B'; topbarBg = '#1E293B'; footerBg = '#0F172A'; footerCard = '#1E293B'; footerCardAlt = '#334155'; footerBorder = 'rgba(255, 255, 255, 0.12)'; footerInput = '#1E293B'; } else { surfaceDark = this.hslToHex(pHsl.h, Math.min(25, Math.round(pHsl.s * 0.25)), 6); cardDark = this.hslToHex(pHsl.h, Math.min(22, Math.round(pHsl.s * 0.2)), 10); cardAltDark = this.hslToHex(pHsl.h, Math.min(22, Math.round(pHsl.s * 0.2)), 15); borderDark = this.hslToHex(pHsl.h, Math.min(22, Math.round(pHsl.s * 0.2)), 20); // Dynamic rich tones for topbar and footer reflecting theme topbarBg = this.hslToHex(pHsl.h, Math.min(Math.max(pHsl.s, 45), 75), 18); footerBg = this.hslToHex(pHsl.h, Math.min(Math.max(pHsl.s * 0.5, 30), 55), 10); footerCard = this.hslToHex(pHsl.h, Math.min(Math.max(pHsl.s * 0.45, 25), 45), 15); footerCardAlt = this.hslToHex(pHsl.h, Math.min(Math.max(pHsl.s * 0.4, 25), 45), 20); footerBorder = this.hslToHex(pHsl.h, Math.min(Math.max(pHsl.s * 0.5, 35), 60), 26); footerInput = this.hslToHex(pHsl.h, Math.min(Math.max(pHsl.s * 0.45, 25), 45), 13); } const topbarRgb = this.hexToRgb(topbarBg); const footerRgb = this.hexToRgb(footerBg); const footerCardRgb = this.hexToRgb(footerCard); const footerCardAltRgb = this.hexToRgb(footerCardAlt); const footerBorderRgb = this.hexToRgb(footerBorder.startsWith('#') ? footerBorder : '#1E293B'); const footerInputRgb = this.hexToRgb(footerInput); const surfaceDarkRgb = this.hexToRgb(surfaceDark); const cardDarkRgb = this.hexToRgb(cardDark); const cardAltDarkRgb = this.hexToRgb(cardAltDark); const borderDarkRgb = this.hexToRgb(borderDark); // Terapkan ke DOM (:root dan document.body) const targets = [document.documentElement, document.body].filter(Boolean); targets.forEach(target => { target.style.setProperty('--color-primary', this.primaryHex); target.style.setProperty('--color-primary-rgb', `${pRgb.r} ${pRgb.g} ${pRgb.b}`); target.style.setProperty('--color-primary-hover', pHoverHex); target.style.setProperty('--color-primary-hover-rgb', `${Math.round(pRgb.r * 0.85)} ${Math.round(pRgb.g * 0.85)} ${Math.round(pRgb.b * 0.85)}`); target.style.setProperty('--color-primary-glow', `rgba(${pRgb.r}, ${pRgb.g}, ${pRgb.b}, 0.38)`); target.style.setProperty('--color-primary-subtle', `rgba(${pRgb.r}, ${pRgb.g}, ${pRgb.b}, 0.12)`); target.style.setProperty('--color-secondary', this.secondaryHex); target.style.setProperty('--color-secondary-rgb', `${sRgb.r} ${sRgb.g} ${sRgb.b}`); target.style.setProperty('--color-secondary-hover', sHoverHex); target.style.setProperty('--color-secondary-hover-rgb', `${Math.round(sRgb.r * 0.85)} ${Math.round(sRgb.g * 0.85)} ${Math.round(sRgb.b * 0.85)}`); target.style.setProperty('--color-secondary-dark', sDarkHex); target.style.setProperty('--color-secondary-dark-rgb', `${Math.round(sRgb.r * 0.65)} ${Math.round(sRgb.g * 0.65)} ${Math.round(sRgb.b * 0.65)}`); target.style.setProperty('--color-secondary-glow', `rgba(${sRgb.r}, ${sRgb.g}, ${sRgb.b}, 0.35)`); target.style.setProperty('--color-secondary-subtle', `rgba(${sRgb.r}, ${sRgb.g}, ${sRgb.b}, 0.12)`); target.style.setProperty('--color-accent', this.primaryHex); target.style.setProperty('--color-accent-rgb', `${pRgb.r} ${pRgb.g} ${pRgb.b}`); target.style.setProperty('--color-accent-hover', pHoverHex); target.style.setProperty('--color-accent-hover-rgb', `${Math.round(pRgb.r * 0.85)} ${Math.round(pRgb.g * 0.85)} ${Math.round(pRgb.b * 0.85)}`); target.style.setProperty('--color-accent-glow', `rgba(${pRgb.r}, ${pRgb.g}, ${pRgb.b}, 0.38)`); target.style.setProperty('--color-accent-subtle', `rgba(${pRgb.r}, ${pRgb.g}, ${pRgb.b}, 0.12)`); target.style.setProperty('--color-surface-dark', surfaceDark); target.style.setProperty('--color-surface-dark-rgb', `${surfaceDarkRgb.r} ${surfaceDarkRgb.g} ${surfaceDarkRgb.b}`); target.style.setProperty('--color-card-dark', cardDark); target.style.setProperty('--color-card-dark-rgb', `${cardDarkRgb.r} ${cardDarkRgb.g} ${cardDarkRgb.b}`); target.style.setProperty('--color-card-alt-dark', cardAltDark); target.style.setProperty('--color-card-alt-dark-rgb', `${cardAltDarkRgb.r} ${cardAltDarkRgb.g} ${cardAltDarkRgb.b}`); target.style.setProperty('--color-border-dark', borderDark); target.style.setProperty('--color-border-dark-rgb', `${borderDarkRgb.r} ${borderDarkRgb.g} ${borderDarkRgb.b}`); target.style.setProperty('--color-topbar-bg', topbarBg); target.style.setProperty('--color-topbar-bg-rgb', `${topbarRgb.r} ${topbarRgb.g} ${topbarRgb.b}`); target.style.setProperty('--color-footer-bg', footerBg); target.style.setProperty('--color-footer-bg-rgb', `${footerRgb.r} ${footerRgb.g} ${footerRgb.b}`); target.style.setProperty('--color-footer-card', footerCard); target.style.setProperty('--color-footer-card-rgb', `${footerCardRgb.r} ${footerCardRgb.g} ${footerCardRgb.b}`); target.style.setProperty('--color-footer-card-alt', footerCardAlt); target.style.setProperty('--color-footer-card-alt-rgb', `${footerCardAltRgb.r} ${footerCardAltRgb.g} ${footerCardAltRgb.b}`); target.style.setProperty('--color-footer-border', footerBorder); target.style.setProperty('--color-footer-border-rgb', `${footerBorderRgb.r} ${footerBorderRgb.g} ${footerBorderRgb.b}`); target.style.setProperty('--color-footer-input', footerInput); target.style.setProperty('--color-footer-input-rgb', `${footerInputRgb.r} ${footerInputRgb.g} ${footerInputRgb.b}`); }); // Update tema class pada document.documentElement dan body const themeClassList = ['theme-eduma', 'theme-emerald', 'theme-neon', 'theme-blue', 'theme-sapphire', 'theme-purple', 'theme-orange', 'theme-crimson', 'theme-rose', 'theme-gold', 'theme-teal', 'theme-gray', 'theme-dark', 'theme-custom']; themeClassList.forEach(cls => { document.documentElement.classList.remove(cls); if (document.body) document.body.classList.remove(cls); }); if (this.currentTheme) { document.documentElement.classList.add(this.currentTheme); if (document.body) document.body.classList.add(this.currentTheme); } // Simpan ke localStorage jika user mengubah tema secara manual if (isUserAction) { localStorage.setItem('theme_user_customized', 'true'); localStorage.setItem('theme_org_code', this.orgCode); localStorage.setItem('theme_color_wheel_palette', JSON.stringify({ primaryHex: this.primaryHex, secondaryHex: this.secondaryHex, harmonyType: this.harmonyType, secondaryMode: this.secondaryMode, currentTheme: this.currentTheme })); localStorage.setItem('customAccentColor', this.primaryHex); localStorage.setItem('currentTheme', this.currentTheme); } // Event global window.dispatchEvent(new CustomEvent('theme-changed', { detail: { primaryHex: this.primaryHex, secondaryHex: this.secondaryHex, harmonyType: this.harmonyType, themeName: this.currentTheme } })); }, resetToDefault() { this.primaryHex = this.defaultColor; this.secondaryHex = '#EA580C'; this.harmonyType = 'complementary'; this.secondaryMode = 'harmony'; this.currentTheme = 'theme-custom'; const rgb = this.hexToRgb(this.primaryHex); const hsl = this.rgbToHsl(rgb.r, rgb.g, rgb.b); this.primaryHue = hsl.h; this.primarySat = hsl.s; this.primaryLit = hsl.l; const targetDark = (this.defaultMode === 'dark'); this.darkMode = targetDark; if (targetDark) { document.documentElement.classList.add('dark'); localStorage.setItem('darkMode', 'true'); } else { document.documentElement.classList.remove('dark'); localStorage.setItem('darkMode', 'false'); } window.dispatchEvent(new CustomEvent('dark-mode-toggled', { detail: { darkMode: targetDark } })); localStorage.removeItem('theme_user_customized'); localStorage.removeItem('theme_color_wheel_palette'); localStorage.removeItem('customAccentColor'); localStorage.setItem('theme_org_code', this.orgCode); this.applyAll(false); this.drawWheel(); }, copyHex(hex) { navigator.clipboard.writeText(hex).then(() => { this.copied = true; this.copiedText = hex; setTimeout(() => { this.copied = false; }, 2000); }); } }" @keydown.escape.window="open = false" @keydown.alt.t.window.prevent="open = !open">

Canva Color Wheel Theory

Kombinasi harmoni warna website otomatis

Roda Warna Interaktif

Klik atau geser di roda warna untuk memilih warna utama secara presisi

#

Orange Pekat: Mempertahankan aksen tombol & badge sekunder tetap warna orange hangat.
Harmoni Canva: Menghitung warna sekunder secara matematis dari roda warna Canva (Complementary / Triadic).

Primary
Secondary
Live Preview Komponen
Badge
Mode Tampilan
Pilih tema terang atau gelap