@underverse-ui/underverse 0.1.13 → 0.1.14

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.cjs CHANGED
@@ -35,6 +35,7 @@ __export(index_exports, {
35
35
  Avatar: () => Avatar_default,
36
36
  Badge: () => Badge_default,
37
37
  BadgeBase: () => Badge,
38
+ BatteryProgress: () => BatteryProgress,
38
39
  BottomSheet: () => BottomSheet,
39
40
  Breadcrumb: () => Breadcrumb_default,
40
41
  Button: () => Button_default,
@@ -43,6 +44,7 @@ __export(index_exports, {
43
44
  Carousel: () => Carousel,
44
45
  CategoryTreeSelect: () => CategoryTreeSelect,
45
46
  Checkbox: () => Checkbox,
47
+ CircularProgress: () => CircularProgress,
46
48
  ClientOnly: () => ClientOnly,
47
49
  Combobox: () => Combobox,
48
50
  CompactPagination: () => CompactPagination,
@@ -52,6 +54,8 @@ __export(index_exports, {
52
54
  DateUtils: () => date_exports,
53
55
  Drawer: () => Drawer,
54
56
  DropdownMenu: () => DropdownMenu_default,
57
+ DropdownMenuItem: () => DropdownMenuItem,
58
+ DropdownMenuSeparator: () => DropdownMenuSeparator,
55
59
  FloatingContacts: () => FloatingContacts,
56
60
  Form: () => Form,
57
61
  FormActions: () => FormActions,
@@ -75,7 +79,9 @@ __export(index_exports, {
75
79
  LanguageSwitcherHeadless: () => LanguageSwitcherHeadless,
76
80
  LoadingBar: () => LoadingBar,
77
81
  LoadingDots: () => LoadingDots,
82
+ LoadingProgress: () => LoadingProgress,
78
83
  LoadingSpinner: () => LoadingSpinner,
84
+ MiniProgress: () => MiniProgress,
79
85
  Modal: () => Modal_default,
80
86
  MultiCombobox: () => MultiCombobox,
81
87
  NotificationBadge: () => NotificationBadge,
@@ -86,21 +92,34 @@ __export(index_exports, {
86
92
  PasswordInput: () => PasswordInput,
87
93
  PillTabs: () => PillTabs,
88
94
  Popover: () => Popover,
89
- Progress: () => Progress_default,
95
+ Progress: () => Progress,
90
96
  PulseBadge: () => PulseBadge,
91
- RadioGroup: () => RadioGroup_default,
97
+ RadioGroup: () => RadioGroup,
98
+ RadioGroupItem: () => RadioGroupItem,
92
99
  SIZE_STYLES_BTN: () => SIZE_STYLES_BTN,
93
100
  ScrollArea: () => ScrollArea,
101
+ SearchInput: () => SearchInput,
94
102
  Section: () => Section_default,
103
+ SegmentedProgress: () => SegmentedProgress,
104
+ SelectDropdown: () => SelectDropdown,
95
105
  Sheet: () => Sheet,
96
106
  SidebarSheet: () => SidebarSheet,
97
107
  SimplePagination: () => SimplePagination,
98
108
  SimpleTabs: () => SimpleTabs,
99
109
  Skeleton: () => Skeleton_default,
110
+ SkeletonAvatar: () => SkeletonAvatar,
111
+ SkeletonButton: () => SkeletonButton,
112
+ SkeletonCard: () => SkeletonCard,
113
+ SkeletonList: () => SkeletonList,
114
+ SkeletonMessage: () => SkeletonMessage,
115
+ SkeletonPost: () => SkeletonPost,
116
+ SkeletonTable: () => SkeletonTable,
117
+ SkeletonText: () => SkeletonText,
100
118
  SlideOver: () => SlideOver,
101
119
  Slider: () => Slider,
102
120
  SmartImage: () => SmartImage,
103
121
  StatusBadge: () => StatusBadge,
122
+ StepProgress: () => StepProgress,
104
123
  Switch: () => Switch_default,
105
124
  Table: () => Table,
106
125
  TableBody: () => TableBody,
@@ -1564,6 +1583,148 @@ var Skeleton = ({
1564
1583
  }
1565
1584
  );
1566
1585
  };
1586
+ var SkeletonAvatar = ({
1587
+ size = "md",
1588
+ className
1589
+ }) => {
1590
+ const sizeClasses2 = {
1591
+ sm: "w-8 h-8",
1592
+ md: "w-10 h-10",
1593
+ lg: "w-12 h-12"
1594
+ };
1595
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1596
+ Skeleton,
1597
+ {
1598
+ variant: "circular",
1599
+ className: cn(sizeClasses2[size], className)
1600
+ }
1601
+ );
1602
+ };
1603
+ var SkeletonButton = ({
1604
+ size = "md",
1605
+ className
1606
+ }) => {
1607
+ const sizeClasses2 = {
1608
+ sm: "h-8 w-20",
1609
+ md: "h-10 w-24",
1610
+ lg: "h-12 w-28"
1611
+ };
1612
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1613
+ Skeleton,
1614
+ {
1615
+ variant: "rounded",
1616
+ className: cn(sizeClasses2[size], className)
1617
+ }
1618
+ );
1619
+ };
1620
+ var SkeletonText = ({
1621
+ lines = 3,
1622
+ className,
1623
+ width = "100%"
1624
+ }) => {
1625
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1626
+ Skeleton,
1627
+ {
1628
+ variant: "text",
1629
+ lines,
1630
+ width,
1631
+ className
1632
+ }
1633
+ );
1634
+ };
1635
+ var SkeletonCard = ({
1636
+ showAvatar = true,
1637
+ showImage = false,
1638
+ textLines = 3,
1639
+ className
1640
+ }) => {
1641
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: cn("p-4 space-y-4 rounded-lg border bg-card", className), children: [
1642
+ showAvatar && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex items-center space-x-3", children: [
1643
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SkeletonAvatar, {}),
1644
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "space-y-2", children: [
1645
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Skeleton, { className: "h-4 w-24" }),
1646
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Skeleton, { className: "h-3 w-16" })
1647
+ ] })
1648
+ ] }),
1649
+ showImage && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Skeleton, { className: "h-48 w-full rounded-md" }),
1650
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SkeletonText, { lines: textLines }),
1651
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex space-x-2", children: [
1652
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SkeletonButton, { size: "sm" }),
1653
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SkeletonButton, { size: "sm" })
1654
+ ] })
1655
+ ] });
1656
+ };
1657
+ var SkeletonPost = ({ className }) => {
1658
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: cn("p-6 space-y-4 rounded-xl border bg-card", className), children: [
1659
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex items-center space-x-3", children: [
1660
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SkeletonAvatar, { size: "lg" }),
1661
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "space-y-2", children: [
1662
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Skeleton, { className: "h-4 w-32" }),
1663
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Skeleton, { className: "h-3 w-20" })
1664
+ ] })
1665
+ ] }),
1666
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SkeletonText, { lines: 2 }),
1667
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Skeleton, { className: "h-64 w-full rounded-lg" }),
1668
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex items-center space-x-4", children: [
1669
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Skeleton, { className: "h-3 w-16" }),
1670
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Skeleton, { className: "h-3 w-20" }),
1671
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Skeleton, { className: "h-3 w-12" })
1672
+ ] }),
1673
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "flex items-center justify-between pt-2 border-t border-border", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex space-x-4", children: [
1674
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Skeleton, { className: "h-8 w-16" }),
1675
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Skeleton, { className: "h-8 w-20" }),
1676
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Skeleton, { className: "h-8 w-16" })
1677
+ ] }) })
1678
+ ] });
1679
+ };
1680
+ var SkeletonMessage = ({
1681
+ own = false,
1682
+ showAvatar = true,
1683
+ className
1684
+ }) => {
1685
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: cn(
1686
+ "flex items-end space-x-2",
1687
+ own && "flex-row-reverse space-x-reverse",
1688
+ className
1689
+ ), children: [
1690
+ showAvatar && !own && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SkeletonAvatar, { size: "sm" }),
1691
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: cn(
1692
+ "max-w-xs space-y-1",
1693
+ own ? "items-end" : "items-start"
1694
+ ), children: [
1695
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Skeleton, { className: cn(
1696
+ "h-10 rounded-2xl",
1697
+ own ? "w-32 bg-primary/20" : "w-40 bg-muted"
1698
+ ) }),
1699
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Skeleton, { className: "h-3 w-12" })
1700
+ ] })
1701
+ ] });
1702
+ };
1703
+ var SkeletonList = ({
1704
+ items = 5,
1705
+ itemHeight = 60,
1706
+ showAvatar = true,
1707
+ className
1708
+ }) => {
1709
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: cn("space-y-3", className), children: Array.from({ length: items }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex items-center space-x-3 p-3 rounded-lg", children: [
1710
+ showAvatar && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SkeletonAvatar, {}),
1711
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex-1 space-y-2", children: [
1712
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Skeleton, { className: "h-4 w-3/4" }),
1713
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Skeleton, { className: "h-3 w-1/2" })
1714
+ ] }),
1715
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Skeleton, { className: "h-6 w-16" })
1716
+ ] }, index)) });
1717
+ };
1718
+ var SkeletonTable = ({
1719
+ rows = 5,
1720
+ columns = 4,
1721
+ className
1722
+ }) => {
1723
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: cn("space-y-3", className), children: [
1724
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "flex space-x-4 p-3 border-b border-border", children: Array.from({ length: columns }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Skeleton, { className: "h-4 flex-1" }, index)) }),
1725
+ Array.from({ length: rows }).map((_, rowIndex) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "flex space-x-4 p-3", children: Array.from({ length: columns }).map((_2, colIndex) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Skeleton, { className: "h-4 flex-1" }, colIndex)) }, rowIndex))
1726
+ ] });
1727
+ };
1567
1728
  var Skeleton_default = Skeleton;
