Info Terkini

Reputasi dan Rekognisi UHO

Selamat Datang di Universitas Halu Oleo

Saat ini Universitas Haluoleo telah memiliki 17 Fakultas, Program Pendidikan Vokasi dan Program Pascasarjana. Universitas Haluoleo sejak tahun 2007 telah menjadi Universitas yang maju dan modern, setelah adanya persetujuan Bantuan Soft-Loan Pemerintah Indonesia

Sertifikat Akreditasi "Unggul" Universitas Halu Oleo

Universitas Halu Oleo Raih Akreditasi Unggul, Tegaskan Posisi di Tingkat Nasional tertuang dalam Surat Keputusan BAN-PT Nomor: 146/SK/BAN-PT/Ak/PT/V/2026 yang disahkan pada tanggal 5 Mei 2026.

Kepala Badan Riset dan Inovasi Daerah (BRIDA) Provinsi Sulawesi Tenggara

Partisipasi aktif dan antusiasmenya Kepala Badan Riset dan Inovasi Daerah (BRIDA) Provinsi Sulawesi Tenggara dalam sesi diskusi pada kegiatan Pusat Kolaborasi Riset yang diselenggarakan di Universitas Halu Oleo (UHO).

Selamat Datang di Universitas Halu Oleo

Peringkat Universitas Halu Oleo

Selamat Datang di Universitas Halu Oleo

Memiliki Tujuh Program Studi Terakreditasi Internasional

Pusat Kolaborasi Riset

Bupati Wakatobi, H. Haliana, S.E. menunjukkan partisipasi aktif dan antusiasmenya dalam sesi diskusi pada kegiatan Pusat Kolaborasi Riset yang diselenggarakan di Universitas Halu Oleo (UHO). Keterlibatan langsung ini menegaskan komitmen kuat pemerintah daerah untuk terus bersinergi dengan lembaga akademis guna mendorong inovasi dan pembangunan daerah berbasis riset.

Peta Jalan (Roadmap) Milestone Universitas Halu Oleo (UHO)

Peta jalan ini mengilustrasikan langkah bertahap UHO dalam membangun fondasi kelembagaan lokal dan nasional menuju perguruan tinggi berdaya saing global pada tahun 2045.

TENTANG HALU OLEO

UHO Bisa Jagad Kita

Universitas Halu Oleo berupaya menjadi perguruan tinggi unggul di Indonesia, bermartabat, berbudaya akademik, untuk menghasilkan SDM cerdas komprehensif dalam pengembangan pesisir, kelautan, dan pedesaan

Informasi

  • 08 July 2026

Siaran Pers Hasil Ujian Seleksi Mandiri Masuk (SMM) Universitas Halu Oleo (UHO)

READ MORE
  • 02 July 2026

Pelaksanaan Wisuda Universitas Halu Oleo Semester Genap Periode 5 Tahun Akademik 2025/2026

READ MORE
  • 29 May 2026

Perpanjangan Pendaftaran Seleksi Mandiri Masuk Universitas Halu Oleo (SMM UHO) Tahun 2026 Sampai dengan tanggal 5 Juni 2026melalui laman https//utbk.smm.uho.ac.id

READ MORE
  • 22 May 2026

PENGUMUMAN PEMBAYARAN UANG KULIAH TUNGGAL (UKT) DAN BIAYA PEMERIKSAAN KESEHATAN (PEMKES) CALON MAHASISWA BARU JALUR SELEKSI NASIONAL BERDASARKAN PRESTASI (SNBP) TAHUN 2026

READ MORE
  • 20 April 2026

SURAT EDARAN PELAKSANAAN AKADEMIK SELAMA UTBK 2026

READ MORE

Event

  • 06 July 2024

Dosen UHO Latih Timnas Takraw, Sukses Raih Emas

READ MORE
  • 19 February 2024

Wakil Rektor I: Kedepankan Penilaian Sikap, Keterampilan, dan Pengetahuan

READ MORE
  • 12 February 2024

UHO di Posisi Puncak Pemeringkatan Webometrics Perguruan Tinggi Se-Sulawesi Tenggara

READ MORE
  • 07 February 2024

UHO Mengukuhkan 2.403 orang Wisudawan Periode Oktober 2023 – Januari 2024

READ MORE
  • 09 November 2023

UHO Mengukuhkan 3.347 Wisudawan Periode Juli – Oktober 2023

READ MORE

Pengumuman

  • 02 October 2026

PEMBAGIAN BUKU TABUNGAN BAGI MAHASISWA PENERIMA KIP KULIAH JALUR SNBP DAN SNBT TAHUN 2026 UNIVERSITAS HALU OLEO

READ MORE
  • 20 September 2026

STATUS PENURUNAN DESIL BAGI MAHASISWA PELAMAR KIP KULIAH JALUR SNBP DAN SNBT TAHUN 2026 UNIVERSITAS HALU OLEO

READ MORE
  • 09 August 2026

Penyambutan dan Pengenalan Kehidupan Kampus Mahasiswa Baru Universitas Halu Oleo Tahun 2026

READ MORE
  • 30 July 2026

Jadwal Pemerikasaan Kesehatan (PEMKES) Calon Mahasiswa Baru Universitas Halu Oleo Jalur Seleksi Mandiri Masuk Universitas Halu Oleo (SMMUHO) Gelombang 2 Tahun 2026

READ MORE
  • 24 July 2026

Registrasi Pembayaran Uang Kuliah Tunggal (UKT), Pembayaran Iuran Pengembangan Institusi (IPI) dan Biaya Pemeriksaan Kesehatan (PEMKES) Calon Mahasiswa Baru Jalur Seleksi Mandiri Masuk Universitas Halu Oleo (SMMUHO) Gelombang 2 Tahun 2026

READ MORE

AKADEMIK

Wujudkan Prestasimu di Universitas Halu Oleo

Universitas Halu Oleo Memiliki 17 Fakultas yang didalamnya termasuk program pendidikan Vokasi dan Pasca Sarjana

Daftar sekarang
Universitas Halu Oleo

Layanan & Informasi Publik

Temukan layanan dan informasi yang Anda butuhkan sesuai peran Anda. Klik kategori untuk membuka atau menutup.

Universitas Halu Oleo

Berita Terbaru

Kabar terkini dari fakultas dan program studi di lingkungan UHO.

