@luxonis/component-lib 1.0.12 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1544,6 +1544,687 @@ var TabsContent = React15.forwardRef(({ className, ...props }, ref) => /* @__PUR
1544
1544
  }
1545
1545
  ));
1546
1546
  TabsContent.displayName = TabsPrimitive.Content.displayName;
1547
+
1548
+ // src/ProgressBar.tsx
1549
+ import * as React16 from "react";
1550
+ import * as ProgressPrimitive from "@radix-ui/react-progress";
1551
+ import { cx as cx22 } from "class-variance-authority";
1552
+ import { jsx as jsx26 } from "react/jsx-runtime";
1553
+ var Progress = React16.forwardRef(({ className, value, ...props }, ref) => /* @__PURE__ */ jsx26(
1554
+ ProgressPrimitive.Root,
1555
+ {
1556
+ ref,
1557
+ className: cx22("relative h-2 w-full overflow-hidden rounded-full bg-primary/20", className),
1558
+ ...props,
1559
+ children: /* @__PURE__ */ jsx26(
1560
+ ProgressPrimitive.Indicator,
1561
+ {
1562
+ className: "size-full flex-1 bg-primary transition-all",
1563
+ style: { transform: `translateX(-${100 - (value || 0)}%)` }
1564
+ }
1565
+ )
1566
+ }
1567
+ ));
1568
+ Progress.displayName = ProgressPrimitive.Root.displayName;
1569
+
1570
+ // src/EdgeSlideshow.tsx
1571
+ import { useEffect as useEffect3, useState as useState6 } from "react";
1572
+ import { useInView } from "react-intersection-observer";
1573
+ import { Fragment as Fragment2, jsx as jsx27, jsxs as jsxs14 } from "react/jsx-runtime";
1574
+ var slides = [
1575
+ "ai-performance",
1576
+ //'stereo-depth',
1577
+ //'video-streaming',
1578
+ "processing-efficiency",
1579
+ "custom-vision"
1580
+ ];
1581
+ function getNextSlide(currentSlide) {
1582
+ const currentIndex = slides.indexOf(currentSlide);
1583
+ const nextIndex = (currentIndex + 1) % slides.length;
1584
+ return slides[nextIndex];
1585
+ }
1586
+ function getSlideInfo(slide) {
1587
+ switch (slide) {
1588
+ case "ai-performance":
1589
+ return {
1590
+ title: "AI Performance",
1591
+ imageUrl: "ai-performance.webp",
1592
+ imageAlt: "AI Performance",
1593
+ content: /* @__PURE__ */ jsxs14(Fragment2, { children: [
1594
+ /* @__PURE__ */ jsx27(
1595
+ EdgeSlideshowTextPoint,
1596
+ {
1597
+ title: "48 TOPS INT8 / 12 TOPS FP16:",
1598
+ description: "Handle complex neural models effortlessly, from object detection to segmentation."
1599
+ }
1600
+ ),
1601
+ /* @__PURE__ */ jsx27(
1602
+ EdgeSlideshowTextPoint,
1603
+ {
1604
+ title: "Run YOLO, ResNet, MobileNet (90+Models):",
1605
+ description: "Optimized for high throughput and low latency."
1606
+ }
1607
+ ),
1608
+ /* @__PURE__ */ jsx27(
1609
+ EdgeSlideshowTextPoint,
1610
+ {
1611
+ title: "Inference Speed:",
1612
+ description: /* @__PURE__ */ jsxs14("article", { className: "flex flex-row flex-wrap items-start gap-2 lg:items-center", children: [
1613
+ /* @__PURE__ */ jsx27(EdgeSlideshowTextPointButton, { text: "YOLOv5m: 280 FPS" }),
1614
+ /* @__PURE__ */ jsx27(EdgeSlideshowTextPointButton, { text: "ResNet-50: 934 FPS" }),
1615
+ /* @__PURE__ */ jsx27(EdgeSlideshowTextPointButton, { text: "BiseNetv1-MBNV2: 647 FPS" })
1616
+ ] })
1617
+ }
1618
+ )
1619
+ ] })
1620
+ };
1621
+ //case 'stereo-depth':
1622
+ // return {
1623
+ // title: 'Stereo Depth Precision',
1624
+ // imageUrl: 'stereo-depth.webp',
1625
+ // imageAlt: 'Stereo Depth',
1626
+ // content: (
1627
+ // <>
1628
+ // <EdgeSlideshowTextPoint
1629
+ // title="Subpixel Accuracy:"
1630
+ // description="Up to 1/32 subpixel, enabling precise depth maps for real-world applications."
1631
+ // />
1632
+ // <EdgeSlideshowTextPoint
1633
+ // title="High Resolution:"
1634
+ // description="Stereo depth at 720p @ 60 FPS with configurable disparity ranges."
1635
+ // />
1636
+ // <EdgeSlideshowTextPoint
1637
+ // title="Advanced Features:"
1638
+ // description="Confidence mapping, neural network based depth matching, and fine-tuning parameters tailored to any environment."
1639
+ // />
1640
+ // </>
1641
+ // ),
1642
+ // };
1643
+ //case 'video-streaming':
1644
+ // return {
1645
+ // title: 'Video Streaming',
1646
+ // imageUrl: 'video-streaming.webp',
1647
+ // imageAlt: 'Video Streaming',
1648
+ // content: (
1649
+ // <>
1650
+ // <EdgeSlideshowTextPoint
1651
+ // title="Encoding:"
1652
+ // description={<EdgeSlideshowTextPointButton text={'4K @ 120 FPS (H.264/H.265)'} />}
1653
+ // />
1654
+ // <EdgeSlideshowTextPoint
1655
+ // title="Decoding:"
1656
+ // description={<EdgeSlideshowTextPointButton text={'4K @ 240 FPS, with VP9 and AV1 support'} />}
1657
+ // />
1658
+ // <EdgeSlideshowTextPoint
1659
+ // title="ISP:"
1660
+ // description={
1661
+ // <article className="flex flex-row flex-wrap gap-2 items-start lg:items-center">
1662
+ // <EdgeSlideshowTextPointButton text={'5 camera streams'} />
1663
+ // <EdgeSlideshowTextPointButton text={'HDR'} />
1664
+ // <EdgeSlideshowTextPointButton text={'EIS'} />
1665
+ // <EdgeSlideshowTextPointButton text={'3A'} />
1666
+ // <EdgeSlideshowTextPointButton text={'up to 3x 8K @ 30FPS'} />
1667
+ // </article>
1668
+ // }
1669
+ // />
1670
+ // </>
1671
+ // ),
1672
+ // };
1673
+ case "processing-efficiency":
1674
+ return {
1675
+ title: "Processing Efficiency",
1676
+ imageUrl: "processing-efficiency.webp",
1677
+ imageAlt: "Processing Efficiency",
1678
+ content: /* @__PURE__ */ jsxs14(Fragment2, { children: [
1679
+ /* @__PURE__ */ jsx27(
1680
+ EdgeSlideshowTextPoint,
1681
+ {
1682
+ title: "Power Consumption:",
1683
+ description: "Average 10\u201315W, balancing performance and energy efficiency for edge deployments."
1684
+ }
1685
+ ),
1686
+ /* @__PURE__ */ jsx27(
1687
+ EdgeSlideshowTextPoint,
1688
+ {
1689
+ title: "Compact Design:",
1690
+ description: "Fully integrated processing in a device that fits in your hand."
1691
+ }
1692
+ )
1693
+ ] })
1694
+ };
1695
+ case "custom-vision":
1696
+ return {
1697
+ title: "Custom Vision Engines",
1698
+ imageUrl: "custom-vision.webp",
1699
+ imageAlt: "Custom Vision",
1700
+ content: /* @__PURE__ */ jsxs14(Fragment2, { children: [
1701
+ /* @__PURE__ */ jsx27(
1702
+ EdgeSlideshowTextPoint,
1703
+ {
1704
+ title: "Processing:",
1705
+ description: "Stereo depth, optical flow, and feature detection are processed in parallel on dedicated hardware blocks."
1706
+ }
1707
+ ),
1708
+ /* @__PURE__ */ jsx27(
1709
+ EdgeSlideshowTextPoint,
1710
+ {
1711
+ title: "Throughput:",
1712
+ description: /* @__PURE__ */ jsxs14("article", { className: "flex flex-col items-start gap-2", children: [
1713
+ /* @__PURE__ */ jsx27(EdgeSlideshowTextPointButton, { text: "Optical Flow:\nFull-dense at VGA @ 60 FPS" }),
1714
+ /* @__PURE__ */ jsx27(EdgeSlideshowTextPointButton, { text: "Template Matching:\n 1080p with 1.2 ms for 500 templates" })
1715
+ ] })
1716
+ }
1717
+ )
1718
+ ] })
1719
+ };
1720
+ }
1721
+ }
1722
+ function EdgeSlideshowTextPointButton(props) {
1723
+ return /* @__PURE__ */ jsx27(
1724
+ Button,
1725
+ {
1726
+ variant: "primaryAlt",
1727
+ className: "min-h-fit cursor-default whitespace-pre-line rounded-md !p-4 text-start",
1728
+ animate: false,
1729
+ children: props.text
1730
+ }
1731
+ );
1732
+ }
1733
+ function EdgeSlideshowImage(props) {
1734
+ const { imageAlt, imageUrl } = getSlideInfo(props.activeSlide);
1735
+ return /* @__PURE__ */ jsx27(
1736
+ "img",
1737
+ {
1738
+ src: `/assets/edge-interference/slideshow/${imageUrl}`,
1739
+ alt: imageAlt,
1740
+ className: "size-full max-w-[1/2] rounded-lg object-cover"
1741
+ }
1742
+ );
1743
+ }
1744
+ function EdgeSlideshowHeader() {
1745
+ return /* @__PURE__ */ jsxs14("header", { className: "flex flex-col gap-4", children: [
1746
+ /* @__PURE__ */ jsx27(Text, { text: "The Benchmark for Edge AI", size: "h2", color: "default" }),
1747
+ /* @__PURE__ */ jsx27(
1748
+ Text,
1749
+ {
1750
+ text: "Luxonis devices deliver unparalleled AI performance at the edge, combining neural inference, stereo depth, and real-time vision in one compact package.",
1751
+ size: "lg",
1752
+ color: "default"
1753
+ }
1754
+ )
1755
+ ] });
1756
+ }
1757
+ function EdgeSlideshowNav(props) {
1758
+ const { activeSlide, setActiveSlide, autoscrolling, inView } = props;
1759
+ const [progress, setProgress] = useState6(0);
1760
+ useEffect3(() => {
1761
+ let intervalId;
1762
+ const startTime = Date.now();
1763
+ if (autoscrolling && inView) {
1764
+ intervalId = window.setInterval(() => {
1765
+ const elapsed = Date.now() - startTime;
1766
+ const newProgress = Math.min(elapsed / 1e4 * 100, 100);
1767
+ setProgress(newProgress);
1768
+ if (newProgress >= 100) {
1769
+ clearInterval(intervalId);
1770
+ setProgress(0);
1771
+ }
1772
+ }, 100);
1773
+ }
1774
+ return () => {
1775
+ if (intervalId !== void 0) {
1776
+ clearInterval(intervalId);
1777
+ }
1778
+ };
1779
+ }, [autoscrolling, activeSlide, inView]);
1780
+ return /* @__PURE__ */ jsx27("nav", { className: "flex flex-row items-center gap-3", children: slides.map(
1781
+ (slide, index) => autoscrolling && slides.indexOf(slide) === slides.indexOf(activeSlide) ? /* @__PURE__ */ jsx27(
1782
+ Progress,
1783
+ {
1784
+ onClick: () => setActiveSlide(slide),
1785
+ value: progress,
1786
+ max: 100,
1787
+ className: "!h-3 w-16 cursor-pointer select-none"
1788
+ },
1789
+ index
1790
+ ) : /* @__PURE__ */ jsx27(
1791
+ Badge,
1792
+ {
1793
+ onClick: () => setActiveSlide(slide),
1794
+ variant: activeSlide === slide ? "default" : "secondary",
1795
+ className: "h-3 w-16 cursor-pointer select-none"
1796
+ },
1797
+ slide
1798
+ )
1799
+ ) });
1800
+ }
1801
+ function EdgeSlideshowTextPoint(props) {
1802
+ return /* @__PURE__ */ jsxs14("article", { className: `flex flex-col items-start gap-2`, children: [
1803
+ /* @__PURE__ */ jsx27(Text, { text: props.title, size: "md", color: "default", weight: "bold" }),
1804
+ typeof props.description === "string" ? /* @__PURE__ */ jsx27(Text, { text: props.description, size: "md", color: "default" }) : props.description
1805
+ ] });
1806
+ }
1807
+ function EdgeSlideshowText(props) {
1808
+ const { activeSlide, setActiveSlide, autoscrolling, inView } = props;
1809
+ const slideInfo = getSlideInfo(activeSlide);
1810
+ return /* @__PURE__ */ jsxs14("section", { className: "flex size-full flex-col justify-between gap-4", children: [
1811
+ /* @__PURE__ */ jsx27("section", { className: "hidden xl:flex", children: /* @__PURE__ */ jsx27(EdgeSlideshowHeader, {}) }),
1812
+ /* @__PURE__ */ jsxs14("article", { className: "flex flex-col items-start gap-8", children: [
1813
+ /* @__PURE__ */ jsx27(Text, { text: slideInfo.title, size: "h4", color: "primary" }),
1814
+ slideInfo.content,
1815
+ /* @__PURE__ */ jsx27(
1816
+ EdgeSlideshowNav,
1817
+ {
1818
+ activeSlide,
1819
+ autoscrolling,
1820
+ inView,
1821
+ setActiveSlide
1822
+ }
1823
+ )
1824
+ ] })
1825
+ ] });
1826
+ }
1827
+ function EdgeSlideshow() {
1828
+ const [activeSlide, setActiveSlide] = useState6("ai-performance");
1829
+ const [autoscrolling, setAutoscrolling] = useState6(true);
1830
+ const { ref, inView } = useInView({});
1831
+ useEffect3(() => {
1832
+ let intervalId;
1833
+ if (inView) {
1834
+ intervalId = window.setInterval(() => {
1835
+ setActiveSlide(getNextSlide(activeSlide));
1836
+ setAutoscrolling(true);
1837
+ }, 1e4);
1838
+ }
1839
+ return () => {
1840
+ if (intervalId !== void 0) {
1841
+ clearInterval(intervalId);
1842
+ }
1843
+ };
1844
+ }, [inView, activeSlide, setActiveSlide]);
1845
+ return /* @__PURE__ */ jsxs14("section", { className: "page-card page-padding bg-white", children: [
1846
+ /* @__PURE__ */ jsx27("section", { className: "flex pb-8 xl:hidden", children: /* @__PURE__ */ jsx27(EdgeSlideshowHeader, {}) }),
1847
+ /* @__PURE__ */ jsxs14(
1848
+ "div",
1849
+ {
1850
+ ref,
1851
+ className: "page-card-content grid grid-cols-1 items-center justify-center gap-8 lg:justify-around lg:gap-24 xl:grid-cols-2 ",
1852
+ children: [
1853
+ /* @__PURE__ */ jsx27(EdgeSlideshowImage, { activeSlide }),
1854
+ /* @__PURE__ */ jsx27(
1855
+ EdgeSlideshowText,
1856
+ {
1857
+ inView,
1858
+ activeSlide,
1859
+ setActiveSlide,
1860
+ autoscrolling
1861
+ }
1862
+ )
1863
+ ]
1864
+ }
1865
+ )
1866
+ ] });
1867
+ }
1868
+
1869
+ // src/StereoDepthCalibration.tsx
1870
+ import { Icon as Icon8 } from "@iconify/react";
1871
+ import { jsx as jsx28, jsxs as jsxs15 } from "react/jsx-runtime";
1872
+ var cards = [
1873
+ {
1874
+ title: "Extreme Precision",
1875
+ text: "Alignment on 42 key metrics ensures unparalleled accuracy across stereo pairs.",
1876
+ icon: "uil:crosshair"
1877
+ },
1878
+ {
1879
+ title: "Wide Lens Compatibility",
1880
+ text: "Accommodates a variety of lenses, including super wide-angle optics.",
1881
+ icon: "mage:lens-fill"
1882
+ },
1883
+ {
1884
+ title: "Temperature Compensation",
1885
+ text: "Calibrated for stability across temperature fluctuations.",
1886
+ icon: "fluent:temperature-16-regular"
1887
+ },
1888
+ {
1889
+ title: "Housing Calibration",
1890
+ text: "Fine-tuned for alignment between the camera and its physical enclosure.",
1891
+ icon: "f7:gear-alt-fill"
1892
+ }
1893
+ ];
1894
+ function StereoDepthCalibrationWrapper() {
1895
+ return /* @__PURE__ */ jsxs15("section", { className: "page-card-content relative flex size-full flex-col items-center justify-center gap-8 overflow-hidden rounded-lg bg-black", children: [
1896
+ /* @__PURE__ */ jsx28(
1897
+ "img",
1898
+ {
1899
+ alt: "Stereo Depth Calibration Background Overlay",
1900
+ src: "/assets/stereo-depth/stereo-depth-calibration-bg.webp",
1901
+ className: "absolute size-full bg-cover bg-center bg-no-repeat object-cover md:h-5/6"
1902
+ }
1903
+ ),
1904
+ /* @__PURE__ */ jsx28(StereoDepthCalibrationBody, {})
1905
+ ] });
1906
+ }
1907
+ function StereoDepthCalibrationHeader() {
1908
+ return /* @__PURE__ */ jsxs15("header", { className: "flex flex-col items-center justify-center gap-4 pt-6 text-center lg:w-1/2", children: [
1909
+ /* @__PURE__ */ jsx28(Text, { text: "Rail Calibration", size: "md", color: "muted", className: "uppercase" }),
1910
+ /* @__PURE__ */ jsx28(Text, { text: "Starting on the Right Track", size: "h2", color: "white" }),
1911
+ /* @__PURE__ */ jsx28(
1912
+ Text,
1913
+ {
1914
+ text: "Our patent pending rail calibration process guarantees unmatched consistency.",
1915
+ size: "lg",
1916
+ color: "white"
1917
+ }
1918
+ )
1919
+ ] });
1920
+ }
1921
+ function StereoDepthCalibrationFooter() {
1922
+ return /* @__PURE__ */ jsxs15("footer", { className: "mt-10 flex flex-col items-start gap-8", children: [
1923
+ /* @__PURE__ */ jsx28(
1924
+ Text,
1925
+ {
1926
+ text: "From lenses to housing, every component is precisely aligned for dependable performance.",
1927
+ size: "h4",
1928
+ color: "white",
1929
+ className: "w-full lg:w-2/5"
1930
+ }
1931
+ ),
1932
+ /* @__PURE__ */ jsx28(StereoDepthCalibrationFooterCards, {})
1933
+ ] });
1934
+ }
1935
+ function StereoDepthCalibrationFooterCard(props) {
1936
+ return /* @__PURE__ */ jsxs15(FrostedCard, { className: "flex h-full flex-col items-start justify-start gap-2", children: [
1937
+ /* @__PURE__ */ jsx28(Icon8, { icon: props.icon, width: 32, height: 32, className: "card-icon" }),
1938
+ /* @__PURE__ */ jsx28(Text, { text: props.title, size: "lg", color: "white", weight: "semibold" }),
1939
+ /* @__PURE__ */ jsx28(Text, { text: props.text, size: "sm", color: "white" })
1940
+ ] });
1941
+ }
1942
+ function StereoDepthCalibrationFooterCards() {
1943
+ return /* @__PURE__ */ jsx28("section", { className: "grid size-full grid-cols-1 items-center justify-center gap-8 md:grid-cols-2 xl:grid-cols-4", children: cards.map((card) => /* @__PURE__ */ jsx28(StereoDepthCalibrationFooterCard, { ...card }, card.title)) });
1944
+ }
1945
+ function StereoDepthCalibrationBody() {
1946
+ return /* @__PURE__ */ jsxs15("section", { className: " z-[1] flex size-full flex-col items-center justify-start overflow-hidden rounded-lg p-4 lg:p-12", children: [
1947
+ /* @__PURE__ */ jsx28(StereoDepthCalibrationHeader, {}),
1948
+ /* @__PURE__ */ jsx28(StereoDepthCalibrationFooter, {})
1949
+ ] });
1950
+ }
1951
+ function StereoDepthCalibration() {
1952
+ return /* @__PURE__ */ jsx28("section", { className: "page-card page-padding bg-white", children: /* @__PURE__ */ jsx28(StereoDepthCalibrationWrapper, {}) });
1953
+ }
1954
+
1955
+ // src/Support.tsx
1956
+ import { cx as cx23 } from "class-variance-authority";
1957
+
1958
+ // src/links.ts
1959
+ var github = "https://github.com/luxonis/";
1960
+ var twitter = "https://twitter.com/luxonis";
1961
+ var linkedin = "https://www.linkedin.com/company/luxonis/";
1962
+ var youtube = "https://www.youtube.com/c/Luxonis";
1963
+ var discord = "https://www.luxonis.com/discord";
1964
+ var docs = "https://docs.luxonis.com/en/latest/";
1965
+ var forum = "https://discuss.luxonis.com/";
1966
+ var status = "https://status.luxonis.com/";
1967
+ var store = "https://shop.luxonis.com/";
1968
+ var oakRealsenseDocs = "https://docs.luxonis.com/projects/hardware/en/latest/pages/guides/realsense_comparison.html";
1969
+ var distributorForm = "https://docs.google.com/forms/d/e/1FAIpQLSeVo9QREQxPsIxiHCAfyEgnI2kK88W4r6dUkCTbYfH_R5emAQ/viewform?vc=0&c=0&w=1&flr=0";
1970
+ var kickstarter = "https://www.kickstarter.com/projects/opencv/rae-0";
1971
+ var raeStorepage = "https://shop.luxonis.com/collections/early-access/products/rae";
1972
+ var robothub = "https://hub.luxonis.com/join";
1973
+ var depthaiHardwareProject = "https://github.com/luxonis/depthai-hardware/tree/master/DM1095_OAK-D-LITE-DEV_DepthAI_USB3C";
1974
+ var getStoreSearchLink = (search) => {
1975
+ return `https://shop.luxonis.com/search?q=${search}`;
1976
+ };
1977
+ var supportMail = "mailto:support@luxonis.com";
1978
+ var supportMailClean = "support@luxonis.com";
1979
+ var salesMail = "mailto:orders@luxonis.com";
1980
+ var salesMailClean = "orders@luxonis.com";
1981
+ var applyMail = "mailto:careers@luxonis.com";
1982
+ var applyMailClean = "careers@luxonis.com";
1983
+ var showcaseMail = "mailto:support@luxonis.com";
1984
+ var showcaseMailClean = "support@luxonis.com";
1985
+ var blog = "https://discuss.luxonis.com/blog";
1986
+ var privacy = "/privacy";
1987
+ var termsOfService = "/terms-of-service";
1988
+ var aboutUs = "/about-us";
1989
+ var showcase = "/solutions";
1990
+ var careers = "/careers";
1991
+ var distributors = "/distributors";
1992
+ var marketing = "/marketing";
1993
+ var robothubInternal = "/hub";
1994
+ var certificates = "/certificates";
1995
+ var services = "/services";
1996
+ var bloomberg = "https://www.bloomberg.com/news/articles/2021-03-11/oak-d-device-paves-the-way-for-future-spatial-ai";
1997
+ var forbes = "https://www.forbes.com/sites/gusalexiou/2021/03/24/cutting-edge-intel-ai-powered-backpack-could-replace-a-guide-dog-for-blind-people/?sh=70bb63d01b36";
1998
+ var techcrunch = "https://techcrunch.com/2020/07/14/opencv-ai-kit-aims-to-do-for-computer-vision-what-raspberry-pi-did-for-hobbyist-hardware/";
1999
+ var camerasProducts = "https://shop.luxonis.com/collections/oak-cameras-1";
2000
+ var modulesProducts = "https://shop.luxonis.com/collections/oak-modules";
2001
+ var accessoriesProducts = "https://shop.luxonis.com/collections/accessories";
2002
+ var earlyAccessProducts = "https://shop.luxonis.com/collections/early-access";
2003
+ var supportForm = "https://share-eu1.hsforms.com/1qY1TD1LgRU27qYXxzRyHNgf2chh";
2004
+ var servicesMeetLink = "https://meetings-eu1.hubspot.com/bradley1/luxonis-services-";
2005
+ var replayInstructions = "https://docs-beta.luxonis.com/cloud/perception-apps/robothub-library/replay/";
2006
+ var contactLink = "https://meetings-eu1.hubspot.com/cj-mann/cj-demo";
2007
+
2008
+ // src/TalkToSalesButton.tsx
2009
+ import { jsx as jsx29 } from "react/jsx-runtime";
2010
+ function TalkToSalesButton() {
2011
+ return /* @__PURE__ */ jsx29("a", { href: contactLink, target: "_blank", children: /* @__PURE__ */ jsx29(Button, { variant: "secondary", color: "white", role: "continue", children: "Talk to Sales" }) });
2012
+ }
2013
+
2014
+ // src/ContactUsForm.tsx
2015
+ import { z } from "zod";
2016
+ import React17 from "react";
2017
+
2018
+ // src/useRudderAnalytics.ts
2019
+ import { useEffect as useEffect4, useState as useState7 } from "react";
2020
+ var useRudderStackAnalytics = () => {
2021
+ const [analytics, setAnalytics] = useState7();
2022
+ useEffect4(() => {
2023
+ if (!analytics) {
2024
+ const initialize = async () => {
2025
+ const { RudderAnalytics } = await import("@rudderstack/analytics-js");
2026
+ const analyticsInstance = new RudderAnalytics();
2027
+ if (!process.env.NEXT_PUBLIC_RUDDERSTACK_WRITE_KEY || !process.env.NEXT_PUBLIC_RUDDERSTACK_DATAPLANE) {
2028
+ console.warn("RudderStack not configured");
2029
+ return;
2030
+ }
2031
+ analyticsInstance.load(
2032
+ process.env.NEXT_PUBLIC_RUDDERSTACK_WRITE_KEY,
2033
+ process.env.NEXT_PUBLIC_RUDDERSTACK_DATAPLANE,
2034
+ {
2035
+ storage: { type: "memoryStorage" }
2036
+ }
2037
+ // Disables storage of events in local storage or cookies
2038
+ );
2039
+ window.rudderanalytics = analyticsInstance;
2040
+ setAnalytics(analyticsInstance);
2041
+ };
2042
+ initialize().catch((e) => console.log(e));
2043
+ }
2044
+ }, [analytics]);
2045
+ return analytics;
2046
+ };
2047
+
2048
+ // src/ContactUsForm.tsx
2049
+ import { jsx as jsx30, jsxs as jsxs16 } from "react/jsx-runtime";
2050
+ var formSchema = z.object({
2051
+ name: z.string().min(1),
2052
+ company: z.string().min(1),
2053
+ email: z.string().email(),
2054
+ message: z.string().min(1),
2055
+ inquiry: z.string().min(1)
2056
+ });
2057
+ function ContactUsForm() {
2058
+ const [formSubmitted, setFormSubmitted] = React17.useState(false);
2059
+ const [formHasError, setFormHasError] = React17.useState(false);
2060
+ const [formIsLoading, setFormIsLoading] = React17.useState(false);
2061
+ const analytics = useRudderStackAnalytics();
2062
+ const handleSubmit = (event) => {
2063
+ event.preventDefault();
2064
+ setFormIsLoading(true);
2065
+ const [nameInput, companyInput, emailInput, inquiryInput, messageInput] = [
2066
+ document.getElementById("name"),
2067
+ document.getElementById("company"),
2068
+ document.getElementById("email"),
2069
+ document.getElementById("inquiry"),
2070
+ document.getElementById("message")
2071
+ ];
2072
+ const formData = {
2073
+ name: nameInput.value,
2074
+ company: companyInput.value,
2075
+ email: emailInput.value,
2076
+ inquiry: inquiryInput.textContent,
2077
+ message: messageInput.value
2078
+ };
2079
+ setFormHasError(false);
2080
+ const parsedData = formSchema.safeParse(formData);
2081
+ if (parsedData.error || !parsedData.data) {
2082
+ console.warn("Form contains errors!", parsedData.error);
2083
+ setFormHasError(true);
2084
+ setFormIsLoading(false);
2085
+ return;
2086
+ }
2087
+ if (!analytics) {
2088
+ console.warn("Rudder Stack not running");
2089
+ setFormIsLoading(false);
2090
+ return;
2091
+ }
2092
+ analytics.identify(
2093
+ parsedData.data.email,
2094
+ {
2095
+ ...parsedData
2096
+ },
2097
+ () => {
2098
+ console.debug("User identified.");
2099
+ }
2100
+ );
2101
+ analytics.track(
2102
+ "Contact Form Submitted",
2103
+ {
2104
+ message: "Message from contact form",
2105
+ reasonForContact: parsedData.data,
2106
+ privacyPolicyAccepted: true,
2107
+ formData
2108
+ },
2109
+ () => {
2110
+ setFormIsLoading(false);
2111
+ console.debug("Form submission event tracked.");
2112
+ }
2113
+ );
2114
+ setFormSubmitted(true);
2115
+ };
2116
+ if (formSubmitted) {
2117
+ return /* @__PURE__ */ jsx30("div", { className: "m-auto flex size-full h-[456px] flex-col items-center justify-center px-4", children: /* @__PURE__ */ jsx30(
2118
+ Text,
2119
+ {
2120
+ size: "h4",
2121
+ text: "Thank you for your message. We will get back to you soon.",
2122
+ color: "white",
2123
+ className: "my-auto text-center"
2124
+ }
2125
+ ) });
2126
+ }
2127
+ return /* @__PURE__ */ jsxs16("form", { id: "contact-form-anchor", className: "flex w-full flex-col gap-6 text-white", onSubmit: handleSubmit, children: [
2128
+ /* @__PURE__ */ jsxs16("div", { className: "flex w-full flex-col gap-6 lg:flex-row", children: [
2129
+ /* @__PURE__ */ jsxs16("div", { className: "flex w-full flex-col gap-2", children: [
2130
+ /* @__PURE__ */ jsx30(Label, { className: "font-normal", htmlFor: "name", children: "Name *" }),
2131
+ /* @__PURE__ */ jsx30(Input, { type: "text", id: "name", placeholder: "E.g. Hanna Johns" })
2132
+ ] }),
2133
+ /* @__PURE__ */ jsxs16("div", { className: "flex w-full flex-col gap-2", children: [
2134
+ /* @__PURE__ */ jsx30(Label, { className: "font-normal", htmlFor: "Company", children: "Company *" }),
2135
+ /* @__PURE__ */ jsx30(Input, { type: "text", id: "company", placeholder: "E.g. Hanna" })
2136
+ ] })
2137
+ ] }),
2138
+ /* @__PURE__ */ jsxs16("div", { className: "flex flex-col gap-2", children: [
2139
+ /* @__PURE__ */ jsx30(Label, { className: "font-normal", htmlFor: "email", children: "E-mail *" }),
2140
+ /* @__PURE__ */ jsx30(Input, { type: "email", id: "email", placeholder: "E.g. info@email.com" })
2141
+ ] }),
2142
+ /* @__PURE__ */ jsxs16("div", { className: "flex flex-col gap-2", children: [
2143
+ /* @__PURE__ */ jsx30(Label, { className: "font-normal", htmlFor: "inquiry", children: "Type of Inquiry *" }),
2144
+ /* @__PURE__ */ jsxs16(Select, { children: [
2145
+ /* @__PURE__ */ jsx30(SelectTrigger, { className: "h-[48px] bg-white text-black ", children: /* @__PURE__ */ jsx30(SelectValue, { id: "inquiry", placeholder: "Select..." }) }),
2146
+ /* @__PURE__ */ jsxs16(SelectContent, { className: "bg-white", children: [
2147
+ /* @__PURE__ */ jsx30(SelectItem, { value: "Hub assistance", children: "Hub assistance" }),
2148
+ /* @__PURE__ */ jsx30(SelectItem, { value: "hardware-issue", children: "Hardware issue" }),
2149
+ /* @__PURE__ */ jsx30(SelectItem, { value: "support", children: "Support" }),
2150
+ /* @__PURE__ */ jsx30(SelectItem, { value: "training", children: "Training" }),
2151
+ /* @__PURE__ */ jsx30(SelectItem, { value: "other", children: "Other" })
2152
+ ] })
2153
+ ] })
2154
+ ] }),
2155
+ /* @__PURE__ */ jsxs16("div", { className: "flex flex-col gap-2", children: [
2156
+ /* @__PURE__ */ jsx30(Label, { className: "font-normal", htmlFor: "message", children: "Message *" }),
2157
+ /* @__PURE__ */ jsx30(Input, { type: "text", id: "message", placeholder: "Type..." })
2158
+ ] }),
2159
+ /* @__PURE__ */ jsxs16("div", { className: "flex flex-row items-center justify-start gap-8", children: [
2160
+ /* @__PURE__ */ jsx30(Button, { type: "submit", variant: "secondary", size: "lg", role: "continue", className: "w-fit", children: formIsLoading ? "Submitting..." : "Submit" }),
2161
+ formHasError && /* @__PURE__ */ jsx30(Text, { text: "Please fill out all fields", color: "error", size: "xl" })
2162
+ ] })
2163
+ ] });
2164
+ }
2165
+
2166
+ // src/Support.tsx
2167
+ import { jsx as jsx31, jsxs as jsxs17 } from "react/jsx-runtime";
2168
+ var Support = (props) => {
2169
+ const { variant = "fullpage" } = props;
2170
+ return /* @__PURE__ */ jsx31("div", { className: "page-card page-padding", children: /* @__PURE__ */ jsxs17(
2171
+ Card,
2172
+ {
2173
+ variant,
2174
+ outerStyles: "h-full",
2175
+ className: cx23(
2176
+ "page-card-content mx-auto flex w-full h-full flex-col gap-x-20 gap-y-4 justify-between overflow-hidden bg-gradient-stereo-depth pt-12 xl:p-8 xl:flex-row"
2177
+ ),
2178
+ children: [
2179
+ /* @__PURE__ */ jsxs17("div", { className: "flex w-full flex-col items-center gap-8 px-4 text-white xl:w-fit xl:items-start xl:gap-10 xl:px-0", children: [
2180
+ /* @__PURE__ */ jsxs17("div", { className: "flex w-full flex-col items-center gap-4 text-white xl:items-start xl:gap-6", children: [
2181
+ /* @__PURE__ */ jsx31(Text, { size: "h2", text: "Need More Help?", className: "max-w-[650px] text-center xl:text-left" }),
2182
+ /* @__PURE__ */ jsx31(
2183
+ Text,
2184
+ {
2185
+ size: "lg",
2186
+ text: "Our dedicated team is available for technical support, business solutions, and more. Let us provide the help you need.",
2187
+ className: "w-full max-w-105 text-center xl:text-left"
2188
+ }
2189
+ )
2190
+ ] }),
2191
+ /* @__PURE__ */ jsxs17("div", { className: "flex w-fit flex-col gap-4 md:flex-row", children: [
2192
+ /* @__PURE__ */ jsx31(TalkToSalesButton, {}),
2193
+ /* @__PURE__ */ jsx31("a", { href: "https://chat.luxonis.com", target: "_blank", rel: "noreferrer", children: /* @__PURE__ */ jsx31(Button, { size: "lg", variant: "secondary", role: "continue", children: "Get Instant Support" }) })
2194
+ ] })
2195
+ ] }),
2196
+ /* @__PURE__ */ jsx31("div", { className: "w-full p-4 xl:p-0", children: /* @__PURE__ */ jsx31(FrostedCard, { className: "h-full", children: /* @__PURE__ */ jsx31(ContactUsForm, {}) }) })
2197
+ ]
2198
+ }
2199
+ ) });
2200
+ };
2201
+
2202
+ // src/ContactUs.tsx
2203
+ import { jsx as jsx32, jsxs as jsxs18 } from "react/jsx-runtime";
2204
+ var ContactUsSection = (props) => {
2205
+ const {
2206
+ title = "Let\u2019s Build \n the Future of \n Vision Together",
2207
+ description = "Our dedicated team is available for technical support, business solutions, and more. Let us provide the help you need."
2208
+ } = props;
2209
+ return /* @__PURE__ */ jsx32("section", { id: "contact-us", className: "page-card page-padding", children: /* @__PURE__ */ jsxs18("section", { className: "page-card-content flex flex-col gap-8 rounded-lg p-4 pt-12 [background:radial-gradient(416.66%_106.71%_at_76.3%_37.11%,#5724E8_0%,#000_100%),#000] md:p-12 lg:flex-row lg:justify-between", children: [
2210
+ /* @__PURE__ */ jsx32(
2211
+ Description,
2212
+ {
2213
+ title,
2214
+ align: "left",
2215
+ textStyle: "max-w-none w-fit lg:max-w-auto lg:justify-start justify-center lg:text-left text-center",
2216
+ wrapperClassName: "lg:items-start items-center lg:text-left text-center flex",
2217
+ description,
2218
+ className: "text-white ",
2219
+ children: /* @__PURE__ */ jsxs18("div", { className: "flex w-full max-w-[500px] flex-col flex-wrap items-center gap-4 lg:flex-row lg:justify-start", children: [
2220
+ /* @__PURE__ */ jsx32("a", { href: "https://hub.luxonis.com", target: "_blank", className: "w-fit", children: /* @__PURE__ */ jsx32(Button, { variant: "secondary", size: "lg", role: "continue", className: "w-full", children: "Start for Free" }) }),
2221
+ /* @__PURE__ */ jsx32(TalkToSalesButton, {})
2222
+ ] })
2223
+ }
2224
+ ),
2225
+ /* @__PURE__ */ jsx32(FrostedCard, { className: "!p-6", children: /* @__PURE__ */ jsx32(ContactUsForm, {}) })
2226
+ ] }) });
2227
+ };
1547
2228
  export {
1548
2229
  Accordion,
1549
2230
  AccordionContent,
@@ -1560,9 +2241,12 @@ export {
1560
2241
  ChatButton,
1561
2242
  Checkbox,
1562
2243
  CodeBlock,
2244
+ ContactUsForm,
2245
+ ContactUsSection,
1563
2246
  Copyright,
1564
2247
  Description,
1565
2248
  DualRangeSlider,
2249
+ EdgeSlideshow,
1566
2250
  FrostedCard,
1567
2251
  Hero,
1568
2252
  HoverCard,
@@ -1570,6 +2254,7 @@ export {
1570
2254
  HoverCardTrigger,
1571
2255
  Input,
1572
2256
  Label,
2257
+ Progress,
1573
2258
  SearchBar,
1574
2259
  Select,
1575
2260
  SelectContent,
@@ -1581,6 +2266,8 @@ export {
1581
2266
  SelectSeparator,
1582
2267
  SelectTrigger,
1583
2268
  SelectValue,
2269
+ StereoDepthCalibration,
2270
+ Support,
1584
2271
  Switch,
1585
2272
  Table,
1586
2273
  TableBody,
@@ -1594,6 +2281,7 @@ export {
1594
2281
  TabsContent,
1595
2282
  TabsList,
1596
2283
  TabsTrigger,
2284
+ TalkToSalesButton,
1597
2285
  Text,
1598
2286
  Textarea,
1599
2287
  Tooltip,
@@ -1601,7 +2289,54 @@ export {
1601
2289
  TooltipProvider,
1602
2290
  TooltipTrigger,
1603
2291
  Video,
2292
+ aboutUs,
2293
+ accessoriesProducts,
2294
+ applyMail,
2295
+ applyMailClean,
1604
2296
  badgeVariants,
2297
+ blog,
2298
+ bloomberg,
1605
2299
  buttonVariants,
1606
- parseNewLines
2300
+ camerasProducts,
2301
+ careers,
2302
+ certificates,
2303
+ contactLink,
2304
+ depthaiHardwareProject,
2305
+ discord,
2306
+ distributorForm,
2307
+ distributors,
2308
+ docs,
2309
+ earlyAccessProducts,
2310
+ forbes,
2311
+ forum,
2312
+ getStoreSearchLink,
2313
+ github,
2314
+ kickstarter,
2315
+ linkedin,
2316
+ marketing,
2317
+ modulesProducts,
2318
+ oakRealsenseDocs,
2319
+ parseNewLines,
2320
+ privacy,
2321
+ raeStorepage,
2322
+ replayInstructions,
2323
+ robothub,
2324
+ robothubInternal,
2325
+ salesMail,
2326
+ salesMailClean,
2327
+ services,
2328
+ servicesMeetLink,
2329
+ showcase,
2330
+ showcaseMail,
2331
+ showcaseMailClean,
2332
+ status,
2333
+ store,
2334
+ supportForm,
2335
+ supportMail,
2336
+ supportMailClean,
2337
+ techcrunch,
2338
+ termsOfService,
2339
+ twitter,
2340
+ useRudderStackAnalytics,
2341
+ youtube
1607
2342
  };