virtual-ui-lib 1.0.62 → 1.0.64

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.js CHANGED
@@ -31,11 +31,13 @@ var index_exports = {};
31
31
  __export(index_exports, {
32
32
  Avatar: () => Avatar,
33
33
  AvatarCard: () => AvatarCard,
34
+ Charts: () => Charts,
34
35
  CodeBlock: () => CodeBlock,
35
36
  CustomInputField: () => CustomInputField,
36
37
  DividerLine: () => DividerLine,
37
38
  FileUpload: () => FileUpload,
38
39
  Footer: () => Footer,
40
+ ImageCard: () => ImageCard,
39
41
  Loader: () => Loader,
40
42
  LoadingSpinner: () => LoadingSpinner,
41
43
  Navbar: () => Navbar,
@@ -1599,15 +1601,466 @@ var Sidebar = ({
1599
1601
  background: accent
1600
1602
  } }), /* @__PURE__ */ import_react22.default.createElement("span", { style: { fontSize: "14px", fontWeight: "700", color: "#fff" } }, activeItem == null ? void 0 : activeItem.label)), /* @__PURE__ */ import_react22.default.createElement("div", { style: { color: "#fff" } }, activeItem == null ? void 0 : activeItem.component)));
1601
1603
  };
1604
+
1605
+ // src/components/Charts/Charts.jsx
1606
+ var import_react23 = __toESM(require("react"));
1607
+ var Charts = ({
1608
+ type = "bar",
1609
+ data = [
1610
+ { label: "Jan", value: 40 },
1611
+ { label: "Feb", value: 70 },
1612
+ { label: "Mar", value: 55 },
1613
+ { label: "Apr", value: 90 },
1614
+ { label: "May", value: 65 },
1615
+ { label: "Jun", value: 80 },
1616
+ { label: "Jul", value: 100 },
1617
+ { label: "Aug", value: 30 }
1618
+ ],
1619
+ title = "Monthly Stats",
1620
+ accent = "#6366f1",
1621
+ bg = "#0f172a",
1622
+ radius = "16px",
1623
+ showGrid = true,
1624
+ showValues = true
1625
+ }) => {
1626
+ const [hovered, setHovered] = (0, import_react23.useState)(null);
1627
+ const alpha = (hex, op) => {
1628
+ const r = parseInt(hex.slice(1, 3), 16);
1629
+ const g = parseInt(hex.slice(3, 5), 16);
1630
+ const b = parseInt(hex.slice(5, 7), 16);
1631
+ return `rgba(${r},${g},${b},${op})`;
1632
+ };
1633
+ const max = Math.max(...data.map((d) => d.value));
1634
+ const min = Math.min(...data.map((d) => d.value));
1635
+ const W = 320;
1636
+ const H = 160;
1637
+ const padL = 28;
1638
+ const padR = 12;
1639
+ const padT = 16;
1640
+ const padB = 28;
1641
+ const chartW = W - padL - padR;
1642
+ const chartH = H - padT - padB;
1643
+ const getX = (i) => padL + i / (data.length - 1) * chartW;
1644
+ const getY = (v) => padT + chartH - (v - min) / (max - min || 1) * chartH;
1645
+ const points = data.map((d, i) => `${getX(i)},${getY(d.value)}`).join(" ");
1646
+ const areaPoints = `${padL},${padT + chartH} ` + points + ` ${getX(data.length - 1)},${padT + chartH}`;
1647
+ const gridLines = [0, 0.25, 0.5, 0.75, 1].map((t) => ({
1648
+ y: padT + chartH * (1 - t),
1649
+ val: Math.round(min + t * (max - min))
1650
+ }));
1651
+ const BarChart = () => {
1652
+ const barW = Math.min(28, chartW / data.length * 0.55);
1653
+ return /* @__PURE__ */ import_react23.default.createElement("svg", { width: "100%", viewBox: `0 0 ${W} ${H}` }, showGrid && gridLines.map((g, i) => /* @__PURE__ */ import_react23.default.createElement("g", { key: i }, /* @__PURE__ */ import_react23.default.createElement(
1654
+ "line",
1655
+ {
1656
+ x1: padL,
1657
+ y1: g.y,
1658
+ x2: W - padR,
1659
+ y2: g.y,
1660
+ stroke: "rgba(255,255,255,0.05)",
1661
+ strokeWidth: "1"
1662
+ }
1663
+ ), /* @__PURE__ */ import_react23.default.createElement(
1664
+ "text",
1665
+ {
1666
+ x: padL - 4,
1667
+ y: g.y + 4,
1668
+ textAnchor: "end",
1669
+ fill: "rgba(255,255,255,0.25)",
1670
+ fontSize: "9"
1671
+ },
1672
+ g.val
1673
+ ))), data.map((d, i) => {
1674
+ const x = padL + i / data.length * chartW + (chartW / data.length - barW) / 2;
1675
+ const barH = (d.value - min) / (max - min || 1) * chartH;
1676
+ const y = padT + chartH - barH;
1677
+ const isH = hovered === i;
1678
+ return /* @__PURE__ */ import_react23.default.createElement("g", { key: i, onMouseEnter: () => setHovered(i), onMouseLeave: () => setHovered(null) }, /* @__PURE__ */ import_react23.default.createElement(
1679
+ "rect",
1680
+ {
1681
+ x,
1682
+ y: padT,
1683
+ width: barW,
1684
+ height: chartH,
1685
+ fill: "transparent",
1686
+ rx: "4"
1687
+ }
1688
+ ), /* @__PURE__ */ import_react23.default.createElement(
1689
+ "rect",
1690
+ {
1691
+ x,
1692
+ y,
1693
+ width: barW,
1694
+ height: barH,
1695
+ fill: isH ? accent : alpha(accent, 0.55),
1696
+ rx: "4",
1697
+ style: { transition: "fill 0.15s" }
1698
+ }
1699
+ ), showValues && isH && /* @__PURE__ */ import_react23.default.createElement(
1700
+ "text",
1701
+ {
1702
+ x: x + barW / 2,
1703
+ y: y - 5,
1704
+ textAnchor: "middle",
1705
+ fill: "#fff",
1706
+ fontSize: "9",
1707
+ fontWeight: "700"
1708
+ },
1709
+ d.value
1710
+ ), /* @__PURE__ */ import_react23.default.createElement(
1711
+ "text",
1712
+ {
1713
+ x: x + barW / 2,
1714
+ y: H - 6,
1715
+ textAnchor: "middle",
1716
+ fill: "rgba(255,255,255,0.3)",
1717
+ fontSize: "9"
1718
+ },
1719
+ d.label
1720
+ ));
1721
+ }));
1722
+ };
1723
+ const LineChart = () => /* @__PURE__ */ import_react23.default.createElement("svg", { width: "100%", viewBox: `0 0 ${W} ${H}` }, /* @__PURE__ */ import_react23.default.createElement("defs", null, /* @__PURE__ */ import_react23.default.createElement("linearGradient", { id: "lg", x1: "0", y1: "0", x2: "0", y2: "1" }, /* @__PURE__ */ import_react23.default.createElement("stop", { offset: "0%", stopColor: accent, stopOpacity: "0.3" }), /* @__PURE__ */ import_react23.default.createElement("stop", { offset: "100%", stopColor: accent, stopOpacity: "0" }))), showGrid && gridLines.map((g, i) => /* @__PURE__ */ import_react23.default.createElement("g", { key: i }, /* @__PURE__ */ import_react23.default.createElement(
1724
+ "line",
1725
+ {
1726
+ x1: padL,
1727
+ y1: g.y,
1728
+ x2: W - padR,
1729
+ y2: g.y,
1730
+ stroke: "rgba(255,255,255,0.05)",
1731
+ strokeWidth: "1"
1732
+ }
1733
+ ), /* @__PURE__ */ import_react23.default.createElement(
1734
+ "text",
1735
+ {
1736
+ x: padL - 4,
1737
+ y: g.y + 4,
1738
+ textAnchor: "end",
1739
+ fill: "rgba(255,255,255,0.25)",
1740
+ fontSize: "9"
1741
+ },
1742
+ g.val
1743
+ ))), /* @__PURE__ */ import_react23.default.createElement("polygon", { points: areaPoints, fill: "url(#lg)" }), /* @__PURE__ */ import_react23.default.createElement(
1744
+ "polyline",
1745
+ {
1746
+ points,
1747
+ fill: "none",
1748
+ stroke: accent,
1749
+ strokeWidth: "2",
1750
+ strokeLinejoin: "round",
1751
+ strokeLinecap: "round"
1752
+ }
1753
+ ), data.map((d, i) => {
1754
+ const isH = hovered === i;
1755
+ return /* @__PURE__ */ import_react23.default.createElement("g", { key: i, onMouseEnter: () => setHovered(i), onMouseLeave: () => setHovered(null) }, /* @__PURE__ */ import_react23.default.createElement("circle", { cx: getX(i), cy: getY(d.value), r: "10", fill: "transparent" }), /* @__PURE__ */ import_react23.default.createElement(
1756
+ "circle",
1757
+ {
1758
+ cx: getX(i),
1759
+ cy: getY(d.value),
1760
+ r: isH ? 5 : 3,
1761
+ fill: isH ? "#fff" : accent,
1762
+ stroke: accent,
1763
+ strokeWidth: "2",
1764
+ style: { transition: "all 0.15s" }
1765
+ }
1766
+ ), showValues && isH && /* @__PURE__ */ import_react23.default.createElement(
1767
+ "text",
1768
+ {
1769
+ x: getX(i),
1770
+ y: getY(d.value) - 10,
1771
+ textAnchor: "middle",
1772
+ fill: "#fff",
1773
+ fontSize: "9",
1774
+ fontWeight: "700"
1775
+ },
1776
+ d.value
1777
+ ), /* @__PURE__ */ import_react23.default.createElement(
1778
+ "text",
1779
+ {
1780
+ x: getX(i),
1781
+ y: H - 6,
1782
+ textAnchor: "middle",
1783
+ fill: "rgba(255,255,255,0.3)",
1784
+ fontSize: "9"
1785
+ },
1786
+ d.label
1787
+ ));
1788
+ }));
1789
+ const PieChart = () => {
1790
+ var _a, _b;
1791
+ const cx = W / 2, cy = H / 2 - 4, r = Math.min(H, W) / 2 - 24;
1792
+ const total = data.reduce((s, d) => s + d.value, 0);
1793
+ const colors = [
1794
+ accent,
1795
+ alpha(accent, 0.75),
1796
+ alpha(accent, 0.55),
1797
+ alpha(accent, 0.4),
1798
+ alpha(accent, 0.3),
1799
+ alpha(accent, 0.2),
1800
+ alpha(accent, 0.12)
1801
+ ];
1802
+ let startAngle = -Math.PI / 2;
1803
+ const slices = data.map((d, i) => {
1804
+ const angle = d.value / total * 2 * Math.PI;
1805
+ const x1 = cx + r * Math.cos(startAngle);
1806
+ const y1 = cy + r * Math.sin(startAngle);
1807
+ const x2 = cx + r * Math.cos(startAngle + angle);
1808
+ const y2 = cy + r * Math.sin(startAngle + angle);
1809
+ const lx = cx + (r + 14) * Math.cos(startAngle + angle / 2);
1810
+ const ly = cy + (r + 14) * Math.sin(startAngle + angle / 2);
1811
+ const large = angle > Math.PI ? 1 : 0;
1812
+ const path = `M ${cx} ${cy} L ${x1} ${y1} A ${r} ${r} 0 ${large} 1 ${x2} ${y2} Z`;
1813
+ const slice = { path, color: colors[i % colors.length], d, angle, lx, ly, i };
1814
+ startAngle += angle;
1815
+ return slice;
1816
+ });
1817
+ return /* @__PURE__ */ import_react23.default.createElement("svg", { width: "100%", viewBox: `0 0 ${W} ${H}` }, slices.map((s) => /* @__PURE__ */ import_react23.default.createElement("g", { key: s.i, onMouseEnter: () => setHovered(s.i), onMouseLeave: () => setHovered(null) }, /* @__PURE__ */ import_react23.default.createElement(
1818
+ "path",
1819
+ {
1820
+ d: s.path,
1821
+ fill: s.color,
1822
+ stroke: bg,
1823
+ strokeWidth: "2",
1824
+ transform: hovered === s.i ? `translate(${Math.cos(s.angle / 2 - Math.PI / 2) * 4}, ${Math.sin(s.angle / 2 - Math.PI / 2) * 4})` : "",
1825
+ style: { transition: "transform 0.15s", cursor: "pointer" }
1826
+ }
1827
+ ))), hovered !== null && /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, null, /* @__PURE__ */ import_react23.default.createElement(
1828
+ "text",
1829
+ {
1830
+ x: cx,
1831
+ y: cy - 8,
1832
+ textAnchor: "middle",
1833
+ fill: "#fff",
1834
+ fontSize: "16",
1835
+ fontWeight: "800"
1836
+ },
1837
+ (_a = data[hovered]) == null ? void 0 : _a.value
1838
+ ), /* @__PURE__ */ import_react23.default.createElement(
1839
+ "text",
1840
+ {
1841
+ x: cx,
1842
+ y: cy + 10,
1843
+ textAnchor: "middle",
1844
+ fill: "rgba(255,255,255,0.4)",
1845
+ fontSize: "9"
1846
+ },
1847
+ (_b = data[hovered]) == null ? void 0 : _b.label
1848
+ )), hovered === null && /* @__PURE__ */ import_react23.default.createElement(
1849
+ "text",
1850
+ {
1851
+ x: cx,
1852
+ y: cy + 5,
1853
+ textAnchor: "middle",
1854
+ fill: "rgba(255,255,255,0.2)",
1855
+ fontSize: "9"
1856
+ },
1857
+ "Hover slice"
1858
+ ));
1859
+ };
1860
+ const AreaChart = () => /* @__PURE__ */ import_react23.default.createElement("svg", { width: "100%", viewBox: `0 0 ${W} ${H}` }, /* @__PURE__ */ import_react23.default.createElement("defs", null, /* @__PURE__ */ import_react23.default.createElement("linearGradient", { id: "ag", x1: "0", y1: "0", x2: "0", y2: "1" }, /* @__PURE__ */ import_react23.default.createElement("stop", { offset: "0%", stopColor: accent, stopOpacity: "0.5" }), /* @__PURE__ */ import_react23.default.createElement("stop", { offset: "100%", stopColor: accent, stopOpacity: "0.02" }))), showGrid && gridLines.map((g, i) => /* @__PURE__ */ import_react23.default.createElement("g", { key: i }, /* @__PURE__ */ import_react23.default.createElement(
1861
+ "line",
1862
+ {
1863
+ x1: padL,
1864
+ y1: g.y,
1865
+ x2: W - padR,
1866
+ y2: g.y,
1867
+ stroke: "rgba(255,255,255,0.05)",
1868
+ strokeWidth: "1"
1869
+ }
1870
+ ), /* @__PURE__ */ import_react23.default.createElement(
1871
+ "text",
1872
+ {
1873
+ x: padL - 4,
1874
+ y: g.y + 4,
1875
+ textAnchor: "end",
1876
+ fill: "rgba(255,255,255,0.25)",
1877
+ fontSize: "9"
1878
+ },
1879
+ g.val
1880
+ ))), /* @__PURE__ */ import_react23.default.createElement("polygon", { points: areaPoints, fill: "url(#ag)" }), /* @__PURE__ */ import_react23.default.createElement(
1881
+ "polyline",
1882
+ {
1883
+ points,
1884
+ fill: "none",
1885
+ stroke: accent,
1886
+ strokeWidth: "1.5",
1887
+ strokeLinejoin: "round",
1888
+ strokeLinecap: "round"
1889
+ }
1890
+ ), data.map((d, i) => /* @__PURE__ */ import_react23.default.createElement("g", { key: i, onMouseEnter: () => setHovered(i), onMouseLeave: () => setHovered(null) }, /* @__PURE__ */ import_react23.default.createElement("rect", { x: getX(i) - 12, y: padT, width: 24, height: chartH, fill: "transparent" }), hovered === i && /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, null, /* @__PURE__ */ import_react23.default.createElement(
1891
+ "line",
1892
+ {
1893
+ x1: getX(i),
1894
+ y1: padT,
1895
+ x2: getX(i),
1896
+ y2: padT + chartH,
1897
+ stroke: "rgba(255,255,255,0.1)",
1898
+ strokeWidth: "1",
1899
+ strokeDasharray: "3 3"
1900
+ }
1901
+ ), showValues && /* @__PURE__ */ import_react23.default.createElement(
1902
+ "text",
1903
+ {
1904
+ x: getX(i),
1905
+ y: getY(d.value) - 10,
1906
+ textAnchor: "middle",
1907
+ fill: "#fff",
1908
+ fontSize: "9",
1909
+ fontWeight: "700"
1910
+ },
1911
+ d.value
1912
+ )), /* @__PURE__ */ import_react23.default.createElement(
1913
+ "text",
1914
+ {
1915
+ x: getX(i),
1916
+ y: H - 6,
1917
+ textAnchor: "middle",
1918
+ fill: "rgba(255,255,255,0.3)",
1919
+ fontSize: "9"
1920
+ },
1921
+ d.label
1922
+ ))));
1923
+ const renderChart = () => {
1924
+ if (type === "line") return /* @__PURE__ */ import_react23.default.createElement(LineChart, null);
1925
+ if (type === "pie") return /* @__PURE__ */ import_react23.default.createElement(PieChart, null);
1926
+ if (type === "area") return /* @__PURE__ */ import_react23.default.createElement(AreaChart, null);
1927
+ return /* @__PURE__ */ import_react23.default.createElement(BarChart, null);
1928
+ };
1929
+ return /* @__PURE__ */ import_react23.default.createElement("div", { style: {
1930
+ background: bg,
1931
+ borderRadius: radius,
1932
+ padding: "20px",
1933
+ fontFamily: "system-ui, sans-serif",
1934
+ border: "1px solid rgba(255,255,255,0.07)",
1935
+ width: "100%",
1936
+ maxWidth: "360px",
1937
+ boxSizing: "border-box"
1938
+ } }, /* @__PURE__ */ import_react23.default.createElement("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: "16px" } }, /* @__PURE__ */ import_react23.default.createElement("p", { style: { fontSize: "14px", fontWeight: "700", color: "#fff", margin: 0 } }, title), /* @__PURE__ */ import_react23.default.createElement("span", { style: {
1939
+ fontSize: "10px",
1940
+ fontWeight: "700",
1941
+ padding: "3px 9px",
1942
+ borderRadius: "6px",
1943
+ background: alpha(accent, 0.12),
1944
+ color: accent,
1945
+ border: `1px solid ${alpha(accent, 0.25)}`,
1946
+ textTransform: "capitalize"
1947
+ } }, type)), renderChart());
1948
+ };
1949
+
1950
+ // src/components/ImageCard/ImageCard.jsx
1951
+ var import_react24 = __toESM(require("react"));
1952
+ var ImageCard = ({
1953
+ image = "https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=600&q=80",
1954
+ tag = "Travel",
1955
+ title = "Discover the Hidden Peaks of the Himalayas",
1956
+ description = "A breathtaking journey through untouched landscapes, ancient monasteries, and snow-capped summits that few have ever seen.",
1957
+ buttonText = "Read More",
1958
+ accent = "#6366f1",
1959
+ bg = "#0f172a",
1960
+ radius = "20px",
1961
+ onButtonClick = () => {
1962
+ }
1963
+ }) => {
1964
+ const [hovered, setHovered] = (0, import_react24.useState)(false);
1965
+ const alpha = (hex, op) => {
1966
+ const r = parseInt(hex.slice(1, 3), 16);
1967
+ const g = parseInt(hex.slice(3, 5), 16);
1968
+ const b = parseInt(hex.slice(5, 7), 16);
1969
+ return `rgba(${r},${g},${b},${op})`;
1970
+ };
1971
+ return /* @__PURE__ */ import_react24.default.createElement(
1972
+ "div",
1973
+ {
1974
+ onMouseEnter: () => setHovered(true),
1975
+ onMouseLeave: () => setHovered(false),
1976
+ style: {
1977
+ background: bg,
1978
+ borderRadius: radius,
1979
+ overflow: "hidden",
1980
+ width: "300px",
1981
+ border: `1px solid ${hovered ? alpha(accent, 0.3) : "rgba(255,255,255,0.07)"}`,
1982
+ fontFamily: "system-ui, sans-serif",
1983
+ transition: "border-color 0.25s, transform 0.25s",
1984
+ transform: hovered ? "translateY(-4px)" : "none",
1985
+ boxShadow: hovered ? `0 16px 40px rgba(0,0,0,0.5)` : "0 4px 20px rgba(0,0,0,0.3)"
1986
+ }
1987
+ },
1988
+ /* @__PURE__ */ import_react24.default.createElement("div", { style: { position: "relative", width: "100%", height: "180px", overflow: "hidden" } }, /* @__PURE__ */ import_react24.default.createElement(
1989
+ "img",
1990
+ {
1991
+ src: image,
1992
+ alt: title,
1993
+ style: {
1994
+ width: "100%",
1995
+ height: "100%",
1996
+ objectFit: "cover",
1997
+ transform: hovered ? "scale(1.05)" : "scale(1)",
1998
+ transition: "transform 0.4s ease"
1999
+ }
2000
+ }
2001
+ ), /* @__PURE__ */ import_react24.default.createElement("div", { style: {
2002
+ position: "absolute",
2003
+ inset: 0,
2004
+ background: "linear-gradient(to top, rgba(0,0,0,0.5) 0%, transparent 60%)"
2005
+ } }), tag && /* @__PURE__ */ import_react24.default.createElement("div", { style: {
2006
+ position: "absolute",
2007
+ top: "12px",
2008
+ left: "12px",
2009
+ padding: "4px 10px",
2010
+ borderRadius: "20px",
2011
+ background: alpha(accent, 0.85),
2012
+ fontSize: "10px",
2013
+ fontWeight: "700",
2014
+ color: "#fff",
2015
+ letterSpacing: "0.5px",
2016
+ textTransform: "uppercase"
2017
+ } }, tag)),
2018
+ /* @__PURE__ */ import_react24.default.createElement("div", { style: { padding: "18px" } }, /* @__PURE__ */ import_react24.default.createElement("h3", { style: {
2019
+ fontSize: "15px",
2020
+ fontWeight: "700",
2021
+ color: "#fff",
2022
+ margin: "0 0 8px",
2023
+ lineHeight: 1.4
2024
+ } }, title), /* @__PURE__ */ import_react24.default.createElement("p", { style: {
2025
+ fontSize: "13px",
2026
+ color: "rgba(255,255,255,0.45)",
2027
+ lineHeight: 1.65,
2028
+ margin: "0 0 18px"
2029
+ } }, description), /* @__PURE__ */ import_react24.default.createElement(
2030
+ "button",
2031
+ {
2032
+ onClick: onButtonClick,
2033
+ style: {
2034
+ width: "100%",
2035
+ padding: "11px",
2036
+ borderRadius: "12px",
2037
+ border: "none",
2038
+ background: `linear-gradient(135deg, ${accent}, ${alpha(accent, 0.7)})`,
2039
+ color: "#fff",
2040
+ fontSize: "13px",
2041
+ fontWeight: "700",
2042
+ cursor: "pointer",
2043
+ fontFamily: "inherit",
2044
+ transition: "opacity 0.2s"
2045
+ },
2046
+ onMouseEnter: (e) => e.currentTarget.style.opacity = "0.85",
2047
+ onMouseLeave: (e) => e.currentTarget.style.opacity = "1"
2048
+ },
2049
+ buttonText
2050
+ ))
2051
+ );
2052
+ };
1602
2053
  // Annotate the CommonJS export names for ESM import in node:
