{"id":2925,"date":"2026-07-26T00:35:49","date_gmt":"2026-07-26T00:35:49","guid":{"rendered":"https:\/\/imo.udec.cl\/?page_id=2925"},"modified":"2026-09-02T13:19:39","modified_gmt":"2026-09-02T13:19:39","slug":"repositorio","status":"publish","type":"page","link":"https:\/\/imo.udec.cl\/en\/repositorio\/","title":{"rendered":"repository"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2925\" class=\"elementor elementor-2925\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5b8c611 e-con e-atomic-element e-flexbox-base e-5b8c611-8caa809 \" data-id=\"5b8c611\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"5b8c611\" data-e-type=\"e-flexbox\" data-id=\"5b8c611\">\n    \t\t<div class=\"elementor-element elementor-element-bcb14d7 elementor-widget elementor-widget-heading\" data-id=\"bcb14d7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Repositorio <\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9aa695e elementor-widget elementor-widget-text-editor\" data-id=\"9aa695e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Publicaciones cient\u00edficas del Instituto Milenio de Oceanograf\u00eda durante su primer periodo, 2014 &#8211; 2025.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-2cfe520 e-flex e-con-boxed e-con e-parent\" data-id=\"2cfe520\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f4b689e elementor-widget elementor-widget-html\" data-id=\"f4b689e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"es\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<title>Publicaciones por a\u00f1o<\/title>\n<style>\n\n:root{--navy:#172a49;--tab:#f2f3f5;--tabText:#0a3475;--active:#b5a77b;--title:#172033;--text:#5c6b85;--lineBg:#edfff4;--lineBd:#a5ebc0;--lineTx:#176b3b;--yearBg:#eef8ff;--yearBd:#adddff;--yearTx:#075e9f}\n\n*{box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n\nhtml{scroll-behavior:smooth}\n\nbody{margin:0;min-height:100vh;background:#172a49;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;color:var(--text)}\n\nbutton,a{font:inherit}\n\n.layout{display:grid;grid-template-columns:minmax(230px,300px) minmax(0,1fr);gap:24px;align-items:start;width:100%;min-height:100vh;position:relative}\n\n.sidebar{position:relative;top:auto;align-self:start;width:100%;height:auto;padding:0 0 36px;overflow:visible;background:#172a49;z-index:1}\n\n.tabs{display:grid;gap:12px}\n\n.mobile-year-select{display:none;width:100%;min-height:48px;padding:10px 14px;border:1px solid rgba(255,255,255,.28);border-radius:8px;background:#fff;color:var(--tabText);font-size:16px;font-weight:750}\n\n.tab{width:100%;min-height:62px;padding:14px 38px;border:0;border-radius:0;background:var(--tab);color:var(--tabText);cursor:pointer;font-size:19px;font-weight:800;text-align:left;transition:background .18s ease,color .18s ease,transform .18s ease}\n\n.card:hover{transform:translateY(-2px);box-shadow:0 6px 16px rgba(0,0,0,.05)}\n.tab:hover{background:#fff;color:#fff;transform:translateX(3px)}\n\n.tab.active{background:var(--active);color:#fff}\n\n.tab:focus-visible,.card:focus-visible{outline:3px solid #72b7ff;outline-offset:3px}\n\n.panel{min-width:0;width:100%;padding:0 0 34px;position:relative;z-index:1}\n\n.list{display:grid;gap:30px}\n\n.card{display:block;width:100%;padding:26px 29px 25px;background:#fff;border:0;border-radius:12px;color:inherit;text-decoration:none;transition:transform .18s ease,box-shadow .18s ease}\n\n\n\n.title{margin:0 0 17px;color:var(--title);font-size:clamp(18px,1.35vw,22px);font-weight:760;line-height:1.28;letter-spacing:-.02em}\n\n.authors{margin:0;color:var(--text);font-size:16px;line-height:1.6}\n\n.footer{display:flex;flex-wrap:wrap;gap:10px 12px;align-items:center;margin-top:34px}\n\n.tag{display:inline-flex;align-items:center;gap:7px;min-height:34px;max-width:100%;padding:6px 14px;border:1px solid transparent;border-radius:999px;font-size:14px;font-weight:500;line-height:1.25}\n\n.tag svg{width:16px;height:16px;flex:0 0 auto;stroke-width:1.8}\n\n.line{color:var(--lineTx);background:var(--lineBg);border-color:var(--lineBd)}\n\n.year{color:var(--yearTx);background:var(--yearBg);border-color:var(--yearBd);white-space:nowrap}\n.journal{color:#92400e;background:#fef3c7;border-color:#fde68a}\n.pub-url{color:#0d9488;background:#f0fdfa;border-color:#ccfbf1;text-decoration:none}\n.pub-url:hover{color:#fff;background:#0d9488;border-color:#0d9488}\n\n\n\n\n.empty{padding:34px;background:#fff;border-radius:12px;text-align:center}\n\n@media(max-width:1100px){\n .layout{grid-template-columns:minmax(210px,250px) minmax(0,1fr);gap:18px}\n .sidebar{padding-bottom:28px}\n .tab{min-height:54px;padding:12px 26px;font-size:17px}\n .panel{padding-right:0}\n .list{gap:22px}\n}\n\n@media(max-width:760px){\n .layout{display:block}\n .sidebar{position:relative;z-index:1;top:auto;width:100%;height:auto;padding:0 0 12px;overflow:visible;background:transparent;box-shadow:none}\n .tabs{display:none}\n .mobile-year-select{display:block}\n .panel{padding:16px 0 26px}\n .list{gap:16px}\n}\n\n@media(max-width:620px){\n\n .card{padding:22px 19px;border-radius:10px}\n\n .title{font-size:18px}\n\n .authors{font-size:14px}\n\n .footer{margin-top:25px}\n\n .tag{white-space:normal}\n\n}\n\n@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}.tab,.card{transition:none}.tab:hover{transform:none}}\n\n<\/style>\n<\/head>\n<body>\n<main class=\"layout\">\n\n<aside class=\"sidebar\" aria-label=\"A\u00f1os de publicaci\u00f3n\">\n\n<nav id=\"tabs\" class=\"tabs\" aria-label=\"Seleccionar a\u00f1o\"><\/nav>\n\n<label for=\"mobileYearSelect\" class=\"sr-only\">Seleccionar a\u00f1o<\/label>\n\n<select id=\"mobileYearSelect\" class=\"mobile-year-select\" aria-label=\"Seleccionar a\u00f1o\"><\/select>\n\n<\/aside>\n\n<section class=\"panel\" aria-live=\"polite\">\n\n<div id=\"list\" class=\"list\"><\/div>\n\n<\/section>\n\n<\/main>\n\n<script>\n\nconst API_URL=\"\/intranet\/api\/publications\";\n\nlet publications=[];\n\nasync function loadPublications(){\n  const response=await fetch(API_URL, {\n    headers: {\"Accept\":\"application\/json\"}\n  });\n\n  if(!response.ok){\n    throw new Error(`HTTP ${response.status}`);\n  }\n\n  const data=await response.json();\n\n  if(!data.ok || !Array.isArray(data.publications)){\n    throw new Error(\"Respuesta de API inesperada\");\n  }\n\n  publications = data.publications.map(p => ({\n    title: p.titulo,\n    authors: p.autores,\n    year: String(p.anio),\n    research_lines: p.lineas,\n    url: p.url,\n    doi: p.doi,\n    revista: p.revista\n  }));\n}\n\nlet years=[];\n\nconst icons={\n\n line:`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" aria-hidden=\"true\"><circle cx=\"5\" cy=\"5\" r=\"2\"><\/circle><circle cx=\"5\" cy=\"19\" r=\"2\"><\/circle><circle cx=\"19\" cy=\"12\" r=\"2\"><\/circle><path d=\"M7 6.2 17 11\"><\/path><path d=\"M7 17.8 17 13\"><\/path><path d=\"M5 7v10\"><\/path><\/svg>`,\n\n year:`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" aria-hidden=\"true\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\"><\/rect><path d=\"M16 3v4M8 3v4M3 10h18\"><\/path><path d=\"M8 14h.01M12 14h.01M16 14h.01M8 18h.01M12 18h.01M16 18h.01\"><\/path><\/svg>`\n\n};\n\nconst esc=v=>String(v??\"\").replaceAll(\"&\",\"&amp;\").replaceAll(\"<\",\"&lt;\").replaceAll(\">\",\"&gt;\").replaceAll('\"',\"&quot;\").replaceAll(\"'\",\"&#039;\");\n\nfunction lines(v){\n  if(Array.isArray(v)){\n    return v.map(x => {\n      if(x && typeof x === \"object\") return x.nombre ?? x.linea ?? x.name ?? \"\";\n      return String(x ?? \"\");\n    }).map(x => x.trim()).filter(Boolean);\n  }\n\n  if(v && typeof v === \"object\") {\n    const text = v.nombre ?? v.linea ?? v.name ?? \"\";\n    return text ? [String(text).trim()] : [];\n  }\n\n  if(typeof v !== \"string\" || !v.trim()) return [];\n\n  return v.split(\/\\s*[|;]\\s*\/)\n    .map(x => x.trim())\n    .filter(Boolean);\n}\n\nfunction url(v){if(typeof v!==\"string\")return\"\";let u=v.trim();if(!u)return\"\";u=u.replace(\/^http:\\\/\\\/doi:(?=10\\.)\/i,\"https:\/\/doi.org\/\").replace(\/^https?:\\\/\\\/dx\\.doi\\.org\\\/\/i,\"https:\/\/doi.org\/\");if(\/^doi:\\s*10\\.\/i.test(u))u=\"https:\/\/doi.org\/\"+u.replace(\/^doi:\\s*\/i,\"\");if(\/^10\\.\\d{4,9}\\\/\/.test(u))u=\"https:\/\/doi.org\/\"+u;return u}\n\nfunction renderTabs(active){\n\n const el=document.getElementById(\"tabs\");\n\n const select=document.getElementById(\"mobileYearSelect\");\n\n\n el.innerHTML=years.map(y=>`<button type=\"button\" class=\"tab ${y===active?\"active\":\"\"}\" data-year=\"${y}\" aria-pressed=\"${y===active}\">${y}<\/button>`).join(\"\");\n\n el.querySelectorAll(\".tab\").forEach(b=>b.addEventListener(\"click\",()=>setYear(b.dataset.year)));\n\n\n select.innerHTML=years.map(y=>`<option value=\"${y}\" ${y===active?\"selected\":\"\"}>${y}<\/option>`).join(\"\");\n\n select.onchange=()=>setYear(select.value);\n\n}\n\nfunction renderAuthors(authors){\n  if(!Array.isArray(authors)) return esc(authors);\n\n  return authors.map((a,i)=>{\n    const nombre=String(a?.nombre ?? \"\").trim();\n    if(!nombre) return \"\";\n\n    const text=esc(nombre);\n\n    \/\/ autor_imo=1 -> nombre en negrita.\n    return Number(a?.autor_imo)===1\n      ? `<strong>${text}<\/strong>`\n      : text;\n  }).filter(Boolean).join(\"; \");\n}\n\nfunction render(year){\n\n const el=document.getElementById(\"list\");\n const items=publications.filter(p=>String(p.year)===year);\n\n if(!items.length){\n   el.innerHTML='<div class=\"empty\">No hay publicaciones disponibles para este a\u00f1o.<\/div>';\n   return;\n }\n\n el.innerHTML=items.map(p=>{\n\n   const u=url(p.url);\n\n   const lineTags=lines(p.research_lines)\n     .map(x=>`<span class=\"tag line\">${icons.line}<span>${esc(x)}<\/span><\/span>`)\n     .join(\"\");\n\n   const revista = p.revista\n     ? `<span class=\"tag journal\">${esc(p.revista)}<\/span>`\n     : \"\";\n\n   const urlTag = u\n     ? `<a class=\"tag pub-url\" href=\"${esc(u)}\" target=\"_blank\" rel=\"noopener noreferrer\">${esc(u)}<\/a>`\n     : \"\";\n\n   return `<article class=\"card\">\n     <h2 class=\"title\">${esc(p.title)}<\/h2>\n     <p class=\"authors\">${renderAuthors(p.authors)}<\/p>\n     <div class=\"footer\">\n       ${revista}\n       <span class=\"tag year\">${icons.year}<span>${esc(p.year)}<\/span><\/span>\n       ${urlTag}\n       ${lineTags}\n     <\/div>\n   <\/article>`;\n\n }).join(\"\");\n}\n\nfunction setYear(year){renderTabs(year);render(year);history.replaceState(null,\"\",\"#\"+year)}\n\nasync function init(){\n  const el=document.getElementById(\"list\");\n\n  try{\n    el.innerHTML='<div class=\"empty\">Cargando publicaciones...<\/div>';\n\n    await loadPublications();\n\n    const currentYear = new Date().getFullYear();\n    const historicalStartYear = currentYear - 1;\n\n    years=[...new Set(\n      publications\n        .map(p=>Number(p.year))\n        .filter(year => Number.isFinite(year) && year <= historicalStartYear)\n    )]\n    .sort((a,b)=>b-a)\n    .map(String);\n\n    if(!years.length){\n      el.innerHTML='<div class=\"empty\">La API no entreg\u00f3 publicaciones.<\/div>';\n      return;\n    }\n\n    const requested=location.hash.slice(1);\n    setYear(years.includes(requested)?requested:years[0]);\n\n  }catch(error){\n    console.error(\"Error cargando publicaciones:\",error);\n    el.innerHTML='<div class=\"empty\">No fue posible cargar las publicaciones.<\/div>';\n  }\n}\n\ninit();\n\n<\/script>\n\n\n<\/body>\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Repositorio Publicaciones cient\u00edficas del Instituto Milenio de Oceanograf\u00eda durante su primer periodo, 2014 &#8211; 2025. Publicaciones por a\u00f1o Seleccionar a\u00f1o<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2925","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/imo.udec.cl\/en\/wp-json\/wp\/v2\/pages\/2925","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/imo.udec.cl\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/imo.udec.cl\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/imo.udec.cl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/imo.udec.cl\/en\/wp-json\/wp\/v2\/comments?post=2925"}],"version-history":[{"count":136,"href":"https:\/\/imo.udec.cl\/en\/wp-json\/wp\/v2\/pages\/2925\/revisions"}],"predecessor-version":[{"id":4418,"href":"https:\/\/imo.udec.cl\/en\/wp-json\/wp\/v2\/pages\/2925\/revisions\/4418"}],"wp:attachment":[{"href":"https:\/\/imo.udec.cl\/en\/wp-json\/wp\/v2\/media?parent=2925"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}