{"id":1922,"date":"2026-07-30T16:06:06","date_gmt":"2026-07-30T09:06:06","guid":{"rendered":"https:\/\/aipnemaptma.org\/?page_id=1922"},"modified":"2026-07-30T20:38:13","modified_gmt":"2026-07-30T13:38:13","slug":"dosen-aipnema","status":"publish","type":"page","link":"https:\/\/aipnemaptma.org\/en\/dosen-aipnema\/","title":{"rendered":"Dosen AIPNEMA"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1922\" class=\"elementor elementor-1922\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-84b2cdb elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"84b2cdb\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f3e048d\" data-id=\"f3e048d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-31ed592 elementor-widget elementor-widget-html\" data-id=\"31ed592\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- PAGE DOSEN AIPNEMA \u2014 tempelkan pada satu widget Custom HTML Elementor -->\n<style>\n:root{\n  --aip-faculty-primary:#094528;\n  --aip-faculty-primary-2:#0C5A35;\n  --aip-faculty-dark:#052F1D;\n  --aip-faculty-deep:#032416;\n  --aip-faculty-gold:#D8B25C;\n  --aip-faculty-gold-soft:#F5E9C9;\n  --aip-faculty-text:#1C2822;\n  --aip-faculty-muted:#647169;\n  --aip-faculty-border:#DCE5E0;\n  --aip-faculty-soft:#EAF3EE;\n  --aip-faculty-bg:#F7F9F8;\n  --aip-faculty-white:#FFFFFF;\n  --aip-faculty-container:1200px;\n  --aip-faculty-shadow:0 18px 48px rgba(5,47,29,.10);\n  --aip-faculty-shadow-sm:0 10px 28px rgba(5,47,29,.08);\n  --aip-faculty-header-offset:120px;\n}\n\n.aip-faculty-page,\n.aip-faculty-page *{\n  box-sizing:border-box;\n}\n\n.aip-faculty-page{\n  position:relative;\n  left:50%;\n  z-index:1;\n  width:100vw;\n  max-width:100vw;\n  margin:0 0 0 -50vw;\n  padding:0!important;\n  overflow-x:clip;\n  color:var(--aip-faculty-text);\n  background:var(--aip-faculty-white);\n  font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",Arial,sans-serif;\n}\n\n.aip-faculty-page [id]{\n  scroll-margin-top:var(--aip-faculty-header-offset);\n}\n\n.aip-faculty-page img{\n  display:block;\n  max-width:100%;\n}\n\n.aip-faculty-page a{\n  color:inherit;\n}\n\n.aip-faculty-page h1,\n.aip-faculty-page h2,\n.aip-faculty-page h3,\n.aip-faculty-page p{\n  margin-top:0;\n}\n\n.aip-faculty-container{\n  width:min(var(--aip-faculty-container),calc(100% - 48px));\n  margin-inline:auto;\n}\n\n.aip-faculty-section{\n  position:relative;\n  padding:86px 0;\n}\n\n.aip-faculty-section-soft{\n  background:var(--aip-faculty-bg);\n}\n\n.aip-faculty-kicker{\n  display:inline-flex;\n  align-items:center;\n  gap:10px;\n  margin:0 0 15px;\n  color:var(--aip-faculty-primary);\n  font-size:13px;\n  font-weight:800;\n  letter-spacing:.12em;\n  text-transform:uppercase;\n}\n\n.aip-faculty-kicker::before{\n  content:\"\";\n  width:30px;\n  height:3px;\n  border-radius:999px;\n  background:var(--aip-faculty-gold);\n}\n\n.aip-faculty-heading{\n  max-width:930px;\n  margin:0;\n  color:var(--aip-faculty-text);\n  font-size:clamp(32px,4.4vw,52px);\n  font-weight:820;\n  letter-spacing:-.04em;\n  line-height:1.12;\n}\n\n\/* HERO *\/\n.aip-faculty-hero{\n  position:relative;\n  isolation:isolate;\n  overflow:hidden;\n  color:var(--aip-faculty-white);\n  background:\n    radial-gradient(circle at 85% 16%,rgba(216,178,92,.20),transparent 24%),\n    linear-gradient(125deg,var(--aip-faculty-deep),var(--aip-faculty-primary) 60%,#0A5A34);\n}\n\n.aip-faculty-hero::before{\n  content:\"\";\n  position:absolute;\n  inset:0;\n  z-index:-1;\n  opacity:.11;\n  background-image:\n    linear-gradient(rgba(255,255,255,.28) 1px,transparent 1px),\n    linear-gradient(90deg,rgba(255,255,255,.28) 1px,transparent 1px);\n  background-size:54px 54px;\n  mask-image:linear-gradient(to right,#000,transparent 82%);\n}\n\n.aip-faculty-hero-grid{\n  display:grid;\n  grid-template-columns:minmax(0,1.08fr) minmax(330px,.92fr);\n  align-items:center;\n  gap:62px;\n  padding:82px 0 76px;\n}\n\n.aip-faculty-breadcrumb{\n  display:flex;\n  flex-wrap:wrap;\n  gap:8px;\n  margin-bottom:24px;\n  color:#CFE0D6;\n  font-size:13px;\n}\n\n.aip-faculty-breadcrumb a{\n  text-decoration:none;\n}\n\n.aip-faculty-breadcrumb a:hover{\n  color:#F0D99F;\n}\n\n.aip-faculty-hero-badge{\n  display:inline-flex;\n  align-items:center;\n  gap:9px;\n  margin-bottom:22px;\n  padding:8px 13px;\n  border:1px solid rgba(255,255,255,.20);\n  border-radius:999px;\n  color:#F7EBCB;\n  background:rgba(255,255,255,.08);\n  font-size:13px;\n  font-weight:760;\n}\n\n.aip-faculty-hero-badge::before{\n  content:\"\";\n  width:8px;\n  height:8px;\n  border-radius:50%;\n  background:var(--aip-faculty-gold);\n}\n\n.aip-faculty-hero h1{\n  max-width:820px;\n  margin:0;\n  color:var(--aip-faculty-white);\n  font-size:clamp(42px,5.2vw,66px);\n  font-weight:830;\n  letter-spacing:-.05em;\n  line-height:1.04;\n}\n\n.aip-faculty-hero h1 span{\n  color:#F1D99D;\n}\n\n.aip-faculty-hero-text{\n  max-width:740px;\n  margin:24px 0 0;\n  color:#DCEBE2;\n  font-size:17px;\n  line-height:1.78;\n}\n\n.aip-faculty-hero-panel{\n  padding:30px;\n  border:1px solid rgba(255,255,255,.16);\n  border-radius:24px;\n  background:rgba(255,255,255,.08);\n  box-shadow:0 28px 64px rgba(0,0,0,.17);\n  backdrop-filter:blur(8px);\n}\n\n.aip-faculty-logo-wrap{\n  display:inline-flex;\n  padding:13px 15px;\n  border-radius:14px;\n  background:var(--aip-faculty-white);\n  box-shadow:0 12px 30px rgba(0,0,0,.15);\n}\n\n.aip-faculty-logo-wrap img{\n  width:190px;\n  height:auto;\n}\n\n.aip-faculty-hero-panel p{\n  margin:20px 0 0;\n  color:#DCEBE2;\n  font-size:14px;\n  line-height:1.75;\n}\n\n.aip-faculty-stat-grid{\n  display:grid;\n  grid-template-columns:repeat(2,1fr);\n  gap:12px;\n  margin-top:22px;\n}\n\n.aip-faculty-stat{\n  padding:17px;\n  border:1px solid rgba(255,255,255,.13);\n  border-radius:14px;\n  background:rgba(255,255,255,.07);\n}\n\n.aip-faculty-stat strong{\n  display:block;\n  color:#F2DCA5;\n  font-size:25px;\n  font-weight:840;\n  line-height:1.05;\n}\n\n.aip-faculty-stat span{\n  display:block;\n  margin-top:7px;\n  color:#DCEBE2;\n  font-size:12px;\n  line-height:1.45;\n}\n\n\n\/* ANALYTICS \/ CHARTS *\/\n.aip-faculty-analytics{\n  overflow:hidden;\n  background:\n    radial-gradient(circle at 8% 10%,rgba(216,178,92,.10),transparent 21%),\n    radial-gradient(circle at 92% 0,rgba(9,69,40,.08),transparent 25%),\n    var(--aip-faculty-white);\n}\n\n.aip-faculty-analytics-head{\n  display:flex;\n  align-items:flex-end;\n  justify-content:space-between;\n  gap:32px;\n  margin-bottom:34px;\n}\n\n.aip-faculty-analytics-copy{\n  max-width:850px;\n}\n\n.aip-faculty-analytics-copy p:last-child{\n  max-width:780px;\n  margin:16px 0 0;\n  color:var(--aip-faculty-muted);\n  font-size:15px;\n  line-height:1.75;\n}\n\n.aip-faculty-analytics-note{\n  display:inline-flex;\n  align-items:center;\n  gap:8px;\n  flex:0 0 auto;\n  padding:10px 13px;\n  border:1px solid var(--aip-faculty-border);\n  border-radius:999px;\n  color:var(--aip-faculty-primary);\n  background:rgba(255,255,255,.82);\n  box-shadow:0 8px 20px rgba(5,47,29,.06);\n  font-size:11px;\n  font-weight:780;\n  white-space:nowrap;\n}\n\n.aip-faculty-analytics-note::before{\n  content:\"\";\n  width:8px;\n  height:8px;\n  border-radius:50%;\n  background:var(--aip-faculty-gold);\n  box-shadow:0 0 0 5px rgba(216,178,92,.17);\n}\n\n.aip-faculty-chart-grid{\n  display:grid;\n  grid-template-columns:repeat(3,minmax(0,1fr));\n  gap:20px;\n}\n\n.aip-faculty-chart-card{\n  position:relative;\n  isolation:isolate;\n  min-width:0;\n  overflow:hidden;\n  padding:25px;\n  border:1px solid var(--aip-faculty-border);\n  border-radius:21px;\n  background:rgba(255,255,255,.94);\n  box-shadow:var(--aip-faculty-shadow-sm);\n  transition:transform .25s ease,border-color .25s ease,box-shadow .25s ease;\n}\n\n.aip-faculty-chart-card::before{\n  content:\"\";\n  position:absolute;\n  inset:0 0 auto;\n  z-index:-1;\n  height:5px;\n  background:linear-gradient(90deg,var(--chart-accent-1),var(--chart-accent-2));\n}\n\n.aip-faculty-chart-card::after{\n  content:\"\";\n  position:absolute;\n  top:-90px;\n  right:-90px;\n  z-index:-1;\n  width:190px;\n  height:190px;\n  border-radius:50%;\n  background:radial-gradient(circle,var(--chart-glow),transparent 68%);\n  pointer-events:none;\n}\n\n.aip-faculty-chart-card:hover{\n  transform:translateY(-6px);\n  border-color:rgba(9,69,40,.27);\n  box-shadow:0 22px 52px rgba(5,47,29,.13);\n}\n\n.aip-faculty-chart-card-rank{\n  --chart-accent-1:#094528;\n  --chart-accent-2:#D8B25C;\n  --chart-glow:rgba(9,69,40,.13);\n}\n\n.aip-faculty-chart-card-education{\n  --chart-accent-1:#1E6292;\n  --chart-accent-2:#6F5BD3;\n  --chart-glow:rgba(30,98,146,.13);\n}\n\n.aip-faculty-chart-card-certification{\n  --chart-accent-1:#0C5A35;\n  --chart-accent-2:#E1A82B;\n  --chart-glow:rgba(216,178,92,.16);\n}\n\n.aip-faculty-chart-card-head{\n  display:flex;\n  align-items:center;\n  gap:13px;\n  min-height:52px;\n}\n\n.aip-faculty-chart-icon{\n  width:45px;\n  height:45px;\n  flex:0 0 45px;\n  display:grid;\n  place-items:center;\n  border-radius:14px;\n  color:var(--aip-faculty-white);\n  background:linear-gradient(145deg,var(--chart-accent-1),var(--chart-accent-2));\n  box-shadow:0 10px 22px rgba(5,47,29,.14);\n}\n\n.aip-faculty-chart-icon svg{\n  width:22px;\n  height:22px;\n}\n\n.aip-faculty-chart-card-head h3{\n  margin:0;\n  color:var(--aip-faculty-text);\n  font-size:18px;\n  line-height:1.35;\n}\n\n.aip-faculty-chart-card-head p{\n  margin:4px 0 0;\n  color:var(--aip-faculty-muted);\n  font-size:11px;\n  line-height:1.45;\n}\n\n.aip-faculty-chart-content{\n  margin-top:22px;\n}\n\n.aip-faculty-donut-layout{\n  display:grid;\n  grid-template-columns:152px minmax(0,1fr);\n  align-items:center;\n  gap:15px;\n}\n\n.aip-faculty-donut-wrap{\n  position:relative;\n  width:152px;\n  height:152px;\n  margin:auto;\n  filter:drop-shadow(0 12px 20px rgba(5,47,29,.09));\n}\n\n.aip-faculty-donut-ring{\n  position:absolute;\n  inset:0;\n  border-radius:50%;\n  background:var(--donut-gradient,#E9EFEC);\n  opacity:0;\n  transform:rotate(-18deg) scale(.84);\n  transition:\n    background .28s ease,\n    filter .25s ease,\n    transform .25s ease;\n}\n\n.aip-faculty-donut-ring::before{\n  content:\"\";\n  position:absolute;\n  inset:18px;\n  border-radius:50%;\n  background:\n    radial-gradient(circle at 35% 30%,#FFFFFF,#F7FAF8 72%);\n  box-shadow:\n    inset 0 0 0 1px rgba(9,69,40,.05),\n    0 8px 22px rgba(5,47,29,.07);\n}\n\n.aip-faculty-donut-ring.is-drawn{\n  opacity:1;\n  transform:rotate(0deg) scale(1);\n  animation:aipFacultyDonutBreathe 4.8s ease-in-out 1.05s infinite;\n}\n\n.aip-faculty-donut-ring.is-highlighted{\n  transform:scale(1.035);\n  filter:drop-shadow(0 10px 13px rgba(5,47,29,.16));\n  animation:none;\n}\n\n@keyframes aipFacultyDonutBreathe{\n  0%,100%{filter:drop-shadow(0 0 0 rgba(5,47,29,0))}\n  50%{filter:drop-shadow(0 7px 9px rgba(5,47,29,.10))}\n}\n\n.aip-faculty-donut-center{\n  position:absolute;\n  inset:0;\n  z-index:2;\n  display:flex;\n  align-items:center;\n  justify-content:center;\n  flex-direction:column;\n  padding:35px;\n  text-align:center;\n  pointer-events:none;\n}\n\n.aip-faculty-donut-center strong{\n  color:var(--aip-faculty-text);\n  font-size:29px;\n  font-weight:850;\n  letter-spacing:-.04em;\n  line-height:1;\n}\n\n.aip-faculty-donut-center span{\n  display:block;\n  max-width:90px;\n  margin-top:7px;\n  color:var(--aip-faculty-muted);\n  font-size:9.5px;\n  font-weight:720;\n  line-height:1.25;\n  overflow-wrap:anywhere;\n}\n.aip-faculty-chart-legend{\n  display:grid;\n  gap:8px;\n  min-width:0;\n}\n\n.aip-faculty-legend-item{\n  display:grid;\n  grid-template-columns:12px minmax(0,1fr) auto;\n  align-items:center;\n  gap:9px;\n  padding:8px 9px;\n  border-radius:10px;\n  transition:background .2s ease,transform .2s ease;\n  cursor:default;\n}\n\n.aip-faculty-legend-item:hover{\n  transform:translateX(3px);\n  background:var(--aip-faculty-bg);\n}\n\n.aip-faculty-legend-dot{\n  width:10px;\n  height:10px;\n  border-radius:50%;\n  box-shadow:0 0 0 4px color-mix(in srgb,currentColor 14%,transparent);\n}\n\n.aip-faculty-legend-label{\n  min-width:0;\n  color:var(--aip-faculty-text);\n  font-size:10.5px;\n  font-weight:680;\n  line-height:1.35;\n  overflow-wrap:anywhere;\n}\n\n.aip-faculty-legend-value{\n  display:flex;\n  align-items:baseline;\n  gap:5px;\n  color:var(--aip-faculty-muted);\n  font-size:10px;\n  white-space:nowrap;\n}\n\n.aip-faculty-legend-value strong{\n  color:var(--aip-faculty-text);\n  font-size:12px;\n  font-weight:820;\n}\n\n.aip-faculty-chart-empty{\n  min-height:180px;\n  display:grid;\n  place-items:center;\n  padding:28px;\n  border:1px dashed var(--aip-faculty-border);\n  border-radius:15px;\n  color:var(--aip-faculty-muted);\n  background:var(--aip-faculty-bg);\n  text-align:center;\n  font-size:12px;\n  line-height:1.6;\n}\n\n.aip-faculty-chart-skeleton{\n  display:grid;\n  grid-template-columns:160px 1fr;\n  align-items:center;\n  gap:22px;\n  min-height:185px;\n}\n\n.aip-faculty-chart-skeleton-circle{\n  width:150px;\n  height:150px;\n  border:17px solid #E8EEEB;\n  border-top-color:#D0DDD6;\n  border-radius:50%;\n  animation:aipFacultyChartSpin 1.2s linear infinite;\n}\n\n.aip-faculty-chart-skeleton-lines{\n  display:grid;\n  gap:11px;\n}\n\n.aip-faculty-chart-skeleton-lines span{\n  display:block;\n  height:13px;\n  border-radius:999px;\n  background:linear-gradient(90deg,#E8EEEB,#F7F9F8,#E8EEEB);\n  background-size:220% 100%;\n  animation:aipFacultyChartShimmer 1.45s infinite linear;\n}\n\n.aip-faculty-chart-skeleton-lines span:nth-child(2){width:84%}\n.aip-faculty-chart-skeleton-lines span:nth-child(3){width:67%}\n.aip-faculty-chart-skeleton-lines span:nth-child(4){width:76%}\n\n@keyframes aipFacultyChartSpin{\n  to{transform:rotate(360deg)}\n}\n\n@keyframes aipFacultyChartShimmer{\n  from{background-position:200% 0}\n  to{background-position:-20% 0}\n}\n\n.aip-faculty-chart-card.is-ready{\n  animation:aipFacultyChartEnter .55s both;\n}\n\n.aip-faculty-chart-card.is-ready:nth-child(2){\n  animation-delay:.08s;\n}\n\n.aip-faculty-chart-card.is-ready:nth-child(3){\n  animation-delay:.16s;\n}\n\n@keyframes aipFacultyChartEnter{\n  from{opacity:0;transform:translateY(14px)}\n  to{opacity:1;transform:translateY(0)}\n}\n\n\/* TOOLBAR *\/\n.aip-faculty-toolbar{\n  display:grid;\n  grid-template-columns:minmax(270px,1fr) minmax(195px,.58fr) minmax(180px,.48fr) minmax(165px,.42fr);\n  gap:13px;\n  margin-top:38px;\n}\n\n.aip-faculty-search-wrap{\n  position:relative;\n}\n\n.aip-faculty-search-icon{\n  position:absolute;\n  top:50%;\n  left:15px;\n  width:20px;\n  height:20px;\n  transform:translateY(-50%);\n  color:var(--aip-faculty-primary);\n  pointer-events:none;\n}\n\n.aip-faculty-input,\n.aip-faculty-select{\n  width:100%;\n  min-height:50px;\n  border:1px solid var(--aip-faculty-border);\n  border-radius:12px;\n  color:var(--aip-faculty-text);\n  background:var(--aip-faculty-white);\n  font-family:inherit;\n  font-size:14px;\n  outline:none;\n}\n\n.aip-faculty-input{\n  padding:0 15px 0 44px;\n}\n\n.aip-faculty-select{\n  padding:0 38px 0 14px;\n}\n\n.aip-faculty-input:focus,\n.aip-faculty-select:focus{\n  border-color:var(--aip-faculty-primary);\n  box-shadow:0 0 0 4px rgba(9,69,40,.10);\n}\n\n.aip-faculty-result-bar{\n  display:flex;\n  align-items:center;\n  justify-content:space-between;\n  gap:20px;\n  margin:25px 0 20px;\n  color:var(--aip-faculty-muted);\n  font-size:13px;\n}\n\n.aip-faculty-result-actions{\n  display:flex;\n  flex-wrap:wrap;\n  align-items:center;\n  gap:8px;\n}\n\n.aip-faculty-view-button,\n.aip-faculty-reset{\n  min-height:38px;\n  padding:0 13px;\n  border:1px solid var(--aip-faculty-border);\n  border-radius:10px;\n  color:var(--aip-faculty-muted);\n  background:var(--aip-faculty-white);\n  font-family:inherit;\n  font-size:11px;\n  font-weight:760;\n  cursor:pointer;\n}\n\n.aip-faculty-view-button.is-active{\n  color:var(--aip-faculty-white);\n  border-color:var(--aip-faculty-primary);\n  background:var(--aip-faculty-primary);\n}\n\n.aip-faculty-reset{\n  color:var(--aip-faculty-primary);\n  border-color:transparent;\n  background:transparent;\n}\n\n\/* CARDS *\/\n.aip-faculty-grid{\n  display:grid;\n  grid-template-columns:repeat(3,minmax(0,1fr));\n  gap:18px;\n}\n\n.aip-faculty-card{\n  display:flex;\n  flex-direction:column;\n  min-width:0;\n  overflow:hidden;\n  border:1px solid var(--aip-faculty-border);\n  border-radius:18px;\n  background:var(--aip-faculty-white);\n  transition:.22s ease;\n}\n\n.aip-faculty-card:hover{\n  transform:translateY(-5px);\n  border-color:rgba(9,69,40,.30);\n  box-shadow:var(--aip-faculty-shadow-sm);\n}\n\n.aip-faculty-card-head{\n  display:flex;\n  align-items:center;\n  gap:17px;\n  min-height:125px;\n  padding:22px;\n  color:var(--aip-faculty-white);\n  background:\n    radial-gradient(circle at 90% 10%,rgba(216,178,92,.24),transparent 28%),\n    linear-gradient(135deg,var(--aip-faculty-dark),var(--aip-faculty-primary));\n}\n\n.aip-faculty-photo-wrap{\n  position:relative;\n  width:78px;\n  height:78px;\n  flex:0 0 78px;\n  overflow:hidden;\n  border:3px solid rgba(255,255,255,.85);\n  border-radius:20px;\n  background:rgba(255,255,255,.13);\n  box-shadow:0 10px 24px rgba(0,0,0,.18);\n}\n\n.aip-faculty-photo{\n  width:100%;\n  height:100%;\n  object-fit:cover;\n  object-position:center top;\n}\n\n.aip-faculty-initials{\n  position:absolute;\n  inset:0;\n  display:grid;\n  place-items:center;\n  color:#F5DFA8;\n  background:linear-gradient(145deg,var(--aip-faculty-primary),var(--aip-faculty-primary-2));\n  font-size:20px;\n  font-weight:850;\n}\n\n.aip-faculty-card-title{\n  min-width:0;\n}\n\n.aip-faculty-card-title h3{\n  overflow-wrap:anywhere;\n  margin:0;\n  color:var(--aip-faculty-white);\n  font-size:19px;\n  line-height:1.42;\n}\n\n.aip-faculty-card-title p{\n  overflow-wrap:anywhere;\n  margin:7px 0 0;\n  color:#DCEBE2;\n  font-size:12px;\n  line-height:1.5;\n}\n\n\n.aip-faculty-email{\n  display:flex;\n  align-items:flex-start;\n  gap:8px;\n  margin:11px 0 0;\n  color:#DCEBE2;\n  font-size:11px;\n  line-height:1.45;\n}\n\n.aip-faculty-email svg{\n  width:15px;\n  height:15px;\n  flex:0 0 15px;\n  margin-top:1px;\n}\n\n.aip-faculty-email a{\n  min-width:0;\n  overflow-wrap:anywhere;\n  color:#F5DFA8!important;\n  text-decoration:none!important;\n  font-weight:700;\n}\n\n.aip-faculty-email a:hover{\n  color:#FFFFFF!important;\n  text-decoration:underline!important;\n}\n\n.aip-faculty-card-body{\n  display:flex;\n  flex-direction:column;\n  flex:1;\n  padding:22px;\n}\n\n.aip-faculty-badges{\n  display:flex;\n  flex-wrap:wrap;\n  gap:7px;\n  min-height:31px;\n}\n\n.aip-faculty-badge{\n  display:inline-flex;\n  align-items:center;\n  min-height:29px;\n  padding:0 10px;\n  border-radius:999px;\n  color:var(--aip-faculty-primary);\n  background:var(--aip-faculty-soft);\n  font-size:10px;\n  font-weight:780;\n  line-height:1.3;\n}\n\n.aip-faculty-badge-gold{\n  color:#725615;\n  background:var(--aip-faculty-gold-soft);\n}\n\n.aip-faculty-details{\n  display:grid;\n  gap:11px;\n  margin-top:18px;\n  padding-top:17px;\n  border-top:1px solid var(--aip-faculty-border);\n}\n\n.aip-faculty-detail{\n  display:grid;\n  grid-template-columns:105px minmax(0,1fr);\n  gap:11px;\n  align-items:start;\n}\n\n.aip-faculty-detail span{\n  color:var(--aip-faculty-muted);\n  font-size:11px;\n  font-weight:730;\n  line-height:1.52;\n}\n\n.aip-faculty-detail strong{\n  overflow-wrap:anywhere;\n  color:var(--aip-faculty-text);\n  font-size:12px;\n  font-weight:650;\n  line-height:1.55;\n}\n\n.aip-faculty-profile-links{\n  display:flex;\n  flex-wrap:wrap;\n  gap:8px;\n  margin-top:auto;\n  padding-top:20px;\n}\n\n.aip-faculty-profile-link{\n  display:inline-flex;\n  align-items:center;\n  justify-content:center;\n  min-height:35px;\n  padding:0 11px;\n  border:1px solid var(--aip-faculty-border);\n  border-radius:9px;\n  color:var(--aip-faculty-primary)!important;\n  background:var(--aip-faculty-white);\n  text-decoration:none!important;\n  font-size:10px;\n  font-weight:780;\n  transition:.2s ease;\n}\n\n.aip-faculty-profile-link:hover{\n  color:var(--aip-faculty-white)!important;\n  border-color:var(--aip-faculty-primary);\n  background:var(--aip-faculty-primary);\n}\n\n\n.aip-faculty-badge-certified{\n  color:#FFFFFF;\n  background:var(--aip-faculty-primary);\n}\n\n.aip-faculty-badge-uncertified{\n  color:#765916;\n  background:var(--aip-faculty-gold-soft);\n}\n\n\/* TABLE *\/\n.aip-faculty-table-view[hidden],\n.aip-faculty-grid[hidden]{\n  display:none!important;\n}\n\n.aip-faculty-table-wrap{\n  overflow-x:auto;\n  border:1px solid var(--aip-faculty-border);\n  border-radius:18px;\n  background:var(--aip-faculty-white);\n  box-shadow:var(--aip-faculty-shadow-sm);\n}\n\n.aip-faculty-table{\n  width:100%;\n  min-width:960px;\n  border-collapse:collapse;\n}\n\n.aip-faculty-table th{\n  padding:15px 16px;\n  color:var(--aip-faculty-white);\n  background:var(--aip-faculty-primary);\n  text-align:left;\n  font-size:11px;\n  font-weight:780;\n  line-height:1.4;\n}\n\n.aip-faculty-table td{\n  padding:15px 16px;\n  border-bottom:1px solid var(--aip-faculty-border);\n  color:var(--aip-faculty-muted);\n  font-size:12px;\n  line-height:1.6;\n  vertical-align:top;\n}\n\n.aip-faculty-table tbody tr:last-child td{\n  border-bottom:0;\n}\n\n.aip-faculty-table tbody tr:hover{\n  background:var(--aip-faculty-bg);\n}\n\n.aip-faculty-table td strong{\n  color:var(--aip-faculty-text);\n  font-size:13px;\n}\n\n\/* STATES *\/\n.aip-faculty-state{\n  grid-column:1\/-1;\n  padding:43px;\n  border:1px dashed var(--aip-faculty-border);\n  border-radius:17px;\n  color:var(--aip-faculty-muted);\n  background:var(--aip-faculty-white);\n  text-align:center;\n  font-size:14px;\n  line-height:1.75;\n}\n\n.aip-faculty-state strong{\n  display:block;\n  margin-bottom:7px;\n  color:var(--aip-faculty-text);\n  font-size:17px;\n}\n\n.aip-faculty-loading{\n  display:inline-flex;\n  gap:5px;\n  margin-top:13px;\n}\n\n.aip-faculty-loading span{\n  width:7px;\n  height:7px;\n  border-radius:50%;\n  background:var(--aip-faculty-primary);\n  animation:aipFacultyPulse 1.15s infinite ease-in-out;\n}\n\n.aip-faculty-loading span:nth-child(2){animation-delay:.16s}\n.aip-faculty-loading span:nth-child(3){animation-delay:.32s}\n\n@keyframes aipFacultyPulse{\n  0%,80%,100%{opacity:.25;transform:scale(.8)}\n  40%{opacity:1;transform:scale(1)}\n}\n\n\/* CTA *\/\n.aip-faculty-cta{\n  padding-top:0;\n  background:var(--aip-faculty-bg);\n}\n\n.aip-faculty-cta-card{\n  display:flex;\n  align-items:center;\n  justify-content:space-between;\n  gap:38px;\n  padding:38px 42px;\n  border:1px solid var(--aip-faculty-border);\n  border-radius:20px;\n  background:var(--aip-faculty-white);\n  box-shadow:var(--aip-faculty-shadow-sm);\n}\n\n.aip-faculty-cta-card h2{\n  margin:0;\n  color:var(--aip-faculty-text);\n  font-size:clamp(26px,3.2vw,38px);\n  letter-spacing:-.03em;\n  line-height:1.2;\n}\n\n.aip-faculty-cta-card p{\n  margin:10px 0 0;\n  color:var(--aip-faculty-muted);\n  font-size:15px;\n  line-height:1.7;\n}\n\n.aip-faculty-cta-button{\n  display:inline-flex;\n  align-items:center;\n  justify-content:center;\n  min-height:50px;\n  padding:0 22px;\n  border:1px solid var(--aip-faculty-primary);\n  border-radius:11px;\n  color:var(--aip-faculty-white)!important;\n  background:var(--aip-faculty-primary);\n  text-decoration:none!important;\n  font-size:15px;\n  font-weight:760;\n  transition:.22s ease;\n}\n\n.aip-faculty-cta-button:hover{\n  transform:translateY(-2px);\n  background:var(--aip-faculty-primary-2);\n}\n\n\n\n@media(max-width:1180px) and (min-width:841px){\n  .aip-faculty-chart-grid{\n    grid-template-columns:repeat(2,minmax(0,1fr));\n  }\n\n  .aip-faculty-chart-card-certification{\n    grid-column:1\/-1;\n  }\n\n  .aip-faculty-chart-card-certification .aip-faculty-donut-layout{\n    max-width:520px;\n    margin-inline:auto;\n  }\n}\n\n@media(max-width:840px){\n  .aip-faculty-chart-grid{\n    grid-template-columns:1fr;\n  }\n}\n\n@media(max-width:1100px){\n  .aip-faculty-donut-layout{\n    grid-template-columns:165px minmax(0,1fr);\n  }\n}\n\n@media(max-width:760px){\n  .aip-faculty-analytics-head{\n    align-items:flex-start;\n    flex-direction:column;\n  }\n\n  .aip-faculty-analytics-note{\n    white-space:normal;\n  }\n}\n\n@media(max-width:520px){\n  .aip-faculty-chart-card{\n    padding:22px 18px;\n  }\n\n  .aip-faculty-donut-layout,\n  .aip-faculty-chart-skeleton{\n    grid-template-columns:1fr;\n  }\n\n  .aip-faculty-donut-wrap{\n    width:170px;\n    height:170px;\n  }\n\n  .aip-faculty-chart-skeleton-circle{\n    margin:auto;\n  }\n}\n\n@media(max-width:1080px){\n  .aip-faculty-grid{\n    grid-template-columns:repeat(2,minmax(0,1fr));\n  }\n\n  .aip-faculty-toolbar{\n    grid-template-columns:1fr 1fr;\n  }\n\n  .aip-faculty-search-wrap{\n    grid-column:1\/-1;\n  }\n}\n\n@media(max-width:920px){\n  .aip-faculty-hero-grid{\n    grid-template-columns:1fr;\n    gap:38px;\n    padding:68px 0;\n  }\n\n  .aip-faculty-hero-panel{\n    max-width:620px;\n  }\n\n  .aip-faculty-section{\n    padding:68px 0;\n  }\n}\n\n@media(max-width:680px){\n  :root{\n    --aip-faculty-header-offset:105px;\n  }\n\n  .aip-faculty-container{\n    width:min(var(--aip-faculty-container),calc(100% - 30px));\n  }\n\n  .aip-faculty-section{\n    padding:56px 0;\n  }\n\n  .aip-faculty-hero-grid{\n    padding:52px 0;\n  }\n\n  .aip-faculty-hero h1{\n    font-size:clamp(38px,11vw,50px);\n  }\n\n  .aip-faculty-hero-text{\n    font-size:16px;\n  }\n\n  .aip-faculty-toolbar{\n    grid-template-columns:1fr;\n  }\n\n  .aip-faculty-search-wrap{\n    grid-column:auto;\n  }\n\n  .aip-faculty-result-bar{\n    align-items:flex-start;\n    flex-direction:column;\n  }\n\n  .aip-faculty-grid{\n    grid-template-columns:1fr;\n  }\n\n  .aip-faculty-detail{\n    grid-template-columns:1fr;\n    gap:3px;\n  }\n\n  .aip-faculty-cta-card{\n    flex-direction:column;\n    align-items:flex-start;\n    padding:30px 24px;\n  }\n\n  .aip-faculty-cta-button{\n    width:100%;\n  }\n}\n<\/style>\n\n<main class=\"aip-faculty-page\" id=\"aipFacultyPage\">\n\n  <header class=\"aip-faculty-hero\">\n    <div class=\"aip-faculty-container aip-faculty-hero-grid\">\n      <div>\n        <nav class=\"aip-faculty-breadcrumb\" aria-label=\"Breadcrumb\">\n          <a href=\"https:\/\/aipnemaptma.org\/\">Beranda<\/a>\n          <span>\/<\/span>\n          <span>Dosen AIPNEMA<\/span>\n        <\/nav>\n\n        <div class=\"aip-faculty-hero-badge\">\n          Jejaring Akademisi Keperawatan PTMA\n        <\/div>\n\n        <h1>\n          Dosen <span>AIPNEMA<\/span>\n        <\/h1>\n\n        <p class=\"aip-faculty-hero-text\">\n          Direktori dosen pada institusi pendidikan keperawatan\n          Muhammadiyah dan \u2018Aisyiyah yang menjadi bagian dari jejaring AIPNEMA.\n        <\/p>\n      <\/div>\n\n      <aside class=\"aip-faculty-hero-panel\">\n        <div class=\"aip-faculty-logo-wrap\">\n          <img fetchpriority=\"high\" decoding=\"async\"\n            src=\"https:\/\/aipnemaptma.org\/wp-content\/uploads\/2023\/07\/logo-aipnema2.png\"\n            alt=\"Logo AIPNEMA\"\n            width=\"500\"\n            height=\"150\"\n            loading=\"eager\"\n          >\n        <\/div>\n\n        <p>\n          Temukan dosen berdasarkan nama, institusi, jabatan akademik,\n          dan bidang keahlian.\n        <\/p>\n\n        <div class=\"aip-faculty-stat-grid\">\n          <div class=\"aip-faculty-stat\">\n            <strong id=\"aipFacultyTotal\">\u2013<\/strong>\n            <span>Dosen terdata<\/span>\n          <\/div>\n\n          <div class=\"aip-faculty-stat\">\n            <strong id=\"aipFacultyInstitutionCount\">\u2013<\/strong>\n            <span>Institusi anggota<\/span>\n          <\/div>\n        <\/div>\n      <\/aside>\n    <\/div>\n  <\/header>\n\n\n  <section class=\"aip-faculty-section aip-faculty-analytics\" id=\"profil-dosen\">\n    <div class=\"aip-faculty-container\">\n      <div class=\"aip-faculty-analytics-head\">\n        <div class=\"aip-faculty-analytics-copy\">\n          <p class=\"aip-faculty-kicker\">Profil Dosen<\/p>\n\n          <h2 class=\"aip-faculty-heading\">\n            Komposisi akademik dosen AIPNEMA.\n          <\/h2>\n\n          <p>\n            Persentase jabatan fungsional, pendidikan terakhir,\n            dan sertifikasi dosen pada jejaring institusi anggota.\n          <\/p>\n        <\/div>\n\n        <div class=\"aip-faculty-analytics-note\">\n          Persentase dihitung dari seluruh dosen terdata\n        <\/div>\n      <\/div>\n\n      <div class=\"aip-faculty-chart-grid\" id=\"aipFacultyChartGrid\">\n        <article class=\"aip-faculty-chart-card aip-faculty-chart-card-rank\">\n          <div class=\"aip-faculty-chart-card-head\">\n            <span class=\"aip-faculty-chart-icon\" aria-hidden=\"true\">\n              <svg viewBox=\"0 0 24 24\" fill=\"none\">\n                <path d=\"M4 20h16M6 17V9h4v8M14 17V4h4v13\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\/>\n              <\/svg>\n            <\/span>\n\n            <div>\n              <h3>Jabatan Fungsional<\/h3>\n              <p>Distribusi jenjang jabatan akademik<\/p>\n            <\/div>\n          <\/div>\n\n          <div class=\"aip-faculty-chart-content\" id=\"aipFacultyRankChart\">\n            <div class=\"aip-faculty-chart-skeleton\">\n              <span class=\"aip-faculty-chart-skeleton-circle\"><\/span>\n              <span class=\"aip-faculty-chart-skeleton-lines\">\n                <span><\/span><span><\/span><span><\/span><span><\/span>\n              <\/span>\n            <\/div>\n          <\/div>\n        <\/article>\n\n        <article class=\"aip-faculty-chart-card aip-faculty-chart-card-education\">\n          <div class=\"aip-faculty-chart-card-head\">\n            <span class=\"aip-faculty-chart-icon\" aria-hidden=\"true\">\n              <svg viewBox=\"0 0 24 24\" fill=\"none\">\n                <path d=\"M3 9l9-5 9 5-9 5-9-5Z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\"\/>\n                <path d=\"M7 12.2V17c2.8 2 7.2 2 10 0v-4.8M21 9v6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\/>\n              <\/svg>\n            <\/span>\n\n            <div>\n              <h3>Pendidikan Terakhir<\/h3>\n              <p>Komposisi kualifikasi akademik<\/p>\n            <\/div>\n          <\/div>\n\n          <div class=\"aip-faculty-chart-content\" id=\"aipFacultyEducationChart\">\n            <div class=\"aip-faculty-chart-skeleton\">\n              <span class=\"aip-faculty-chart-skeleton-circle\"><\/span>\n              <span class=\"aip-faculty-chart-skeleton-lines\">\n                <span><\/span><span><\/span><span><\/span><span><\/span>\n              <\/span>\n            <\/div>\n          <\/div>\n        <\/article>\n\n        <article class=\"aip-faculty-chart-card aip-faculty-chart-card-certification\">\n          <div class=\"aip-faculty-chart-card-head\">\n            <span class=\"aip-faculty-chart-icon\" aria-hidden=\"true\">\n              <svg viewBox=\"0 0 24 24\" fill=\"none\">\n                <circle cx=\"12\" cy=\"9\" r=\"5\" stroke=\"currentColor\" stroke-width=\"2\"\/>\n                <path d=\"m9 13-1 8 4-2 4 2-1-8\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\"\/>\n                <path d=\"m10 9 1.3 1.3L14 7.6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>\n              <\/svg>\n            <\/span>\n\n            <div>\n              <h3>Sertifikasi Dosen<\/h3>\n              <p>Status sertifikasi profesional dosen<\/p>\n            <\/div>\n          <\/div>\n\n          <div class=\"aip-faculty-chart-content\" id=\"aipFacultyCertificationChart\">\n            <div class=\"aip-faculty-chart-skeleton\">\n              <span class=\"aip-faculty-chart-skeleton-circle\"><\/span>\n              <span class=\"aip-faculty-chart-skeleton-lines\">\n                <span><\/span><span><\/span><span><\/span><span><\/span>\n              <\/span>\n            <\/div>\n          <\/div>\n        <\/article>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"aip-faculty-section aip-faculty-section-soft\" id=\"direktori-dosen\">\n    <div class=\"aip-faculty-container\">\n      <p class=\"aip-faculty-kicker\">Direktori Dosen<\/p>\n\n      <h2 class=\"aip-faculty-heading\">\n        Daftar dosen\n      <\/h2>\n\n      <div class=\"aip-faculty-toolbar\">\n        <div class=\"aip-faculty-search-wrap\">\n          <svg class=\"aip-faculty-search-icon\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n            <circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"currentColor\" stroke-width=\"2\"\/>\n            <path d=\"M20 20l-3.5-3.5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\/>\n          <\/svg>\n\n          <input\n            class=\"aip-faculty-input\"\n            id=\"aipFacultySearch\"\n            type=\"search\"\n            placeholder=\"Cari nama dosen, institusi, atau keahlian\u2026\"\n            autocomplete=\"off\"\n          >\n        <\/div>\n\n        <select class=\"aip-faculty-select\" id=\"aipFacultyInstitution\">\n          <option value=\"\">Semua institusi<\/option>\n        <\/select>\n\n        <select class=\"aip-faculty-select\" id=\"aipFacultyRank\">\n          <option value=\"\">Semua jabatan akademik<\/option>\n        <\/select>\n\n        <select class=\"aip-faculty-select\" id=\"aipFacultySort\">\n          <option value=\"name-asc\" selected>Nama A\u2013Z<\/option>\n          <option value=\"name-desc\">Nama Z\u2013A<\/option>\n          <option value=\"institution\">Berdasarkan institusi<\/option>\n        <\/select>\n      <\/div>\n\n      <div class=\"aip-faculty-result-bar\">\n        <span id=\"aipFacultyResultText\">Memuat data dosen\u2026<\/span>\n\n        <div class=\"aip-faculty-result-actions\">\n          <button\n            class=\"aip-faculty-view-button is-active\"\n            id=\"aipFacultyCardView\"\n            type=\"button\"\n          >\n            Tampilan Kartu\n          <\/button>\n\n          <button\n            class=\"aip-faculty-view-button\"\n            id=\"aipFacultyTableViewButton\"\n            type=\"button\"\n          >\n            Tampilan Tabel\n          <\/button>\n\n          <button\n            class=\"aip-faculty-reset\"\n            id=\"aipFacultyReset\"\n            type=\"button\"\n          >\n            Reset\n          <\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"aip-faculty-grid\" id=\"aipFacultyGrid\" aria-live=\"polite\">\n        <div class=\"aip-faculty-state\">\n          <strong>Memuat daftar dosen\u2026<\/strong>\n          Mohon menunggu beberapa saat.\n          <span class=\"aip-faculty-loading\" aria-hidden=\"true\">\n            <span><\/span><span><\/span><span><\/span>\n          <\/span>\n        <\/div>\n      <\/div>\n\n      <div class=\"aip-faculty-table-view\" id=\"aipFacultyTableView\" hidden>\n        <div class=\"aip-faculty-table-wrap\">\n          <table class=\"aip-faculty-table\">\n            <thead id=\"aipFacultyTableHead\"><\/thead>\n            <tbody id=\"aipFacultyTableBody\"><\/tbody>\n          <\/table>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"aip-faculty-section aip-faculty-cta\">\n    <div class=\"aip-faculty-container\">\n      <div class=\"aip-faculty-cta-card\">\n        <div>\n          <h2>Data dosen belum tercantum atau perlu diperbarui?<\/h2>\n\n          <p>\n            Sampaikan pemutakhiran data profesional dosen melalui\n            sekretariat AIPNEMA.\n          <\/p>\n        <\/div>\n\n        <a\n          class=\"aip-faculty-cta-button\"\n          href=\"https:\/\/aipnemaptma.org\/kontak\/\"\n        >\n          Hubungi Sekretariat\n        <\/a>\n      <\/div>\n    <\/div>\n  <\/section>\n\n<\/main>\n\n<script>\n(function(){\n  const SHEET_ID =\n    '1vdsRsT5L02Npj7NUxwJ9CYu4EyfyVw2gr8pBPktlS0M';\n  const SHEET_GID = '0';\n\n  const SHEET_BASE =\n    'https:\/\/docs.google.com\/spreadsheets\/d\/' +\n    SHEET_ID +\n    '\/gviz\/tq';\n\n  const FIELD_ALIASES = {\n    name:[\n      'nama dosen','nama lengkap dan gelar','nama lengkap','nama',\n      'dosen','nama pegawai','nama tenaga pendidik','full name'\n    ],\n    institution:[\n      'institusi','asal institusi','institusi asal','afiliasi',\n      'perguruan tinggi','nama perguruan tinggi','universitas',\n      'ptma','instansi','asal perguruan tinggi'\n    ],\n    rank:[\n      'jabatan fungsional','jabatan akademik','jafung',\n      'academic rank','jabatan','pangkat akademik'\n    ],\n    education:[\n      'pendidikan terakhir','pendidikan','kualifikasi akademik',\n      'gelar pendidikan','jenjang pendidikan','academic qualification'\n    ],\n    certification:[\n      'status sertifikasi dosen','sertifikasi dosen','status serdos',\n      'sertifikasi','serdos','lecturer certification'\n    ],\n    expertise:[\n      'bidang keahlian','bidang keilmuan','keahlian','kepakaran',\n      'bidang ilmu','rumpun ilmu','spesialisasi','area keahlian',\n      'expertise'\n    ],\n    program:[\n      'program studi','nama program studi','prodi','homebase',\n      'program pendidikan','departemen','department'\n    ],\n    photo:[\n      'foto','photo','pas foto','foto dosen','url foto',\n      'link foto','gambar','image'\n    ],\n    email:[\n      'email','email dosen','alamat email','surel',\n      'e-mail','email institusi','institutional email'\n    ],\n    sinta:[\n      'sinta id','id sinta','sinta','profil sinta','link sinta',\n      'url sinta'\n    ],\n    scopus:[\n      'scopus id','id scopus','scopus','profil scopus',\n      'link scopus','url scopus'\n    ],\n    orcid:[\n      'orcid','orcid id','id orcid','profil orcid',\n      'link orcid','url orcid'\n    ],\n    scholar:[\n      'google scholar','scholar','profil google scholar',\n      'link scholar','url scholar'\n    ]\n  };\n\n  const pageElement = document.getElementById('aipFacultyPage');\n  const gridElement = document.getElementById('aipFacultyGrid');\n  const tableViewElement = document.getElementById('aipFacultyTableView');\n  const tableHeadElement = document.getElementById('aipFacultyTableHead');\n  const tableBodyElement = document.getElementById('aipFacultyTableBody');\n\n  const searchElement = document.getElementById('aipFacultySearch');\n  const institutionElement =\n    document.getElementById('aipFacultyInstitution');\n  const rankElement = document.getElementById('aipFacultyRank');\n  const sortElement = document.getElementById('aipFacultySort');\n  const resetElement = document.getElementById('aipFacultyReset');\n\n  const resultTextElement =\n    document.getElementById('aipFacultyResultText');\n  const cardViewElement =\n    document.getElementById('aipFacultyCardView');\n  const tableViewButtonElement =\n    document.getElementById('aipFacultyTableViewButton');\n\n  const totalElement = document.getElementById('aipFacultyTotal');\n  const institutionCountElement =\n    document.getElementById('aipFacultyInstitutionCount');\n\n  const rankChartElement =\n    document.getElementById('aipFacultyRankChart');\n  const educationChartElement =\n    document.getElementById('aipFacultyEducationChart');\n  const certificationChartElement =\n    document.getElementById('aipFacultyCertificationChart');\n\n  let headers = [];\n  let records = [];\n  let viewMode = 'card';\n\n  let keys = {\n    name:null,\n    institution:null,\n    rank:null,\n    education:null,\n    certification:null,\n    expertise:null,\n    program:null,\n    photo:null,\n    email:null,\n    sinta:null,\n    scopus:null,\n    orcid:null,\n    scholar:null\n  };\n\n  function setHeaderOffset(){\n    if(!pageElement) return;\n\n    const header =\n      document.getElementById('aipnemaSiteHeader') ||\n      document.querySelector('#masthead, .site-header');\n\n    if(!header) return;\n\n    const style = window.getComputedStyle(header);\n    const overlay =\n      ['absolute','fixed','sticky'].includes(style.position);\n\n    pageElement.style.paddingTop =\n      overlay ? header.offsetHeight + 'px' : '0px';\n\n    pageElement.style.setProperty(\n      '--aip-faculty-header-offset',\n      (header.offsetHeight + 24) + 'px'\n    );\n  }\n\n  function normalize(value){\n    return String(value || '')\n      .trim()\n      .toLowerCase()\n      .normalize('NFD')\n      .replace(\/[\\u0300-\\u036f]\/g,'')\n      .replace(\/[^a-z0-9]+\/g,' ')\n      .replace(\/\\s+\/g,' ')\n      .trim();\n  }\n\n  function valueOf(value){\n    if(value === null || typeof value === 'undefined') return '';\n    return String(value).trim();\n  }\n\n  function escapeHtml(value){\n    return String(value || '')\n      .replace(\/&\/g,'&amp;')\n      .replace(\/<\/g,'&lt;')\n      .replace(\/>\/g,'&gt;')\n      .replace(\/\"\/g,'&quot;')\n      .replace(\/'\/g,'&#039;');\n  }\n\n  function nameSortKey(value){\n    let name = valueOf(value);\n\n    if(!name) return '';\n\n    name = name.split(',')[0];\n\n    const titles =\n      \/^(?:(?:prof(?:esor)?|dr|drs|dra|ir|apt|ns|ners|hj|h|kh|ust|ustadz|ustazah|skm|s\\.?kep|m\\.?kep|ph\\.?d|mph|mkm|msn|man)\\.?\\s+)+\/i;\n\n    let previous;\n\n    do{\n      previous = name;\n      name = name.replace(titles,'').trim();\n    }while(name !== previous);\n\n    return normalize(name);\n  }\n\n  function initials(value){\n    const academicTokens = new Set([\n      'prof','profesor','dr','drs','dra','ir','apt','ns','ners',\n      'skep','mkep','phd','mph','mkm','msn','man','spkep'\n    ]);\n\n    const words = valueOf(value)\n      .replace(\/[.,()]\/g,' ')\n      .split(\/\\s+\/)\n      .filter(Boolean)\n      .filter(function(word){\n        return !academicTokens.has(normalize(word));\n      });\n\n    return words.slice(0,2)\n      .map(function(word){\n        return word.charAt(0).toUpperCase();\n      })\n      .join('') || 'DS';\n  }\n\n  function ensureUrl(value){\n    const text = valueOf(value);\n\n    if(!text) return '';\n\n    if(\/^https?:\\\/\\\/\/i.test(text)){\n      return text;\n    }\n\n    if(\/^www\\.\/i.test(text)){\n      return 'https:\/\/' + text;\n    }\n\n    if(\n      \/^[a-z0-9.-]+\\.[a-z]{2,}(\\\/.*)?$\/i.test(text)\n    ){\n      return 'https:\/\/' + text;\n    }\n\n    return '';\n  }\n\n  function driveImageUrl(value){\n    const url = ensureUrl(value);\n\n    if(!url) return '';\n\n    let match = url.match(\n      \/drive\\.google\\.com\\\/file\\\/d\\\/([^\/?#]+)\/\n    );\n\n    if(!match){\n      match = url.match(\/[?&]id=([^&#]+)\/);\n    }\n\n    if(match){\n      return 'https:\/\/drive.google.com\/uc?export=view&id=' +\n        match[1];\n    }\n\n    return url;\n  }\n\n  function normalizeEmail(value){\n    const text = valueOf(value)\n      .replace(\/^mailto:\/i,'')\n      .trim();\n\n    if(!text) return '';\n\n    return \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(text)\n      ? text\n      : '';\n  }\n\n  function profileUrl(type,value){\n    const text = valueOf(value);\n\n    if(!text) return '';\n\n    const existingUrl = ensureUrl(text);\n\n    if(existingUrl) return existingUrl;\n\n    if(type === 'sinta' && \/^[0-9]+$\/.test(text)){\n      return 'https:\/\/sinta.kemdikbud.go.id\/authors\/profile\/' + text;\n    }\n\n    if(type === 'scopus'){\n      return 'https:\/\/www.scopus.com\/authid\/detail.uri?authorId=' +\n        encodeURIComponent(text);\n    }\n\n    if(type === 'orcid'){\n      return 'https:\/\/orcid.org\/' + encodeURIComponent(text);\n    }\n\n    return '';\n  }\n\n  function cellValue(cell){\n    if(!cell) return '';\n\n    if(cell.f !== null && typeof cell.f !== 'undefined'){\n      return valueOf(cell.f);\n    }\n\n    if(cell.v !== null && typeof cell.v !== 'undefined'){\n      return valueOf(cell.v);\n    }\n\n    return '';\n  }\n\n  function rowHeaderScore(row){\n    const aliases = Object.values(FIELD_ALIASES)\n      .flat()\n      .map(normalize);\n\n    return row.reduce(function(score,value){\n      const item = normalize(value);\n\n      if(!item) return score;\n\n      const matched = aliases.some(function(alias){\n        return item === alias ||\n          item.includes(alias) ||\n          alias.includes(item);\n      });\n\n      return score + (matched ? 1 : 0);\n    },0);\n  }\n\n  function uniqueHeaders(row){\n    const used = {};\n\n    return row.map(function(header,index){\n      let candidate =\n        valueOf(header) || 'Kolom ' + (index + 1);\n\n      const key = normalize(candidate) || 'kolom';\n\n      used[key] = (used[key] || 0) + 1;\n\n      if(used[key] > 1){\n        candidate += ' ' + used[key];\n      }\n\n      return candidate;\n    });\n  }\n\n  function parseResponse(response){\n    if(!response || response.status === 'error'){\n      throw new Error('Data dosen belum dapat dibaca.');\n    }\n\n    const table = response.table;\n\n    if(\n      !table ||\n      !Array.isArray(table.cols) ||\n      !Array.isArray(table.rows)\n    ){\n      throw new Error('Format data belum dapat dikenali.');\n    }\n\n    const columnCount = table.cols.length;\n\n    const matrix = table.rows.map(function(row){\n      return Array.from({length:columnCount},function(_,index){\n        return cellValue(row.c ? row.c[index] : null);\n      });\n    });\n\n    if(!matrix.length){\n      throw new Error('Daftar dosen belum tersedia.');\n    }\n\n    let headerIndex = 0;\n    let headerScore = -1;\n\n    matrix.slice(0,15).forEach(function(row,index){\n      const score = rowHeaderScore(row);\n\n      if(score > headerScore){\n        headerScore = score;\n        headerIndex = index;\n      }\n    });\n\n    if(headerScore < 2){\n      headerIndex = matrix.findIndex(function(row){\n        return row.filter(Boolean).length >= 2;\n      });\n\n      if(headerIndex < 0) headerIndex = 0;\n    }\n\n    const parsedHeaders =\n      uniqueHeaders(matrix[headerIndex]);\n\n    const parsedRecords = matrix\n      .slice(headerIndex + 1)\n      .map(function(row){\n        const record = {};\n\n        parsedHeaders.forEach(function(header,index){\n          record[header] = valueOf(row[index]);\n        });\n\n        return record;\n      })\n      .filter(function(record){\n        return parsedHeaders.some(function(header){\n          return valueOf(record[header]);\n        });\n      });\n\n    return {\n      headers:parsedHeaders,\n      records:parsedRecords\n    };\n  }\n\n  function parseVisualizationText(text){\n    const match = String(text || '').match(\n      \/google\\.visualization\\.Query\\.setResponse\\(([\\s\\S]*)\\);?\\s*$\/\n    );\n\n    if(!match){\n      throw new Error('Respons data belum dapat diproses.');\n    }\n\n    return JSON.parse(match[1]);\n  }\n\n  function findHeader(aliases){\n    const normalizedAliases = aliases.map(normalize);\n\n    const exact = headers.find(function(header){\n      return normalizedAliases.includes(normalize(header));\n    });\n\n    if(exact) return exact;\n\n    return headers.find(function(header){\n      const item = normalize(header);\n\n      return normalizedAliases.some(function(alias){\n        return item.includes(alias) ||\n          alias.includes(item);\n      });\n    }) || null;\n  }\n\n  function configureFields(){\n    Object.keys(keys).forEach(function(key){\n      keys[key] = findHeader(FIELD_ALIASES[key]);\n    });\n\n    if(!keys.name){\n      keys.name = headers[0] || null;\n    }\n\n    if(!keys.institution){\n      keys.institution = headers.find(function(header){\n        return header !== keys.name;\n      }) || null;\n    }\n  }\n\n  function uniqueValues(key){\n    if(!key) return [];\n\n    return Array.from(\n      new Set(\n        records\n          .map(function(record){\n            return valueOf(record[key]);\n          })\n          .filter(Boolean)\n      )\n    ).sort(function(a,b){\n      return a.localeCompare(\n        b,\n        'id',\n        {sensitivity:'base',numeric:true}\n      );\n    });\n  }\n\n  function setOptions(element,values,defaultLabel){\n    element.innerHTML =\n      '<option value=\"\">' +\n      escapeHtml(defaultLabel) +\n      '<\/option>';\n\n    values.forEach(function(value){\n      element.insertAdjacentHTML(\n        'beforeend',\n        '<option value=\"' +\n        escapeHtml(value) +\n        '\">' +\n        escapeHtml(value) +\n        '<\/option>'\n      );\n    });\n  }\n\n  function populateFilters(){\n    setOptions(\n      institutionElement,\n      uniqueValues(keys.institution),\n      'Semua institusi'\n    );\n\n    setOptions(\n      rankElement,\n      uniqueValues(keys.rank),\n      'Semua jabatan akademik'\n    );\n\n    rankElement.hidden =\n      !(keys.rank && uniqueValues(keys.rank).length);\n  }\n\n  function updateStats(){\n    totalElement.textContent = records.length;\n\n    institutionCountElement.textContent =\n      keys.institution\n        ? uniqueValues(keys.institution).length\n        : '\u2013';\n  }\n\n\n  function normalizeRankCategory(value){\n    const raw = valueOf(value);\n    const item = normalize(raw);\n\n    if(!item) return 'Belum Diisi';\n    if(\/guru besar|profesor\/.test(item)) return 'Profesor\/Guru Besar';\n    if(\/lektor kepala\/.test(item)) return 'Lektor Kepala';\n    if(\/asisten ahli\/.test(item)) return 'Asisten Ahli';\n    if(\/tenaga pengajar\/.test(item)) return 'Tenaga Pengajar';\n    if(\/lektor\/.test(item)) return 'Lektor';\n\n    return raw;\n  }\n\n  function normalizeEducationCategory(value){\n    const raw = valueOf(value);\n    const item = normalize(raw);\n\n    if(!item) return 'Belum Diisi';\n    if(\/doktor|s3|doctoral|doctorate\/.test(item)) return 'Doktor';\n    if(\/spesialis\/.test(item)) return 'Spesialis';\n    if(\/magister|s2|master\/.test(item)) return 'Magister';\n    if(\/sarjana|s1|bachelor\/.test(item)) return 'Sarjana';\n    if(\/diploma|d3|d4\/.test(item)) return 'Diploma';\n\n    return raw;\n  }\n\n  function normalizeCertificationCategory(value){\n    const raw = valueOf(value);\n    const item = normalize(raw);\n\n    if(!item) return 'Belum Diisi';\n\n    if(\n      \/belum|tidak|non|not certified|uncertified\/.test(item)\n    ){\n      return 'Belum Tersertifikasi';\n    }\n\n    if(\n      \/tersertifikasi|sudah|ya|yes|certified|aktif\/.test(item)\n    ){\n      return 'Tersertifikasi';\n    }\n\n    return raw;\n  }\n\n  function buildDistribution(key,normalizer,preferredOrder){\n    const counts = new Map();\n\n    records.forEach(function(record){\n      const category = normalizer(\n        key ? record[key] : ''\n      );\n\n      counts.set(\n        category,\n        (counts.get(category) || 0) + 1\n      );\n    });\n\n    const order = new Map(\n      preferredOrder.map(function(item,index){\n        return [item,index];\n      })\n    );\n\n    return Array.from(counts.entries())\n      .map(function(entry){\n        return {\n          label:entry[0],\n          count:entry[1],\n          percentage:records.length\n            ? (entry[1] \/ records.length) * 100\n            : 0\n        };\n      })\n      .sort(function(a,b){\n        const orderA = order.has(a.label)\n          ? order.get(a.label)\n          : preferredOrder.length + 1;\n\n        const orderB = order.has(b.label)\n          ? order.get(b.label)\n          : preferredOrder.length + 1;\n\n        if(orderA !== orderB) return orderA - orderB;\n        if(a.count !== b.count) return b.count - a.count;\n\n        return a.label.localeCompare(\n          b.label,\n          'id',\n          {sensitivity:'base'}\n        );\n      });\n  }\n\n  function formatPercentage(value){\n    const rounded = Math.round(value * 10) \/ 10;\n\n    return Number.isInteger(rounded)\n      ? rounded + '%'\n      : rounded.toFixed(1).replace('.',',') + '%';\n  }\n\n  function colorWithAlpha(hex,alpha){\n    const clean = String(hex || '').replace('#','');\n\n    if(!\/^[0-9a-f]{6}$\/i.test(clean)){\n      return hex;\n    }\n\n    const red = parseInt(clean.slice(0,2),16);\n    const green = parseInt(clean.slice(2,4),16);\n    const blue = parseInt(clean.slice(4,6),16);\n\n    return 'rgba(' +\n      red + ',' +\n      green + ',' +\n      blue + ',' +\n      alpha + ')';\n  }\n\n  function buildConicGradient(data,palette,activeIndex){\n    let currentDegree = 0;\n    const stops = [];\n\n    data.forEach(function(item,index){\n      const degree =\n        records.length\n          ? (item.count \/ records.length) * 360\n          : 0;\n\n      const start = currentDegree;\n      const end = currentDegree + degree;\n      const baseColor = palette[index % palette.length];\n\n      const color =\n        typeof activeIndex === 'number' && activeIndex !== index\n          ? colorWithAlpha(baseColor,.16)\n          : baseColor;\n\n      stops.push(\n        color + ' ' + start.toFixed(3) + 'deg ' +\n        end.toFixed(3) + 'deg'\n      );\n\n      currentDegree = end;\n    });\n\n    return 'conic-gradient(from -90deg,' +\n      stops.join(',') +\n      ')';\n  }\n\n  function donutMarkup(data,palette){\n    if(!data.length || !records.length){\n      return `\n        <div class=\"aip-faculty-chart-empty\">\n          Data untuk grafik ini belum tersedia.\n        <\/div>\n      `;\n    }\n\n    const normalGradient =\n      buildConicGradient(data,palette);\n\n    const legends = data.map(function(item,index){\n      const color = palette[index % palette.length];\n\n      return `\n        <div\n          class=\"aip-faculty-legend-item\"\n          data-legend=\"${index}\"\n          tabindex=\"0\"\n        >\n          <span\n            class=\"aip-faculty-legend-dot\"\n            style=\"background:${color};color:${color}\"\n          ><\/span>\n\n          <span class=\"aip-faculty-legend-label\">\n            ${escapeHtml(item.label)}\n          <\/span>\n\n          <span class=\"aip-faculty-legend-value\">\n            <strong>${formatPercentage(item.percentage)}<\/strong>\n            <span>${item.count}<\/span>\n          <\/span>\n        <\/div>\n      `;\n    }).join('');\n\n    return `\n      <div class=\"aip-faculty-donut-layout\">\n        <div class=\"aip-faculty-donut-wrap\">\n          <div\n            class=\"aip-faculty-donut-ring\"\n            data-donut-ring\n            style=\"--donut-gradient:${normalGradient}\"\n            role=\"img\"\n            aria-label=\"Grafik persentase dosen\"\n          ><\/div>\n\n          <div class=\"aip-faculty-donut-center\">\n            <strong data-chart-center-value>${records.length}<\/strong>\n            <span data-chart-center-label>Dosen<\/span>\n          <\/div>\n        <\/div>\n\n        <div class=\"aip-faculty-chart-legend\">\n          ${legends}\n        <\/div>\n      <\/div>\n    `;\n  }\n\n  function activateDonutInteractions(container,data,palette){\n    const ring =\n      container.querySelector('[data-donut-ring]');\n\n    const legends = Array.from(\n      container.querySelectorAll('.aip-faculty-legend-item')\n    );\n\n    const centerValue =\n      container.querySelector('[data-chart-center-value]');\n    const centerLabel =\n      container.querySelector('[data-chart-center-label]');\n\n    const normalGradient =\n      buildConicGradient(data,palette);\n\n    window.requestAnimationFrame(function(){\n      window.requestAnimationFrame(function(){\n        if(ring){\n          ring.classList.add('is-drawn');\n        }\n      });\n    });\n\n    function highlight(index){\n      if(ring){\n        ring.style.setProperty(\n          '--donut-gradient',\n          buildConicGradient(data,palette,index)\n        );\n        ring.classList.add('is-highlighted');\n      }\n\n      if(centerValue && centerLabel && data[index]){\n        centerValue.textContent =\n          formatPercentage(data[index].percentage);\n        centerLabel.textContent = data[index].label;\n      }\n    }\n\n    function reset(){\n      if(ring){\n        ring.style.setProperty(\n          '--donut-gradient',\n          normalGradient\n        );\n        ring.classList.remove('is-highlighted');\n      }\n\n      if(centerValue && centerLabel){\n        centerValue.textContent = records.length;\n        centerLabel.textContent = 'Dosen';\n      }\n    }\n\n    legends.forEach(function(legend,index){\n      legend.addEventListener('mouseenter',function(){\n        highlight(index);\n      });\n\n      legend.addEventListener('mouseleave',reset);\n\n      legend.addEventListener('focus',function(){\n        highlight(index);\n      });\n\n      legend.addEventListener('blur',reset);\n    });\n  }\n\n  function renderDonutChart(container,data,palette){\n    if(!container) return;\n\n    container.innerHTML = donutMarkup(data,palette);\n    activateDonutInteractions(container,data,palette);\n\n    const card = container.closest('.aip-faculty-chart-card');\n\n    if(card){\n      card.classList.add('is-ready');\n    }\n  }\n\n  function renderCharts(){\n    const rankData = buildDistribution(\n      keys.rank,\n      normalizeRankCategory,\n      [\n        'Profesor\/Guru Besar',\n        'Lektor Kepala',\n        'Lektor',\n        'Asisten Ahli',\n        'Tenaga Pengajar',\n        'Belum Diisi'\n      ]\n    );\n\n    const educationData = buildDistribution(\n      keys.education,\n      normalizeEducationCategory,\n      [\n        'Doktor',\n        'Spesialis',\n        'Magister',\n        'Sarjana',\n        'Diploma',\n        'Belum Diisi'\n      ]\n    );\n\n    const certificationData = buildDistribution(\n      keys.certification,\n      normalizeCertificationCategory,\n      [\n        'Tersertifikasi',\n        'Belum Tersertifikasi',\n        'Belum Diisi'\n      ]\n    );\n\n    renderDonutChart(\n      rankChartElement,\n      rankData,\n      [\n        '#094528',\n        '#D8B25C',\n        '#1E6292',\n        '#7656C9',\n        '#E47B2B',\n        '#B7486A',\n        '#93A39A'\n      ]\n    );\n\n    renderDonutChart(\n      educationChartElement,\n      educationData,\n      [\n        '#1E6292',\n        '#7656C9',\n        '#0C5A35',\n        '#D8B25C',\n        '#E47B2B',\n        '#B7486A',\n        '#93A39A'\n      ]\n    );\n\n    renderDonutChart(\n      certificationChartElement,\n      certificationData,\n      [\n        '#0C5A35',\n        '#D8B25C',\n        '#93A39A',\n        '#1E6292'\n      ]\n    );\n  }\n\n  function showChartError(){\n    [\n      rankChartElement,\n      educationChartElement,\n      certificationChartElement\n    ].forEach(function(container){\n      if(!container) return;\n\n      container.innerHTML = `\n        <div class=\"aip-faculty-chart-empty\">\n          Grafik belum dapat ditampilkan.\n        <\/div>\n      `;\n    });\n  }\n\n  function profileLinks(record){\n    const links = [\n      {\n        label:'Sinta',\n        url:keys.sinta\n          ? profileUrl('sinta',record[keys.sinta])\n          : ''\n      },\n      {\n        label:'Scopus',\n        url:keys.scopus\n          ? profileUrl('scopus',record[keys.scopus])\n          : ''\n      },\n      {\n        label:'ORCID',\n        url:keys.orcid\n          ? profileUrl('orcid',record[keys.orcid])\n          : ''\n      },\n      {\n        label:'Google Scholar',\n        url:keys.scholar\n          ? profileUrl('scholar',record[keys.scholar])\n          : ''\n      }\n    ].filter(function(item){\n      return item.url;\n    });\n\n    if(!links.length) return '';\n\n    return `\n      <div class=\"aip-faculty-profile-links\">\n        ${links.map(function(item){\n          return `\n            <a\n              class=\"aip-faculty-profile-link\"\n              href=\"${escapeHtml(item.url)}\"\n              target=\"_blank\"\n              rel=\"noopener\"\n            >\n              ${escapeHtml(item.label)}\n            <\/a>\n          `;\n        }).join('')}\n      <\/div>\n    `;\n  }\n\n  function photoMarkup(record,name){\n    const photo =\n      keys.photo\n        ? driveImageUrl(record[keys.photo])\n        : '';\n\n    if(!photo){\n      return `\n        <div class=\"aip-faculty-photo-wrap\">\n          <span class=\"aip-faculty-initials\">\n            ${escapeHtml(initials(name))}\n          <\/span>\n        <\/div>\n      `;\n    }\n\n    return `\n      <div class=\"aip-faculty-photo-wrap\">\n        <img decoding=\"async\"\n          class=\"aip-faculty-photo\"\n          src=\"${escapeHtml(photo)}\"\n          alt=\"Foto ${escapeHtml(name)}\"\n          loading=\"lazy\"\n          onerror=\"this.style.display='none';this.nextElementSibling.style.display='grid'\"\n        >\n        <span class=\"aip-faculty-initials\" style=\"display:none\">\n          ${escapeHtml(initials(name))}\n        <\/span>\n      <\/div>\n    `;\n  }\n\n  function detailMarkup(label,value){\n    const text = valueOf(value);\n\n    if(!text) return '';\n\n    return `\n      <div class=\"aip-faculty-detail\">\n        <span>${escapeHtml(label)}<\/span>\n        <strong>${escapeHtml(text)}<\/strong>\n      <\/div>\n    `;\n  }\n\n  function cardMarkup(record){\n    const name =\n      valueOf(record[keys.name]) ||\n      'Nama belum dicantumkan';\n\n    const institution =\n      keys.institution\n        ? valueOf(record[keys.institution])\n        : '';\n\n    const email =\n      keys.email\n        ? normalizeEmail(record[keys.email])\n        : '';\n\n    const rank =\n      keys.rank\n        ? valueOf(record[keys.rank])\n        : '';\n\n    const education =\n      keys.education\n        ? valueOf(record[keys.education])\n        : '';\n\n    const expertise =\n      keys.expertise\n        ? valueOf(record[keys.expertise])\n        : '';\n\n    const certification =\n      keys.certification\n        ? normalizeCertificationCategory(\n            record[keys.certification]\n          )\n        : '';\n\n    const program =\n      keys.program\n        ? valueOf(record[keys.program])\n        : '';\n\n    return `\n      <article class=\"aip-faculty-card\">\n        <div class=\"aip-faculty-card-head\">\n          ${photoMarkup(record,name)}\n\n          <div class=\"aip-faculty-card-title\">\n            <h3>${escapeHtml(name)}<\/h3>\n\n            ${institution\n              ? `<p>${escapeHtml(institution)}<\/p>`\n              : ''\n            }\n\n            ${email\n              ? `\n                <div class=\"aip-faculty-email\">\n                  <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n                    <path d=\"M3 6h18v12H3V6Z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\"\/>\n                    <path d=\"m4 7 8 6 8-6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>\n                  <\/svg>\n\n                  <a href=\"mailto:${escapeHtml(email)}\">\n                    ${escapeHtml(email)}\n                  <\/a>\n                <\/div>\n              `\n              : ''\n            }\n          <\/div>\n        <\/div>\n\n        <div class=\"aip-faculty-card-body\">\n          <div class=\"aip-faculty-badges\">\n            ${rank\n              ? `\n                <span class=\"aip-faculty-badge aip-faculty-badge-gold\">\n                  ${escapeHtml(rank)}\n                <\/span>\n              `\n              : ''\n            }\n\n            ${program\n              ? `\n                <span class=\"aip-faculty-badge\">\n                  ${escapeHtml(program)}\n                <\/span>\n              `\n              : ''\n            }\n\n            ${certification && certification !== 'Belum Diisi'\n              ? `\n                <span class=\"aip-faculty-badge ${\n                  certification === 'Tersertifikasi'\n                    ? 'aip-faculty-badge-certified'\n                    : 'aip-faculty-badge-uncertified'\n                }\">\n                  ${escapeHtml(certification)}\n                <\/span>\n              `\n              : ''\n            }\n          <\/div>\n\n          <div class=\"aip-faculty-details\">\n            ${detailMarkup('Pendidikan',education)}\n            ${detailMarkup('Keahlian',expertise)}\n          <\/div>\n\n          ${profileLinks(record)}\n        <\/div>\n      <\/article>\n    `;\n  }\n\n  function filteredRecords(){\n    const term = normalize(searchElement.value);\n    const selectedInstitution = institutionElement.value;\n    const selectedRank = rankElement.value;\n\n    const filtered = records.filter(function(record){\n      const publicText = [\n        valueOf(record[keys.name]),\n        keys.institution\n          ? valueOf(record[keys.institution])\n          : '',\n        keys.rank\n          ? valueOf(record[keys.rank])\n          : '',\n        keys.education\n          ? valueOf(record[keys.education])\n          : '',\n        keys.certification\n          ? valueOf(record[keys.certification])\n          : '',\n        keys.expertise\n          ? valueOf(record[keys.expertise])\n          : '',\n        keys.program\n          ? valueOf(record[keys.program])\n          : '',\n        keys.email\n          ? valueOf(record[keys.email])\n          : ''\n      ].join(' ');\n\n      const matchesSearch =\n        !term || normalize(publicText).includes(term);\n\n      const matchesInstitution =\n        !selectedInstitution ||\n        valueOf(record[keys.institution]) ===\n          selectedInstitution;\n\n      const matchesRank =\n        !selectedRank ||\n        valueOf(record[keys.rank]) === selectedRank;\n\n      return matchesSearch &&\n        matchesInstitution &&\n        matchesRank;\n    });\n\n    const collator = new Intl.Collator('id',{\n      sensitivity:'base',\n      numeric:true\n    });\n\n    filtered.sort(function(a,b){\n      const nameA = nameSortKey(a[keys.name]);\n      const nameB = nameSortKey(b[keys.name]);\n\n      if(sortElement.value === 'name-desc'){\n        return collator.compare(nameB,nameA);\n      }\n\n      if(sortElement.value === 'institution'){\n        const institutionCompare = collator.compare(\n          valueOf(a[keys.institution]),\n          valueOf(b[keys.institution])\n        );\n\n        if(institutionCompare !== 0){\n          return institutionCompare;\n        }\n      }\n\n      return collator.compare(nameA,nameB);\n    });\n\n    return filtered;\n  }\n\n  function renderTable(items){\n    const columns = [\n      {label:'Nama Dosen',key:keys.name},\n      {label:'Institusi',key:keys.institution},\n      {label:'Email',key:keys.email},\n      {label:'Jabatan Akademik',key:keys.rank},\n      {label:'Pendidikan',key:keys.education},\n      {label:'Sertifikasi Dosen',key:keys.certification},\n      {label:'Bidang Keahlian',key:keys.expertise}\n    ].filter(function(column){\n      return column.key;\n    });\n\n    tableHeadElement.innerHTML = `\n      <tr>\n        ${columns.map(function(column){\n          return '<th>' + escapeHtml(column.label) + '<\/th>';\n        }).join('')}\n      <\/tr>\n    `;\n\n    tableBodyElement.innerHTML = items.map(function(record){\n      return `\n        <tr>\n          ${columns.map(function(column,index){\n            const value =\n              valueOf(record[column.key]) || '\u2014';\n\n            const isEmailColumn =\n              column.key === keys.email &&\n              normalizeEmail(value);\n\n            return `\n              <td>\n                ${index === 0\n                  ? '<strong>' + escapeHtml(value) + '<\/strong>'\n                  : isEmailColumn\n                    ? '<a href=\"mailto:' +\n                      escapeHtml(normalizeEmail(value)) +\n                      '\" style=\"color:#094528;font-weight:700;text-decoration:none\">' +\n                      escapeHtml(normalizeEmail(value)) +\n                      '<\/a>'\n                    : escapeHtml(value)\n                }\n              <\/td>\n            `;\n          }).join('')}\n        <\/tr>\n      `;\n    }).join('');\n  }\n\n  function render(){\n    const items = filteredRecords();\n\n    resultTextElement.textContent =\n      items.length +\n      ' dari ' +\n      records.length +\n      ' dosen ditampilkan';\n\n    if(!items.length){\n      gridElement.innerHTML = `\n        <div class=\"aip-faculty-state\">\n          <strong>Dosen tidak ditemukan.<\/strong>\n          Ubah kata kunci atau pilihan filter.\n        <\/div>\n      `;\n\n      tableHeadElement.innerHTML = '';\n      tableBodyElement.innerHTML = '';\n      return;\n    }\n\n    gridElement.innerHTML =\n      items.map(cardMarkup).join('');\n\n    renderTable(items);\n  }\n\n  function setView(mode){\n    viewMode = mode;\n    const isCard = viewMode === 'card';\n\n    gridElement.hidden = !isCard;\n    tableViewElement.hidden = isCard;\n\n    cardViewElement.classList.toggle('is-active',isCard);\n    tableViewButtonElement.classList.toggle('is-active',!isCard);\n  }\n\n  function initializeData(parsed){\n    headers = parsed.headers;\n    records = parsed.records;\n\n    configureFields();\n\n    records = records.filter(function(record){\n      return valueOf(record[keys.name]);\n    });\n\n    if(!records.length){\n      throw new Error('Daftar dosen belum tersedia.');\n    }\n\n    populateFilters();\n    updateStats();\n    renderCharts();\n    render();\n    setView('card');\n  }\n\n  function showError(error){\n    const message =\n      error && error.message\n        ? error.message\n        : 'Data dosen belum dapat dimuat.';\n\n    gridElement.innerHTML = `\n      <div class=\"aip-faculty-state\">\n        <strong>Data dosen belum dapat dimuat.<\/strong>\n        ${escapeHtml(message)}\n        Silakan hubungi administrator website.\n      <\/div>\n    `;\n\n    resultTextElement.textContent =\n      'Data dosen belum dapat dimuat';\n\n    showChartError();\n\n    totalElement.textContent = '\u2013';\n    institutionCountElement.textContent = '\u2013';\n  }\n\n  function visualizationUrl(includeCallback){\n    const parameters = new URLSearchParams();\n\n    parameters.set('gid',SHEET_GID);\n    parameters.set('headers','0');\n    parameters.set('_',String(Date.now()));\n\n    if(includeCallback){\n      parameters.set(\n        'tqx',\n        'out:json;responseHandler:aipnemaFacultyReceive'\n      );\n    }else{\n      parameters.set('tqx','out:json');\n    }\n\n    return SHEET_BASE + '?' + parameters.toString();\n  }\n\n  function loadWithJsonp(){\n    return new Promise(function(resolve,reject){\n      const script = document.createElement('script');\n      let completed = false;\n\n      const timeout = window.setTimeout(function(){\n        if(completed) return;\n\n        completed = true;\n        script.remove();\n\n        reject(new Error(\n          'Waktu pemuatan data telah habis.'\n        ));\n      },15000);\n\n      window.aipnemaFacultyReceive = function(response){\n        if(completed) return;\n\n        completed = true;\n        window.clearTimeout(timeout);\n        script.remove();\n        resolve(response);\n      };\n\n      script.onerror = function(){\n        if(completed) return;\n\n        completed = true;\n        window.clearTimeout(timeout);\n        script.remove();\n\n        reject(new Error(\n          'Data belum dapat dihubungi.'\n        ));\n      };\n\n      script.src = visualizationUrl(true);\n      document.head.appendChild(script);\n    });\n  }\n\n  async function loadData(){\n    try{\n      let responseObject;\n\n      try{\n        const response = await fetch(\n          visualizationUrl(false),\n          {cache:'no-store'}\n        );\n\n        if(!response.ok){\n          throw new Error('Permintaan data gagal.');\n        }\n\n        responseObject =\n          parseVisualizationText(await response.text());\n      }catch(fetchError){\n        responseObject = await loadWithJsonp();\n      }\n\n      initializeData(parseResponse(responseObject));\n    }catch(error){\n      showError(error);\n    }\n  }\n\n  searchElement.addEventListener('input',render);\n  institutionElement.addEventListener('change',render);\n  rankElement.addEventListener('change',render);\n  sortElement.addEventListener('change',render);\n\n  resetElement.addEventListener('click',function(){\n    searchElement.value = '';\n    institutionElement.value = '';\n    rankElement.value = '';\n    sortElement.value = 'name-asc';\n    render();\n  });\n\n  cardViewElement.addEventListener('click',function(){\n    setView('card');\n  });\n\n  tableViewButtonElement.addEventListener('click',function(){\n    setView('table');\n  });\n\n  setHeaderOffset();\n  loadData();\n\n  window.addEventListener('load',setHeaderOffset);\n  window.addEventListener('resize',setHeaderOffset);\n})();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Beranda \/ Dosen AIPNEMA Jejaring Akademisi Keperawatan PTMA Dosen AIPNEMA Direktori dosen pada institusi pendidikan keperawatan Muhammadiyah dan \u2018Aisyiyah yang menjadi bagian dari jejaring AIPNEMA. Temukan dosen berdasarkan nama, institusi, jabatan akademik, dan bidang keahlian. \u2013 Dosen terdata \u2013 Institusi anggota Profil Dosen Komposisi akademik dosen AIPNEMA. Persentase jabatan fungsional, pendidikan terakhir, dan sertifikasi dosen&#8230;<\/p>","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"disable","_kad_post_title":"hide","_kad_post_layout":"fullwidth","_kad_post_sidebar_id":"","_kad_post_content_style":"unboxed","_kad_post_vertical_padding":"hide","_kad_post_feature":"hide","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-1922","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/aipnemaptma.org\/en\/wp-json\/wp\/v2\/pages\/1922","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aipnemaptma.org\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/aipnemaptma.org\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/aipnemaptma.org\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/aipnemaptma.org\/en\/wp-json\/wp\/v2\/comments?post=1922"}],"version-history":[{"count":7,"href":"https:\/\/aipnemaptma.org\/en\/wp-json\/wp\/v2\/pages\/1922\/revisions"}],"predecessor-version":[{"id":1932,"href":"https:\/\/aipnemaptma.org\/en\/wp-json\/wp\/v2\/pages\/1922\/revisions\/1932"}],"wp:attachment":[{"href":"https:\/\/aipnemaptma.org\/en\/wp-json\/wp\/v2\/media?parent=1922"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}