1568
1729
 
1569
1730
  // ../../components/ui/Progress.tsx
@@ -1662,7 +1823,356 @@ var Progress = ({
1662
1823
  )
1663
1824
  ] });
1664
1825
  };
1665
- var Progress_default = Progress;
1826
+ var CircularProgress = ({
1827
+ value,
1828
+ max = 100,
1829
+ size = 64,
1830
+ strokeWidth = 4,
1831
+ className,
1832
+ variant = "primary",
1833
+ showValue = false,
1834
+ children,
1835
+ indeterminate = false,
1836
+ status = "normal",
1837
+ trackColor = "stroke-muted/20"
1838
+ }) => {
1839
+ const percentage = Math.min(Math.max(value / max * 100, 0), 100);
1840
+ const radius = (size - strokeWidth) / 2;
1841
+ const circumference = radius * Math.PI * 2;
1842
+ const offset = circumference - percentage / 100 * circumference;
1843
+ const isComplete = status === "complete" || percentage >= 100;
1844
+ const isError = status === "error";
1845
+ const variantColors = {
1846
+ default: "stroke-muted-foreground",
1847
+ primary: "stroke-primary",
1848
+ success: "stroke-success",
1849
+ warning: "stroke-warning",
1850
+ danger: "stroke-destructive",
1851
+ info: "stroke-info"
1852
+ };
1853
+ const getContentIcon = () => {
1854
+ if (isComplete) return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react4.Check, { className: "w-5 h-5 text-success" });
1855
+ if (isError) return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react4.X, { className: "w-5 h-5 text-destructive" });
1856
+ return null;
1857
+ };
1858
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
1859
+ "div",
1860
+ {
1861
+ className: cn("relative inline-flex items-center justify-center", className),
1862
+ role: "progressbar",
1863
+ "aria-valuemin": 0,
1864
+ "aria-valuemax": indeterminate ? void 0 : max,
1865
+ "aria-valuenow": indeterminate ? void 0 : Math.round(percentage),
1866
+ "aria-label": children ? void 0 : "Progress",
1867
+ children: [
1868
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
1869
+ "svg",
1870
+ {
1871
+ width: size,
1872
+ height: size,
1873
+ className: cn(
1874
+ "transform -rotate-90",
1875
+ indeterminate && "animate-spin"
1876
+ ),
1877
+ style: { animationDuration: indeterminate ? "2s" : void 0 },
1878
+ children: [
1879
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1880
+ "circle",
1881
+ {
1882
+ cx: size / 2,
1883
+ cy: size / 2,
1884
+ r: radius,
1885
+ stroke: "currentColor",
1886
+ strokeWidth,
1887
+ fill: "transparent",
1888
+ className: trackColor
1889
+ }
1890
+ ),
1891
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1892
+ "circle",
1893
+ {
1894
+ cx: size / 2,
1895
+ cy: size / 2,
1896
+ r: radius,
1897
+ strokeWidth,
1898
+ fill: "transparent",
1899
+ strokeDasharray: circumference,
1900
+ strokeDashoffset: indeterminate ? circumference * 0.25 : offset,
1901
+ className: cn(
1902
+ "transition-all duration-700 ease-out",
1903
+ isComplete ? "stroke-success" : isError ? "stroke-destructive" : variantColors[variant],
1904
+ "drop-shadow-sm"
1905
+ ),
1906
+ strokeLinecap: "round",
1907
+ style: {
1908
+ filter: `drop-shadow(0 0 4px ${isComplete ? "hsl(var(--success) / 0.3)" : isError ? "hsl(var(--destructive) / 0.3)" : "hsl(var(--primary) / 0.2)"})`
1909
+ }
1910
+ }
1911
+ )
1912
+ ]
1913
+ }
1914
+ ),
1915
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "absolute inset-0 flex flex-col items-center justify-center text-center", children: children ? children : /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_jsx_runtime11.Fragment, { children: [
1916
+ getContentIcon(),
1917
+ showValue && !indeterminate && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: cn(
1918
+ "text-sm font-semibold",
1919
+ isComplete ? "text-success" : isError ? "text-destructive" : "text-foreground"
1920
+ ), children: isComplete ? "\u2713" : isError ? "\u2717" : `${Math.round(percentage)}%` }),
1921
+ indeterminate && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react4.Clock, { className: "w-4 h-4 text-muted-foreground animate-pulse" })
1922
+ ] }) })
1923
+ ]
1924
+ }
1925
+ );
1926
+ };
1927
+ var StepProgress = ({
1928
+ steps,
1929
+ currentStep,
1930
+ className,
1931
+ variant = "primary",
1932
+ size = "md"
1933
+ }) => {
1934
+ const stepSizes = {
1935
+ sm: "w-6 h-6 text-xs",
1936
+ md: "w-8 h-8 text-sm",
1937
+ lg: "w-10 h-10 text-base"
1938
+ };
1939
+ const getStepStatus = (stepIndex) => {
1940
+ if (stepIndex < currentStep) return "completed";
1941
+ if (stepIndex === currentStep) return "current";
1942
+ return "upcoming";
1943
+ };
1944
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: cn("w-full", className), role: "list", "aria-label": "Progress steps", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "flex items-center justify-between", children: steps.map((step, index) => {
1945
+ const status = getStepStatus(index);
1946
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "flex items-center", role: "listitem", "aria-current": status === "current" ? "step" : void 0, children: [
1947
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1948
+ "div",
1949
+ {
1950
+ className: cn(
1951
+ "rounded-full border-2 flex items-center justify-center font-medium transition-all duration-300",
1952
+ "shadow-sm hover:shadow-md",
1953
+ stepSizes[size],
1954
+ status === "completed" && [
1955
+ "border-success bg-success text-success-foreground",
1956
+ "shadow-success/20"
1957
+ ],
1958
+ status === "current" && [
1959
+ "border-primary bg-primary/10 text-primary",
1960
+ "ring-2 ring-primary/20 ring-offset-2",
1961
+ "shadow-primary/20"
1962
+ ],
1963
+ status === "upcoming" && [
1964
+ "border-muted-foreground/30 text-muted-foreground bg-background",
1965
+ "hover:border-muted-foreground/50"
1966
+ ]
1967
+ ),
1968
+ children: status === "completed" ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react4.Check, { className: "w-3 h-3" }) : index + 1
1969
+ }
1970
+ ),
1971
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1972
+ "span",
1973
+ {
1974
+ className: cn(
1975
+ "ml-2 text-sm font-medium transition-colors duration-200",
1976
+ status === "completed" && variantStyles2[variant].replace("bg-", "text-"),
1977
+ status === "current" && "text-foreground",
1978
+ status === "upcoming" && "text-muted-foreground"
1979
+ ),
1980
+ children: step
1981
+ }
1982
+ ),
1983
+ index < steps.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1984
+ "div",
1985
+ {
1986
+ className: cn(
1987
+ "flex-1 h-0.5 mx-4 transition-colors duration-200",
1988
+ index < currentStep ? variantStyles2[variant] : "bg-muted"
1989
+ )
1990
+ }
1991
+ )
1992
+ ] }, step);
1993
+ }) }) });
1994
+ };
1995
+ var MiniProgress = ({
1996
+ value,
1997
+ max = 100,
1998
+ className,
1999
+ variant = "primary",
2000
+ showValue = false
2001
+ }) => {
2002
+ const percentage = Math.min(Math.max(value / max * 100, 0), 100);
2003
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: cn("flex items-center gap-2", className), children: [
2004
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2005
+ "div",
2006
+ {
2007
+ className: "flex-1 h-1.5 bg-muted/50 rounded-full overflow-hidden",
2008
+ role: "progressbar",
2009
+ "aria-valuemin": 0,
2010
+ "aria-valuemax": max,
2011
+ "aria-valuenow": Math.round(percentage),
2012
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2013
+ "div",
2014
+ {
2015
+ className: cn(
2016
+ "h-full transition-all duration-500 ease-out rounded-full",
2017
+ variantStyles2[variant]
2018
+ ),
2019
+ style: { width: `${percentage}%` }
2020
+ }
2021
+ )
2022
+ }
2023
+ ),
2024
+ showValue && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { className: "text-xs font-medium text-muted-foreground min-w-[2.5rem] text-right", children: [
2025
+ Math.round(percentage),
2026
+ "%"
2027
+ ] })
2028
+ ] });
2029
+ };
2030
+ var BatteryProgress = ({
2031
+ value,
2032
+ max = 100,
2033
+ className,
2034
+ charging = false,
2035
+ showValue = false
2036
+ }) => {
2037
+ const percentage = Math.min(Math.max(value / max * 100, 0), 100);
2038
+ const getVariant = () => {
2039
+ if (charging) return "info";
2040
+ if (percentage <= 20) return "danger";
2041
+ if (percentage <= 50) return "warning";
2042
+ return "success";
2043
+ };
2044
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: cn("flex items-center gap-2", className), children: [
2045
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "relative", role: "progressbar", "aria-label": "Battery level", "aria-valuemin": 0, "aria-valuemax": max, "aria-valuenow": Math.round(percentage), children: [
2046
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "w-6 h-3 border-2 border-foreground/20 rounded-sm relative", children: [
2047
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "absolute -right-1 top-0.5 w-0.5 h-1 bg-foreground/20 rounded-r-sm" }),
2048
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2049
+ "div",
2050
+ {
2051
+ className: cn(
2052
+ "h-full transition-all duration-500 ease-out rounded-sm",
2053
+ variantStyles2[getVariant()],
2054
+ charging && "animate-pulse"
2055
+ ),
2056
+ style: { width: `${percentage}%` }
2057
+ }
2058
+ )
2059
+ ] }),
2060
+ charging && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "w-2 h-2 text-info-foreground", children: "\u26A1" }) })
2061
+ ] }),
2062
+ showValue && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { className: cn(
2063
+ "text-xs font-medium",
2064
+ percentage <= 20 ? "text-destructive" : "text-muted-foreground"
2065
+ ), children: [
2066
+ Math.round(percentage),
2067
+ "%"
2068
+ ] })
2069
+ ] });
2070
+ };
2071
+ var SegmentedProgress = ({
2072
+ segments,
2073
+ activeSegments,
2074
+ className,
2075
+ variant = "primary",
2076
+ size = "md"
2077
+ }) => {
2078
+ const segmentSizes = {
2079
+ sm: "h-1",
2080
+ md: "h-2",
2081
+ lg: "h-3"
2082
+ };
2083
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2084
+ "div",
2085
+ {
2086
+ className: cn("flex gap-1", className),
2087
+ role: "progressbar",
2088
+ "aria-valuemin": 0,
2089
+ "aria-valuemax": segments,
2090
+ "aria-valuenow": activeSegments,
2091
+ children: Array.from({ length: segments }, (_, index) => /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2092
+ "div",
2093
+ {
2094
+ className: cn(
2095
+ "flex-1 rounded-full transition-all duration-300",
2096
+ segmentSizes[size],
2097
+ index < activeSegments ? variantStyles2[variant] : "bg-muted/50"
2098
+ )
2099
+ },
2100
+ index
2101
+ ))
2102
+ }
2103
+ );
2104
+ };
2105
+ var LoadingProgress = ({
2106
+ value,
2107
+ max = 100,
2108
+ className,
2109
+ variant = "primary",
2110
+ label,
2111
+ status = "loading",
2112
+ speed,
2113
+ timeRemaining
2114
+ }) => {
2115
+ const percentage = Math.min(Math.max(value / max * 100, 0), 100);
2116
+ const getStatusIcon = () => {
2117
+ switch (status) {
2118
+ case "complete":
2119
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react4.Check, { className: "w-4 h-4 text-success" });
2120
+ case "error":
2121
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react4.X, { className: "w-4 h-4 text-destructive" });
2122
+ case "paused":
2123
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_lucide_react4.Clock, { className: "w-4 h-4 text-warning" });
2124
+ default:
2125
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "w-2 h-2 bg-primary rounded-full animate-bounce" });
2126
+ }
2127
+ };
2128
+ const getStatusColor = () => {
2129
+ switch (status) {
2130
+ case "complete":
2131
+ return "success";
2132
+ case "error":
2133
+ return "danger";
2134
+ case "paused":
2135
+ return "warning";
2136
+ default:
2137
+ return variant;
2138
+ }
2139
+ };
2140
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: cn("w-full space-y-2", className), children: [
2141
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "flex items-center justify-between text-sm", children: [
2142
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "flex items-center gap-2", children: [
2143
+ getStatusIcon(),
2144
+ label && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "font-medium text-foreground", children: label })
2145
+ ] }),
2146
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "text-muted-foreground", children: status === "complete" ? "Complete" : `${Math.round(percentage)}%` })
2147
+ ] }),
2148
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2149
+ "div",
2150
+ {
2151
+ className: "w-full h-2 bg-muted/50 rounded-full overflow-hidden",
2152
+ role: "progressbar",
2153
+ "aria-valuemin": 0,
2154
+ "aria-valuemax": max,
2155
+ "aria-valuenow": Math.round(percentage),
2156
+ "aria-label": label || "Loading progress",
2157
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2158
+ "div",
2159
+ {
2160
+ className: cn(
2161
+ "h-full transition-all duration-300 ease-out rounded-full",
2162
+ variantStyles2[getStatusColor()],
2163
+ status === "loading" && "animate-pulse"
2164
+ ),
2165
+ style: { width: `${percentage}%` }
2166
+ }
2167
+ )
2168
+ }
2169
+ ),
2170
+ (speed || timeRemaining) && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "flex justify-between text-xs text-muted-foreground", children: [
2171
+ speed && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { children: speed }),
2172
+ timeRemaining && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { children: timeRemaining })
2173
+ ] })
2174
+ ] });
2175
+ };
1666
2176
 