Translate »
array(), 'kanan' => array(), 'tengah' => array() ); foreach ( array( 'kiri', 'kanan', 'tengah' ) as $side ) { $rows = ( isset( $in[ $side ] ) && is_array( $in[ $side ] ) ) ? array_values( $in[ $side ] ) : array(); foreach ( array_slice( $rows, 0, HSM_MAX ) as $r ) { if ( ! is_array( $r ) ) { continue; } $foto = isset( $r['foto'] ) ? esc_url_raw( $r['foto'] ) : ''; if ( '' === $foto ) { continue; } $tg = ( isset( $r['target'] ) && is_string( $r['target'] ) ) ? $r['target'] : ''; $out[ $side ][] = array( 'id' => isset( $r['id'] ) ? absint( $r['id'] ) : 0, 'foto' => $foto, 'id_hp' => ( 'tengah' === $side && isset( $r['id_hp'] ) ) ? absint( $r['id_hp'] ) : 0, 'foto_hp' => ( 'tengah' === $side && isset( $r['foto_hp'] ) ) ? esc_url_raw( $r['foto_hp'] ) : '', 'judul' => isset( $r['judul'] ) ? sanitize_text_field( $r['judul'] ) : '', 'teks' => isset( $r['teks'] ) ? sanitize_textarea_field( $r['teks'] ) : '', 'link' => isset( $r['link'] ) ? esc_url_raw( $r['link'] ) : '', 'target' => ( 'self' === $tg || 'blank' === $tg ) ? $tg : '', 'fokus' => ( isset( $r['fokus'] ) && is_string( $r['fokus'] ) && isset( hsm_fokus()[ $r['fokus'] ] ) ) ? $r['fokus'] : '', ); } } update_option( HSM_OPT, $out, false ); update_option( HSM_TAMPIL, hsm_bersih_tampil( ( isset( $_POST['tp'] ) && is_array( $_POST['tp'] ) ) ? wp_unslash( $_POST['tp'] ) : array() ), false ); // phpcs:ignore update_option( HSM_UI, hsm_bersih_ui( ( isset( $_POST['ui'] ) && is_array( $_POST['ui'] ) ) ? wp_unslash( $_POST['ui'] ) : array() ), false ); // phpcs:ignore wp_safe_redirect( add_query_arg( array( 'page' => 'hero-samping', 'tersimpan' => 1 ), admin_url( 'admin.php' ) ) ); exit; } ); /* ---------- Penanda mode otomatis slider tengah (agar CSS hanya aktif bila dipilih) ---------- */ add_filter( 'body_class', function ( $classes ) { if ( is_front_page() || is_home() ) { $t = hsm_tampil(); if ( hsm_hero_terpadu() ) { $classes[] = 'hsm-hero-plugin'; } elseif ( hsm_tengah_aktif() ) { $classes[] = 'hsm-tengah-plugin'; } elseif ( 'auto' === $t['tengah']['mode'] ) { $classes[] = 'hsm-tengah-auto'; } } return $classes; } ); /* ---------- Font (hanya dimuat di beranda, hanya bila dipilih) ---------- */ add_action( 'wp_enqueue_scripts', function () { if ( ! is_front_page() && ! is_home() ) { return; } $ui = hsm_ui(); if ( 'inter' === $ui['font'] ) { wp_enqueue_style( 'hsm-font', 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap', array(), null ); } elseif ( 'poppins' === $ui['font'] ) { wp_enqueue_style( 'hsm-font', 'https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap', array(), null ); } } ); /* ---------- Markup slider generik (dipakai tengah, kiri, kanan) ---------- */ function hsm_slider_html( $slides, $o ) { $slides = array_values( $slides ); $total = count( $slides ); if ( ! $total ) { return; } $ui = hsm_ui(); $auto = ( 'auto' === $o['mode'] ); $kelas = 'hsm-tengah ' . $o['kelas'] . ' ' . ( $auto ? 'hsm-auto' : 'hsm-statis' ) . ' hsm-pos-' . $o['posisi'] . ' ' . ( 'potong' === $o['mode'] ? 'hsm-fit-cover' : 'hsm-fit-contain' ); echo '
'; echo '
'; $n = 0; foreach ( $slides as $r ) { $r = wp_parse_args( is_array( $r ) ? $r : array(), array( 'id' => 0, 'foto' => '', 'id_hp' => 0, 'foto_hp' => '', 'judul' => '', 'teks' => '', 'link' => '', 'fokus' => '', 'target' => '' ) ); $foto = ''; $w = 0; $h = 0; if ( ! empty( $r['id'] ) ) { $src = wp_get_attachment_image_src( (int) $r['id'], $o['ukuran'] ); if ( $src ) { $foto = $src[0]; $w = (int) $src[1]; $h = (int) $src[2]; } } if ( ! $foto ) { $foto = $r['foto']; } $foto_hp = ''; if ( ! empty( $r['id_hp'] ) ) { $src_hp = wp_get_attachment_image_src( (int) $r['id_hp'], 'large' ); if ( $src_hp ) { $foto_hp = $src_hp[0]; } } if ( ! $foto_hp ) { $foto_hp = $r['foto_hp']; } $ratio = ( $w > 0 && $h > 0 ) ? max( (float) $o['rmin'], min( (float) $o['rmax'], $w / $h ) ) : 0; $ada_link = ! empty( $r['link'] ); $blank = ( 'blank' === hsm_target_slide( $r, $ui ) ); $panjang = ( hsm_panjang_teks( (string) $r['teks'] ) > $ui['batas'] ); $kelas_item = 'hsm-card' . ( $ada_link ? ' hsm-link' : '' ) . ( $panjang ? ' hsm-panjang' : '' ); $fk = ( ! empty( $r['fokus'] ) && isset( hsm_fokus()[ $r['fokus'] ] ) ) ? ' style="object-position:' . esc_attr( $r['fokus'] ) . '"' : ''; $ukuran = ( $w > 0 && $h > 0 ) ? ' width="' . (int) $w . '" height="' . (int) $h . '"' : ''; $gaya_foto = $ratio ? ' style="--hsm-r:' . esc_attr( number_format( $ratio, 4, '.', '' ) ) . '"' : ''; $img = '' . esc_attr( $r['judul'] ) . ''; echo '
'; echo '
'; echo ''; // phpcs:ignore if ( $foto_hp ) { echo ''; } echo $img . ''; // phpcs:ignore if ( '' !== $r['judul'] || '' !== $r['teks'] ) { echo ''; if ( '' !== $r['judul'] ) { echo '' . esc_html( $r['judul'] ) . ''; } if ( '' !== $r['teks'] ) { echo '' . esc_html( $r['teks'] ) . ''; echo ''; } echo ''; } if ( $ada_link ) { $aria = ( '' !== $r['judul'] ? $r['judul'] : 'Buka tautan' ) . ( $blank ? ' (dibuka di tab baru)' : '' ); echo ''; } echo '
'; $n++; } echo '
'; echo ''; echo ''; echo '
'; echo '
' . ( $o['pp'] ? '' : '' ) . '
'; echo '
'; } /* Opsi dasar tiap slider (tengah / kiri / kanan). */ function hsm_opsi_slider( $side, $t, $ui ) { $geser = ( 'manual' === $ui['geser'] ) ? 'manual' : 'otomatis'; if ( 'tengah' === $side ) { return array( 'kelas' => 'hsm-utama', 'label' => 'Slider utama', 'mode' => $t['tengah']['mode'], 'latar' => $t['tengah']['latar'], 'fokus' => $t['tengah']['fokus'], 'posisi' => $ui['tengah_posisi'], 'rmin' => $ui['tengah_rmin'], 'rmax' => $ui['tengah_rmax'], 'geser' => $geser, 'jeda' => $ui['jeda'], 'tunda' => 0, 'pp' => true, 'ukuran' => 'full', 'prioritas' => true, ); } return array( 'kelas' => 'hsm-sisi hsm-sisi-' . $side, 'label' => ( 'kiri' === $side ? 'Slider kiri' : 'Slider kanan' ), 'mode' => $t[ $side ]['mode'], 'latar' => $t[ $side ]['latar'], 'fokus' => $t[ $side ]['fokus'], 'posisi' => $ui['posisi'], 'rmin' => HSM_RMIN, 'rmax' => HSM_RMAX, 'geser' => $geser, 'jeda' => $ui['jeda'], 'tunda' => ( 'kiri' === $side ? 700 : 1400 ), 'pp' => false, 'ukuran' => 'large', 'prioritas' => false, ); } /* Mode klasik: hanya slider tengah, dipasang ke dalam bingkai tema oleh skrip. */ function hsm_render_tengah( $d, $t, $ui ) { if ( ! hsm_tengah_aktif() || hsm_hero_terpadu() ) { return; } echo '' . "\n"; } /* Mode terpadu: seluruh hero (kiri, tengah, kanan) disusun plugin. */ function hsm_render_hero( $d, $t, $ui ) { if ( ! hsm_hero_terpadu() ) { return; } $kiri = ! empty( $d['kiri'] ); $kanan = ! empty( $d['kanan'] ); $cols = ( $kiri ? 'minmax(0,20fr) ' : '' ) . 'minmax(0,45fr)' . ( $kanan ? ' minmax(0,20fr)' : '' ); if ( ! $kiri && ! $kanan ) { $cols = 'minmax(0,1fr)'; } $kelas = 'hsm-hero' . ( 'sembunyi' === $ui['hero_sisi_hp'] ? ' hsm-sisi-hp-sembunyi' : '' ) . ( ( $kiri xor $kanan ) ? ' hsm-sisi-1' : '' ); echo '' . "\n"; } /* ---------- Tampilan di beranda: markup ---------- */ add_action( 'wp_footer', function () { if ( ! is_front_page() && ! is_home() ) { return; } $d = hsm_get(); $t = hsm_tampil(); $ui = hsm_ui(); // Sebelum dipindah ke dalam hero oleh skrip, sidebar tidak boleh terlihat di footer. // Pada mode terpadu elemen ini menjadi cadangan: dihapus setelah hero plugin terpasang dengan baik. echo '' . "\n"; foreach ( array( 'kiri' => 'Slider kiri', 'kanan' => 'Slider kanan' ) as $side => $label ) { if ( empty( $d[ $side ] ) ) { continue; } $auto = ( 'auto' === $t[ $side ]['mode'] ); $cls = 'hero-samping hero-' . $side . ' hsm' . ( $auto ? ' hsm-auto' : '' ) . ' hsm-pos-' . $ui['posisi']; echo '' . "\n"; } hsm_render_tengah( $d, $t, $ui ); hsm_render_hero( $d, $t, $ui ); }, 5 ); /* ---------- Gaya tampilan foto lama (mode utuh / isi penuh) ---------- */ add_action( 'wp_footer', function () { if ( ! is_front_page() && ! is_home() ) { return; } $t = hsm_tampil(); $sel = array( 'kiri' => array( '#hero-slider .hero-kiri .hs-foto img', '#hero-slider .hero-kiri .hs-foto' ), 'tengah' => array( '#hero-slider .swiper-hero .slide-item .background img', '#hero-slider .swiper-hero .slide-item .background' ), 'kanan' => array( '#hero-slider .hero-kanan .hs-foto img', '#hero-slider .hero-kanan .hs-foto' ), ); $css = ''; if ( '' !== $t['tinggi'] ) { $css .= '#hero-slider{--foto-h:clamp(220px,' . $t['tinggi'] . 'vw,600px);}'; } foreach ( $sel as $k => $s ) { $x = $t[ $k ]; if ( 'tengah' === $k && hsm_tengah_aktif() ) { continue; // slider tengah dikelola plugin. } if ( 'auto' === $x['mode'] ) { continue; // ditangani oleh gaya otomatis di bawah. } if ( 'potong' === $x['mode'] && 'center center' === $x['fokus'] ) { continue; // sama dengan bawaan tema } $css .= $s[0] . '{object-fit:' . ( 'utuh' === $x['mode'] ? 'contain' : 'cover' ) . ' !important;object-position:' . $x['fokus'] . ' !important;}'; if ( 'utuh' === $x['mode'] ) { $css .= $s[1] . '{background:' . $x['latar'] . ' !important;}'; } } if ( $css ) { echo '' . "\n"; // phpcs:ignore } }, 6 ); /* ---------- CSS slide samping (terisolasi pada aside.hero-samping.hsm dan .hsm-modal) ---------- */ add_action( 'wp_footer', function () { if ( ! is_front_page() && ! is_home() ) { return; } $ui = hsm_ui(); $A = ':is(#hero-slider,html) aside.hero-samping.hsm'; $bg = $ui['caption']; $fg = hsm_warna_teks( $bg ); $ff = hsm_font_stack( $ui['font'] ); $vars = $A . '{--hsm-font:' . $ff . ';--hsm-cap-bg:' . $bg . ';--hsm-cap-bg-a:' . hsm_rgba( $bg, 0.88 ) . ';--hsm-cap-fg:' . $fg . ';--hsm-radius:12px;}' . "\n" . '.hsm-tengah{--hsm-font:' . $ff . ';--hsm-cap-bg:' . $bg . ';--hsm-cap-bg-a:' . hsm_rgba( $bg, 0.88 ) . ';--hsm-cap-fg:' . $fg . ';--hsm-radius:12px;}' . "\n" . '.hsm-modal{--hsm-font:' . $ff . ';}' . "\n"; $css = <<<'CSS' /* ----- Dasar: font, warna, deskripsi (semua mode) ----- */ @A@ .hs-item{position:relative !important;text-decoration:none !important;} @A@ .hs-desk{box-sizing:border-box !important;background:var(--hsm-cap-bg) !important;color:var(--hsm-cap-fg) !important;font-family:var(--hsm-font) !important;text-shadow:none !important;} @A@ .hs-judul{display:block !important;margin:0 0 .35em !important;color:var(--hsm-cap-fg) !important;font-family:var(--hsm-font) !important;font-size:clamp(1rem,.94rem + .3vw,1.2rem) !important;font-weight:700 !important;line-height:1.3 !important;letter-spacing:0 !important;text-transform:none !important;text-shadow:none !important;opacity:1 !important;} @A@ .hs-teks{display:-webkit-box !important;-webkit-box-orient:vertical !important;-webkit-line-clamp:3 !important;line-clamp:3 !important;overflow:hidden !important;margin:0 !important;color:var(--hsm-cap-fg) !important;font-family:var(--hsm-font) !important;font-size:clamp(.9375rem,.9rem + .2vw,1.0625rem) !important;font-weight:500 !important;line-height:1.6 !important;letter-spacing:.005em !important;text-transform:none !important;text-shadow:none !important;opacity:1 !important;} @media (max-width:767px){@A@ .hs-teks{-webkit-line-clamp:4 !important;line-clamp:4 !important;}} /* ----- Tombol Baca Selengkapnya ----- */ @A@ .hsm-more{position:relative !important;z-index:3 !important;display:inline-block;margin:.6em 0 0 !important;padding:.4em 1em !important;min-height:36px;border:1.5px solid var(--hsm-cap-fg) !important;border-radius:999px !important;background:transparent !important;box-shadow:none !important;color:var(--hsm-cap-fg) !important;font:600 .875rem/1.2 var(--hsm-font) !important;letter-spacing:0 !important;text-transform:none !important;cursor:pointer;pointer-events:auto !important;transition:background-color .2s ease,color .2s ease;} @A@ .hsm-more:hover,@A@ .hsm-more:focus-visible{background:var(--hsm-cap-fg) !important;color:var(--hsm-cap-bg) !important;} @A@ .hsm-more:focus-visible{outline:3px solid #facc15 !important;outline-offset:2px !important;} @A@ .hsm-more[hidden]{display:none !important;} /* ----- Seluruh slide dapat diklik ----- */ @A@ .hsm-stretch{position:absolute !important;top:0 !important;right:0 !important;bottom:0 !important;left:0 !important;z-index:1 !important;display:block !important;border:0 !important;background:transparent !important;text-decoration:none !important;cursor:pointer !important;} @A@ .hsm-stretch:focus-visible{outline:3px solid #facc15 !important;outline-offset:-3px !important;} @A@ .hsm-link{cursor:pointer;} @media (prefers-reduced-motion:no-preference){@A@ .hsm-link{transition:box-shadow .25s ease;}@A@ .hsm-media img{transition:filter .25s ease;}} @A@ .hsm-link:hover{box-shadow:0 0 0 2px var(--hsm-cap-bg),0 4px 12px rgba(15,23,42,.35) !important;} @A@ .hsm-link:hover .hs-judul{text-decoration:underline !important;text-underline-offset:3px;} @A@ .hsm-link:hover .hs-foto img{filter:brightness(1.07);} /* ----- Mode Otomatis: foto utuh, rasio asli, tinggi mengikuti foto ----- */ @A@.hsm-auto{height:auto !important;min-height:0 !important;max-height:none !important;align-self:center !important;} @A@.hsm-auto .hs-swiper{height:auto !important;min-height:0 !important;padding:8px 8px 2px !important;box-sizing:border-box !important;overflow:hidden !important;} @A@.hsm-auto .swiper-wrapper{align-items:flex-start !important;height:auto;transition-property:transform,height !important;} @A@.hsm-auto .swiper-slide{height:auto !important;} @A@.hsm-auto .hs-item{display:block !important;width:100% !important;height:auto !important;margin:0 !important;padding:0 !important;border-radius:var(--hsm-radius) !important;overflow:hidden !important;background:var(--hsm-cap-bg) !important;box-shadow:0 2px 8px rgba(15,23,42,.22) !important;} @A@.hsm-auto .hs-foto{display:block !important;position:relative !important;width:100% !important;height:auto !important;max-height:none !important;margin:0 !important;overflow:hidden !important;aspect-ratio:var(--hsm-r,1) !important;background:var(--hsm-latar,#f2f2f2) !important;} @A@.hsm-auto .hs-foto img{position:absolute !important;top:0 !important;left:0 !important;display:block !important;width:100% !important;height:100% !important;max-width:100% !important;max-height:none !important;margin:0 !important;object-fit:contain !important;object-position:center center;} @A@.hsm-auto .hs-desk{display:block !important;width:100% !important;max-width:100% !important;height:auto !important;min-height:0 !important;max-height:none !important;margin:0 !important;padding:clamp(12px,.9vw + 6px,20px) clamp(14px,1vw + 8px,22px) !important;border:0 !important;border-radius:0 !important;transform:none !important;text-align:left !important;} @A@.hsm-auto.hsm-pos-bawah .hs-desk{position:relative !important;z-index:2;top:auto !important;right:auto !important;bottom:auto !important;left:auto !important;} @A@.hsm-auto.hsm-pos-overlay .hs-desk{position:absolute !important;z-index:2;top:auto !important;right:0 !important;bottom:0 !important;left:0 !important;background:var(--hsm-cap-bg-a) !important;} @A@.hsm-auto .hsm-link .hs-desk{pointer-events:none;} @A@.hsm-auto .hsm-link .hsm-more{pointer-events:auto !important;} @A@.hsm-auto .swiper-pagination{position:static !important;width:100% !important;margin:8px 0 0 !important;transform:none !important;text-align:center !important;line-height:1 !important;} @A@.hsm-auto .swiper-pagination-bullet{width:9px !important;height:9px !important;margin:0 4px !important;border-radius:50% !important;background:#cbd5e1 !important;box-shadow:0 0 0 1px rgba(15,23,42,.4) !important;opacity:1 !important;} @A@.hsm-auto .swiper-pagination-bullet-active{background:var(--hsm-cap-bg) !important;box-shadow:0 0 0 2px #fff !important;} /* ----- Jendela "Baca Selengkapnya" ----- */ .hsm-modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:2147483000;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:16px;background:rgba(15,23,42,.65);font-family:var(--hsm-font);} .hsm-modal[hidden]{display:none !important;} .hsm-modal *{box-sizing:border-box;} .hsm-modal__box{position:relative;width:min(560px,100%);max-height:min(86vh,720px);overflow:auto;padding:clamp(20px,3vw,32px);border-radius:14px;background:#fff;color:#0f172a;box-shadow:0 24px 60px rgba(0,0,0,.4);} .hsm-modal__judul{margin:0 2.4rem .7rem 0 !important;padding:0 !important;color:#0f172a !important;font:700 clamp(1.15rem,1rem + .6vw,1.5rem)/1.3 var(--hsm-font) !important;letter-spacing:0 !important;text-transform:none !important;} .hsm-modal__teks{margin:0 !important;color:#1e293b !important;font:400 clamp(1rem,.96rem + .2vw,1.0625rem)/1.75 var(--hsm-font) !important;white-space:pre-line;overflow-wrap:anywhere;} .hsm-modal__aksi{display:flex;flex-wrap:wrap;gap:10px;margin-top:22px;} .hsm-modal__btn{display:inline-flex;align-items:center;justify-content:center;min-height:44px;padding:0 20px !important;border:2px solid #0b1f3a !important;border-radius:999px !important;background:#0b1f3a !important;color:#fff !important;font:600 .9375rem/1 var(--hsm-font) !important;text-decoration:none !important;text-transform:none !important;letter-spacing:0 !important;cursor:pointer;box-shadow:none !important;} .hsm-modal__btn--alt{background:#fff !important;color:#0b1f3a !important;} .hsm-modal__btn:hover{filter:brightness(1.15);} .hsm-modal__btn:focus-visible,.hsm-modal__x:focus-visible{outline:3px solid #f59e0b !important;outline-offset:2px !important;} .hsm-modal__x{position:absolute;top:10px;right:10px;width:40px;height:40px;padding:0 !important;border:0 !important;border-radius:50% !important;background:#e2e8f0 !important;color:#0f172a !important;font:400 26px/1 Arial,sans-serif !important;cursor:pointer;box-shadow:none !important;} .hsm-modal__x:hover{background:#cbd5e1 !important;} CSS; // Slider tengah, mode Otomatis (aktif hanya bila body memiliki kelas hsm-tengah-auto). $tp = hsm_tampil(); if ( 'auto' === $tp['tengah']['mode'] && ! hsm_tengah_aktif() ) { $C = 'body.hsm-tengah-auto #hero-slider .swiper-hero'; $css .= "\n/* ----- Slider tengah: mode Otomatis ----- */\n" . $C . '{height:auto !important;min-height:0 !important;max-height:none !important;}' . "\n" . $C . ' .swiper-wrapper{align-items:flex-start !important;height:auto;transition-property:transform,height !important;}' . "\n" . $C . ' .swiper-slide{height:auto !important;}' . "\n" . $C . ' .slide-item{position:relative !important;height:auto !important;min-height:0 !important;max-height:none !important;}' . "\n" . $C . ' .slide-item .background{position:relative !important;display:block !important;top:auto !important;left:auto !important;width:100% !important;height:auto !important;min-height:0 !important;max-height:none !important;overflow:hidden !important;aspect-ratio:var(--hsm-r,2) !important;background:' . $tp['tengah']['latar'] . ' !important;}' . "\n" . $C . ' .slide-item .background img{position:absolute !important;top:0 !important;left:0 !important;display:block !important;width:100% !important;height:100% !important;max-width:100% !important;max-height:none !important;margin:0 !important;object-fit:contain !important;object-position:' . $tp['tengah']['fokus'] . ';}' . "\n"; } // Slider tengah yang dikelola plugin. if ( hsm_tengah_aktif() ) { if ( hsm_hero_terpadu() ) { $css .= <<<'CSSH' /* ----- Hero terpadu ----- */ @keyframes hsm-tampil{to{visibility:visible;}} body.hsm-hero-plugin #hero-slider:not(.hsm-hero-on) > *{visibility:hidden;animation:hsm-tampil 0s linear 2.5s forwards;} @H@.hsm-hero-on{display:block !important;height:auto !important;min-height:0 !important;max-height:none !important;} @H@.hsm-hero-on > :not(.hsm-hero){display:none !important;} :is(#hero-slider,html) .hsm-hero{box-sizing:border-box;display:grid;grid-template-columns:var(--hsm-cols,minmax(0,20fr) minmax(0,45fr) minmax(0,20fr));gap:clamp(10px,1.4vw,24px);align-items:center;width:100%;max-width:100%;margin:0 auto;padding:clamp(10px,1.4vw,24px);} :is(#hero-slider,html) .hsm-hero .hsm-col{min-width:0;} @media (max-width:991px){ :is(#hero-slider,html) .hsm-hero{grid-template-columns:repeat(2,minmax(0,1fr));align-items:start;} :is(#hero-slider,html) .hsm-hero .hsm-col-tengah{order:-1;grid-column:1 / -1;} :is(#hero-slider,html) .hsm-hero.hsm-sisi-1 .hsm-col-kiri,:is(#hero-slider,html) .hsm-hero.hsm-sisi-1 .hsm-col-kanan{grid-column:1 / -1;} :is(#hero-slider,html) .hsm-hero.hsm-sisi-hp-sembunyi .hsm-col-kiri,:is(#hero-slider,html) .hsm-hero.hsm-sisi-hp-sembunyi .hsm-col-kanan{display:none;} } @media (max-width:599px){ :is(#hero-slider,html) .hsm-hero{grid-template-columns:minmax(0,1fr);} :is(#hero-slider,html) .hsm-hero .hsm-col-kiri,:is(#hero-slider,html) .hsm-hero .hsm-col-kanan{grid-column:1 / -1;} } CSSH; } else { $css .= <<<'CSSF' /* ----- Bingkai slider tengah (mode klasik) ----- */ @F@{height:auto !important;min-height:0 !important;max-height:none !important;} @F@ > :not(.hsm-tengah){display:none !important;} @keyframes hsm-tampil{to{visibility:visible;}} body.hsm-tengah-plugin #hero-slider .swiper-hero:not(.hsm-tengah-on) .swiper-wrapper{visibility:hidden;animation:hsm-tampil 0s linear 2.5s forwards;} CSSF; } $css .= <<<'CSST' /* ----- Slider tengah (dikelola plugin) ----- */ @T@{position:relative;display:block;width:100%;max-width:100%;box-sizing:border-box;color:var(--hsm-cap-fg);font-family:var(--hsm-font);} @T@ *{box-sizing:border-box;} @T@ [hidden]{display:none !important;} @T@ .hsm-stage{position:relative;} @T@ .hsm-viewport{position:relative;overflow:hidden;border-radius:var(--hsm-radius);background:var(--hsm-cap-bg);box-shadow:0 2px 10px rgba(15,23,42,.25);touch-action:pan-y;transition:height .35s ease;} @T@ .hsm-track{display:flex;width:100%;transition:transform .55s cubic-bezier(.22,.61,.36,1);will-change:transform;} @T@ .hsm-slide{flex:0 0 100%;width:100%;min-width:0;} @T@.hsm-auto .hsm-track{align-items:flex-start;} @T@.hsm-statis .hsm-viewport{height:var(--foto-h,clamp(220px,22.5vw,600px));} @T@.hsm-statis .hsm-track,@T@.hsm-statis .hsm-slide{height:100%;} @T@ .hsm-card{position:relative;display:block;width:100%;margin:0;overflow:hidden;background:var(--hsm-cap-bg);} @T@.hsm-statis .hsm-card{display:flex;flex-direction:column;height:100%;} @T@ .hsm-media{display:block;position:relative;width:100%;overflow:hidden;background:var(--hsm-latar,#f2f2f2);} @T@.hsm-auto .hsm-media{aspect-ratio:var(--hsm-r,2);} @T@.hsm-statis .hsm-media{flex:1 1 auto;min-height:0;} @T@ .hsm-media picture{display:block;position:absolute;top:0;right:0;bottom:0;left:0;} @T@ .hsm-media img{position:absolute;top:0;left:0;display:block;width:100%;height:100%;max-width:100%;max-height:none;margin:0;object-fit:contain;object-position:var(--hsm-pos,center center);-webkit-user-drag:none;user-select:none;} @T@.hsm-fit-cover .hsm-media img{object-fit:cover;} @T@ .hsm-cap{display:block;position:relative;z-index:2;width:100%;padding:clamp(14px,1.2vw + 8px,28px) clamp(16px,1.6vw + 8px,32px);background:var(--hsm-cap-bg);color:var(--hsm-cap-fg);text-align:left;} @T@.hsm-pos-overlay .hsm-cap{position:absolute;right:0;bottom:0;left:0;background:var(--hsm-cap-bg-a);} @T@.hsm-statis.hsm-pos-bawah .hsm-cap{flex:0 0 auto;} @T@ .hsm-link .hsm-cap{pointer-events:none;} @T@ .hsm-judul{display:block;margin:0 0 .4em;color:var(--hsm-cap-fg);font:700 clamp(1.2rem,.95rem + 1vw,2rem)/1.25 var(--hsm-font);letter-spacing:0;text-transform:none;} @T@ .hsm-teks{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;line-clamp:3;overflow:hidden;max-width:72ch;margin:0;color:var(--hsm-cap-fg);font:500 clamp(1rem,.95rem + .35vw,1.2rem)/1.6 var(--hsm-font);letter-spacing:.005em;} @T@ .hsm-more{position:relative;z-index:3;display:inline-block;min-height:36px;margin:.7em 0 0;padding:.4em 1.1em;border:1.5px solid var(--hsm-cap-fg);border-radius:999px;background:transparent;box-shadow:none;color:var(--hsm-cap-fg);font:600 .9375rem/1.2 var(--hsm-font);letter-spacing:0;text-transform:none;cursor:pointer;pointer-events:auto;transition:background-color .2s ease,color .2s ease;} @T@ .hsm-more:hover,@T@ .hsm-more:focus-visible{background:var(--hsm-cap-fg);color:var(--hsm-cap-bg);} @T@ .hsm-more:focus-visible{outline:3px solid #facc15;outline-offset:2px;} @T@ .hsm-stretch{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:block;border:0;background:transparent;text-decoration:none;cursor:pointer;} @T@ .hsm-stretch:focus-visible{outline:3px solid #facc15;outline-offset:-3px;} @T@ .hsm-link:hover .hsm-judul{text-decoration:underline;text-underline-offset:3px;} @T@ .hsm-link:hover .hsm-media img{filter:brightness(1.06);} @media (prefers-reduced-motion:no-preference){@T@ .hsm-media img{transition:filter .25s ease;}} @T@ .hsm-nav{position:absolute;top:50%;z-index:4;display:flex;align-items:center;justify-content:center;width:44px;height:44px;margin:-22px 0 0;padding:0;border:0;border-radius:50%;background:var(--hsm-cap-bg-a);box-shadow:0 2px 6px rgba(0,0,0,.35);color:var(--hsm-cap-fg);font:400 28px/1 Arial,sans-serif;cursor:pointer;} @T@ .hsm-prev{left:10px;} @T@ .hsm-next{right:10px;} @T@ .hsm-nav:hover{filter:brightness(1.2);} @T@ .hsm-nav:focus-visible,@T@ .hsm-dot:focus-visible,@T@ .hsm-pp:focus-visible{outline:3px solid #facc15;outline-offset:2px;} @T@ .hsm-ctrl{display:flex;align-items:center;justify-content:center;gap:14px;margin-top:10px;} @T@ .hsm-dots{display:flex;align-items:center;gap:10px;} @T@ .hsm-dot{position:relative;width:11px;height:11px;padding:0;border:0;border-radius:50%;background:#cbd5e1;box-shadow:0 0 0 1px rgba(15,23,42,.4);cursor:pointer;} @T@ .hsm-dot::after{content:"";position:absolute;top:-10px;right:-6px;bottom:-10px;left:-6px;} @T@ .hsm-dot[aria-current="true"]{background:var(--hsm-cap-bg);box-shadow:0 0 0 2px #fff,0 0 0 3px var(--hsm-cap-bg);} @T@ .hsm-pp{min-height:32px;padding:.2em .9em;border:1.5px solid var(--hsm-cap-bg);border-radius:999px;background:#fff;color:var(--hsm-cap-bg);font:600 .8125rem/1.2 var(--hsm-font);cursor:pointer;} @T@.hsm-sisi .hsm-judul{font-size:clamp(1rem,.94rem + .3vw,1.2rem);} @T@.hsm-sisi .hsm-teks{font-size:clamp(.9375rem,.9rem + .2vw,1.0625rem);} @T@.hsm-sisi .hsm-cap{padding:clamp(12px,.9vw + 6px,20px) clamp(14px,1vw + 8px,22px);} @T@.hsm-sisi .hsm-nav{width:34px;height:34px;margin-top:-17px;font-size:22px;} @T@.hsm-sisi .hsm-prev{left:6px;} @T@.hsm-sisi .hsm-next{right:6px;} @media (max-width:767px){ @T@ .hsm-teks{-webkit-line-clamp:3;line-clamp:3;} @T@ .hsm-nav{width:38px;height:38px;margin-top:-19px;font-size:24px;} @T@.hsm-sisi .hsm-nav{width:34px;height:34px;margin-top:-17px;} } @media (prefers-reduced-motion:reduce){@T@ .hsm-track,@T@ .hsm-viewport{transition:none !important;}} CSST; } $T = ':is(#hero-slider,html) .hsm-tengah'; $F = ':is(#hero-slider,html) .swiper-hero.hsm-tengah-on'; $H = ':is(#hero-slider,html) #hero-slider'; echo '' . "\n"; // phpcs:ignore }, 6 ); /* ---------- JS gabungan: modal, slider samping, slider tengah ---------- */ add_action( 'wp_footer', function () { if ( ! is_front_page() && ! is_home() ) { return; } $d = hsm_get(); $terpadu = hsm_hero_terpadu(); $sides = ( ! empty( $d['kiri'] ) || ! empty( $d['kanan'] ) ); $tengah = ( ! $terpadu && hsm_tengah_aktif() ); if ( ! $sides && ! $tengah && ! $terpadu ) { return; } $debug = ( isset( $_GET['hsm_debug'] ) && current_user_can( 'manage_options' ) ); // phpcs:ignore $cfg = array( 'sides' => $sides, 'tengah' => $tengah, 'hero' => $terpadu, 'debug' => $debug, 'versi' => '3.0.1', 'mode' => ( $terpadu ? 'terpadu' : 'klasik' ) ); $js = <<<'JS' (function () { 'use strict'; var CFG = __CFG__; /* Panel diagnosis: tambahkan ?hsm_debug=1 pada alamat beranda (hanya untuk admin). */ var panel = null; function L(msg) { if (!CFG.debug) { return; } if (!panel) { panel = document.createElement('pre'); panel.style.cssText = 'position:fixed;left:8px;bottom:8px;z-index:2147483600;max-width:92vw;max-height:45vh;overflow:auto;margin:0;padding:10px 12px;border-radius:8px;background:#0f172a;color:#e2e8f0;font:12px/1.5 monospace;white-space:pre-wrap;box-shadow:0 4px 18px rgba(0,0,0,.5)'; document.body.appendChild(panel); L('Hero Samping ' + CFG.versi + ' | mode: ' + CFG.mode); } panel.textContent += '\n' + msg; } window.addEventListener('error', function (e) { L('GALAT JS: ' + e.message + ' (' + (e.filename || '').split('/').pop() + ':' + e.lineno + ')'); }); function clamp(v, a, b) { return Math.min(b, Math.max(a, v)); } function raf(fn) { return window.requestAnimationFrame ? window.requestAnimationFrame(fn) : setTimeout(fn, 16); } /* "Baca Selengkapnya" tampil hanya bila deskripsi benar-benar terpotong. */ function cekMore(scope) { scope.querySelectorAll('.hsm-card').forEach(function (card) { var t = card.querySelector('.hs-teks, .hsm-teks'); var b = card.querySelector('.hsm-more'); if (!t || !b) { return; } if (t.clientHeight > 0) { b.hidden = !(t.scrollHeight > t.clientHeight + 1); } else { b.hidden = !card.classList.contains('hsm-panjang'); } }); } /* ================= Jendela Baca Selengkapnya (dipakai bersama) ================= */ var modal, mJudul, mTeks, mGo, mTutup, mX, terakhir, dijeda; function bangun() { modal = document.createElement('div'); modal.className = 'hsm-modal'; modal.hidden = true; modal.setAttribute('role', 'dialog'); modal.setAttribute('aria-modal', 'true'); modal.setAttribute('aria-labelledby', 'hsm-m-judul'); modal.innerHTML = '

