PageSourceSearch

https://ruvos.com/js/components.js?v=20260915

js ruvos.com collected 2026-09-25 14:28:24 UTC 33,247 bytes, 865 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// Products section
202// ——————————————————————————————————————————————————
203const PRODUCTS = [{
204  title: 'AIMS',
205  logo: /*#__PURE__*/React.createElement(AimsLogo, null),
206  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.",
207  tags: ['National Backbone', 'Crisis Tested', 'TEFCA Enabled'],
208  brandA: '#2AB5BA',
209  brandB: '#1A1F2E',
210  href: 'https://aphl.org/focus-areas/informatics/aims-platform/overview',
211  external: true
212}, {
213  title: 'HCAP',
214  logo: /*#__PURE__*/React.createElement(HcapLogo, null),
215  desc: "Healthcare Capacity is a decision-support platform that turns fragmented public health and healthcare data into a clear, actionable picture of community need.",
216  tags: ['Global Data', 'Decision Support', 'Progress Tracking'],
217  brandA: '#DD1A3C',
218  brandB: '#1F2A5A',
219  href: 'hcap.html'
220}, {
221  title: 'Integrity',
222  logo: /*#__PURE__*/React.createElement(IntegrityLogo, null),
223  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.",
224  tags: ['Data Quality', 'Real-time Intelligence', 'Analytics'],
225  brandA: '#1947E5',
226  brandB: '#2A2A2E',
227  href: 'integrity.html'
228}, {
229  title: 'WellGS',
230  logo: /*#__PURE__*/React.createElement(WellGsLogo, null),
231  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.",
232  tags: ['Bioinformatics Lab', 'AWS HealthOmics', 'LIMS Integration'],
233  brandA: '#4A7CD6',
234  brandB: '#0B195C',
235  href: 'wellgs.html'
236}, {
237  title: 'Global Mosaic',
238  logo: /*#__PURE__*/React.createElement(GloMoLogo, null),
239  desc: "GloMo is an end-to-end geospatial analytics project that lets users explore administrative boundaries, draw polygons, and query population and demographic mosaics.",
240  tags: ['Custom Polygons', 'Pixel Data', 'AI Enabled Insights'],
241  brandA: '#1B6B6B',
242  brandB: '#C44B2B'
243},
244// BioDB hidden
245// {
246//   title: 'BioDB',
247//   logo: <BioDbLogo />,
248//   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.",
249//   tags: ['Genomics', 'Genome Data Exchange', 'Analytics'],
250//   brandA: '#7FAE5A', brandB: '#4A7038',
251//   href: 'biodb.html',
252// },
253{
254  title: 'Global Pandemic Simulator',
255  logo: /*#__PURE__*/React.createElement(PandemicLogo, null),
256  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.",
257  tags: ['Outbreak Models', 'AI-Enabled Insights', 'Pandemic Passport'],
258  brandA: '#0093D0',
259  brandB: '#0E1E37'
260}, {
261  title: 'WellConnector',
262  logo: /*#__PURE__*/React.createElement(WellConnectorLogo, null),
263  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.",
264  tags: ['Encrypted', 'Instant Transfer', 'Health Passport'],
265  brandA: '#2479F2',
266  brandB: '#13218B',
267  href: 'https://www.wellconnector.com/',
268  external: true
269}, {
270  title: 'TLH NavCare',
271  logo: /*#__PURE__*/React.createElement(TlhNavCareLogo, null),
272  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.",
273  tags: ['Tallahassee Health', 'Community-Driven'],
274  brandA: '#0E8C8C',
275  brandB: '#0A5A5A',
276  href: 'https://tlhnavcare.com/',
277  external: true
278}, {
279  title: 'Capital Region Business Concierge',
280  logo: /*#__PURE__*/React.createElement(CapitalRegionLogo, null),
281  desc: "A platform connecting businesses, entrepreneurs, talent, investors, and community organizations across Florida's Capital Region.",
282  tags: ['Business Network', 'Regional Platform', 'Community Resources'],
283  brandA: '#003366',
284  brandB: '#C6942A',
285  href: 'https://capitalregion.biz/',
286  external: true
287}];
288
289// Brand-mark components (simple SVG/type marks)
290function AimsLogo() {
291  return /*#__PURE__*/React.createElement("img", {
292    src: "assets/logo-aims.png",
293    alt: "AIMS",
294    style: {
295      height: 96,
296      width: 'auto',
297      objectFit: 'contain'
298    }
299  });
300}
301function HcapLogo() {
302  return /*#__PURE__*/React.createElement("img", {
303    src: "assets/logo-hcap.png",
304    alt: "HCAP",
305    style: {
306      height: 56,
307      width: 'auto',
308      objectFit: 'contain'
309    }
310  });
311}
312function IntegrityLogo() {
313  return /*#__PURE__*/React.createElement("img", {
314    src: "assets/logo-integrity.png",
315    alt: "Integrity",
316    style: {
317      height: 110,
318      width: 'auto',
319      objectFit: 'contain'
320    }
321  });
322}
323function GloMoLogo() {
324  return /*#__PURE__*/React.createElement("img", {
325    src: "assets/GlobalMosaic_Wordmark_Light.png",
326    alt: "Global Mosaic",
327    style: {
328      height: 80,
329      width: 'auto',
330      objectFit: 'contain'
331    }
332  });
333}
334function WellGsLogo() {
335  return /*#__PURE__*/React.createElement("img", {
336    src: "assets/logo-wellgs.png",
337    alt: "WellGS",
338    style: {
339      width: 330,
340      height: 'auto',
341      display: 'block'
342    }
343  });
344}
345function BioDbLogo() {
346  return /*#__PURE__*/React.createElement("img", {
347    src: "assets/logo-biodb.png",
348    alt: "BioDB",
349    style: {
350      height: 140,
351      width: 'auto',
352      objectFit: 'contain'
353    }
354  });
355}
356function PandemicLogo() {
357  return /*#__PURE__*/React.createElement("img", {
358    src: "assets/WHO_PanSim.png",
359    alt: "WHO Pandemic Simulator",
360    style: {
361      maxHeight: 100,
362      width: '92%',
363      maxWidth: 340,
364      objectFit: 'contain'
365    }
366  });
367}
368function TlhNavCareLogo() {
369  return /*#__PURE__*/React.createElement("img", {
370    src: "assets/logo-tlhnavcare.png",
371    alt: "TLH NavCare",
372    style: {
373      height: 88,
374      width: 'auto',
375      objectFit: 'contain'
376    }
377  });
378}
379function CapitalRegionLogo() {
380  return /*#__PURE__*/React.createElement("div", {
381    style: {
382      display: 'flex',
383      flexDirection: 'column',
384      alignItems: 'center',
385      gap: 5
386    }
387  }, /*#__PURE__*/React.createElement("span", {
388    style: {
389      fontFamily: 'var(--font-display)',
390      fontWeight: 700,
391      fontSize: 41,
392      letterSpacing: '-0.02em',
393      color: '#003366'
394    }
395  }, "Capital Region"), /*#__PURE__*/React.createElement("span", {
396    style: {
397      fontFamily: 'var(--font-display)',
398      fontWeight: 600,
399      fontSize: 22,
400      letterSpacing: '0.14em',
401      textTransform: 'uppercase',
402      color: '#C6942A'
403    }
404  }, "Business Concierge"));
405}
406function WellConnectorLogo() {
407  return /*#__PURE__*/React.createElement("img", {
408    src: "assets/logo-wellconnector.png?v=1",
409    alt: "WellConnector",
410    style: {
411      width: 330,
412      height: 'auto',
413      display: 'block'
414    }
415  });
416}
417function Products() {
418  return /*#__PURE__*/React.createElement("section", {
419    className: "section",
420    id: "products"
421  }, /*#__PURE__*/React.createElement("div", {
422    className: "section__inner"
423  }, /*#__PURE__*/React.createElement("div", {
424    className: "section__head"
425  }, /*#__PURE__*/React.createElement("h2", {
426    className: "section__title"
427  }, "We don\u2019t just consult. ", /*#__PURE__*/React.createElement("b", null, "We build.")), /*#__PURE__*/React.createElement("p", {
428    className: "section__sub"
429  }, "From strategy and roadmapping through implementation, operations, and long-term support, we stay with our partners for the full journey."), /*#__PURE__*/React.createElement("div", {
430    style: {
431      marginTop: 28
432    }
433  }, /*#__PURE__*/React.createElement("span", {
434    className: "section__eyebrow"
435  }, /*#__PURE__*/React.createElement("svg", {
436    width: "14",
437    height: "14",
438    viewBox: "0 0 24 24",
439    fill: "none",
440    stroke: "currentColor",
441    strokeWidth: "1.8",
442    strokeLinecap: "round",
443    strokeLinejoin: "round",
444    "aria-hidden": "true"
445  }, /*#__PURE__*/React.createElement("rect", {
446    width: "20",
447    height: "14",
448    x: "2",
449    y: "7",
450    rx: "2"
451  }), /*#__PURE__*/React.createElement("path", {
452    d: "M6 3h12"
453  }), /*#__PURE__*/React.createElement("path", {
454    d: "M2 11h20"
455  })), "Solutions"))), /*#__PURE__*/React.createElement("div", {
456    className: "products"
457  }, PRODUCTS.map((p, i) => /*#__PURE__*/React.createElement("article", {
458    key: i,
459    className: `pcard${p.comingSoon ? ' pcard--soon' : ''}${p.href ? ' pcard--link' : ''}`,
460    style: {
461      '--brandA': p.brandA,
462      '--brandB': p.brandB
463    }
464  }, p.href ? /*#__PURE__*/React.createElement("a", _extends({
465    href: p.href,
466    className: "pcard__media-link",
467    "aria-label": `Learn more about ${p.title}`
468  }, p.external ? {
469    target: '_blank',
470    rel: 'noopener noreferrer'
471  } : {}), /*#__PURE__*/React.createElement("div", {
472    className: "pcard__media"
473  }, p.logo, p.comingSoon && /*#__PURE__*/React.createElement("span", {
474    className: "pcard__badge"
475  }, "Coming soon"))) : /*#__PURE__*/React.createElement("div", {
476    className: "pcard__media"
477  }, p.logo, p.comingSoon && /*#__PURE__*/React.createElement("span", {
478    className: "pcard__badge"
479  }, "Coming soon")), /*#__PURE__*/React.createElement("div", {
480    className: "pcard__body"
481  }, /*#__PURE__*/React.createElement("h3", {
482    className: "pcard__title"
483  }, p.title), /*#__PURE__*/React.createElement("p", {
484    className: "pcard__desc"
485  }, p.desc), /*#__PURE__*/React.createElement("div", {
486    className: "pcard__tags"
487  }, p.tags.map((t, j) => /*#__PURE__*/React.createElement("span", {
488    key: j,
489    className: "tag"
490  }, t)))))))));
491}
492
493// ——————————————————————————————————————————————————
494// Services
495// ——————————————————————————————————————————————————
496const SERVICES = [{
497  img: 'assets/service-interop.gif',
498  title: 'Interoperability',
499  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."
500}, {
501  img: 'assets/service-analytics.gif',
502  title: 'Advanced Analytics',
503  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."
504}, {
505  img: 'assets/service-modernization.gif',
506  title: 'Modernization',
507  desc: "We help organizations move from outdated, legacy infrastructure to modern, scalable systems, without disrupting the work that depends on them."
508}];
509function Services() {
510  return /*#__PURE__*/React.createElement("section", {
511    className: "section",
512    id: "services",
513    style: {
514      background: 'transparent',
515      borderTop: '1px solid var(--border)',
516      borderBottom: '1px solid var(--border)'
517    }
518  }, /*#__PURE__*/React.createElement("div", {
519    className: "section__inner"
520  }, /*#__PURE__*/React.createElement("div", {
521    className: "section__head"
522  }, /*#__PURE__*/React.createElement("h2", {
523    className: "section__title"
524  }, /*#__PURE__*/React.createElement("b", null, "We translate"), " across disciplines"), /*#__PURE__*/React.createElement("p", {
525    className: "section__sub"
526  }, "Our team brings together data engineering, public health, epidemiology, clinical practice, and strategy."), /*#__PURE__*/React.createElement("div", {
527    style: {
528      marginTop: 28
529    }
530  }, /*#__PURE__*/React.createElement("span", {
531    className: "section__eyebrow"
532  }, /*#__PURE__*/React.createElement("svg", {
533    width: "14",
534    height: "14",
535    viewBox: "0 0 24 24",
536    fill: "none",
537    stroke: "currentColor",
538    strokeWidth: "1.8",
539    strokeLinecap: "round",
540    strokeLinejoin: "round",
541    "aria-hidden": "true"
542  }, /*#__PURE__*/React.createElement("path", {
543    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"
544  })), "Our Services"))), /*#__PURE__*/React.createElement("div", {
545    className: "services"
546  }, SERVICES.map((s, i) => /*#__PURE__*/React.createElement("article", {
547    key: i,
548    className: "scard"
549  }, /*#__PURE__*/React.createElement("div", {
550    className: "scard__visual"
551  }, /*#__PURE__*/React.createElement("img", {
552    src: s.img,
553    alt: s.title
554  })), /*#__PURE__*/React.createElement("h3", {
555    className: "scard__title"
556  }, s.title), /*#__PURE__*/React.createElement("p", {
557    className: "scard__desc"
558  }, s.desc))))));
559}
560
561// ——————————————————————————————————————————————————
562// Contact CTA
563// ——————————————————————————————————————————————————
564function Typewriter({
565  words,
566  typeSpeed = 110,
567  deleteSpeed = 55,
568  holdMs = 1100
569}) {
570  const [wi, setWi] = useState(0);
571  const [text, setText] = useState('');
572  const [phase, setPhase] = useState('typing'); // typing | holding | deleting
573
574  useEffect(() => {
575    const word = words[wi % words.length];
576    let t;
577    if (phase === 'typing') {
578      if (text.length < word.length) {
579        t = setTimeout(() => setText(word.slice(0, text.length + 1)), typeSpeed);
580      } else {
581        t = setTimeout(() => setPhase('deleting'), holdMs);
582      }
583    } else if (phase === 'deleting') {
584      if (text.length > 0) {
585        t = setTimeout(() => setText(word.slice(0, text.length - 1)), deleteSpeed);
586      } else {
587        setPhase('typing');
588        setWi(i => (i + 1) % words.length);
589      }
590    }
591    return () => clearTimeout(t);
592  }, [text, phase, wi, words, typeSpeed, deleteSpeed, holdMs]);
593  return /*#__PURE__*/React.createElement("span", {
594    className: "contact__typed"
595  }, /*#__PURE__*/React.createElement("span", {
596    className: "contact__l"
597  }, text), /*#__PURE__*/React.createElement("span", {
598    className: "contact__cursor"
599  }, "_"));
600}
601function Contact() {
602  return /*#__PURE__*/React.createElement("section", {
603    className: "contact",
604    id: "contact"
605  }, /*#__PURE__*/React.createElement("div", {
606    className: "contact__inner"
607  }, /*#__PURE__*/React.createElement("h2", {
608    className: "contact__title"
609  }, /*#__PURE__*/React.createElement("span", {
610    className: "contact__line contact__line--1"
611  }, "We speak your"), /*#__PURE__*/React.createElement("span", {
612    className: "contact__line contact__line--2"
613  }, /*#__PURE__*/React.createElement(Typewriter, {
614    words: ["System", "LIMS", "EHR", "Data", "Cloud"]
615  }), " language.")), /*#__PURE__*/React.createElement("p", {
616    className: "contact__sub"
617  }, "Let\u2019s get the conversation started."), /*#__PURE__*/React.createElement("a", {
618    href: "mailto:[email protected]",
619    className: "btn btn--primary"
620  }, "Contact us")));
621}
622
623// ——————————————————————————————————————————————————
624// Interest form — Netlify Forms
625// ——————————————————————————————————————————————————
626// Netlify detects forms by parsing the STATIC HTML at deploy time. These pages
627// render through React, so the form does not exist in the deployed markup and
628// would never be detected. Each page that uses this component therefore carries
629// a matching hidden <form> in its .html file — same `name`, same field names —
630// which is what Netlify registers. This component posts to it by form-name.
631//
632// Submitting over fetch rather than a native POST keeps the visitor on the page
633// and lets the section swap to an inline thank-you instead of bouncing to
634// Netlify's generic success page.
635function InterestForm({
636  formName,
637  onDark,
638  submitLabel = 'Send'
639}) {
640  const [status, setStatus] = useState('idle'); // idle | sending | done | error
641
642  function handleSubmit(e) {
643    e.preventDefault();
644    const body = new URLSearchParams(new FormData(e.target)).toString();
645    setStatus('sending');
646    fetch('/', {
647      method: 'POST',
648      headers: {
649        'Content-Type': 'application/x-www-form-urlencoded'
650      },
651      body
652    }).then(res => {
653      if (!res.ok) throw new Error(`Netlify returned ${res.status}`);
654      setStatus('done');
655    }).catch(() => setStatus('error'));
656  }
657  const cls = `cform${onDark ? ' cform--on-dark' : ''}`;
658  if (status === 'done') {
659    return /*#__PURE__*/React.createElement("div", {
660      className: `${cls} cform__thanks`,
661      role: "status"
662    }, /*#__PURE__*/React.createElement("h3", {
663      className: "cform__thanks-title"
664    }, "Thanks \u2014 we\u2019ve got it."), /*#__PURE__*/React.createElement("p", {
665      className: "cform__thanks-body"
666    }, "Someone from our team will follow up at the address you gave us."));
667  }
668  return /*#__PURE__*/React.createElement("form", {
669    className: cls,
670    name: formName,
671    method: "POST",
672    "data-netlify": "true",
673    "data-netlify-honeypot": "bot-field",
674    onSubmit: handleSubmit
675  }, /*#__PURE__*/React.createElement("input", {
676    type: "hidden",
677    name: "form-name",
678    value: formName
679  }), /*#__PURE__*/React.createElement("p", {
680    className: "cform__hp"
681  }, /*#__PURE__*/React.createElement("label", null, "Leave this field empty", /*#__PURE__*/React.createElement("input", {
682    name: "bot-field",
683    tabIndex: "-1",
684    autoComplete: "off"
685  }))), /*#__PURE__*/React.createElement("div", {
686    className: "cform__row"
687  }, /*#__PURE__*/React.createElement("label", {
688    className: "cform__field"
689  }, /*#__PURE__*/React.createElement("span", {
690    className: "cform__label"
691  }, "Name"), /*#__PURE__*/React.createElement("input", {
692    className: "cform__input",
693    type: "text",
694    name: "name",
695    required: true,
696    autoComplete: "name"
697  })), /*#__PURE__*/React.createElement("label", {
698    className: "cform__field"
699  }, /*#__PURE__*/React.createElement("span", {
700    className: "cform__label"
701  }, "Organization"), /*#__PURE__*/React.createElement("input", {
702    className: "cform__input",
703    type: "text",
704    name: "organization",
705    required: true,
706    autoComplete: "organization"
707  }))), /*#__PURE__*/React.createElement("label", {
708    className: "cform__field"
709  }, /*#__PURE__*/React.createElement("span", {
710    className: "cform__label"
711  }, "Email address"), /*#__PURE__*/React.createElement("input", {
712    className: "cform__input",
713    type: "email",
714    name: "email",
715    required: true,
716    autoComplete: "email"
717  })), /*#__PURE__*/React.createElement("div", {
718    className: "cform__actions"
719  }, /*#__PURE__*/React.createElement("button", {
720    type: "submit",
721    className: "btn btn--primary",
722    disabled: status === 'sending'
723  }, status === 'sending' ? 'Sending…' : submitLabel, /*#__PURE__*/React.createElement("svg", {
724    className: "btn__arrow",
725    width: "16",
726    height: "16",
727    viewBox: "0 0 16 16",
728    fill: "none"
729  }, /*#__PURE__*/React.createElement("path", {
730    d: "M3 8h10M9 4l4 4-4 4",
731    stroke: "currentColor",
732    strokeWidth: "1.5",
733    strokeLinecap: "round",
734    strokeLinejoin: "round"
735  }))), /*#__PURE__*/React.createElement("p", {
736    className: "cform__alt"
737  }, "Prefer email? ", /*#__PURE__*/React.createElement("a", {
738    href: "mailto:[email protected]"
739  }, "[email protected]"))), status === 'error' && /*#__PURE__*/React.createElement("p", {
740    className: "cform__error",
741    role: "alert"
742  }, "Something went wrong sending that. Please email us at", ' ', /*#__PURE__*/React.createElement("a", {
743    href: "mailto:[email protected]"
744  }, "[email protected]"), " and we\u2019ll pick it up from there."));
745}
746
747// ——————————————————————————————————————————————————
748// Footer
749// ——————————————————————————————————————————————————
750function Footer() {
751  return /*#__PURE__*/React.createElement("footer", {
752    className: "footer"
753  }, /*#__PURE__*/React.createElement("div", {
754    className: "footer__inner"
755  }, /*#__PURE__*/React.createElement("div", {
756    className: "footer__logo"
757  }, /*#__PURE__*/React.createElement("img", {
758    src: "assets/ruvos-logo-footer.png",
759    alt: "Ruvos"
760  })), /*#__PURE__*/React.createElement("div", {
761    className: "footer__col"
762  }, /*#__PURE__*/React.createElement("h4", {
763    className: "footer__col-title"
764  }, "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", {
765    className: "footer__col"
766  }, /*#__PURE__*/React.createElement("h4", {
767    className: "footer__col-title"
768  }, "Contact"), /*#__PURE__*/React.createElement("p", null, "We\u2019d love to hear from you!"), /*#__PURE__*/React.createElement("a", {
769    href: "mailto:[email protected]"
770  }, "Reach out at [email protected]"), /*#__PURE__*/React.createElement("a", {
771    href: "tel:+18502547270"
772  }, "+1 850-254-7270")), /*#__PURE__*/React.createElement("div", {
773    className: "footer__col"
774  }, /*#__PURE__*/React.createElement("h4", {
775    className: "footer__col-title"
776  }, "Company"), /*#__PURE__*/React.createElement("a", {
777    href: "about.html"
778  }, "About"), /*#__PURE__*/React.createElement("a", {
779    href: "team.html"
780  }, "Team"), /*#__PURE__*/React.createElement("a", {
781    href: "careers.html"
782  }, "Careers"), /*#__PURE__*/React.createElement("a", {
783    href: "https://drive.google.com/file/d/1l51USAv7q9LHJfRvG9Tm2TrvQy7XaPzC/view",
784    target: "_blank",
785    rel: "noopener noreferrer"
786  }, "Master Services Agreement"))), /*#__PURE__*/React.createElement("div", {
787    className: "footer__bottom"
788  }, /*#__PURE__*/React.createElement("span", null, "\xA9 2026 Ruvos. All rights reserved."), /*#__PURE__*/React.createElement("div", {
789    className: "footer__social",
790    "aria-label": "Social media"
791  }, /*#__PURE__*/React.createElement("a", {
792    href: "https://x.com/thisisruvos",
793    target: "_blank",
794    rel: "noopener noreferrer",
795    "aria-label": "X"
796  }, /*#__PURE__*/React.createElement("svg", {
797    width: "14",
798    height: "14",
799    viewBox: "0 0 16 16",
800    fill: "currentColor"
801  }, /*#__PURE__*/React.createElement("path", {
802    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"
803  }))), /*#__PURE__*/React.createElement("a", {
804    href: "https://www.linkedin.com/company/werruvos/",
805    target: "_blank",
806    rel: "noopener noreferrer",
807    "aria-label": "LinkedIn"
808  }, /*#__PURE__*/React.createElement("svg", {
809    width: "14",
810    height: "14",
811    viewBox: "0 0 16 16",
812    fill: "currentColor"
813  }, /*#__PURE__*/React.createElement("path", {
814    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"
815  }))), /*#__PURE__*/React.createElement("a", {
816    href: "https://www.youtube.com/channel/UCLJNt4ocvElZw3-WBJgGtQw",
817    target: "_blank",
818    rel: "noopener noreferrer",
819    "aria-label": "YouTube"
820  }, /*#__PURE__*/React.createElement("svg", {
821    width: "16",
822    height: "14",
823    viewBox: "0 0 16 14",
824    fill: "currentColor"
825  }, /*#__PURE__*/React.createElement("path", {
826    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"
827  }))), /*#__PURE__*/React.createElement("a", {
828    href: "https://www.facebook.com/ThisIsRuvos/",
829    target: "_blank",
830    rel: "noopener noreferrer",
831    "aria-label": "Facebook"
832  }, /*#__PURE__*/React.createElement("svg", {
833    width: "14",
834    height: "14",
835    viewBox: "0 0 16 16",
836    fill: "currentColor"
837  }, /*#__PURE__*/React.createElement("path", {
838    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"
839  }))))));
840}
841
842// ——————————————————————————————————————————————————
843// App
844// ——————————————————————————————————————————————————
845function App() {
846  useEffect(() => {
847    if (!window.location.hash) return;
848    const el = document.querySelector(window.location.hash);
849    if (el) el.scrollIntoView({
850      behavior: 'smooth'
851    });
852  }, []);
853  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(Products, null), /*#__PURE__*/React.createElement(Services, null), /*#__PURE__*/React.createElement(Contact, null), /*#__PURE__*/React.createElement(Footer, null));
854}
855Object.assign(window, {
856  App,
857  Nav,
858  Hero,
859  LogoMarquee,
860  Products,
861  Services,
862  Contact,
863  InterestForm,
864  Footer
865});

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.