1667
2177
  // ../../components/ui/Modal.tsx
1668
2178
  var React9 = __toESM(require("react"), 1);
@@ -3378,6 +3888,31 @@ var DropdownMenuItem = ({ children, onClick, disabled, destructive, className })
3378
3888
  children
3379
3889
  }
3380
3890
  );
3891
+ var DropdownMenuSeparator = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: cn("h-px bg-border my-1", className) });
3892
+ var SelectDropdown = ({ options, value, onChange, placeholder = "Select...", className }) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
3893
+ DropdownMenu,
3894
+ {
3895
+ trigger: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
3896
+ "button",
3897
+ {
3898
+ className: cn(
3899
+ "inline-flex items-center justify-between gap-2 px-3 py-2 text-sm rounded-md border bg-background",
3900
+ "hover:bg-accent/50",
3901
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
3902
+ className
3903
+ ),
3904
+ children: [
3905
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "truncate max-w-[16rem] text-foreground/90", children: value || placeholder }),
3906
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("svg", { width: "16", height: "16", viewBox: "0 0 20 20", fill: "none", className: "opacity-70", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("path", { d: "M6 8l4 4 4-4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) })
3907
+ ]
3908
+ }
3909
+ ),
3910
+ items: options.map((option) => ({
3911
+ label: option,
3912
+ onClick: () => onChange(option)
3913
+ }))
3914
+ }
3915
+ );
3381
3916
  var DropdownMenu_default = DropdownMenu;
