{"id":26424,"date":"2025-09-09T13:30:57","date_gmt":"2025-09-09T13:30:57","guid":{"rendered":"https:\/\/edibbee.com\/beta-pibhub\/arquivo\/"},"modified":"2026-10-16T14:49:29","modified_gmt":"2026-10-16T14:49:29","slug":"arquivo","status":"publish","type":"page","link":"https:\/\/www.pibhub.pt\/pt-pt\/arquivo\/","title":{"rendered":"Arquivos"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"26424\" class=\"elementor elementor-26424 elementor-22261\">\n\t\t\t\t        <section class=\"elementor-section elementor-top-section elementor-element elementor-element-0d6368d elementor-section-stretched elementor-section-full_width elementor-section-height-min-height elementor-section-content-middle elementor-section-height-default elementor-section-items-middle pxl-row-scroll-none pxl-zoom-point-false pxl-section-overflow-visible pxl-full-content-with-space-none\" data-id=\"0d6368d\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;stretch_section&quot;:&quot;section-stretched&quot;,&quot;background_background&quot;:&quot;classic&quot;}\">\n\n                            <div class=\"elementor-background-overlay\"><\/div>\n            \n                <div class=\"elementor-container elementor-column-gap-extended \">\n                <div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5edccfc pxl-column-none pxl-column-overflow-hidden-no\" data-id=\"5edccfc\" data-element_type=\"column\" data-e-type=\"column\">\r\n        <div class=\"elementor-widget-wrap elementor-element-populated\">\r\n                     \r\n                <section class=\"elementor-section elementor-inner-section elementor-element elementor-element-b8690cb elementor-section-content-middle elementor-section-height-min-height elementor-section-full_width elementor-section-height-default pxl-row-scroll-none pxl-zoom-point-false pxl-section-overflow-visible pxl-full-content-with-space-none\" data-id=\"b8690cb\" data-element_type=\"section\" data-e-type=\"section\">\n\n                \n                <div class=\"elementor-container elementor-column-gap-default \">\n                <div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-c6d9a06 pxl-column-none pxl-column-overflow-hidden-no\" data-id=\"c6d9a06\" data-element_type=\"column\" data-e-type=\"column\">\r\n        <div class=\"elementor-widget-wrap elementor-element-populated\">\r\n                     \r\n        \t\t<div class=\"elementor-element elementor-element-96d26f1 elementor-widget elementor-widget-pxl_heading\" data-id=\"96d26f1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"pxl_heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\n<div id=\"pxl-pxl_heading-96d26f1-2374\" class=\"pxl-heading px-sub-title-default-style \">\n\t<div class=\"pxl-heading--inner\">\n\t\t\n\t\t<h3 class=\"pxl-item--title style-default ft-gt highlight-default \" data-wow-delay=\"ms\">\n\t\t\t\t\t\t\tArquivos\t\n\t\t\t\t\n\t\t<\/h3>\n\t\t\n\t<\/div>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1de8a11 elementor-widget elementor-widget-pxl_text_editor\" data-id=\"1de8a11\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"pxl_text_editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"pxl-text-editor\">\n\t<div class=\"pxl-item--inner  \" data-wow-delay=\"ms\">\n\t\t<p><i>Relat\u00f3rios e Contas Anuais do PIBhub<\/i><\/p>\n\t\t\n\t<\/div>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-49e0c37 elementor-hidden-mobile elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"49e0c37\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-14a015d elementor-hidden-mobile elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"14a015d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d188e63 elementor-hidden-mobile elementor-widget elementor-widget-pxl_breadcrumb\" data-id=\"d188e63\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"pxl_breadcrumb.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"pxl-breadcrumb-wrap\">\n\t<ul class=\"pxl-breadcrumb\"><li><span class=\"breadcrumb-entry\">In\u00edcio<\/span><\/li><\/ul><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t            <\/div>\r\n        <\/div>\r\n        \t\t\t<\/div>\n\t\t<\/section>\n\t\t            <\/div>\r\n        <\/div>\r\n        \t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-78e24b3 e-con-full e-flex e-con e-parent \" data-id=\"78e24b3\" data-element_type=\"container\" data-e-type=\"container\">\t\t<div class=\"elementor-element elementor-element-673da8f elementor-widget elementor-widget-html\" data-id=\"673da8f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- MAIN -->\r\n<section class=\"archives-section\">\r\n\r\n  <!-- LEFT: Info + Active Report Card -->\r\n  <div class=\"left-panel\">\r\n   \r\n    \r\n\r\n    <div class=\"active-report\" id=\"reportCard\">\r\n      <div class=\"report-year-label\">Ano Selecionado<\/div>\r\n      <div class=\"report-year-display\" id=\"displayYear\">2023<\/div>\r\n      <div class=\"report-title-display\">Relat\u00f3rio Anual<\/div>\r\n      <a class=\"download-btn\" id=\"downloadLink\" href=\"#\" target=\"_blank\" rel=\"noopener\">\r\n        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"14\" height=\"14\" viewbox=\"0 0 14 14\" fill=\"none\">\r\n          <path d=\"M7 1v8M4 6l3 3 3-3M1 10v1a2 2 0 002 2h8a2 2 0 002-2v-1\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><\/path>\r\n        <\/svg>\r\n Download PDF\r\n      <\/a>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- RIGHT: Wheel -->\r\n  <div class=\"right-panel\" id=\"rightPanel\">\r\n    <div class=\"wheel-container\" id=\"wheelContainer\" style=\"width: 484px; height: 484px;\"><div class=\"wheel-glow\" style=\"height: 252.8px; width: 252.8px;\"><\/div><div class=\"orbit-ring orbit-ring-1\" style=\"height: 445.6px; width: 445.6px;\"><\/div><div class=\"orbit-ring orbit-ring-2\" style=\"height: 380.8px; width: 380.8px;\"><\/div><div class=\"track-circle\" style=\"height: 316px; width: 316px;\"><\/div><div class=\"pointer\" style=\"top: 44px;\"><\/div><div class=\"hub\" style=\"height: 86px; width: 86px;\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"36.12\" height=\"36.12\" viewbox=\"0 0 26 26\" fill=\"none\">\r\n    <circle cx=\"13\" cy=\"13\" r=\"10\" stroke=\"#C9A84C\" stroke-width=\"1.5\"><\/circle>\r\n    <path d=\"M13 8v6l4 2\" stroke=\"#C9A84C\" stroke-width=\"1.5\" stroke-linecap=\"round\"><\/path>\r\n  <\/path><\/svg><\/div><div class=\"year-node active\" data-index=\"0\" style=\"width: 72px; height: 72px; left: 242px; top: 84px;\"><span class=\"year-text\" style=\"font-size:18px\">2025<\/span><\/div><div class=\"year-node\" data-index=\"1\" style=\"width: 72px; height: 72px; left: 343.56px; top: 120.965px;\"><span class=\"year-text\" style=\"font-size:18px\">2024<\/span><\/div><div class=\"year-node\" data-index=\"2\" style=\"width: 72px; height: 72px; left: 397.6px; top: 214.564px;\"><span class=\"year-text\" style=\"font-size:18px\">2023<\/span><\/div><div class=\"year-node\" data-index=\"3\" style=\"width: 72px; height: 72px; left: 378.832px; top: 321px;\"><span class=\"year-text\" style=\"font-size:18px\">2022<\/span><\/div><div class=\"year-node\" data-index=\"4\" style=\"width: 72px; height: 72px; left: 296.039px; top: 390.471px;\"><span class=\"year-text\" style=\"font-size:18px\">2021<\/span><\/div><div class=\"year-node\" data-index=\"5\" style=\"width: 72px; height: 72px; left: 187.961px; top: 390.471px;\"><span class=\"year-text\" style=\"font-size:18px\">2020<\/span><\/div><div class=\"year-node\" data-index=\"6\" style=\"width: 72px; height: 72px; left: 105.168px; top: 321px;\"><span class=\"year-text\" style=\"font-size:18px\">2019<\/span><\/div><div class=\"year-node\" data-index=\"7\" style=\"width: 72px; height: 72px; left: 86.4004px; top: 214.564px;\"><span class=\"year-text\" style=\"font-size:18px\">2018<\/span><\/div><div class=\"year-node\" data-index=\"8\" style=\"width: 72px; height: 72px; left: 140.44px; top: 120.965px;\"><span class=\"year-text\" style=\"font-size:18px\">2017<\/span><\/div><\/div>\r\n    <div class=\"hint\">\r\n      <div class=\"hint-arrows\"><span>\u2190<\/span><span>\u2192<\/span><\/div>\r\n Drag or click to rotate\r\n    <\/div>\r\n  <\/div>\r\n\r\n<\/section>\r\n\r\n<script>\r\n\/* \u2500\u2500\u2500 DATA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nconst reports = [\r\n  { year: '2025', url: 'https:\/\/www.pibhub.pt\/wp-content\/uploads\/2026\/08\/2025-PIBhub-Relatorio-e-Contas-e-Historico-de-Atividades-e-Objetivos_signed.pdf' },\r\n  { year: '2024', url: 'https:\/\/www.pibhub.pt\/wp-content\/uploads\/2026\/08\/2024-PIBhub-Relatorio-e-Contas-e-Historico-de-Atividades-e-Objetivos_signed.pdf' },\r\n  { year: '2023', url: 'https:\/\/www.pibhub.pt\/wp-content\/uploads\/2026\/08\/2023-PIBhub-Relatorio-e-Contas-e-Historico-de-Atividades-e-Objetivos_signed.pdf' },\r\n  { year: '2022', url: 'https:\/\/www.pibhub.pt\/wp-content\/uploads\/2026\/08\/2022-PIBhub-Relatorio-e-Contas-e-Historico-de-Atividades-e-Objetivos_signed.pdf' },\r\n  { year: '2021', url: 'https:\/\/www.pibhub.pt\/wp-content\/uploads\/2026\/08\/2021-PIBhub-Relatorio-e-Contas-e-Historico-de-Atividades-e-Objetivos_signed.pdf' },\r\n  { year: '2020', url: 'https:\/\/www.pibhub.pt\/wp-content\/uploads\/2025\/10\/PIBhub-Relatorio-e-Contas-2020_signed.pdf' },\r\n  { year: '2019', url: 'https:\/\/www.pibhub.pt\/wp-content\/uploads\/2025\/10\/PIBhub-Relatorio-e-Contas-2019_signed.pdf' },\r\n  { year: '2018', url: 'https:\/\/www.pibhub.pt\/wp-content\/uploads\/2025\/10\/PIBhub-Relatorio-e-Contas-2018_signed.pdf' },\r\n  { year: '2017', url: 'https:\/\/www.pibhub.pt\/wp-content\/uploads\/2025\/10\/PIBhub-Relatorio-e-Contas-2017_signed.pdf' },\r\n];\r\n\r\n\/* \u2500\u2500\u2500 RESPONSIVE SIZING \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nfunction getWheelSize() {\r\n  const vw = window.innerWidth;\r\n  if (vw <= 380)  return { radius: 100, nodeSize: 54, hubSize: 60, fontSize: 14 };\r\n  if (vw <= 480)  return { radius: 118, nodeSize: 58, hubSize: 66, fontSize: 15 };\r\n  if (vw <= 640)  return { radius: 130, nodeSize: 62, hubSize: 70, fontSize: 16 };\r\n  if (vw <= 860)  return { radius: 145, nodeSize: 66, hubSize: 76, fontSize: 17 };\r\n  return              { radius: 158, nodeSize: 72, hubSize: 86, fontSize: 18 };\r\n}\r\n\r\n\/* \u2500\u2500\u2500 STATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nconst TOTAL       = reports.length;\r\nconst container   = document.getElementById('wheelContainer');\r\nlet wheelAngle    = 0;   \/\/ degrees, cumulative\r\nlet currentIndex  = 0;\r\nlet animFrame;\r\nlet { radius: RADIUS, nodeSize: NODE_SIZE, hubSize: HUB_SIZE, fontSize: FONT_SIZE } = getWheelSize();\r\n\r\n\/* \u2500\u2500\u2500 BUILD DOM \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nlet glow, ring1, ring2, track, hub, pointer;\r\nconst nodes = [];\r\n\r\nfunction buildWheel() {\r\n  container.innerHTML = '';\r\n  const S = getWheelSize();\r\n  RADIUS = S.radius; NODE_SIZE = S.nodeSize; HUB_SIZE = S.hubSize; FONT_SIZE = S.fontSize;\r\n\r\n  const containerSize = (RADIUS + NODE_SIZE) * 2 + 24;\r\n  container.style.width  = containerSize + 'px';\r\n  container.style.height = containerSize + 'px';\r\n\r\n  const cx = containerSize \/ 2;\r\n\r\n  \/* Glow *\/\r\n  glow = document.createElement('div');\r\n  glow.className = 'wheel-glow';\r\n  glow.style.width = glow.style.height = (RADIUS * 1.6) + 'px';\r\n  container.appendChild(glow);\r\n\r\n  \/* Orbit rings *\/\r\n  ring1 = document.createElement('div');\r\n  ring1.className = 'orbit-ring orbit-ring-1';\r\n  ring1.style.width = ring1.style.height = (RADIUS * 2 + NODE_SIZE * 1.8) + 'px';\r\n  container.appendChild(ring1);\r\n\r\n  ring2 = document.createElement('div');\r\n  ring2.className = 'orbit-ring orbit-ring-2';\r\n  ring2.style.width = ring2.style.height = (RADIUS * 2 + NODE_SIZE * 0.9) + 'px';\r\n  container.appendChild(ring2);\r\n\r\n  \/* Track circle (visual, drag target) *\/\r\n  track = document.createElement('div');\r\n  track.className = 'track-circle';\r\n  track.style.width = track.style.height = (RADIUS * 2) + 'px';\r\n  container.appendChild(track);\r\n\r\n  \/* Pointer *\/\r\n  pointer = document.createElement('div');\r\n  pointer.className = 'pointer';\r\n  pointer.style.top = (cx - RADIUS - NODE_SIZE \/ 2 - 4) + 'px';\r\n  container.appendChild(pointer);\r\n\r\n  \/* Hub *\/\r\n  hub = document.createElement('div');\r\n  hub.className = 'hub';\r\n  hub.style.width = hub.style.height = HUB_SIZE + 'px';\r\n  hub.innerHTML = `<svg width=\"${HUB_SIZE*0.42}\" height=\"${HUB_SIZE*0.42}\" viewBox=\"0 0 26 26\" fill=\"none\">\r\n    <circle cx=\"13\" cy=\"13\" r=\"10\" stroke=\"#C9A84C\" stroke-width=\"1.5\"\/>\r\n    <path d=\"M13 8v6l4 2\" stroke=\"#C9A84C\" stroke-width=\"1.5\" stroke-linecap=\"round\"\/>\r\n  <\/svg>`;\r\n  container.appendChild(hub);\r\n\r\n  \/* Year nodes \u2014 appended DIRECTLY to container, NOT to track *\/\r\n  nodes.length = 0;\r\n  reports.forEach((r, i) => {\r\n    const node = document.createElement('div');\r\n    node.className = 'year-node';\r\n    node.style.width  = NODE_SIZE + 'px';\r\n    node.style.height = NODE_SIZE + 'px';\r\n    node.innerHTML = `<span class=\"year-text\" style=\"font-size:${FONT_SIZE}px\">${r.year}<\/span>`;\r\n    node.dataset.index = i;\r\n    container.appendChild(node);\r\n    nodes.push(node);\r\n\r\n    node.addEventListener('click', () => clickNode(i));\r\n    node.addEventListener('touchend', (e) => {\r\n      if (!didDrag) { e.preventDefault(); clickNode(i); }\r\n    }, { passive: false });\r\n  });\r\n\r\n  \/* Attach drag listeners to track circle *\/\r\n  attachDrag(track);\r\n\r\n  \/* Render initial positions *\/\r\n  renderNodes(wheelAngle);\r\n}\r\n\r\n\/* \u2500\u2500\u2500 POSITION NODES \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nfunction renderNodes(angle) {\r\n  const containerSize = parseFloat(container.style.width);\r\n  const cx = containerSize \/ 2;\r\n  const cy = containerSize \/ 2;\r\n  const stepDeg = 360 \/ TOTAL;\r\n  let newActiveIdx = 0;\r\n  let minDist = Infinity;\r\n\r\n  nodes.forEach((node, i) => {\r\n    \/\/ Each node's absolute angle on the circle\r\n    const deg = (stepDeg * i + angle);\r\n    const rad = (deg - 90) * Math.PI \/ 180;  \/\/ -90 so 0\u00b0 = top\r\n\r\n    const x = cx + Math.cos(rad) * RADIUS;\r\n    const y = cy + Math.sin(rad) * RADIUS;\r\n\r\n    \/\/ Place node (transform: translate(-50%,-50%) is set via CSS)\r\n    node.style.left = x + 'px';\r\n    node.style.top  = y + 'px';\r\n\r\n    \/\/ No rotation applied to node \u2014 text always upright \u2713\r\n\r\n    \/\/ Determine which is closest to top (deg \u2248 0 mod 360 after normalising)\r\n    const normDeg = ((deg % 360) + 360) % 360;\r\n    const distFromTop = Math.min(normDeg, 360 - normDeg);\r\n    if (distFromTop < minDist) { minDist = distFromTop; newActiveIdx = i; }\r\n\r\n    node.classList.toggle('active', false); \/\/ reset first\r\n  });\r\n\r\n  nodes[newActiveIdx].classList.add('active');\r\n  return newActiveIdx;\r\n}\r\n\r\n\/* \u2500\u2500\u2500 CARD UPDATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nfunction updateCard(idx) {\r\n  if (idx === currentIndex) return;\r\n  currentIndex = idx;\r\n  const report = reports[idx];\r\n  const card = document.getElementById('reportCard');\r\n  card.classList.remove('animating');\r\n  void card.offsetWidth;\r\n  card.classList.add('animating');\r\n  document.getElementById('displayYear').textContent = report.year;\r\n  document.getElementById('downloadLink').href = report.url;\r\n}\r\n\r\n\/* \u2500\u2500\u2500 ANIMATION \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nfunction animateTo(targetAngle, onDone) {\r\n  cancelAnimationFrame(animFrame);\r\n  const startAngle = wheelAngle;\r\n  const diff = targetAngle - startAngle;\r\n  const duration = 560;\r\n  const start = performance.now();\r\n\r\n  function step(now) {\r\n    const t = Math.min((now - start) \/ duration, 1);\r\n    const ease = 1 - Math.pow(1 - t, 4);\r\n    wheelAngle = startAngle + diff * ease;\r\n    const idx = renderNodes(wheelAngle);\r\n    if (t < 1) {\r\n      animFrame = requestAnimationFrame(step);\r\n    } else {\r\n      wheelAngle = targetAngle;\r\n      const finalIdx = renderNodes(wheelAngle);\r\n      updateCard(finalIdx);\r\n      if (onDone) onDone();\r\n    }\r\n  }\r\n  animFrame = requestAnimationFrame(step);\r\n}\r\n\r\nfunction snapToNearest() {\r\n  const step = 360 \/ TOTAL;\r\n  const snapped = Math.round(wheelAngle \/ step) * step;\r\n  animateTo(snapped);\r\n}\r\n\r\n\/* \u2500\u2500\u2500 CLICK NODE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nfunction clickNode(targetIdx) {\r\n  const step = 360 \/ TOTAL;\r\n  \/\/ How many steps from current active to target?\r\n  let diff = targetIdx - currentIndex;\r\n  \/\/ Pick shortest path\r\n  if (diff > TOTAL \/ 2)  diff -= TOTAL;\r\n  if (diff < -TOTAL \/ 2) diff += TOTAL;\r\n  animateTo(wheelAngle - diff * step);\r\n}\r\n\r\n\/* \u2500\u2500\u2500 DRAG \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nlet isDragging = false;\r\nlet didDrag = false;\r\nlet dragStartX = 0;\r\nlet lastDragX = 0;\r\n\r\nfunction attachDrag(el) {\r\n  el.addEventListener('mousedown',  onDragStart);\r\n  el.addEventListener('touchstart', onDragStart, { passive: true });\r\n}\r\n\r\nfunction onDragStart(e) {\r\n  isDragging = true;\r\n  didDrag = false;\r\n  dragStartX = lastDragX = (e.touches ? e.touches[0].clientX : e.clientX);\r\n  cancelAnimationFrame(animFrame);\r\n  document.addEventListener('mousemove',  onDragMove);\r\n  document.addEventListener('touchmove',  onDragMove, { passive: true });\r\n  document.addEventListener('mouseup',    onDragEnd);\r\n  document.addEventListener('touchend',   onDragEnd);\r\n}\r\n\r\nfunction onDragMove(e) {\r\n  if (!isDragging) return;\r\n  const clientX = e.touches ? e.touches[0].clientX : e.clientX;\r\n  const dx = clientX - lastDragX;\r\n  if (Math.abs(clientX - dragStartX) > 4) didDrag = true;\r\n  wheelAngle += dx * 0.28;\r\n  lastDragX = clientX;\r\n  renderNodes(wheelAngle);\r\n}\r\n\r\nfunction onDragEnd() {\r\n  if (!isDragging) return;\r\n  isDragging = false;\r\n  document.removeEventListener('mousemove', onDragMove);\r\n  document.removeEventListener('touchmove', onDragMove);\r\n  document.removeEventListener('mouseup',   onDragEnd);\r\n  document.removeEventListener('touchend',  onDragEnd);\r\n  if (didDrag) snapToNearest();\r\n}\r\n\r\n\/* \u2500\u2500\u2500 KEYBOARD \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\ndocument.addEventListener('keydown', e => {\r\n  const step = 360 \/ TOTAL;\r\n  if (e.key === 'ArrowRight') animateTo(wheelAngle - step);\r\n  if (e.key === 'ArrowLeft')  animateTo(wheelAngle + step);\r\n});\r\n\r\n\/* \u2500\u2500\u2500 RESIZE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nlet resizeTimer;\r\nwindow.addEventListener('resize', () => {\r\n  clearTimeout(resizeTimer);\r\n  resizeTimer = setTimeout(() => {\r\n    buildWheel();\r\n    \/\/ re-sync card\r\n    document.getElementById('displayYear').textContent = reports[currentIndex].year;\r\n    document.getElementById('downloadLink').href = reports[currentIndex].url;\r\n  }, 150);\r\n});\r\n\r\n\/* \u2500\u2500\u2500 INIT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\nbuildWheel();\r\ncurrentIndex = 0;\r\ndocument.getElementById('displayYear').textContent = reports[0].year;\r\ndocument.getElementById('downloadLink').href = reports[0].url;\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Relat\u00f3rios e Contas Anuais do PIBhub Home Ano Selecionado 2023 Relat\u00f3rio Anual Download PDF 202520242023202220212020201920182017 \u2190\u2192 Drag or click to rotate<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-26424","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Arquivos - Pibhub<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.pibhub.pt\/pt-pt\/arquivo\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Arquivos - Pibhub\" \/>\n<meta property=\"og:description\" content=\"Relat\u00f3rios e Contas Anuais do PIBhub Home Ano Selecionado 2023 Relat\u00f3rio Anual Download PDF 202520242023202220212020201920182017 \u2190\u2192 Drag or click to rotate\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.pibhub.pt\/pt-pt\/arquivo\/\" \/>\n<meta property=\"og:site_name\" content=\"Pibhub\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-16T14:49:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/edibbee.com\/beta-pibhub\/wp-content\/uploads\/2026\/03\/Pibhub-A-networking-hub-for-business-and-investment-opportunities-in-Portuguese-and-Indian-communities-seo-image.jpg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data1\" content=\"13 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.pibhub.pt\\\/pt-pt\\\/arquivo\\\/\",\"url\":\"https:\\\/\\\/www.pibhub.pt\\\/pt-pt\\\/arquivo\\\/\",\"name\":\"Arquivos - Pibhub\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.pibhub.pt\\\/pt-pt\\\/#website\"},\"datePublished\":\"2025-09-09T13:30:57+00:00\",\"dateModified\":\"2026-10-16T14:49:29+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.pibhub.pt\\\/pt-pt\\\/arquivo\\\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.pibhub.pt\\\/pt-pt\\\/arquivo\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.pibhub.pt\\\/pt-pt\\\/arquivo\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.pibhub.pt\\\/pt-pt\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Arquivos\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.pibhub.pt\\\/pt-pt\\\/#website\",\"url\":\"https:\\\/\\\/www.pibhub.pt\\\/pt-pt\\\/\",\"name\":\"Pibhub\",\"description\":\"A networking hub for business and investment opportunities in Portuguese and Indian communities\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.pibhub.pt\\\/pt-pt\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Arquivos - Pibhub","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.pibhub.pt\/pt-pt\/arquivo\/","og_locale":"pt_PT","og_type":"article","og_title":"Arquivos - Pibhub","og_description":"Relat\u00f3rios e Contas Anuais do PIBhub Home Ano Selecionado 2023 Relat\u00f3rio Anual Download PDF 202520242023202220212020201920182017 \u2190\u2192 Drag or click to rotate","og_url":"https:\/\/www.pibhub.pt\/pt-pt\/arquivo\/","og_site_name":"Pibhub","article_modified_time":"2026-10-16T14:49:29+00:00","og_image":[{"url":"https:\/\/edibbee.com\/beta-pibhub\/wp-content\/uploads\/2026\/03\/Pibhub-A-networking-hub-for-business-and-investment-opportunities-in-Portuguese-and-Indian-communities-seo-image.jpg","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Tempo estimado de leitura":"13 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.pibhub.pt\/pt-pt\/arquivo\/","url":"https:\/\/www.pibhub.pt\/pt-pt\/arquivo\/","name":"Arquivos - Pibhub","isPartOf":{"@id":"https:\/\/www.pibhub.pt\/pt-pt\/#website"},"datePublished":"2025-09-09T13:30:57+00:00","dateModified":"2026-10-16T14:49:29+00:00","breadcrumb":{"@id":"https:\/\/www.pibhub.pt\/pt-pt\/arquivo\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.pibhub.pt\/pt-pt\/arquivo\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.pibhub.pt\/pt-pt\/arquivo\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.pibhub.pt\/pt-pt\/"},{"@type":"ListItem","position":2,"name":"Arquivos"}]},{"@type":"WebSite","@id":"https:\/\/www.pibhub.pt\/pt-pt\/#website","url":"https:\/\/www.pibhub.pt\/pt-pt\/","name":"Pibhub","description":"A networking hub for business and investment opportunities in Portuguese and Indian communities","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.pibhub.pt\/pt-pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"}]}},"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.pibhub.pt\/pt-pt\/wp-json\/wp\/v2\/pages\/26424","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pibhub.pt\/pt-pt\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.pibhub.pt\/pt-pt\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.pibhub.pt\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pibhub.pt\/pt-pt\/wp-json\/wp\/v2\/comments?post=26424"}],"version-history":[{"count":46,"href":"https:\/\/www.pibhub.pt\/pt-pt\/wp-json\/wp\/v2\/pages\/26424\/revisions"}],"predecessor-version":[{"id":29602,"href":"https:\/\/www.pibhub.pt\/pt-pt\/wp-json\/wp\/v2\/pages\/26424\/revisions\/29602"}],"wp:attachment":[{"href":"https:\/\/www.pibhub.pt\/pt-pt\/wp-json\/wp\/v2\/media?parent=26424"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}