'; document.body.appendChild(modal); mJudul = modal.querySelector('.hsm-modal__judul'); mTeks = modal.querySelector('.hsm-modal__teks'); mGo = modal.querySelector('.hsm-modal__go'); mTutup = modal.querySelector('.hsm-modal__tutup'); mX = modal.querySelector('.hsm-modal__x'); mX.addEventListener('click', tutup); mTutup.addEventListener('click', tutup); modal.addEventListener('click', function (e) { if (e.target === modal) { tutup(); } }); modal.addEventListener('keydown', function (e) { if (e.key === 'Escape') { e.preventDefault(); tutup(); return; } if (e.key === 'Tab') { var f = Array.prototype.filter.call(modal.querySelectorAll('button,a[href]'), function (x) { return !x.hidden; }); if (!f.length) { return; } var first = f[0], last = f[f.length - 1]; if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); } else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); } } }); } function buka(btn) { var card = btn.closest('.hsm-card'); if (!card) { return; } if (!modal) { bangun(); } var j = card.querySelector('.hs-judul, .hsm-judul'); var t = card.querySelector('.hs-teks, .hsm-teks'); var l = card.querySelector('.hsm-stretch'); mJudul.textContent = j ? j.textContent : ''; mJudul.hidden = !j; mTeks.textContent = t ? t.textContent : ''; if (l) { mGo.href = l.href; if (l.target === '_blank') { mGo.target = '_blank'; mGo.rel = 'noopener noreferrer'; } else { mGo.removeAttribute('target'); mGo.removeAttribute('rel'); } mGo.hidden = false; } else { mGo.hidden = true; } terakhir = btn; var sw = card.closest('.hs-swiper'); var inst = sw && sw.swiper; dijeda = null; if (inst && inst.autoplay && inst.autoplay.running) { inst.autoplay.stop(); dijeda = inst; } document.dispatchEvent(new CustomEvent('hsm:pause')); modal.hidden = false; document.documentElement.style.overflow = 'hidden'; mTutup.focus(); } function tutup() { if (!modal || modal.hidden) { return; } modal.hidden = true; document.documentElement.style.overflow = ''; if (dijeda && dijeda.autoplay) { dijeda.autoplay.start(); } dijeda = null; document.dispatchEvent(new CustomEvent('hsm:resume')); if (terakhir && terakhir.focus) { terakhir.focus(); } } document.addEventListener('click', function (e) { var b = e.target.closest ? e.target.closest('.hsm-more') : null; if (!b) { return; } e.preventDefault(); e.stopPropagation(); buka(b); }, true); /* ================= Slider samping (kiri / kanan) ================= */ function initSamping() { var asides = document.querySelectorAll('aside.hero-samping.hsm'); if (!asides.length) { return; } function setRatio(img, aside) { if (!img.naturalWidth || !img.naturalHeight) { return; } var media = img.closest('.hs-foto'); if (!media) { return; } var rmin = parseFloat(aside.getAttribute('data-rmin')) || 0.75; var rmax = parseFloat(aside.getAttribute('data-rmax')) || 2; media.style.setProperty('--hsm-r', clamp(img.naturalWidth / img.naturalHeight, rmin, rmax).toFixed(4)); } function sync(aside) { var auto = aside.classList.contains('hsm-auto'); if (auto) { aside.querySelectorAll('.hs-foto img').forEach(function (img) { if (img.complete) { setRatio(img, aside); } }); } cekMore(aside); if (!auto) { return; } var wrap = aside.querySelector('.swiper-wrapper'); if (!wrap) { return; } var s = wrap.querySelector('.swiper-slide-active') || wrap.querySelector('.swiper-slide'); var item = s ? s.querySelector('.hs-item') : null; var h = item ? item.offsetHeight : 0; if (h > 0) { wrap.style.setProperty('height', h + 'px', 'important'); } } function req(aside) { if (aside._hsmP) { return; } aside._hsmP = true; raf(function () { aside._hsmP = false; sync(aside); }); } asides.forEach(function (a) { req(a); a.addEventListener('load', function () { req(a); }, true); if ('MutationObserver' in window) { new MutationObserver(function () { req(a); }).observe(a, { subtree: true, attributes: true, attributeFilter: ['class'] }); } if ('ResizeObserver' in window) { new ResizeObserver(function () { req(a); }).observe(a); } }); function semua() { asides.forEach(req); } window.addEventListener('resize', semua); window.addEventListener('orientationchange', semua); window.addEventListener('load', semua); if (document.fonts && document.fonts.ready) { document.fonts.ready.then(semua); } } /* ================= Slider tengah (dikelola plugin) ================= */ function initTengah(root) { var stage = root.querySelector('.hsm-viewport'); var track = root.querySelector('.hsm-track'); var slides = [].slice.call(root.querySelectorAll('.hsm-slide')); var n = slides.length; if (!stage || !track || !n) { return; } var auto = root.classList.contains('hsm-auto'); var rmin = parseFloat(root.getAttribute('data-rmin')) || 1.25; var rmax = parseFloat(root.getAttribute('data-rmax')) || 2.4; var geser = root.getAttribute('data-geser'); var jeda = Math.max(2, parseInt(root.getAttribute('data-jeda'), 10) || 5) * 1000; var tunda = parseInt(root.getAttribute('data-tunda'), 10) || 0; var kurang = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches; var dotsEl = root.querySelector('.hsm-dots'); var btnPP = root.querySelector('.hsm-pp'); var i = 0, timer = null, tundaT = null, hover = false, fokus = false, modalBuka = false, userJeda = false; var dots = []; for (var k = 0; k < n; k++) { (function (idx) { var b = document.createElement('button'); b.type = 'button'; b.className = 'hsm-dot'; b.setAttribute('aria-label', 'Slide ' + (idx + 1) + ' dari ' + n); b.addEventListener('click', function () { go(idx, true); }); dotsEl.appendChild(b); dots.push(b); })(k); } /* tinggi + rasio */ var pend = false; function sync() { if (auto) { root.querySelectorAll('.hsm-media img').forEach(function (img) { if (!img.complete || !img.naturalWidth || !img.naturalHeight) { return; } var m = img.closest('.hsm-media'); if (m) { m.style.setProperty('--hsm-r', clamp(img.naturalWidth / img.naturalHeight, rmin, rmax).toFixed(4)); } }); var card = slides[i].querySelector('.hsm-card'); var h = card ? card.offsetHeight : 0; if (h > 0) { stage.style.setProperty('height', h + 'px', 'important'); } } cekMore(root); } function req() { if (pend) { return; } pend = true; raf(function () { pend = false; sync(); }); } /* navigasi */ function go(idx, user) { i = ((idx % n) + n) % n; track.style.transform = 'translate3d(' + (-i * 100) + '%,0,0)'; slides.forEach(function (s, x) { var on = x === i; s.setAttribute('aria-hidden', on ? 'false' : 'true'); s.querySelectorAll('a,button').forEach(function (el) { if (on) { el.removeAttribute('tabindex'); } else { el.setAttribute('tabindex', '-1'); } }); }); dots.forEach(function (d, x) { if (x === i) { d.setAttribute('aria-current', 'true'); } else { d.removeAttribute('aria-current'); } }); req(); if (user) { mulai(true); } } /* geser otomatis */ function berhenti() { if (timer) { clearInterval(timer); timer = null; } if (tundaT) { clearTimeout(tundaT); tundaT = null; } } function bisaJalan() { return geser === 'otomatis' && !kurang && n > 1; } function mulai(segera) { berhenti(); if (!bisaJalan() || userJeda) { return; } function jalan() { timer = setInterval(function () { if (document.hidden || hover || fokus || modalBuka) { return; } go(i + 1, false); }, jeda); } if (tunda && !segera) { tundaT = setTimeout(jalan, tunda); } else { jalan(); } } /* Tombol Jeda/Putar mengatur semua slider pada hero sekaligus. */ if (bisaJalan() && btnPP) { btnPP.hidden = false; btnPP.addEventListener('click', function () { document.dispatchEvent(new CustomEvent('hsm:jeda', { detail: { jeda: !userJeda } })); }); } document.addEventListener('hsm:jeda', function (e) { userJeda = !!(e.detail && e.detail.jeda); if (btnPP) { btnPP.setAttribute('aria-pressed', userJeda ? 'true' : 'false'); btnPP.textContent = userJeda ? 'Putar' : 'Jeda'; } mulai(true); }); root.addEventListener('mouseenter', function () { hover = true; }); root.addEventListener('mouseleave', function () { hover = false; }); root.addEventListener('focusin', function () { fokus = true; }); root.addEventListener('focusout', function () { fokus = false; }); document.addEventListener('hsm:pause', function () { modalBuka = true; }); document.addEventListener('hsm:resume', function () { modalBuka = false; }); root.querySelector('.hsm-prev').addEventListener('click', function () { go(i - 1, true); }); root.querySelector('.hsm-next').addEventListener('click', function () { go(i + 1, true); }); root.addEventListener('keydown', function (e) { if (e.key === 'ArrowLeft') { go(i - 1, true); } else if (e.key === 'ArrowRight') { go(i + 1, true); } }); /* swipe (sentuh dan mouse) */ var sx = 0, sy = 0, tarik = false, geserSelesai = false; stage.addEventListener('pointerdown', function (e) { if (e.pointerType === 'mouse' && e.button !== 0) { return; } sx = e.clientX; sy = e.clientY; tarik = true; geserSelesai = false; }); stage.addEventListener('pointerup', function (e) { if (!tarik) { return; } tarik = false; var dx = e.clientX - sx, dy = e.clientY - sy; if (Math.abs(dx) > 45 && Math.abs(dx) > Math.abs(dy) * 1.3) { geserSelesai = true; go(dx < 0 ? i + 1 : i - 1, true); } }); stage.addEventListener('pointercancel', function () { tarik = false; }); stage.addEventListener('click', function (e) { if (geserSelesai) { e.preventDefault(); e.stopPropagation(); geserSelesai = false; } }, true); /* pantau perubahan ukuran / pemuatan foto */ root.addEventListener('load', req, true); if ('ResizeObserver' in window) { new ResizeObserver(req).observe(root); } window.addEventListener('resize', req); window.addEventListener('orientationchange', req); window.addEventListener('load', req); if (document.fonts && document.fonts.ready) { document.fonts.ready.then(req); } go(0, false); mulai(); } /* Pasang slider tengah ke dalam bingkai tema, lalu hentikan slider tema. */ function matikanTema(frame) { var k = 0; (function cek() { var els = [frame].concat([].slice.call(frame.querySelectorAll('.swiper'))); var ada = false; els.forEach(function (el) { var sw = el.swiper; if (sw) { ada = true; try { if (sw.autoplay && sw.autoplay.running) { sw.autoplay.stop(); } } catch (e) {} } }); if (!ada && ++k < 30) { setTimeout(cek, 300); } })(); } var coba = 0; function pasangTengah() { var src = document.querySelector('.hsm-tengah-src'); if (!src) { return; } var frame = document.querySelector('#hero-slider .swiper-hero'); if (!frame) { if (++coba < 40) { setTimeout(pasangTengah, 250); } else { document.body.classList.remove('hsm-tengah-plugin'); } return; } var comp = src.firstElementChild; frame.classList.add('hsm-tengah-on'); frame.appendChild(comp); src.parentNode.removeChild(src); initTengah(comp); matikanTema(frame); } /* Mode terpadu: seluruh hero disusun plugin di dalam #hero-slider. Elemen slider kiri/kanan lama dipertahankan sebagai cadangan sampai hero baru terbukti tampil. */ var cobaHero = 0, hostHero = null; function hapusCadangan() { document.querySelectorAll('aside.hero-samping.hsm').forEach(function (a) { a.parentNode.removeChild(a); }); } function batalkanHero(alasan) { L('GAGAL, kembali ke tampilan cadangan: ' + alasan); var h = document.querySelector('.hsm-hero'); if (h && h.parentNode) { h.parentNode.removeChild(h); } if (hostHero) { hostHero.classList.remove('hsm-hero-on'); } document.body.classList.remove('hsm-hero-plugin'); if (CFG.sides) { try { initSamping(); } catch (e) { L('GALAT initSamping: ' + e.message); } } } function verifikasiHero() { var hero = document.querySelector('.hsm-hero'); if (!hero) { return batalkanHero('hero tidak ada di halaman'); } var r = hero.getBoundingClientRect(); var v = hero.querySelector('.hsm-col-tengah .hsm-viewport'); var vh = v ? v.getBoundingClientRect().height : 0; var kolom = [].slice.call(hero.querySelectorAll('.hsm-col')).map(function (c) { var b = c.getBoundingClientRect(); return c.className.replace('hsm-col hsm-col-', '') + '=' + Math.round(b.width) + 'x' + Math.round(b.height); }); L('hero ' + Math.round(r.width) + 'x' + Math.round(r.height) + ' | kolom: ' + kolom.join(', ')); if (r.height < 40 || vh < 10) { return batalkanHero('hero berukuran nol'); } hapusCadangan(); L('OK: hero terpadu tampil, elemen cadangan dihapus'); } function pasangHero() { var src = document.querySelector('.hsm-hero-src'); if (!src) { L('GAGAL: .hsm-hero-src tidak ada'); return; } var host = document.getElementById('hero-slider'); if (!host) { if (++cobaHero < 40) { setTimeout(pasangHero, 250); } else { L('GAGAL: #hero-slider tidak ditemukan'); batalkanHero('#hero-slider tidak ditemukan'); } return; } hostHero = host; L('#hero-slider ditemukan; .swiper-hero: ' + (host.querySelector('.swiper-hero') ? 'ada' : 'tidak ada') + '; aside cadangan: ' + document.querySelectorAll('aside.hero-samping.hsm').length); var comp = src.firstElementChild; host.classList.add('hsm-hero-on'); host.appendChild(comp); src.parentNode.removeChild(src); comp.querySelectorAll('.hsm-tengah').forEach(function (c) { try { initTengah(c); } catch (e) { L('GALAT initTengah: ' + e.message); } }); try { matikanTema(host); } catch (e) { L('GALAT matikanTema: ' + e.message); } setTimeout(verifikasiHero, 1800); } if (CFG.sides && !CFG.hero) { try { initSamping(); } catch (e) { L('GALAT initSamping: ' + e.message); } } if (CFG.tengah) { try { pasangTengah(); } catch (e) { L('GALAT pasangTengah: ' + e.message); } } if (CFG.hero) { try { pasangHero(); } catch (e) { L('GALAT pasangHero: ' + e.message); batalkanHero(e.message); } } L('skrip dijalankan. sides=' + CFG.sides + ' hero=' + CFG.hero + ' tengah=' + CFG.tengah); })(); JS; echo '' . "\n"; // phpcs:ignore }, 7 ); /* ---------- JS slider tengah: tinggi otomatis + geser otomatis / manual ---------- */ add_action( 'wp_footer', function () { if ( ! is_front_page() && ! is_home() ) { return; } if ( hsm_tengah_aktif() ) { return; // slider tengah dikelola plugin; skrip gabungan yang menjalankannya. } $t = hsm_tampil(); $ui = hsm_ui(); $cfg = array( 'auto' => ( 'auto' === $t['tengah']['mode'] ), 'rmin' => (float) $ui['tengah_rmin'], 'rmax' => (float) $ui['tengah_rmax'], 'geser' => $ui['geser'], 'jeda' => (int) $ui['jeda'], ); if ( ! $cfg['auto'] && 'tema' === $cfg['geser'] ) { return; // tidak ada yang perlu dijalankan. } $js = <<<'JS' (function () { 'use strict'; var C = __CFG__; var SEL = '#hero-slider .swiper-hero'; var root = null, tries = 0; function clamp(v, a, b) { return Math.min(b, Math.max(a, v)); } function raf(fn) { return window.requestAnimationFrame ? window.requestAnimationFrame(fn) : setTimeout(fn, 16); } function swiperEl() { return root.classList.contains('swiper') ? root : (root.querySelector('.swiper') || root); } /* ----- Tinggi otomatis mengikuti foto yang sedang tampil ----- */ var pend = false; function sync() { if (!C.auto || !root) { return; } root.querySelectorAll('.slide-item .background img').forEach(function (img) { if (!img.complete || !img.naturalWidth || !img.naturalHeight) { return; } var m = img.closest('.background'); if (m) { m.style.setProperty('--hsm-r', clamp(img.naturalWidth / img.naturalHeight, C.rmin, C.rmax).toFixed(4)); } }); var wrap = root.querySelector('.swiper-wrapper'); if (!wrap) { return; } var s = wrap.querySelector('.swiper-slide-active') || wrap.querySelector('.swiper-slide'); var item = s ? (s.querySelector('.slide-item') || s) : null; var h = item ? item.offsetHeight : 0; if (h > 0) { wrap.style.setProperty('height', h + 'px', 'important'); } } function req() { if (pend) { return; } pend = true; raf(function () { pend = false; sync(); }); } /* ----- Geser otomatis / manual ----- */ var timer = null, hover = false, fokus = false; function stopTema(sw) { try { if (sw.autoplay && sw.autoplay.running) { sw.autoplay.stop(); } } catch (e) {} } function mulai(sw) { if (timer) { clearInterval(timer); } timer = setInterval(function () { if (document.hidden || hover || fokus) { return; } if (sw.isEnd && !(sw.params && sw.params.loop)) { sw.slideTo(0); } else { sw.slideNext(); } }, Math.max(2, C.jeda) * 1000); } var terpasang = false; function pasangGeser() { if (terpasang || C.geser === 'tema') { return; } var sw = swiperEl().swiper; if (!sw) { return false; } terpasang = true; stopTema(sw); var kurang = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches; if (C.geser === 'otomatis' && !kurang) { root.addEventListener('mouseenter', function () { hover = true; }); root.addEventListener('mouseleave', function () { hover = false; }); root.addEventListener('focusin', function () { fokus = true; }); root.addEventListener('focusout', function () { fokus = false; }); mulai(sw); } return true; } function init() { root = document.querySelector(SEL); if (!root) { if (++tries < 40) { setTimeout(init, 250); } return; } if (C.auto) { req(); root.addEventListener('load', req, true); if ('MutationObserver' in window) { new MutationObserver(req).observe(root, { subtree: true, attributes: true, attributeFilter: ['class'] }); } if ('ResizeObserver' in window) { new ResizeObserver(req).observe(root); } window.addEventListener('resize', req); window.addEventListener('orientationchange', req); if (document.fonts && document.fonts.ready) { document.fonts.ready.then(req); } } if (C.geser !== 'tema') { var n = 0; (function tunggu() { if (pasangGeser() === false && ++n < 40) { setTimeout(tunggu, 250); } })(); } } window.addEventListener('load', function () { req(); }); if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })(); JS; echo '' . "\n"; // phpcs:ignore }, 8 );