1function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } 2// components.jsx â Ruvos website React components 3 4const { 5 useState, 6 useEffect, 7 useRef 8} = React; 9 10// ââââââââââââââââââââââââââââââââââââââââââââââââââ 11// Navigation 12// ââââââââââââââââââââââââââââââââââââââââââââââââââ 13function Nav({ 14 activePage 15} = {}) { 16 const [menuOpen, setMenuOpen] = useState(false); 17 function scrollToSection(id, e) { 18 const el = document.getElementById(id); 19 if (el) { 20 e.preventDefault(); 21 setMenuOpen(false); 22 el.scrollIntoView({ 23 behavior: 'smooth' 24 }); 25 } 26 } 27 function closeMenu() { 28 setMenuOpen(false); 29 } 30 return /*#__PURE__*/React.createElement("div", { 31 className: "nav-wrap" 32 }, /*#__PURE__*/React.createElement("nav", { 33 className: `nav${menuOpen ? ' nav--open' : ''}` 34 }, /*#__PURE__*/React.createElement("a", { 35 href: "index.html", 36 className: "nav__logo-link", 37 "aria-label": "Ruvos home" 38 }, /*#__PURE__*/React.createElement("img", { 39 src: "assets/ruvos-wordmark-red.png", 40 alt: "Ruvos", 41 className: "nav__logo" 42 })), /*#__PURE__*/React.createElement("div", { 43 className: "nav__links" 44 }, /*#__PURE__*/React.createElement("a", { 45 className: `nav__link${activePage === 'solutions' ? ' is-active' : ''}`, 46 href: "index.html#products", 47 onClick: e => scrollToSection('products', e) 48 }, "SOLUTIONS"), /*#__PURE__*/React.createElement("a", { 49 className: `nav__link${activePage === 'services' ? ' is-active' : ''}`, 50 href: "index.html#services", 51 onClick: e => scrollToSection('services', e) 52 }, "SERVICES"), /*#__PURE__*/React.createElement("a", { 53 className: `nav__link${activePage === 'about' ? ' is-active' : ''}`, 54 href: "about.html", 55 onClick: closeMenu 56 }, "ABOUT"), /*#__PURE__*/React.createElement("a", { 57 className: `nav__link${activePage === 'team' ? ' is-active' : ''}`, 58 href: "team.html", 59 onClick: closeMenu 60 }, "TEAM"), /*#__PURE__*/React.createElement("a", { 61 className: `nav__link${activePage === 'careers' ? ' is-active' : ''}`, 62 href: "careers.html", 63 onClick: closeMenu 64 }, "CAREERS")), /*#__PURE__*/React.createElement("a", { 65 href: "mailto:[email protected]", 66 className: "nav__cta" 67 }, "Get in Touch"), /*#__PURE__*/React.createElement("button", { 68 className: "nav__burger", 69 "aria-label": menuOpen ? 'Close menu' : 'Open menu', 70 "aria-expanded": menuOpen, 71 onClick: () => setMenuOpen(o => !o) 72 }, /*#__PURE__*/React.createElement("span", null), /*#__PURE__*/React.createElement("span", null), /*#__PURE__*/React.createElement("span", null)))); 73} 74 75// ââââââââââââââââââââââââââââââââââââââââââââââââââ 76// Hero 77// ââââââââââââââââââââââââââââââââââââââââââââââââââ 78function Hero() { 79 return /*#__PURE__*/React.createElement("section", { 80 className: "hero" 81 }, /*#__PURE__*/React.createElement(DnaHelix, { 82 className: "hero__helix" 83 }), /*#__PURE__*/React.createElement("h1", { 84 className: "hero__title" 85 }, "Finding the ", /*#__PURE__*/React.createElement("span", { 86 className: "accent" 87 }, "signal"), " and building what comes next"), /*#__PURE__*/React.createElement("p", { 88 className: "hero__sub" 89 }, "Connecting technology and people so healthcare organizations can turn data into decisions that matter."), /*#__PURE__*/React.createElement("div", { 90 className: "hero__ctas" 91 }, /*#__PURE__*/React.createElement("a", { 92 href: "#contact", 93 className: "btn btn--primary" 94 }, "Work with us", /*#__PURE__*/React.createElement("svg", { 95 className: "btn__arrow", 96 width: "16", 97 height: "16",
98 viewBox: "0 0 16 16", 99 fill: "none" 100 }, /*#__PURE__*/React.createElement("path", { 101 d: "M3 8h10M9 4l4 4-4 4", 102 stroke: "currentColor", 103 strokeWidth: "1.5", 104 strokeLinecap: "round", 105 strokeLinejoin: "round" 106 }))), /*#__PURE__*/React.createElement("a", { 107 href: "about.html", 108 className: "btn btn--ghost" 109 }, "Get to know us"))); 110} 111 112// ââââââââââââââââââââââââââââââââââââââââââââââââââ 113// Logo marquee â scrolls leftâright 114// ââââââââââââââââââââââââââââââââââââââââââââââââââ 115const LOGOS = [{ 116 kind: 'img', 117 src: 'assets/logo-johns-hopkins.png', 118 alt: 'Johns Hopkins University', 119 h: 52 120}, { 121 kind: 'img', 122 src: 'assets/logo-aws.png', 123 alt: 'AWS', 124 h: 37 125}, { 126 kind: 'img', 127 src: 'assets/logo-aphl.png', 128 alt: 'APHL', 129 h: 46 130}, { 131 kind: 'img', 132 src: 'assets/logo-florida-health.png', 133 alt: 'Florida Health', 134 h: 52 135}, { 136 kind: 'img', 137 src: 'assets/logo-cdc.png', 138 alt: 'CDC', 139 h: 60 140}, { 141 kind: 'img', 142 src: 'assets/logo-naphsis-real.png', 143 alt: 'Naphsis', 144 h: 32 145}, { 146 kind: 'img', 147 src: 'assets/logo-pricing-group.png', 148 alt: 'The Pricing Group', 149 h: 56 150}, { 151 kind: 'img', 152 src: 'assets/logo-artia.png', 153 alt: 'Artia Solutions', 154 h: 50 155}, { 156 kind: 'img', 157 src: 'assets/logo-rat.png', 158 alt: 'Radiology Associates of Tallahassee', 159 h: 44, 160 badge: true 161}, { 162 kind: 'img', 163 src: 'assets/GPH.png', 164 alt: 'Georgia Department of Public Health', 165 h: 46 166}]; 167function LogoMarquee() { 168 // duplicate list to create seamless loop 169 const track = [...LOGOS, ...LOGOS]; 170 return /*#__PURE__*/React.createElement("div", { 171 className: "logos" 172 }, /*#__PURE__*/React.createElement("div", { 173 className: "logos__track" 174 }, track.map((l, i) => { 175 if (l.kind === 'img') { 176 return /*#__PURE__*/React.createElement("div", { 177 key: i, 178 className: `logos__item${l.badge ? ' logos__item--badge' : ''}` 179 }, /*#__PURE__*/React.createElement("img", { 180 src: l.src, 181 alt: l.alt, 182 style: { 183 height: l.h || 52 184 } 185 })); 186 } 187 if (l.kind === 'naphsis') { 188 return /*#__PURE__*/React.createElement("div", { 189 key: i, 190 className: "logos__item logos__item--naphsis" 191 }, l.label); 192 } 193 return /*#__PURE__*/React.createElement("div", { 194 key: i, 195 className: `logos__item logos__item--word ${l.cls}` 196 }, l.label); 197 }))); 198} 199 200// ââââââââââââââââââââââââââââââââââââââââââââââââââ 201// Rural Health banner â sits under the logo marquee, points to /ruralhealth 202// ââââââââââââââââââââââââââââââââââââââââââââââââââ 203function RuralHealthBanner() { 204 return /*#__PURE__*/React.createElement("section", { 205 className: "rhbanner", 206 "aria-labelledby": "rhbanner-title" 207 }, /*#__PURE__*/React.createElement("div", { 208 className: "rhbanner__inner" 209 }, /*#__PURE__*/React.createElement("div", { 210 className: "rhbanner__copy" 211 }, /*#__PURE__*/React.createElement("span", { 212 className: "rhbanner__kicker" 213 }, "Rural Health Transformation Program"), /*#__PURE__*/React.createElement("h2", { 214 className: "rhbanner__title", 215 id: "rhbanner-title" 216 }, "We're here to support your ", /*#__PURE__*/React.createElement("em", null, "rural health transformation.")), /*#__PURE__*/React.createElement("p", { 217 className: "rhbanner__lede" 218 }, "As ", /*#__PURE__*/React.createElement("a", { 219 href: "https://www.medicaid.gov/resources-for-states/rural-health", 220 target: "_blank", 221 rel: "noopener noreferrer" 222 }, "RHTP"), " funding reaches states and rural communities, Ruvos helps hospitals and clinics put it to work: assessing and planning modernization, connecting the systems already in place, and seeing the whole picture of the populations they serve.")), /*#__PURE__*/React.createElement("a", { 223 href: "ruralhealth.html", 224 className: "btn rhbanner__btn" 225 }
225, "How we can help", /*#__PURE__*/React.createElement("svg", { 226 className: "btn__arrow", 227 width: "16", 228 height: "16", 229 viewBox: "0 0 16 16", 230 fill: "none" 231 }, /*#__PURE__*/React.createElement("path", { 232 d: "M3 8h10M9 4l4 4-4 4", 233 stroke: "currentColor", 234 strokeWidth: "1.5", 235 strokeLinecap: "round", 236 strokeLinejoin: "round" 237 }))))); 238} 239 240// ââââââââââââââââââââââââââââââââââââââââââââââââââ 241// Products section 242// ââââââââââââââââââââââââââââââââââââââââââââââââââ 243const PRODUCTS = [{ 244 title: 'AIMS', 245 logo: /*#__PURE__*/React.createElement(AimsLogo, null), 246 desc: "Created in partnership with APHL, what started as a pilot to help labs share critical health data is now the backbone of public health data exchange for the entire country.", 247 tags: ['National Backbone', 'Crisis Tested', 'TEFCA Enabled'], 248 brandA: '#2AB5BA', 249 brandB: '#1A1F2E', 250 href: 'https://aphl.org/focus-areas/informatics/aims-platform/overview', 251 external: true 252}, { 253 title: 'HCAP', 254 logo: /*#__PURE__*/React.createElement(HcapLogo, null), 255 desc: "Healthcare Capacity is a decision-support platform that turns fragmented public health and healthcare data into a clear, actionable picture of community need.", 256 tags: ['Global Data', 'Decision Support', 'Progress Tracking'], 257 brandA: '#DD1A3C', 258 brandB: '#1F2A5A', 259 href: 'hcap.html' 260}, { 261 title: 'Integrity', 262 logo: /*#__PURE__*/React.createElement(IntegrityLogo, null), 263 desc: "Built with Florida Department of Health to improve data quality, forecasting, and decision-making, Integrity automates quality checks to ensure accuracy and reliability across health data sources.", 264 tags: ['Data Quality', 'Real-time Intelligence', 'Analytics'], 265 brandA: '#1947E5', 266 brandB: '#2A2A2E', 267 href: 'integrity.html' 268}, { 269 title: 'WellGS', 270 logo: /*#__PURE__*/React.createElement(WellGsLogo, null), 271 desc: "WellGS unites the disparate systems a bioinformatics lab runs on â accessioning, plate maps, sample sheets, instrument runs, cloud analysis, and reporting â into one continuous path, so results come back where the sample already lives.", 272 tags: ['Bioinformatics Lab', 'AWS HealthOmics', 'LIMS Integration'], 273 brandA: '#4A7CD6', 274 brandB: '#0B195C', 275 href: 'wellgs.html' 276}, { 277 title: 'Global Mosaic', 278 logo: /*#__PURE__*/React.createElement(GloMoLogo, null), 279 desc: "GloMo is an end-to-end geospatial analytics project that lets users explore administrative boundaries, draw polygons, and query population and demographic mosaics.", 280 tags: ['Custom Polygons', 'Pixel Data', 'AI Enabled Insights'], 281 brandA: '#1B6B6B', 282 brandB: '#C44B2B' 283}, 284// BioDB hidden 285// { 286// title: 'BioDB', 287// logo: <BioDbLogo />, 288// desc: "The BPHL Bioinformatics Database is a comprehensive genomics database application designed to manage the complete lifecycle of laboratory samples, from accession through sequencing and analysis.", 289// tags: ['Genomics', 'Genome Data Exchange', 'Analytics'], 290// brandA: '#7FAE5A', brandB: '#4A7038', 291// href: 'biodb.html', 292// }, 293{ 294 title: 'Global Pandemic Simulator', 295 logo: /*#__PURE__*/React.createElement(PandemicLogo, null), 296 desc: "Partnering with WHO and Johns Hopkins University to advance pandemic preparedness, our tool simulates outbreaks to test response strategies, resource allocation, and seasonal planning.", 297 tags: ['Outbreak Models', 'AI-Enabled Insights', 'Pandemic Passport'], 298 brandA: '#0093D0', 299 brandB: '#0E1E37' 300}, { 301 title: 'WellConnector', 302 logo: /*#__PURE__*/React.createElement(WellConnectorLogo, null), 303 desc: "WellConnector is helping to kill the clipboard, creating \u201Ca pre-check for patient health,\u201D designing a platform that will allow patients to securely and easily share health history with providers, making new visits more efficient and ensuring accurate medical information is readily available to better inform healthcare decisions.", 304 tags: ['Encrypted', 'Instant Transfer', 'Health Passport'], 305 brandA: '#2479F2', 306 brandB: '#13218B', 307 href: 'https://www.wellconnector.com/', 308 external: true 309}, { 310 title: 'TLH NavCare', 311 logo: /*#__PURE__*/React.createElement(TlhNavCareLogo, null), 312 desc: "The Tallahassee Healthcare Navigation Portal is a free, community-centered resource designed to help people navigate the local healthcare landscape. It is not a diagnostic tool, a patient portal, or a telemedicine service. Its purpose is simple: help you find the right place to get care.", 313 tags: ['Tallahassee Health', 'Community-Driven'], 314 brandA: '#0E8C8C', 315 brandB: '#0A5A5A', 316 href: 'https://tlhnavcare.com/', 317 external: true 318}, { 319 title: 'Capital Region Business Concierge', 320 logo: /*#__PURE__*/React.createElement(CapitalRegionLogo, null), 321 desc: "A platform connecting businesses, entrepreneurs, talent, investors, and community organizations across Florida's Capital Region.", 322 tags: ['Business Network', 'Regional Platform', 'Community Resources'], 323 brandA: '#003366', 324 brandB: '#C6942A',
325 href: 'https://capitalregion.biz/', 326 external: true 327}]; 328 329// Brand-mark components (simple SVG/type marks) 330function AimsLogo() { 331 return /*#__PURE__*/React.createElement("img", { 332 src: "assets/logo-aims.png", 333 alt: "AIMS", 334 style: { 335 height: 96, 336 width: 'auto', 337 objectFit: 'contain' 338 } 339 }); 340} 341function HcapLogo() { 342 return /*#__PURE__*/React.createElement("img", { 343 src: "assets/logo-hcap.png", 344 alt: "HCAP", 345 style: { 346 height: 56, 347 width: 'auto', 348 objectFit: 'contain' 349 } 350 }); 351} 352function IntegrityLogo() { 353 return /*#__PURE__*/React.createElement("img", { 354 src: "assets/logo-integrity.png", 355 alt: "Integrity", 356 style: { 357 height: 110, 358 width: 'auto', 359 objectFit: 'contain' 360 } 361 }); 362} 363function GloMoLogo() { 364 return /*#__PURE__*/React.createElement("img", { 365 src: "assets/GlobalMosaic_Wordmark_Light.png", 366 alt: "Global Mosaic", 367 style: { 368 height: 80, 369 width: 'auto', 370 objectFit: 'contain' 371 } 372 }); 373} 374function WellGsLogo() { 375 return /*#__PURE__*/React.createElement("img", { 376 src: "assets/logo-wellgs.png", 377 alt: "WellGS", 378 style: { 379 width: 330, 380 height: 'auto', 381 display: 'block' 382 } 383 }); 384} 385function BioDbLogo() { 386 return /*#__PURE__*/React.createElement("img", { 387 src: "assets/logo-biodb.png", 388 alt: "BioDB", 389 style: { 390 height: 140, 391 width: 'auto', 392 objectFit: 'contain' 393 } 394 }); 395} 396function PandemicLogo() { 397 return /*#__PURE__*/React.createElement("img", { 398 src: "assets/WHO_PanSim.png", 399 alt: "WHO Pandemic Simulator", 400 style: { 401 maxHeight: 100, 402 width: '92%', 403 maxWidth: 340, 404 objectFit: 'contain' 405 } 406 }); 407} 408function TlhNavCareLogo() { 409 return /*#__PURE__*/React.createElement("img", { 410 src: "assets/logo-tlhnavcare.png", 411 alt: "TLH NavCare", 412 style: { 413 height: 88, 414 width: 'auto', 415 objectFit: 'contain' 416 } 417 }); 418} 419function CapitalRegionLogo() { 420 return /*#__PURE__*/React.createElement("div", { 421 style: { 422 display: 'flex', 423 flexDirection: 'column', 424 alignItems: 'center', 425 gap: 5 426 } 427 }, /*#__PURE__*/React.createElement("span", { 428 style: { 429 fontFamily: 'var(--font-display)', 430 fontWeight: 700, 431 fontSize: 41, 432 letterSpacing: '-0.02em', 433 color: '#003366' 434 } 435 }, "Capital Region"), /*#__PURE__*/React.createElement("span", { 436 style: { 437 fontFamily: 'var(--font-display)', 438 fontWeight: 600, 439 fontSize: 22, 440 letterSpacing: '0.14em', 441 textTransform: 'uppercase', 442 color: '#C6942A' 443 } 444 }, "Business Concierge")); 445} 446function WellConnectorLogo() { 447 return /*#__PURE__*/React.createElement("img", { 448 src: "assets/logo-wellconnector.png?v=1", 449 alt: "WellConnector", 450 style: { 451 width: 330, 452 height: 'auto', 453 display: 'block' 454 } 455 }); 456} 457function Products() { 458 return /*#__PURE__*/React.createElement("section", { 459 className: "section", 460 id: "products" 461 }, /*#__PURE__*/React.createElement("div", { 462 className: "section__inner" 463 }, /*#__PURE__*/React.createElement("div", { 464 className: "section__head" 465 }, /*#__PURE__*/React.createElement("h2", { 466 className: "section__title" 467 }, "We don\u2019t just consult. ", /*#__PURE__*/React.createElement("b", null, "We build.")), /*#__PURE__*/React.createElement("p", { 468 className: "section__sub" 469 }, "From strategy and roadmapping through implementation, operations, and long-term support, we stay with our partners for the full journey."), /*#__PURE__*/React.createElement("div", { 470 style: { 471 marginTop: 28 472 } 473 }, /*#__PURE__*/React.createElement("span", { 474 className: "section__eyebrow" 475 }, /*#__PURE__*/React.createElement("svg", { 476 width: "14", 477 height: "14", 478 viewBox: "0 0 24 24", 479 fill: "none", 480 stroke: "currentColor", 481 strokeWidth: "1.8", 482 strokeLinecap: "round", 483 strokeLinejoin: "round", 484 "aria-hidden": "true" 485 }, /*#__PURE__*/React.createElement("rect", { 486 width: "20", 487 height: "14", 488 x: "2", 489 y: "7", 490 rx: "2" 491 }), /*#__PURE__*/React.createElement("path", { 492 d: "M6 3h12" 493 }), /*#__PURE__*/React.createElement("path", { 494 d: "M2 11h20" 495 })), "Solutions"))), /*#__PURE__*/React.createElement("div", { 496 className: "products" 497 }, PRODUCTS.map((p, i) => /*#__PURE__*/React.createElement("article", { 498 key: i, 499 className: `pcard${p.comingSoon ? ' pcard--soon' : ''}${p.href ? ' pcard--link' : ''}`, 500 style: { 501 '--brandA': p.brandA, 502 '--brandB': p.brandB 503 } 504 }, p.href ? /*#__PURE__*/React.createElement("a", _extends({ 505 href: p.href, 506 className: "pcard__media-link", 507 "aria-label": `Learn more about ${p.title}` 508 }, p.external ? { 509 target: '_blank', 510 rel: 'noopener noreferrer' 511 } : {}), /*#__PURE__*/React.createElement("div", { 512 className: "pcard__media" 513 }, p.logo, p.comingSoon && /*#__PURE__*/React.createElement("span", { 514 className: "pcard__badge" 515 }, "Coming soon"))) : /*#__PURE__*/React.createElement("div", { 516 className: "pcard__media" 517 }, p.logo, p.comingSoon && /*#__PURE__*/React.createElement("span", { 518 className: "pcard__badge" 519 }, "Coming soon")), /*#__PURE__*/React.createElement("div", { 520 className: "pcard__body" 521 }, /*#__PURE__*/React.createElement("h3", { 522 className: "pcard__title" 523 }, p.title), /*#__PURE__*/React.createElement("p", { 524 className: "pcard__desc" 525 }, p.desc), /*#__PURE__*/React.createElement("div", { 526 className: "pcard__tags" 527 }, p.tags.map((t, j) => /*#__PURE__*/React.createElement("span", { 528 key: j, 529 className: "tag" 530 }
530, t))))))))); 531} 532 533// ââââââââââââââââââââââââââââââââââââââââââââââââââ 534// Services 535// ââââââââââââââââââââââââââââââââââââââââââââââââââ 536const SERVICES = [{ 537 img: 'assets/service-interop.gif', 538 title: 'Interoperability', 539 desc: "We connect fragmented systems and make data flow securely and meaningfully between organizations, platforms, and stakeholders. This is where Ruvos began, and it remains foundational to everything else." 540}, { 541 img: 'assets/service-analytics.gif', 542 title: 'Advanced Analytics', 543 desc: "We turn connected data into insight: forecasting, anomaly detection, visualization, and increasingly, AI and machine learning applications that help people see what they couldn't see before." 544}, { 545 img: 'assets/service-modernization.gif', 546 title: 'Modernization', 547 desc: "We help organizations move from outdated, legacy infrastructure to modern, scalable systems, without disrupting the work that depends on them." 548}]; 549function Services() { 550 return /*#__PURE__*/React.createElement("section", { 551 className: "section", 552 id: "services", 553 style: { 554 background: 'transparent', 555 borderTop: '1px solid var(--border)', 556 borderBottom: '1px solid var(--border)' 557 } 558 }, /*#__PURE__*/React.createElement("div", { 559 className: "section__inner" 560 }, /*#__PURE__*/React.createElement("div", { 561 className: "section__head" 562 }, /*#__PURE__*/React.createElement("h2", { 563 className: "section__title" 564 }, /*#__PURE__*/React.createElement("b", null, "We translate"), " across disciplines"), /*#__PURE__*/React.createElement("p", { 565 className: "section__sub" 566 }, "Our team brings together data engineering, public health, epidemiology, clinical practice, and strategy."), /*#__PURE__*/React.createElement("div", { 567 style: { 568 marginTop: 28 569 } 570 }, /*#__PURE__*/React.createElement("span", { 571 className: "section__eyebrow" 572 }, /*#__PURE__*/React.createElement("svg", { 573 width: "14", 574 height: "14", 575 viewBox: "0 0 24 24", 576 fill: "none", 577 stroke: "currentColor", 578 strokeWidth: "1.8", 579 strokeLinecap: "round", 580 strokeLinejoin: "round", 581 "aria-hidden": "true" 582 }, /*#__PURE__*/React.createElement("path", { 583 d: "M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z" 584 })), "Our Services"))), /*#__PURE__*/React.createElement("div", { 585 className: "services" 586 }, SERVICES.map((s, i) => /*#__PURE__*/React.createElement("article", { 587 key: i, 588 className: "scard" 589 }, /*#__PURE__*/React.createElement("div", { 590 className: "scard__visual" 591 }, /*#__PURE__*/React.createElement("img", { 592 src: s.img, 593 alt: s.title 594 })), /*#__PURE__*/React.createElement("h3", { 595 className: "scard__title" 596 }, s.title), /*#__PURE__*/React.createElement("p", { 597 className: "scard__desc" 598 }, s.desc)))))); 599} 600 601// ââââââââââââââââââââââââââââââââââââââââââââââââââ 602// Contact CTA 603// ââââââââââââââââââââââââââââââââââââââââââââââââââ 604function Typewriter({ 605 words, 606 typeSpeed = 110, 607 deleteSpeed = 55, 608 holdMs = 1100 609}) { 610 const [wi, setWi] = useState(0); 611 const [text, setText] = useState(''); 612 const [phase, setPhase] = useState('typing'); // typing | holding | deleting 613 614 useEffect(() => { 615 const word = words[wi % words.length]; 616 let t; 617 if (phase === 'typing') { 618 if (text.length < word.length) { 619 t = setTimeout(() => setText(word.slice(0, text.length + 1)), typeSpeed); 620 } else { 621 t = setTimeout(() => setPhase('deleting'), holdMs); 622 } 623 } else if (phase === 'deleting') { 624 if (text.length > 0) { 625 t = setTimeout(() => setText(word.slice(0, text.length - 1)), deleteSpeed); 626 } else { 627 setPhase('typing'); 628 setWi(i => (i + 1) % words.length); 629 } 630 } 631 return () => clearTimeout(t); 632 }, [text, phase, wi, words, typeSpeed, deleteSpeed, holdMs]); 633 return /*#__PURE__*/React.createElement("span", { 634 className: "contact__typed" 635 }, /*#__PURE__*/React.createElement("span", { 636 className: "contact__l" 637 }, text), /*#__PURE__*/React.createElement("span", { 638 className: "contact__cursor" 639 }, "_")); 640} 641function Contact() { 642 return /*#__PURE__*/React.createElement("section", { 643 className: "contact", 644 id: "contact" 645 }, /*#__PURE__*/React.createElement("div", { 646 className: "contact__inner" 647 }, /*#__PURE__*/React.createElement("h2", { 648 className: "contact__title" 649 }, /*#__PURE__*/React.createElement("span", { 650 className: "contact__line contact__line--1" 651 }, "We speak your"), /*#__PURE__*/React.createElement("span", { 652 className: "contact__line contact__line--2" 653 }, /*#__PURE__*/React.createElement(Typewriter, { 654 words: ["System", "LIMS", "EHR", "Data", "Cloud"] 655 }), " language.")), /*#__PURE__*/React.createElement("p", { 656 className: "contact__sub" 657 }, "Let\u2019s get the conversation started."), /*#__PURE__*/React.createElement("a", { 658 href: "mailto:[email protected]", 659 className: "btn btn--primary" 660 }, "Contact us"))); 661} 662 663// ââââââââââââââââââââââââââââââââââââââââââââââââââ 664// Interest form â Netlify Forms 665// ââââââââââââââââââââââââââââââââââââââââââââââââââ 666// Netlify detects forms by parsing the STATIC HTML at deploy time. These pages 667// render through React, so the form does not exist in the deployed markup and 668// would never be detected. Each page that uses this component therefore carries 669// a matching hidden <form> in its .html file â same `name`, same field names â 670// which is what Netlify registers. This component posts to it by form-name. 671//
672// Submitting over fetch rather than a native POST keeps the visitor on the page 673// and lets the section swap to an inline thank-you instead of bouncing to 674// Netlify's generic success page. 675function InterestForm({ 676 formName, 677 onDark, 678 submitLabel = 'Send' 679}) { 680 const [status, setStatus] = useState('idle'); // idle | sending | done | error 681 682 function handleSubmit(e) { 683 e.preventDefault(); 684 const body = new URLSearchParams(new FormData(e.target)).toString(); 685 setStatus('sending'); 686 fetch('/', { 687 method: 'POST', 688 headers: { 689 'Content-Type': 'application/x-www-form-urlencoded' 690 }, 691 body 692 }).then(res => { 693 if (!res.ok) throw new Error(`Netlify returned ${res.status}`); 694 setStatus('done'); 695 }).catch(() => setStatus('error')); 696 } 697 const cls = `cform${onDark ? ' cform--on-dark' : ''}`; 698 if (status === 'done') { 699 return /*#__PURE__*/React.createElement("div", { 700 className: `${cls} cform__thanks`, 701 role: "status" 702 }, /*#__PURE__*/React.createElement("h3", { 703 className: "cform__thanks-title" 704 }, "Thanks \u2014 we\u2019ve got it."), /*#__PURE__*/React.createElement("p", { 705 className: "cform__thanks-body" 706 }, "Someone from our team will follow up at the address you gave us.")); 707 } 708 return /*#__PURE__*/React.createElement("form", { 709 className: cls, 710 name: formName, 711 method: "POST", 712 "data-netlify": "true", 713 "data-netlify-honeypot": "bot-field", 714 onSubmit: handleSubmit 715 }, /*#__PURE__*/React.createElement("input", { 716 type: "hidden", 717 name: "form-name", 718 value: formName 719 }), /*#__PURE__*/React.createElement("p", { 720 className: "cform__hp" 721 }, /*#__PURE__*/React.createElement("label", null, "Leave this field empty", /*#__PURE__*/React.createElement("input", { 722 name: "bot-field", 723 tabIndex: "-1", 724 autoComplete: "off" 725 }))), /*#__PURE__*/React.createElement("div", { 726 className: "cform__row" 727 }, /*#__PURE__*/React.createElement("label", { 728 className: "cform__field" 729 }, /*#__PURE__*/React.createElement("span", { 730 className: "cform__label" 731 }, "Name"), /*#__PURE__*/React.createElement("input", { 732 className: "cform__input", 733 type: "text", 734 name: "name", 735 required: true, 736 autoComplete: "name" 737 })), /*#__PURE__*/React.createElement("label", { 738 className: "cform__field" 739 }, /*#__PURE__*/React.createElement("span", { 740 className: "cform__label" 741 }, "Organization"), /*#__PURE__*/React.createElement("input", { 742 className: "cform__input", 743 type: "text", 744 name: "organization", 745 required: true, 746 autoComplete: "organization" 747 }))), /*#__PURE__*/React.createElement("label", { 748 className: "cform__field" 749 }, /*#__PURE__*/React.createElement("span", { 750 className: "cform__label" 751 }, "Email address"), /*#__PURE__*/React.createElement("input", { 752 className: "cform__input", 753 type: "email", 754 name: "email", 755 required: true, 756 autoComplete: "email" 757 })), /*#__PURE__*/React.createElement("div", { 758 className: "cform__actions" 759 }, /*#__PURE__*/React.createElement("button", { 760 type: "submit", 761 className: "btn btn--primary", 762 disabled: status === 'sending' 763 }, status === 'sending' ? 'Sendingâ¦' : submitLabel, /*#__PURE__*/React.createElement("svg", { 764 className: "btn__arrow", 765 width: "16", 766 height: "16", 767 viewBox: "0 0 16 16", 768 fill: "none" 769 }, /*#__PURE__*/React.createElement("path", { 770 d: "M3 8h10M9 4l4 4-4 4", 771 stroke: "currentColor", 772 strokeWidth: "1.5", 773 strokeLinecap: "round", 774 strokeLinejoin: "round" 775 }))), /*#__PURE__*/React.createElement("p", { 776 className: "cform__alt" 777 }, "Prefer email? ", /*#__PURE__*/React.createElement("a", { 778 href: "mailto:[email protected]" 779 }, "[email protected]"))), status === 'error' && /*#__PURE__*/React.createElement("p", { 780 className: "cform__error", 781 role: "alert" 782 }, "Something went wrong sending that. Please email us at", ' ', /*#__PURE__*/React.createElement("a", { 783 href: "mailto:[email protected]" 784 }, "[email protected]"), " and we\u2019ll pick it up from there.")); 785} 786 787// ââââââââââââââââââââââââââââââââââââââââââââââââââ 788// Footer 789// ââââââââââââââââââââââââââââââââââââââââââââââââââ 790function Footer() { 791 return /*#__PURE__*/React.createElement("footer", { 792 className: "footer" 793 }, /*#__PURE__*/React.createElement("div", { 794 className: "footer__inner" 795 }, /*#__PURE__*/React.createElement("div", { 796 className: "footer__logo" 797 }, /*#__PURE__*/React.createElement("img", { 798 src: "assets/ruvos-logo-footer.png", 799 alt: "Ruvos" 800 })), /*#__PURE__*/React.createElement("div", {
801 className: "footer__col" 802 }, /*#__PURE__*/React.createElement("h4", { 803 className: "footer__col-title" 804 }, "Location"), /*#__PURE__*/React.createElement("p", null, "Ruvos HQ"), /*#__PURE__*/React.createElement("p", null, "2324 Killearn Center Blvd #100"), /*#__PURE__*/React.createElement("p", null, "Tallahassee, FL 32309")), /*#__PURE__*/React.createElement("div", { 805 className: "footer__col" 806 }, /*#__PURE__*/React.createElement("h4", { 807 className: "footer__col-title" 808 }, "Contact"), /*#__PURE__*/React.createElement("p", null, "We\u2019d love to hear from you!"), /*#__PURE__*/React.createElement("a", { 809 href: "mailto:[email protected]" 810 }, "Reach out at [email protected]"), /*#__PURE__*/React.createElement("a", { 811 href: "tel:+18502547270" 812 }, "+1 850-254-7270")), /*#__PURE__*/React.createElement("div", { 813 className: "footer__col" 814 }, /*#__PURE__*/React.createElement("h4", { 815 className: "footer__col-title" 816 }, "Company"), /*#__PURE__*/React.createElement("a", { 817 href: "about.html" 818 }, "About"), /*#__PURE__*/React.createElement("a", { 819 href: "team.html" 820 }, "Team"), /*#__PURE__*/React.createElement("a", { 821 href: "careers.html" 822 }, "Careers"), /*#__PURE__*/React.createElement("a", { 823 href: "https://drive.google.com/file/d/1l51USAv7q9LHJfRvG9Tm2TrvQy7XaPzC/view", 824 target: "_blank", 825 rel: "noopener noreferrer" 826 }, "Master Services Agreement"))), /*#__PURE__*/React.createElement("div", { 827 className: "footer__bottom" 828 }, /*#__PURE__*/React.createElement("span", null, "\xA9 2026 Ruvos. All rights reserved."), /*#__PURE__*/React.createElement("div", { 829 className: "footer__social", 830 "aria-label": "Social media" 831 }, /*#__PURE__*/React.createElement("a", { 832 href: "https://x.com/thisisruvos", 833 target: "_blank", 834 rel: "noopener noreferrer", 835 "aria-label": "X" 836 }, /*#__PURE__*/React.createElement("svg", { 837 width: "14", 838 height: "14", 839 viewBox: "0 0 16 16", 840 fill: "currentColor" 841 }, /*#__PURE__*/React.createElement("path", { 842 d: "M12.1 1.5h2.3l-5 5.7L15.3 15h-4.6l-3.6-4.7L2.9 15H.6l5.4-6.1L.4 1.5h4.7L8.4 5.8l3.7-4.3Zm-.8 12.1h1.3L4.8 2.8H3.4l7.9 10.8Z" 843 }))), /*#__PURE__*/React.createElement("a", { 844 href: "https://www.linkedin.com/company/werruvos/", 845 target: "_blank", 846 rel: "noopener noreferrer", 847 "aria-label": "LinkedIn" 848 }, /*#__PURE__*/React.createElement("svg", { 849 width: "14", 850 height: "14", 851 viewBox: "0 0 16 16", 852 fill: "currentColor" 853 }, /*#__PURE__*/React.createElement("path", { 854 d: "M3.4 14V5.3H.5V14h2.9ZM2 4.1c1 0 1.6-.7 1.6-1.5S3 1 2 1C1 1 .3 1.7.3 2.6c0 .8.6 1.5 1.6 1.5Zm4.3 9.9h2.8V9.1c0-.2 0-.5.1-.7.2-.5.7-1.1 1.5-1.1 1 0 1.5.8 1.5 1.9V14H15V8.8c0-2.6-1.4-3.8-3.3-3.8-1.5 0-2.2.9-2.6 1.5v-1.3H6.3c0 .8 0 8.8 0 8.8Z" 855 }))), /*#__PURE__*/React.createElement("a", { 856 href: "https://www.youtube.com/channel/UCLJNt4ocvElZw3-WBJgGtQw", 857 target: "_blank", 858 rel: "noopener noreferrer", 859 "aria-label": "YouTube" 860 }, /*#__PURE__*/React.createElement("svg", { 861 width: "16", 862 height: "14", 863 viewBox: "0 0 16 14", 864 fill: "currentColor" 865 }, /*#__PURE__*/React.createElement("path", { 866 d: "M15.6 2.2c-.2-.7-.7-1.2-1.4-1.4C13 .5 8 .5 8 .5s-5 0-6.2.3C1.1 1 .6 1.5.4 2.2 0 3.4 0 7 0 7s0 3.6.4 4.8c.2.7.7 1.2 1.4 1.4 1.2.3 6.2.3 6.2.3s5 0 6.2-.3c.7-.2 1.2-.7 1.4-1.4.4-1.2.4-4.8.4-4.8s0-3.6-.4-4.8ZM6.4 9.3V4.7L10.6 7l-4.2 2.3Z" 867 }))), /*#__PURE__*/React.createElement("a", { 868 href: "https://www.facebook.com/ThisIsRuvos/", 869 target: "_blank", 870 rel: "noopener noreferrer", 871 "aria-label": "Facebook" 872 }, /*#__PURE__*/React.createElement("svg", { 873 width: "14", 874 height: "14", 875 viewBox: "0 0 16 16", 876 fill: "currentColor" 877 }, /*#__PURE__*/React.createElement("path", { 878 d: "M9.3 16V8.8h2.4l.4-2.8H9.3V4.2c0-.8.2-1.4 1.4-1.4h1.5V.3C11.9.3 11 .2 9.9.2 7.7.2 6.3 1.5 6.3 4v2H4v2.8h2.3V16h3Z" 879 })))))); 880} 881 882// ââââââââââââââââââââââââââââââââââââââââââââââââââ 883// App 884// ââââââââââââââââââââââââââââââââââââââââââââââââââ 885function App() { 886 useEffect(() => { 887 if (!window.location.hash) return; 888 const el = document.querySelector(window.location.hash); 889 if (el) el.scrollIntoView({ 890 behavior: 'smooth' 891 }); 892 }, []); 893 return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Nav, null), /*#__PURE__*/React.createElement(Hero, null), /*#__PURE__*/React.createElement(LogoMarquee, null), /*#__PURE__*/React.createElement(RuralHealthBanner, null), /*#__PURE__*/React.createElement(Products, null), /*#__PURE__*/React.createElement(Services, null), /*#__PURE__*/React.createElement(Contact, null), /*#__PURE__*/React.createElement(Footer, null)); 894} 895Object.assign(window, { 896 App, 897 Nav, 898 Hero, 899 LogoMarquee, 900 Products, 901 Services, 902 Contact, 903 InterestForm, 904 Footer 905});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.