3382
3917
 
3383
3918
  // ../../components/ui/Pagination.tsx
@@ -5233,7 +5768,6 @@ var RadioGroupItem = React23.forwardRef(
5233
5768
  }
5234
5769
  );
5235
5770
  RadioGroupItem.displayName = "RadioGroupItem";
5236
- var RadioGroup_default = RadioGroup;
5237
5771
 
5238
5772
  // ../../components/ui/Slider.tsx
5239
5773
  var React24 = __toESM(require("react"), 1);
@@ -8940,6 +9474,7 @@ function getUnderverseMessages(locale = "en") {
8940
9474
  Avatar,
8941
9475
  Badge,
8942
9476
  BadgeBase,
9477
+ BatteryProgress,
8943
9478
  BottomSheet,
8944
9479
  Breadcrumb,
8945
9480
  Button,
@@ -8948,6 +9483,7 @@ function getUnderverseMessages(locale = "en") {
8948
9483
  Carousel,
8949
9484
  CategoryTreeSelect,
8950
9485
  Checkbox,
9486
+ CircularProgress,
8951
9487
  ClientOnly,
8952
9488
  Combobox,
8953
9489
  CompactPagination,
@@ -8957,6 +9493,8 @@ function getUnderverseMessages(locale = "en") {
8957
9493
  DateUtils,
8958
9494
  Drawer,
8959
9495
  DropdownMenu,
9496
+ DropdownMenuItem,
9497
+ DropdownMenuSeparator,
8960
9498
  FloatingContacts,
8961
9499
  Form,
8962
9500
  FormActions,
@@ -8980,7 +9518,9 @@ function getUnderverseMessages(locale = "en") {
8980
9518
  LanguageSwitcherHeadless,
8981
9519
  LoadingBar,
8982
9520
  LoadingDots,
9521
+ LoadingProgress,
8983
9522
  LoadingSpinner,
9523
+ MiniProgress,
8984
9524
  Modal,
8985
9525
  MultiCombobox,
8986
9526
  NotificationBadge,
@@ -8994,18 +9534,31 @@ function getUnderverseMessages(locale = "en") {
8994
9534
  Progress,
8995
9535
  PulseBadge,
8996
9536
  RadioGroup,
9537
+ RadioGroupItem,
8997
9538
  SIZE_STYLES_BTN,
8998
9539
  ScrollArea,
9540
+ SearchInput,
8999
9541
  Section,
9542
+ SegmentedProgress,
9543
+ SelectDropdown,
9000
9544
  Sheet,
9001
9545
  SidebarSheet,
9002
9546
  SimplePagination,
9003
9547
  SimpleTabs,
9004
9548
  Skeleton,
9549
+ SkeletonAvatar,
9550
+ SkeletonButton,
9551
+ SkeletonCard,
9552
+ SkeletonList,
9553
+ SkeletonMessage,
9554
+ SkeletonPost,
9555
+ SkeletonTable,
9556
+ SkeletonText,
9005
9557
  SlideOver,
9006
9558
  Slider,
9007
9559
  SmartImage,
9008
9560
  StatusBadge,
9561
+ StepProgress,
9009
9562
  Switch,
9010
9563
  Table,
9011
9564
  TableBody,