1603
2054
  0 && (module.exports = {
1604
2055
  Avatar,
1605
2056
  AvatarCard,
2057
+ Charts,
1606
2058
  CodeBlock,
1607
2059
  CustomInputField,
1608
2060
  DividerLine,
1609
2061
  FileUpload,
1610
2062
  Footer,
2063
+ ImageCard,
1611
2064
  Loader,
1612
2065
  LoadingSpinner,
1613
2066
  Navbar,
package/dist/index.mjs CHANGED
@@ -1543,14 +1543,465 @@ var Sidebar = ({
1543
1543
  background: accent
1544
1544
  } }), /* @__PURE__ */ React22.createElement("span", { style: { fontSize: "14px", fontWeight: "700", color: "#fff" } }, activeItem == null ? void 0 : activeItem.label)), /* @__PURE__ */ React22.createElement("div", { style: { color: "#fff" } }, activeItem == null ? void 0 : activeItem.component)));
1545
1545
  };
1546
+
1547
+ // src/components/Charts/Charts.jsx
1548
+ import React23, { useState as useState16 } from "react";
1549
+ var Charts = ({
1550
+ type = "bar",
1551
+ data = [
1552
+ { label: "Jan", value: 40 },
1553
+ { label: "Feb", value: 70 },
1554
+ { label: "Mar", value: 55 },
1555
+ { label: "Apr", value: 90 },
1556
+ { label: "May", value: 65 },
1557
+ { label: "Jun", value: 80 },
1558
+ { label: "Jul", value: 100 },
1559
+ { label: "Aug", value: 30 }
1560
+ ],
1561
+ title = "Monthly Stats",
1562
+ accent = "#6366f1",
1563
+ bg = "#0f172a",
1564
+ radius = "16px",
1565
+ showGrid = true,
1566
+ showValues = true
1567
+ }) => {
1568
+ const [hovered, setHovered] = useState16(null);
1569
+ const alpha = (hex, op) => {
1570
+ const r = parseInt(hex.slice(1, 3), 16);
1571
+ const g = parseInt(hex.slice(3, 5), 16);
1572
+ const b = parseInt(hex.slice(5, 7), 16);
1573
+ return `rgba(${r},${g},${b},${op})`;
1574
+ };
1575
+ const max = Math.max(...data.map((d) => d.value));
1576
+ const min = Math.min(...data.map((d) => d.value));
1577
+ const W = 320;
1578
+ const H = 160;
1579
+ const padL = 28;
1580
+ const padR = 12;
1581
+ const padT = 16;
1582
+ const padB = 28;
1583
+ const chartW = W - padL - padR;
1584
+ const chartH = H - padT - padB;
1585
+ const getX = (i) => padL + i / (data.length - 1) * chartW;
1586
+ const getY = (v) => padT + chartH - (v - min) / (max - min || 1) * chartH;
1587
+ const points = data.map((d, i) => `${getX(i)},${getY(d.value)}`).join(" ");
1588
+ const areaPoints = `${padL},${padT + chartH} ` + points + ` ${getX(data.length - 1)},${padT + chartH}`;
1589
+ const gridLines = [0, 0.25, 0.5, 0.75, 1].map((t) => ({
1590
+ y: padT + chartH * (1 - t),
1591
+ val: Math.round(min + t * (max - min))
1592
+ }));
1593
+ const BarChart = () => {
1594
+ const barW = Math.min(28, chartW / data.length * 0.55);
1595
+ return /* @__PURE__ */ React23.createElement("svg", { width: "100%", viewBox: `0 0 ${W} ${H}` }, showGrid && gridLines.map((g, i) => /* @__PURE__ */ React23.createElement("g", { key: i }, /* @__PURE__ */ React23.createElement(
1596
+ "line",
1597
+ {
1598
+ x1: padL,
1599
+ y1: g.y,
1600
+ x2: W - padR,
1601
+ y2: g.y,
1602
+ stroke: "rgba(255,255,255,0.05)",
1603
+ strokeWidth: "1"
1604
+ }
1605
+ ), /* @__PURE__ */ React23.createElement(
1606
+ "text",
1607
+ {
1608
+ x: padL - 4,
1609
+ y: g.y + 4,
1610
+ textAnchor: "end",
1611
+ fill: "rgba(255,255,255,0.25)",
1612
+ fontSize: "9"
1613
+ },
1614
+ g.val
1615
+ ))), data.map((d, i) => {
1616
+ const x = padL + i / data.length * chartW + (chartW / data.length - barW) / 2;
1617
+ const barH = (d.value - min) / (max - min || 1) * chartH;
1618
+ const y = padT + chartH - barH;
1619
+ const isH = hovered === i;
1620
+ return /* @__PURE__ */ React23.createElement("g", { key: i, onMouseEnter: () => setHovered(i), onMouseLeave: () => setHovered(null) }, /* @__PURE__ */ React23.createElement(
1621
+ "rect",
1622
+ {
1623
+ x,
1624
+ y: padT,
1625
+ width: barW,
1626
+ height: chartH,
1627
+ fill: "transparent",
1628
+ rx: "4"
1629
+ }
1630
+ ), /* @__PURE__ */ React23.createElement(
1631
+ "rect",
1632
+ {
1633
+ x,
1634
+ y,
1635
+ width: barW,
1636
+ height: barH,
1637
+ fill: isH ? accent : alpha(accent, 0.55),
1638
+ rx: "4",
1639
+ style: { transition: "fill 0.15s" }
1640
+ }
1641
+ ), showValues && isH && /* @__PURE__ */ React23.createElement(
1642
+ "text",
1643
+ {
1644
+ x: x + barW / 2,
1645
+ y: y - 5,
1646
+ textAnchor: "middle",
1647
+ fill: "#fff",
1648
+ fontSize: "9",
1649
+ fontWeight: "700"
1650
+ },
1651
+ d.value
1652
+ ), /* @__PURE__ */ React23.createElement(
1653
+ "text",
1654
+ {
1655
+ x: x + barW / 2,
1656
+ y: H - 6,
1657
+ textAnchor: "middle",
1658
+ fill: "rgba(255,255,255,0.3)",
1659
+ fontSize: "9"
1660
+ },
1661
+ d.label
1662
+ ));
1663
+ }));
1664
+ };
1665
+ const LineChart = () => /* @__PURE__ */ React23.createElement("svg", { width: "100%", viewBox: `0 0 ${W} ${H}` }, /* @__PURE__ */ React23.createElement("defs", null, /* @__PURE__ */ React23.createElement("linearGradient", { id: "lg", x1: "0", y1: "0", x2: "0", y2: "1" }, /* @__PURE__ */ React23.createElement("stop", { offset: "0%", stopColor: accent, stopOpacity: "0.3" }), /* @__PURE__ */ React23.createElement("stop", { offset: "100%", stopColor: accent, stopOpacity: "0" }))), showGrid && gridLines.map((g, i) => /* @__PURE__ */ React23.createElement("g", { key: i }, /* @__PURE__ */ React23.createElement(
1666
+ "line",
1667
+ {
1668
+ x1: padL,
1669
+ y1: g.y,
1670
+ x2: W - padR,
1671
+ y2: g.y,
1672
+ stroke: "rgba(255,255,255,0.05)",
1673
+ strokeWidth: "1"
1674
+ }
1675
+ ), /* @__PURE__ */ React23.createElement(
1676
+ "text",
1677
+ {
1678
+ x: padL - 4,
1679
+ y: g.y + 4,
1680
+ textAnchor: "end",
1681
+ fill: "rgba(255,255,255,0.25)",
1682
+ fontSize: "9"
1683
+ },
1684
+ g.val
1685
+ ))), /* @__PURE__ */ React23.createElement("polygon", { points: areaPoints, fill: "url(#lg)" }), /* @__PURE__ */ React23.createElement(
1686
+ "polyline",
1687
+ {
1688
+ points,
1689
+ fill: "none",
1690
+ stroke: accent,
1691
+ strokeWidth: "2",
1692
+ strokeLinejoin: "round",
1693
+ strokeLinecap: "round"
1694
+ }
1695
+ ), data.map((d, i) => {
1696
+ const isH = hovered === i;
1697
+ return /* @__PURE__ */ React23.createElement("g", { key: i, onMouseEnter: () => setHovered(i), onMouseLeave: () => setHovered(null) }, /* @__PURE__ */ React23.createElement("circle", { cx: getX(i), cy: getY(d.value), r: "10", fill: "transparent" }), /* @__PURE__ */ React23.createElement(
1698
+ "circle",
1699
+ {
1700
+ cx: getX(i),
1701
+ cy: getY(d.value),
1702
+ r: isH ? 5 : 3,
1703
+ fill: isH ? "#fff" : accent,
1704
+ stroke: accent,
1705
+ strokeWidth: "2",
1706
+ style: { transition: "all 0.15s" }
1707
+ }
1708
+ ), showValues && isH && /* @__PURE__ */ React23.createElement(
1709
+ "text",
1710
+ {
1711
+ x: getX(i),
1712
+ y: getY(d.value) - 10,
1713
+ textAnchor: "middle",
1714
+ fill: "#fff",
1715
+ fontSize: "9",
1716
+ fontWeight: "700"
1717
+ },
1718
+ d.value
1719
+ ), /* @__PURE__ */ React23.createElement(
1720
+ "text",
1721
+ {
1722
+ x: getX(i),
1723
+ y: H - 6,
1724
+ textAnchor: "middle",
1725
+ fill: "rgba(255,255,255,0.3)",
1726
+ fontSize: "9"
1727
+ },
1728
+ d.label
1729
+ ));
1730
+ }));
1731
+ const PieChart = () => {
1732
+ var _a, _b;
1733
+ const cx = W / 2, cy = H / 2 - 4, r = Math.min(H, W) / 2 - 24;
1734
+ const total = data.reduce((s, d) => s + d.value, 0);
1735
+ const colors = [
1736
+ accent,
1737
+ alpha(accent, 0.75),
1738
+ alpha(accent, 0.55),
1739
+ alpha(accent, 0.4),
1740
+ alpha(accent, 0.3),
1741
+ alpha(accent, 0.2),
1742
+ alpha(accent, 0.12)
1743
+ ];
1744
+ let startAngle = -Math.PI / 2;
1745
+ const slices = data.map((d, i) => {
1746
+ const angle = d.value / total * 2 * Math.PI;
1747
+ const x1 = cx + r * Math.cos(startAngle);
1748
+ const y1 = cy + r * Math.sin(startAngle);
1749
+ const x2 = cx + r * Math.cos(startAngle + angle);
1750
+ const y2 = cy + r * Math.sin(startAngle + angle);
1751
+ const lx = cx + (r + 14) * Math.cos(startAngle + angle / 2);
1752
+ const ly = cy + (r + 14) * Math.sin(startAngle + angle / 2);
1753
+ const large = angle > Math.PI ? 1 : 0;
1754
+ const path = `M ${cx} ${cy} L ${x1} ${y1} A ${r} ${r} 0 ${large} 1 ${x2} ${y2} Z`;
1755
+ const slice = { path, color: colors[i % colors.length], d, angle, lx, ly, i };
1756
+ startAngle += angle;
1757
+ return slice;
1758
+ });
1759
+ return /* @__PURE__ */ React23.createElement("svg", { width: "100%", viewBox: `0 0 ${W} ${H}` }, slices.map((s) => /* @__PURE__ */ React23.createElement("g", { key: s.i, onMouseEnter: () => setHovered(s.i), onMouseLeave: () => setHovered(null) }, /* @__PURE__ */ React23.createElement(
1760
+ "path",
1761
+ {
1762
+ d: s.path,
1763
+ fill: s.color,
1764
+ stroke: bg,
1765
+ strokeWidth: "2",
1766
+ transform: hovered === s.i ? `translate(${Math.cos(s.angle / 2 - Math.PI / 2) * 4}, ${Math.sin(s.angle / 2 - Math.PI / 2) * 4})` : "",
1767
+ style: { transition: "transform 0.15s", cursor: "pointer" }
1768
+ }
1769
+ ))), hovered !== null && /* @__PURE__ */ React23.createElement(React23.Fragment, null, /* @__PURE__ */ React23.createElement(
1770
+ "text",
1771
+ {
1772
+ x: cx,
1773
+ y: cy - 8,
1774
+ textAnchor: "middle",
1775
+ fill: "#fff",
1776
+ fontSize: "16",
1777
+ fontWeight: "800"
1778
+ },
1779
+ (_a = data[hovered]) == null ? void 0 : _a.value
1780
+ ), /* @__PURE__ */ React23.createElement(
1781
+ "text",
1782
+ {
1783
+ x: cx,
1784
+ y: cy + 10,
1785
+ textAnchor: "middle",
1786
+ fill: "rgba(255,255,255,0.4)",
1787
+ fontSize: "9"
1788
+ },
1789
+ (_b = data[hovered]) == null ? void 0 : _b.label
1790
+ )), hovered === null && /* @__PURE__ */ React23.createElement(
1791
+ "text",
1792
+ {
1793
+ x: cx,
1794
+ y: cy + 5,
1795
+ textAnchor: "middle",
1796
+ fill: "rgba(255,255,255,0.2)",
1797
+ fontSize: "9"
1798
+ },
1799
+ "Hover slice"
1800
+ ));
1801
+ };
1802
+ const AreaChart = () => /* @__PURE__ */ React23.createElement("svg", { width: "100%", viewBox: `0 0 ${W} ${H}` }, /* @__PURE__ */ React23.createElement("defs", null, /* @__PURE__ */ React23.createElement("linearGradient", { id: "ag", x1: "0", y1: "0", x2: "0", y2: "1" }, /* @__PURE__ */ React23.createElement("stop", { offset: "0%", stopColor: accent, stopOpacity: "0.5" }), /* @__PURE__ */ React23.createElement("stop", { offset: "100%", stopColor: accent, stopOpacity: "0.02" }))), showGrid && gridLines.map((g, i) => /* @__PURE__ */ React23.createElement("g", { key: i }, /* @__PURE__ */ React23.createElement(
1803
+ "line",
1804
+ {
1805
+ x1: padL,
1806
+ y1: g.y,
1807
+ x2: W - padR,
1808
+ y2: g.y,
1809
+ stroke: "rgba(255,255,255,0.05)",
1810
+ strokeWidth: "1"
1811
+ }
1812
+ ), /* @__PURE__ */ React23.createElement(
1813
+ "text",
1814
+ {
1815
+ x: padL - 4,
1816
+ y: g.y + 4,
1817
+ textAnchor: "end",
1818
+ fill: "rgba(255,255,255,0.25)",
1819
+ fontSize: "9"
1820
+ },
1821
+ g.val
1822
+ ))), /* @__PURE__ */ React23.createElement("polygon", { points: areaPoints, fill: "url(#ag)" }), /* @__PURE__ */ React23.createElement(
1823
+ "polyline",
1824
+ {
1825
+ points,
1826
+ fill: "none",
1827
+ stroke: accent,
1828
+ strokeWidth: "1.5",
1829
+ strokeLinejoin: "round",
1830
+ strokeLinecap: "round"
1831
+ }
1832
+ ), data.map((d, i) => /* @__PURE__ */ React23.createElement("g", { key: i, onMouseEnter: () => setHovered(i), onMouseLeave: () => setHovered(null) }, /* @__PURE__ */ React23.createElement("rect", { x: getX(i) - 12, y: padT, width: 24, height: chartH, fill: "transparent" }), hovered === i && /* @__PURE__ */ React23.createElement(React23.Fragment, null, /* @__PURE__ */ React23.createElement(
1833
+ "line",
1834
+ {
1835
+ x1: getX(i),
1836
+ y1: padT,
1837
+ x2: getX(i),
1838
+ y2: padT + chartH,
1839
+ stroke: "rgba(255,255,255,0.1)",
1840
+ strokeWidth: "1",
1841
+ strokeDasharray: "3 3"
1842
+ }
1843
+ ), showValues && /* @__PURE__ */ React23.createElement(
1844
+ "text",
1845
+ {
1846
+ x: getX(i),
1847
+ y: getY(d.value) - 10,
1848
+ textAnchor: "middle",
1849
+ fill: "#fff",
1850
+ fontSize: "9",
1851
+ fontWeight: "700"
1852
+ },
1853
+ d.value
1854
+ )), /* @__PURE__ */ React23.createElement(
1855
+ "text",
1856
+ {
1857
+ x: getX(i),
1858
+ y: H - 6,
1859
+ textAnchor: "middle",
1860
+ fill: "rgba(255,255,255,0.3)",
1861
+ fontSize: "9"
1862
+ },
1863
+ d.label
1864
+ ))));
1865
+ const renderChart = () => {
1866
+ if (type === "line") return /* @__PURE__ */ React23.createElement(LineChart, null);
1867
+ if (type === "pie") return /* @__PURE__ */ React23.createElement(PieChart, null);
1868
+ if (type === "area") return /* @__PURE__ */ React23.createElement(AreaChart, null);
1869
+ return /* @__PURE__ */ React23.createElement(BarChart, null);
1870
+ };
1871
+ return /* @__PURE__ */ React23.createElement("div", { style: {
1872
+ background: bg,
1873
+ borderRadius: radius,
1874
+ padding: "20px",
1875
+ fontFamily: "system-ui, sans-serif",
1876
+ border: "1px solid rgba(255,255,255,0.07)",
1877
+ width: "100%",
1878
+ maxWidth: "360px",
1879
+ boxSizing: "border-box"
1880
+ } }, /* @__PURE__ */ React23.createElement("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: "16px" } }, /* @__PURE__ */ React23.createElement("p", { style: { fontSize: "14px", fontWeight: "700", color: "#fff", margin: 0 } }, title), /* @__PURE__ */ React23.createElement("span", { style: {
1881
+ fontSize: "10px",
1882
+ fontWeight: "700",
1883
+ padding: "3px 9px",
1884
+ borderRadius: "6px",
1885
+ background: alpha(accent, 0.12),
1886
+ color: accent,
1887
+ border: `1px solid ${alpha(accent, 0.25)}`,
1888
+ textTransform: "capitalize"
1889
+ } }, type)), renderChart());
1890
+ };
1891
+
1892
+ // src/components/ImageCard/ImageCard.jsx
1893
+ import React24, { useState as useState17 } from "react";
1894
+ var ImageCard = ({
1895
+ image = "https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=600&q=80",
1896
+ tag = "Travel",
1897
+ title = "Discover the Hidden Peaks of the Himalayas",
1898
+ description = "A breathtaking journey through untouched landscapes, ancient monasteries, and snow-capped summits that few have ever seen.",
1899
+ buttonText = "Read More",
1900
+ accent = "#6366f1",
1901
+ bg = "#0f172a",
1902
+ radius = "20px",
1903
+ onButtonClick = () => {
1904
+ }
1905
+ }) => {
1906
+ const [hovered, setHovered] = useState17(false);
1907
+ const alpha = (hex, op) => {
1908
+ const r = parseInt(hex.slice(1, 3), 16);
1909
+ const g = parseInt(hex.slice(3, 5), 16);
1910
+ const b = parseInt(hex.slice(5, 7), 16);
1911
+ return `rgba(${r},${g},${b},${op})`;
1912
+ };
1913
+ return /* @__PURE__ */ React24.createElement(
1914
+ "div",
1915
+ {
1916
+ onMouseEnter: () => setHovered(true),
1917
+ onMouseLeave: () => setHovered(false),
1918
+ style: {
1919
+ background: bg,
1920
+ borderRadius: radius,
1921
+ overflow: "hidden",
1922
+ width: "300px",
1923
+ border: `1px solid ${hovered ? alpha(accent, 0.3) : "rgba(255,255,255,0.07)"}`,
1924
+ fontFamily: "system-ui, sans-serif",
1925
+ transition: "border-color 0.25s, transform 0.25s",
1926
+ transform: hovered ? "translateY(-4px)" : "none",
1927
+ boxShadow: hovered ? `0 16px 40px rgba(0,0,0,0.5)` : "0 4px 20px rgba(0,0,0,0.3)"
1928
+ }
1929
+ },
1930
+ /* @__PURE__ */ React24.createElement("div", { style: { position: "relative", width: "100%", height: "180px", overflow: "hidden" } }, /* @__PURE__ */ React24.createElement(
1931
+ "img",
1932
+ {
1933
+ src: image,
1934
+ alt: title,
1935
+ style: {
1936
+ width: "100%",
1937
+ height: "100%",
1938
+ objectFit: "cover",
1939
+ transform: hovered ? "scale(1.05)" : "scale(1)",
1940
+ transition: "transform 0.4s ease"
1941
+ }
1942
+ }
1943
+ ), /* @__PURE__ */ React24.createElement("div", { style: {
1944
+ position: "absolute",
1945
+ inset: 0,
1946
+ background: "linear-gradient(to top, rgba(0,0,0,0.5) 0%, transparent 60%)"
1947
+ } }), tag && /* @__PURE__ */ React24.createElement("div", { style: {
1948
+ position: "absolute",
1949
+ top: "12px",
1950
+ left: "12px",
1951
+ padding: "4px 10px",
1952
+ borderRadius: "20px",
1953
+ background: alpha(accent, 0.85),
1954
+ fontSize: "10px",
1955
+ fontWeight: "700",
1956
+ color: "#fff",
1957
+ letterSpacing: "0.5px",
1958
+ textTransform: "uppercase"
1959
+ } }, tag)),
1960
+ /* @__PURE__ */ React24.createElement("div", { style: { padding: "18px" } }, /* @__PURE__ */ React24.createElement("h3", { style: {
1961
+ fontSize: "15px",
1962
+ fontWeight: "700",
1963
+ color: "#fff",
1964
+ margin: "0 0 8px",
1965
+ lineHeight: 1.4
1966
+ } }, title), /* @__PURE__ */ React24.createElement("p", { style: {
1967
+ fontSize: "13px",
1968
+ color: "rgba(255,255,255,0.45)",
1969
+ lineHeight: 1.65,
1970
+ margin: "0 0 18px"
1971
+ } }, description), /* @__PURE__ */ React24.createElement(
1972
+ "button",
1973
+ {
1974
+ onClick: onButtonClick,
1975
+ style: {
1976
+ width: "100%",
1977
+ padding: "11px",
1978
+ borderRadius: "12px",
1979
+ border: "none",
1980
+ background: `linear-gradient(135deg, ${accent}, ${alpha(accent, 0.7)})`,
1981
+ color: "#fff",
1982
+ fontSize: "13px",
1983
+ fontWeight: "700",
1984
+ cursor: "pointer",
1985
+ fontFamily: "inherit",
1986
+ transition: "opacity 0.2s"
1987
+ },
1988
+ onMouseEnter: (e) => e.currentTarget.style.opacity = "0.85",
1989
+ onMouseLeave: (e) => e.currentTarget.style.opacity = "1"
1990
+ },
1991
+ buttonText
1992
+ ))
1993
+ );
1994
+ };
1546
1995
  export {
1547
1996
  Avatar,
1548
1997
  AvatarCard,
1998
+ Charts,
1549
1999
  CodeBlock,
1550
2000
  CustomInputField,
1551
2001
  DividerLine,
1552
2002
  FileUpload,
1553
2003
  Footer,
2004
+ ImageCard,
1554
2005
  Loader,
1555
2006
  LoadingSpinner,
1556
2007
  Navbar,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "virtual-ui-lib",
3
- "version": "1.0.62",
3
+ "version": "1.0.64",
4
4
  "description": "Virtual UI React Component Library",
5
5
  "author": "Ankush",
6
6
  "license": "ISC",