PageSourceSearch

https://ruvos.com/js/components.js?v=20260925b

js ruvos.com collected 2026-10-03 19:41:22 UTC 35,328 bytes, 905 lines download raw bytes

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.