@nurix/ui-component-library 1.1.3-stage.89 → 1.1.3-stage.91

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
@@ -352,7 +352,7 @@ var DEFAULT_THEME = {
352
352
  background: "#f5f5f5",
353
353
  foreground: "#0a0a0a",
354
354
  border: "#e5e5e5",
355
- destructive: "#dc2626",
355
+ destructive: "#ef4444",
356
356
  secondary: "#e5e5e5",
357
357
  mutedForeground: "#737373",
358
358
  muted: "#f5f5f5",
@@ -386,7 +386,9 @@ var DEFAULT_THEME = {
386
386
  semanticForeground: "#ffffff",
387
387
  disabled: "#d4d4d4",
388
388
  primary10: "#1d488519",
389
- success: "#047857",
389
+ success: "#10b981",
390
+ warning: "#fef3c7",
391
+ warningForeground: "#78350f",
390
392
  switchTrack: "#e5e5e5"
391
393
  },
392
394
  darkMode: {
@@ -408,7 +410,7 @@ var DEFAULT_THEME = {
408
410
  chart4: "#0d74ce",
409
411
  chart1: "#5eb1ef",
410
412
  chart5: "#113264",
411
- card: "#171717",
413
+ card: "#262626",
412
414
  cardForeground: "#fafafa",
413
415
  popover: "#262626",
414
416
  popoverForeground: "#fafafa",
@@ -428,6 +430,8 @@ var DEFAULT_THEME = {
428
430
  disabled: "#404040",
429
431
  primary10: "#e6f1ff1a",
430
432
  success: "#a7f3d0",
433
+ warning: "#fde68a",
434
+ warningForeground: "#78350f",
431
435
  switchTrack: "#ffffff"
432
436
  }
433
437
  },
@@ -453,24 +457,25 @@ var DEFAULT_THEME = {
453
457
  // src/button/variables.ts
454
458
  var _a, _b;
455
459
  var BUTTON_TOKENS = {
456
- base: "relative inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none [&>svg]:h-4 [&>svg]:w-4 cursor-pointer",
460
+ base: "relative inline-flex items-center justify-center gap-[10px] whitespace-nowrap text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none [&>svg]:size-6 cursor-pointer",
457
461
  hoverOverlay: "overflow-hidden after:content-[''] after:absolute after:inset-0 after:pointer-events-none after:rounded-[inherit] after:bg-black/10 after:opacity-0 after:transition-opacity hover:after:opacity-100",
458
462
  variant: {
459
463
  primary: "bg-primary text-primary-foreground disabled:bg-disabled disabled:text-primary-foreground disabled:opacity-100",
460
- secondary: "bg-secondary text-secondary-foreground disabled:bg-muted-foreground disabled:text-background disabled:opacity-100",
464
+ secondary: "bg-secondary text-secondary-foreground disabled:bg-disabled disabled:text-primary-foreground disabled:opacity-100",
461
465
  destructive: "bg-destructive text-destructive-foreground disabled:bg-disabled disabled:text-primary-foreground disabled:opacity-100",
462
- outline: "border border-border bg-transparent text-foreground hover:bg-foreground/5 disabled:border-[#b2b2b2] disabled:text-[#b2b2b2] disabled:opacity-100",
463
- link: "bg-transparent text-foreground hover:text-primary disabled:text-muted-foreground disabled:opacity-100",
466
+ outline: "border border-sidebar-border bg-transparent text-foreground hover:bg-foreground/5 disabled:border-sidebar-border disabled:text-disabled disabled:opacity-100",
467
+ link: "bg-transparent text-primary disabled:text-muted-foreground disabled:opacity-100",
464
468
  // Icon-only variants (pair with size `icon` / `iconSm`)
465
469
  iconPrimary: "bg-primary text-primary-foreground disabled:bg-disabled disabled:text-primary-foreground disabled:opacity-100",
466
- iconSecondary: "bg-secondary text-secondary-foreground disabled:bg-muted-foreground disabled:text-secondary disabled:opacity-100",
467
- iconOutline: "border border-border bg-transparent text-foreground hover:bg-foreground/5 disabled:border-[#b2b2b2] disabled:text-[#b2b2b2] disabled:opacity-100"
470
+ iconSecondary: "bg-secondary text-secondary-foreground disabled:bg-disabled disabled:text-primary-foreground disabled:opacity-100",
471
+ iconOutline: "border border-sidebar-border bg-transparent text-foreground hover:bg-foreground/5 disabled:border-sidebar-border disabled:text-disabled disabled:opacity-100"
468
472
  },
469
473
  size: {
470
- default: "h-10 px-4 py-2",
474
+ default: "h-[var(--button-height,40px)] px-[var(--px-4,16px)] py-[var(--py-2,8px)]",
471
475
  sm: "h-9 px-3",
472
476
  lg: "h-10 px-8",
473
- icon: "h-10 w-10",
477
+ link: "h-9 px-0",
478
+ icon: "h-[var(--button-height,40px)] w-10",
474
479
  iconSm: "h-9 w-9"
475
480
  },
476
481
  radius: {
@@ -546,8 +551,8 @@ var INPUT_TOKENS = {
546
551
  root: "flex w-full flex-col gap-1",
547
552
  labelRow: "flex items-center gap-1 text-xs font-medium leading-4 tracking-normal text-foreground",
548
553
  mandatory: "text-destructive",
549
- field: "flex h-12 w-full items-center justify-between overflow-hidden bg-input px-4 py-2 text-sm shadow-none",
550
- fieldBase: "border border-transparent focus-within:border-ring disabled:pointer-events-none",
554
+ field: "flex h-[var(--input-height,48px)] w-full items-center gap-2 overflow-hidden bg-input pl-[var(--input-padding-horizontal,16px)] pr-3 py-1 text-sm shadow-none",
555
+ fieldBase: "border border-transparent focus-within:border-primary disabled:pointer-events-none",
551
556
  fieldDisabled: "opacity-50",
552
557
  fieldInvalid: "border-destructive focus-within:ring-destructive",
553
558
  input: "w-full bg-transparent outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-100",
@@ -729,8 +734,8 @@ var INPUT_GROUP_TOKENS = {
729
734
  mandatory: "text-destructive",
730
735
  supportingText: "text-xs font-normal leading-4 text-muted-foreground",
731
736
  supportingTextError: "text-destructive",
732
- field: "flex h-12 w-full items-center justify-between overflow-hidden bg-input px-4 py-2 text-sm shadow-none",
733
- fieldBase: "border border-transparent focus-within:border-ring disabled:pointer-events-none",
737
+ field: "flex h-[var(--input-height,48px)] w-full items-center gap-2 overflow-hidden bg-input pl-[var(--input-padding-horizontal,16px)] pr-3 py-1 text-sm shadow-none",
738
+ fieldBase: "border border-transparent focus-within:border-primary disabled:pointer-events-none",
734
739
  fieldInvalid: "border-destructive focus-within:border-destructive",
735
740
  fieldDisabled: "opacity-50",
736
741
  // Inner input area
@@ -739,7 +744,7 @@ var INPUT_GROUP_TOKENS = {
739
744
  segment: "shrink-0 h-9 flex items-center text-sm font-medium text-foreground px-4",
740
745
  segmentDivider: "h-9 border-border",
741
746
  // Textarea
742
- textareaField: "w-full bg-input px-4 py-2 text-sm border border-transparent focus-visible:outline-none focus-visible:border-ring disabled:pointer-events-none shadow-none",
747
+ textareaField: "w-full bg-input pl-[var(--input-padding-horizontal,16px)] pr-3 py-1 text-sm border border-transparent focus-visible:outline-none focus-visible:border-primary disabled:pointer-events-none shadow-none",
743
748
  textareaDisabled: "opacity-50",
744
749
  radius: {
745
750
  none: `${DEFAULT_THEME.radius.mode1.roundedNone}px`,
@@ -1661,7 +1666,8 @@ var BADGE_TOKENS = {
1661
1666
  secondary: "bg-secondary text-secondary-foreground",
1662
1667
  destructive: "bg-destructive text-primary-foreground",
1663
1668
  outline: "border border-border bg-transparent text-foreground",
1664
- success: "bg-success text-primary-foreground"
1669
+ success: "bg-success text-primary-foreground",
1670
+ warning: "bg-warning text-warning-foreground"
1665
1671
  },
1666
1672
  // Icon styles
1667
1673
  icon: "[&>svg]:h-3 [&>svg]:w-3",
@@ -1749,6 +1755,109 @@ var NumberBadge = React15.forwardRef(
1749
1755
  );
1750
1756
  NumberBadge.displayName = "NumberBadge";
1751
1757
 
1758
+ // src/select/select.tsx
1759
+ import * as React18 from "react";
1760
+ import * as SelectPrimitive from "@radix-ui/react-select";
1761
+ import { Check as Check2, ChevronDown as ChevronDown2, Search } from "lucide-react";
1762
+
1763
+ // src/select/variables.ts
1764
+ var SELECT_TOKENS = {
1765
+ // Main select container
1766
+ container: {
1767
+ // Figma: trigger uses rounded-lg (8px), padding pl-16 pr-12 py-4
1768
+ default: "bg-input rounded-[var(--rounded-lg,8px)] data-[state=open]:rounded-b-none flex items-center justify-between pl-[var(--input-padding-horizontal,16px)] pr-3 py-1 disabled:opacity-50 disabled:pointer-events-none disabled:cursor-not-allowed focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
1769
+ singleLineRegular: "h-[var(--input-height,48px)]",
1770
+ singleLineLarge: "h-[var(--input-height-large,64px)]",
1771
+ doubleLine: "h-[var(--input-height-large,64px)]",
1772
+ open: "flex-col gap-1 items-start rounded-[var(--rounded-2xl,16px)] w-full"
1773
+ },
1774
+ // Select button (when open, top part)
1775
+ selectButton: {
1776
+ base: "bg-input rounded-[var(--input-radius,16px)] flex items-center justify-between pl-[var(--input-padding-horizontal,16px)] pr-3 py-1 w-full shrink-0",
1777
+ singleLineRegular: "h-12",
1778
+ singleLineLarge: "h-16"
1779
+ },
1780
+ // Content wrapper
1781
+ contentWrap: {
1782
+ base: "flex gap-2 shrink-0",
1783
+ default: "items-center",
1784
+ doubleLine: "items-start"
1785
+ },
1786
+ // Lead icon
1787
+ leadIcon: "shrink-0 size-6",
1788
+ // Text wrapper
1789
+ textWrap: {
1790
+ base: "flex shrink-0",
1791
+ default: "items-center",
1792
+ doubleLine: "flex-col gap-[2px] items-start justify-center"
1793
+ },
1794
+ // Text styles
1795
+ text: {
1796
+ placeholder: "text-sm leading-5 text-muted-foreground font-normal tracking-normal",
1797
+ placeholderSubtext: "text-xs leading-4 text-muted-foreground",
1798
+ value: "text-sm leading-5 text-accent-foreground font-normal tracking-normal",
1799
+ valueSubtext: "text-xs leading-4 text-muted-foreground"
1800
+ },
1801
+ // Chevron icon
1802
+ chevron: "size-6 shrink-0",
1803
+ // Dropdown container — Figma: rounded-[--input/radius,16px], gap-8px, p-8px
1804
+ dropdown: {
1805
+ base: "bg-input flex flex-col gap-2 items-center p-2 rounded-[var(--input-radius,16px)] shrink-0 w-[var(--radix-select-trigger-width)]"
1806
+ },
1807
+ // Search input — Figma: h-48px, rounded-[--input/radius,16px], icon 24px
1808
+ search: {
1809
+ container: "bg-input flex h-[var(--input-height,48px)] items-center gap-2 pl-[var(--input-padding-horizontal,16px)] pr-3 py-1 rounded-[var(--input-radius,16px)] border border-border shrink-0 w-full",
1810
+ iconWrap: "flex items-center shrink-0",
1811
+ icon: "size-6 shrink-0",
1812
+ inputWrap: "flex flex-1 h-9 items-center min-h-px min-w-px pl-2 pr-3 py-1",
1813
+ input: "text-sm leading-5 text-muted-foreground font-normal tracking-normal shrink-0"
1814
+ },
1815
+ // Menu items — Figma: px-8px py-6px, rounded-sm (4px)
1816
+ menu: {
1817
+ container: "flex flex-col items-start shrink-0 w-full",
1818
+ sectionLabel: "flex h-8 items-center px-2 py-[var(--spacing-py-1-5,6px)] rounded-[var(--rounded-md,6px)] shrink-0 w-full",
1819
+ sectionText: "text-xs leading-4 text-muted-foreground font-normal tracking-normal shrink-0",
1820
+ item: {
1821
+ base: "flex items-center justify-between px-2 py-[var(--spacing-py-1-5,6px)] rounded-[var(--rounded-sm,4px)] shrink-0 w-full",
1822
+ singleLine: "h-8",
1823
+ doubleLine: "min-h-[50px]",
1824
+ hover: "bg-foreground/10",
1825
+ default: ""
1826
+ },
1827
+ itemContent: {
1828
+ base: "flex flex-1 gap-2 items-center min-h-px min-w-px"
1829
+ },
1830
+ itemTextWrap: {
1831
+ base: "flex flex-1 min-h-px min-w-px",
1832
+ singleLine: "items-center",
1833
+ doubleLine: "flex-col gap-1 items-start justify-center"
1834
+ },
1835
+ itemText: "text-sm leading-5 text-accent-foreground font-normal tracking-normal flex-1 min-h-px min-w-0 truncate",
1836
+ itemSubtext: "text-xs leading-4 text-muted-foreground font-normal tracking-normal flex-1 min-h-px min-w-0 truncate",
1837
+ checkIcon: {
1838
+ wrap: "flex items-center justify-end pl-2 shrink-0 relative",
1839
+ slot: "size-6 shrink-0",
1840
+ indicator: "absolute inset-0 flex items-center justify-center",
1841
+ icon: "size-6 shrink-0 text-primary"
1842
+ }
1843
+ },
1844
+ // Label component
1845
+ label: {
1846
+ container: "flex font-medium text-xs leading-4 tracking-normal items-center",
1847
+ text: "text-foreground shrink-0",
1848
+ asterisk: "text-destructive shrink-0"
1849
+ },
1850
+ // Select group (label + select)
1851
+ group: {
1852
+ container: "flex flex-col gap-1 items-start"
1853
+ },
1854
+ // Spec card (for storybook)
1855
+ specCard: "bg-background border border-border flex flex-col gap-10 items-start p-14 rounded-3xl size-full",
1856
+ sectionDivider: "flex flex-col h-[18px] items-start justify-center py-2 shrink-0 w-full",
1857
+ dividerLine: "border-border border-t flex-1 h-px min-h-px min-w-px",
1858
+ sectionTitle: "font-medium text-xl leading-7 text-foreground tracking-normal min-w-full shrink-0 w-[min-content] whitespace-pre-wrap"
1859
+ };
1860
+
1752
1861
  // src/theme/theme-context.tsx
1753
1862
  import * as React16 from "react";
1754
1863
 
@@ -1843,13 +1952,15 @@ var UI_TO_CSS_VAR = {
1843
1952
  accentForeground: "--accent-foreground",
1844
1953
  destructive: "--destructive",
1845
1954
  destructiveForeground: "--destructive-foreground",
1955
+ warning: "--warning",
1956
+ warningForeground: "--warning-foreground",
1846
1957
  card: "--card",
1847
1958
  cardForeground: "--card-foreground",
1848
1959
  popover: "--popover",
1849
1960
  popoverForeground: "--popover-foreground"
1850
1961
  };
1851
1962
  function themeJsonToCssVars(theme, mode) {
1852
- var _a5, _b4;
1963
+ var _a5, _b4, _c, _d, _e;
1853
1964
  const ui = (_b4 = (_a5 = theme.uIColors) == null ? void 0 : _a5[mode]) != null ? _b4 : {};
1854
1965
  const out = {};
1855
1966
  for (const [uiKey, cssVar] of Object.entries(UI_TO_CSS_VAR)) {
@@ -1858,6 +1969,30 @@ function themeJsonToCssVars(theme, mode) {
1858
1969
  const hsl = val.startsWith("#") ? hexToHslChannels(val) : null;
1859
1970
  out[cssVar] = hsl != null ? hsl : val;
1860
1971
  }
1972
+ const radius = (_c = theme.radius) == null ? void 0 : _c.mode1;
1973
+ if (radius) {
1974
+ out["--rounded-sm"] = `${radius.roundedSm}px`;
1975
+ out["--rounded-md"] = `${radius.roundedMd}px`;
1976
+ out["--rounded-2xl"] = `${radius.rounded2xl}px`;
1977
+ out["--rounded-full"] = `${radius.roundedFull}px`;
1978
+ }
1979
+ const components = (_d = theme.components) == null ? void 0 : _d.mode1;
1980
+ if (components) {
1981
+ out["--input-radius"] = `${components.inputRadius}px`;
1982
+ out["--input-height"] = `${components.inputHeight}px`;
1983
+ out["--input-height-large"] = `${components.inputHeightLarge}px`;
1984
+ out["--input-padding-horizontal"] = `${components.inputPaddingHorizontal}px`;
1985
+ }
1986
+ const padding = (_e = theme.twPadding) == null ? void 0 : _e.mode1;
1987
+ if (padding) {
1988
+ out["--spacing-pl-2"] = `${padding.px2}px`;
1989
+ out["--spacing-pr-3"] = `${padding.px3}px`;
1990
+ out["--spacing-py-1"] = `${padding.px1}px`;
1991
+ out["--spacing-py-1-5"] = `${padding.px15}px`;
1992
+ out["--spacing-gap-1"] = `${padding.px1}px`;
1993
+ out["--spacing-gap-2"] = `${padding.px2}px`;
1994
+ out["--spacing-gap-4"] = `${padding.px4}px`;
1995
+ }
1861
1996
  return out;
1862
1997
  }
1863
1998
 
@@ -1911,10 +2046,1245 @@ var useTheme = () => {
1911
2046
  return context;
1912
2047
  };
1913
2048
 
1914
- // src/shadow-dom-wrapper.tsx
2049
+ // src/typography/typography.tsx
1915
2050
  import * as React17 from "react";
2051
+ import { Slot as Slot2 } from "@radix-ui/react-slot";
2052
+
2053
+ // src/typography/variables.ts
2054
+ var TYPOGRAPHY_TOKENS = {
2055
+ base: "tracking-normal",
2056
+ tone: {
2057
+ default: "text-foreground",
2058
+ muted: "text-muted-foreground",
2059
+ inherit: "text-inherit"
2060
+ },
2061
+ variant: {
2062
+ h1: "text-4xl leading-10 font-semibold",
2063
+ h2: "text-2xl leading-8 font-bold",
2064
+ h3: "text-xl leading-7 font-bold",
2065
+ h4: "text-base leading-6 font-bold",
2066
+ h5: "text-sm leading-5 font-bold",
2067
+ h6: "text-xs leading-4 font-bold",
2068
+ p1: "text-lg leading-7 font-normal",
2069
+ p2: "text-sm leading-5 font-normal",
2070
+ p3: "text-xs leading-4 font-normal"
2071
+ }
2072
+ };
2073
+
2074
+ // src/typography/typography.tsx
2075
+ import { jsx as jsx15 } from "react/jsx-runtime";
2076
+ var DEFAULT_TAG_BY_VARIANT = {
2077
+ h1: "h1",
2078
+ h2: "h2",
2079
+ h3: "h3",
2080
+ h4: "h4",
2081
+ h5: "h5",
2082
+ h6: "h6",
2083
+ p1: "p",
2084
+ p2: "p",
2085
+ p3: "p"
2086
+ };
2087
+ var Typography = React17.forwardRef(
2088
+ ({
2089
+ variant = "p2",
2090
+ tone = "default",
2091
+ asChild = false,
2092
+ as,
2093
+ className,
2094
+ children,
2095
+ ...props
2096
+ }, ref) => {
2097
+ const Comp = asChild ? Slot2 : as != null ? as : DEFAULT_TAG_BY_VARIANT[variant];
2098
+ return /* @__PURE__ */ jsx15(
2099
+ Comp,
2100
+ {
2101
+ ref,
2102
+ className: cn(
2103
+ TYPOGRAPHY_TOKENS.base,
2104
+ TYPOGRAPHY_TOKENS.variant[variant],
2105
+ TYPOGRAPHY_TOKENS.tone[tone],
2106
+ className
2107
+ ),
2108
+ ...props,
2109
+ children
2110
+ }
2111
+ );
2112
+ }
2113
+ );
2114
+ Typography.displayName = "Typography";
2115
+
2116
+ // src/select/select.tsx
2117
+ import { jsx as jsx16, jsxs as jsxs11 } from "react/jsx-runtime";
2118
+ var Select = SelectPrimitive.Root;
2119
+ var SelectGroup = React18.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx16(
2120
+ SelectPrimitive.Group,
2121
+ {
2122
+ ref,
2123
+ className: cn("flex flex-col gap-0", className),
2124
+ ...props
2125
+ }
2126
+ ));
2127
+ SelectGroup.displayName = SelectPrimitive.Group.displayName;
2128
+ var SelectValue = React18.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx16(
2129
+ SelectPrimitive.Value,
2130
+ {
2131
+ ref,
2132
+ className: cn(
2133
+ // Size/weight per Figma (Text-sm/Regular)
2134
+ "text-sm leading-5 font-normal tracking-normal",
2135
+ // Default value color; placeholder handled by trigger group selector
2136
+ "text-accent-foreground",
2137
+ className
2138
+ ),
2139
+ ...props
2140
+ }
2141
+ ));
2142
+ SelectValue.displayName = "SelectValue";
2143
+ var SelectTrigger = React18.forwardRef(({ className, children, showLead = false, leadIcon, leadIconSize = "sm", size = "regular", ...props }, ref) => /* @__PURE__ */ jsxs11(
2144
+ SelectPrimitive.Trigger,
2145
+ {
2146
+ ref,
2147
+ className: cn(
2148
+ SELECT_TOKENS.container.default,
2149
+ size === "large" ? SELECT_TOKENS.container.singleLineLarge : SELECT_TOKENS.container.singleLineRegular,
2150
+ // Provide placeholder styling hook and consistent typography inheritance
2151
+ "group",
2152
+ "w-full",
2153
+ className
2154
+ ),
2155
+ ...props,
2156
+ children: [
2157
+ /* @__PURE__ */ jsxs11("div", { className: cn(SELECT_TOKENS.contentWrap.base, SELECT_TOKENS.contentWrap.default), children: [
2158
+ showLead && leadIcon && /* @__PURE__ */ jsx16(
2159
+ "span",
2160
+ {
2161
+ className: cn(
2162
+ "shrink-0 text-muted-foreground",
2163
+ leadIconSize === "xs" ? "size-4" : SELECT_TOKENS.leadIcon
2164
+ ),
2165
+ children: leadIcon
2166
+ }
2167
+ ),
2168
+ /* @__PURE__ */ jsx16(
2169
+ Typography,
2170
+ {
2171
+ as: "span",
2172
+ variant: "p2",
2173
+ tone: "inherit",
2174
+ className: cn(
2175
+ SELECT_TOKENS.textWrap.base,
2176
+ SELECT_TOKENS.textWrap.default,
2177
+ // Match Figma: muted placeholder when empty
2178
+ "text-accent-foreground group-data-[placeholder]:text-muted-foreground"
2179
+ ),
2180
+ children
2181
+ }
2182
+ )
2183
+ ] }),
2184
+ /* @__PURE__ */ jsx16(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx16(ChevronDown2, { className: SELECT_TOKENS.chevron }) })
2185
+ ]
2186
+ }
2187
+ ));
2188
+ SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
2189
+ var SelectScrollUpButton = React18.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx16(
2190
+ SelectPrimitive.ScrollUpButton,
2191
+ {
2192
+ ref,
2193
+ className: cn(
2194
+ "flex cursor-default items-center justify-center py-1",
2195
+ className
2196
+ ),
2197
+ ...props,
2198
+ children: /* @__PURE__ */ jsx16(ChevronDown2, { className: "h-4 w-4 rotate-180" })
2199
+ }
2200
+ ));
2201
+ SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
2202
+ var SelectScrollDownButton = React18.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx16(
2203
+ SelectPrimitive.ScrollDownButton,
2204
+ {
2205
+ ref,
2206
+ className: cn(
2207
+ "flex cursor-default items-center justify-center py-1",
2208
+ className
2209
+ ),
2210
+ ...props,
2211
+ children: /* @__PURE__ */ jsx16(ChevronDown2, { className: "h-4 w-4" })
2212
+ }
2213
+ ));
2214
+ SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
2215
+ function filterItemsBySearch(items, query) {
2216
+ if (!query.trim()) return items;
2217
+ const q = query.toLowerCase().trim();
2218
+ return items.filter(
2219
+ (item) => {
2220
+ var _a5, _b4;
2221
+ return item.label.toLowerCase().includes(q) || ((_b4 = (_a5 = item.subtext) == null ? void 0 : _a5.toLowerCase().includes(q)) != null ? _b4 : false);
2222
+ }
2223
+ );
2224
+ }
2225
+ var SelectContent = React18.forwardRef(({ className, children, position = "popper", items, sectionLabel = "Section", showSearch = false, searchPlaceholder = "Search...", side = "bottom", sideOffset = 0, ...props }, ref) => {
2226
+ const { theme } = useTheme();
2227
+ const themeClass = theme === "dark" ? "dark" : "light";
2228
+ const [searchQuery, setSearchQuery] = React18.useState("");
2229
+ const container = React18.useMemo(
2230
+ () => {
2231
+ var _a5;
2232
+ return typeof document !== "undefined" ? (_a5 = document.querySelector(".lego-land")) != null ? _a5 : void 0 : void 0;
2233
+ },
2234
+ []
2235
+ );
2236
+ const filteredItems = React18.useMemo(
2237
+ () => items ? filterItemsBySearch(items, searchQuery) : [],
2238
+ [items, searchQuery]
2239
+ );
2240
+ const handleSearchKeyDown = React18.useCallback((e) => {
2241
+ e.stopPropagation();
2242
+ }, []);
2243
+ const content = items ? /* @__PURE__ */ jsxs11(SelectGroup, { children: [
2244
+ /* @__PURE__ */ jsx16(SelectLabel, { children: sectionLabel }),
2245
+ filteredItems.map((item) => {
2246
+ var _a5;
2247
+ return /* @__PURE__ */ jsx16(
2248
+ SelectItem,
2249
+ {
2250
+ value: item.value,
2251
+ type: item.subtext ? "double" : "single",
2252
+ subtext: item.subtext,
2253
+ leadIcon: item.leadIcon,
2254
+ leadIconSize: (_a5 = item.leadIconSize) != null ? _a5 : "sm",
2255
+ children: item.label
2256
+ },
2257
+ item.value
2258
+ );
2259
+ })
2260
+ ] }) : children;
2261
+ return /* @__PURE__ */ jsx16(SelectPrimitive.Portal, { container, children: /* @__PURE__ */ jsx16("div", { className: cn(!container && "lego-land", !container && themeClass), children: /* @__PURE__ */ jsxs11(
2262
+ SelectPrimitive.Content,
2263
+ {
2264
+ ref,
2265
+ side,
2266
+ sideOffset,
2267
+ className: cn(
2268
+ SELECT_TOKENS.dropdown.base,
2269
+ "relative z-50 overflow-hidden",
2270
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
2271
+ "data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
2272
+ "data-[side=bottom]:rounded-t-none",
2273
+ className
2274
+ ),
2275
+ position,
2276
+ ...props,
2277
+ children: [
2278
+ showSearch && /* @__PURE__ */ jsxs11("div", { className: SELECT_TOKENS.search.container, children: [
2279
+ /* @__PURE__ */ jsx16(Search, { className: SELECT_TOKENS.search.icon }),
2280
+ /* @__PURE__ */ jsx16(
2281
+ "input",
2282
+ {
2283
+ type: "search",
2284
+ role: "searchbox",
2285
+ "aria-label": "Search options",
2286
+ value: searchQuery,
2287
+ onChange: (e) => setSearchQuery(e.target.value),
2288
+ onKeyDown: handleSearchKeyDown,
2289
+ placeholder: searchPlaceholder,
2290
+ className: cn(
2291
+ "flex-1 min-w-0 h-9 bg-transparent pl-2 pr-3 py-1 text-sm leading-5 font-normal tracking-normal text-accent-foreground placeholder:text-muted-foreground outline-none border-0"
2292
+ )
2293
+ }
2294
+ )
2295
+ ] }),
2296
+ /* @__PURE__ */ jsx16(
2297
+ SelectPrimitive.Viewport,
2298
+ {
2299
+ className: cn(
2300
+ "max-h-[300px] overflow-y-auto w-full",
2301
+ position === "popper" && "min-w-[var(--radix-select-trigger-width)]"
2302
+ ),
2303
+ children: content
2304
+ }
2305
+ )
2306
+ ]
2307
+ }
2308
+ ) }) });
2309
+ });
2310
+ SelectContent.displayName = SelectPrimitive.Content.displayName;
2311
+ var SelectLabel = React18.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx16(
2312
+ SelectPrimitive.Label,
2313
+ {
2314
+ ref,
2315
+ className: cn(SELECT_TOKENS.menu.sectionLabel, className),
2316
+ ...props,
2317
+ children: /* @__PURE__ */ jsx16(Typography, { as: "span", variant: "p3", tone: "muted", className: SELECT_TOKENS.menu.sectionText, children: props.children })
2318
+ }
2319
+ ));
2320
+ SelectLabel.displayName = SelectPrimitive.Label.displayName;
2321
+ var SelectItem = React18.forwardRef(({ className, children, subtext, type = "single", leadIcon, leadIconSize = "sm", ...props }, ref) => /* @__PURE__ */ jsxs11(
2322
+ SelectPrimitive.Item,
2323
+ {
2324
+ ref,
2325
+ className: cn(
2326
+ SELECT_TOKENS.menu.item.base,
2327
+ type === "single" ? SELECT_TOKENS.menu.item.singleLine : SELECT_TOKENS.menu.item.doubleLine,
2328
+ "cursor-pointer outline-none",
2329
+ "hover:bg-foreground/10 focus-visible:bg-foreground/10 data-[state=checked]:bg-foreground/10",
2330
+ className
2331
+ ),
2332
+ ...props,
2333
+ children: [
2334
+ /* @__PURE__ */ jsxs11("div", { className: cn(SELECT_TOKENS.menu.itemContent.base), children: [
2335
+ leadIcon ? /* @__PURE__ */ jsx16(
2336
+ "span",
2337
+ {
2338
+ className: cn(
2339
+ "shrink-0 text-muted-foreground",
2340
+ leadIconSize === "xs" && "size-4",
2341
+ leadIconSize === "md" && "size-8",
2342
+ (leadIconSize === "sm" || !leadIconSize) && SELECT_TOKENS.leadIcon
2343
+ ),
2344
+ children: leadIcon
2345
+ }
2346
+ ) : null,
2347
+ /* @__PURE__ */ jsxs11("div", { className: cn(
2348
+ SELECT_TOKENS.menu.itemTextWrap.base,
2349
+ type === "single" ? SELECT_TOKENS.menu.itemTextWrap.singleLine : SELECT_TOKENS.menu.itemTextWrap.doubleLine,
2350
+ "min-w-0 flex-1"
2351
+ ), children: [
2352
+ /* @__PURE__ */ jsx16(SelectPrimitive.ItemText, { asChild: true, children: /* @__PURE__ */ jsx16(
2353
+ Typography,
2354
+ {
2355
+ as: "p",
2356
+ variant: "p2",
2357
+ tone: "inherit",
2358
+ className: cn(SELECT_TOKENS.menu.itemText, "text-accent-foreground"),
2359
+ children
2360
+ }
2361
+ ) }),
2362
+ subtext && type === "double" && /* @__PURE__ */ jsx16(
2363
+ Typography,
2364
+ {
2365
+ as: "p",
2366
+ variant: "p3",
2367
+ tone: "muted",
2368
+ className: SELECT_TOKENS.menu.itemSubtext,
2369
+ children: subtext
2370
+ }
2371
+ )
2372
+ ] })
2373
+ ] }),
2374
+ /* @__PURE__ */ jsxs11("span", { className: SELECT_TOKENS.menu.checkIcon.wrap, children: [
2375
+ /* @__PURE__ */ jsx16("span", { className: SELECT_TOKENS.menu.checkIcon.slot, "aria-hidden": true }),
2376
+ /* @__PURE__ */ jsx16(SelectPrimitive.ItemIndicator, { className: SELECT_TOKENS.menu.checkIcon.indicator, children: /* @__PURE__ */ jsx16(Check2, { className: SELECT_TOKENS.menu.checkIcon.icon }) })
2377
+ ] })
2378
+ ]
2379
+ }
2380
+ ));
2381
+ SelectItem.displayName = SelectPrimitive.Item.displayName;
2382
+ var SelectSeparator = React18.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx16(
2383
+ SelectPrimitive.Separator,
2384
+ {
2385
+ ref,
2386
+ className: cn("-mx-1 my-1 h-px bg-border", className),
2387
+ ...props
2388
+ }
2389
+ ));
2390
+ SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
2391
+ function SelectFormLabel({ className, label = "Title", mandatory = true }) {
2392
+ return /* @__PURE__ */ jsxs11("div", { className: cn(SELECT_TOKENS.label.container, className), children: [
2393
+ /* @__PURE__ */ jsx16("p", { className: SELECT_TOKENS.label.text, children: label }),
2394
+ mandatory && /* @__PURE__ */ jsx16("p", { className: SELECT_TOKENS.label.asterisk, children: "*" })
2395
+ ] });
2396
+ }
2397
+
2398
+ // src/select/play-select.tsx
2399
+ import * as React21 from "react";
2400
+
2401
+ // src/select/playback-control.tsx
2402
+ import * as React19 from "react";
2403
+ import { Pause, Play } from "lucide-react";
2404
+ import { jsx as jsx17 } from "react/jsx-runtime";
2405
+ var PlaybackControl = React19.forwardRef(
2406
+ ({ state, playing, ...props }, ref) => {
2407
+ const showPause = state ? state === "pause" : !!playing;
2408
+ const Icon2 = showPause ? Pause : Play;
2409
+ return /* @__PURE__ */ jsx17(
2410
+ Button,
2411
+ {
2412
+ ref,
2413
+ variant: "iconOutline",
2414
+ size: "icon",
2415
+ button_border_radius: "rounded",
2416
+ "aria-label": showPause ? "Pause" : "Play",
2417
+ showLeadingIcon: false,
2418
+ showTrailingIcon: false,
2419
+ ...props,
2420
+ children: /* @__PURE__ */ jsx17(Icon2, { className: cn("size-5", !showPause && "ml-0.5") })
2421
+ }
2422
+ );
2423
+ }
2424
+ );
2425
+ PlaybackControl.displayName = "PlaybackControl";
2426
+
2427
+ // src/select/use-play-select.ts
2428
+ import * as React20 from "react";
2429
+ function usePlaySelect({
2430
+ value,
2431
+ defaultValue,
2432
+ onValueChange,
2433
+ onPlayClick,
2434
+ onSelectValue,
2435
+ onCloseDropdown
2436
+ }) {
2437
+ const [internalValue, setInternalValue] = React20.useState(defaultValue);
2438
+ const [playingUrl, setPlayingUrl] = React20.useState(null);
2439
+ const audioRef = React20.useRef(null);
2440
+ const currentValue = value !== void 0 ? value : internalValue;
2441
+ React20.useEffect(() => {
2442
+ if (value === void 0 && defaultValue !== void 0) {
2443
+ setInternalValue(defaultValue);
2444
+ }
2445
+ }, [defaultValue, value]);
2446
+ const pauseAudio = React20.useCallback(() => {
2447
+ var _a5;
2448
+ (_a5 = audioRef.current) == null ? void 0 : _a5.pause();
2449
+ setPlayingUrl(null);
2450
+ }, []);
2451
+ const handleValueChange = React20.useCallback(
2452
+ (newValue) => {
2453
+ if (value === void 0) {
2454
+ setInternalValue(newValue);
2455
+ }
2456
+ onValueChange == null ? void 0 : onValueChange(newValue);
2457
+ onSelectValue == null ? void 0 : onSelectValue(newValue);
2458
+ },
2459
+ [value, onValueChange, onSelectValue]
2460
+ );
2461
+ const handleOpenChange = React20.useCallback(
2462
+ (open) => {
2463
+ if (!open) {
2464
+ pauseAudio();
2465
+ onCloseDropdown == null ? void 0 : onCloseDropdown();
2466
+ }
2467
+ },
2468
+ [pauseAudio, onCloseDropdown]
2469
+ );
2470
+ const handlePlay = React20.useCallback(
2471
+ (url, item) => {
2472
+ const audio = audioRef.current;
2473
+ if (!audio) return;
2474
+ if (playingUrl === url) {
2475
+ audio.pause();
2476
+ setPlayingUrl(null);
2477
+ } else {
2478
+ audio.src = url;
2479
+ audio.play();
2480
+ setPlayingUrl(url);
2481
+ }
2482
+ onPlayClick == null ? void 0 : onPlayClick(url, item);
2483
+ },
2484
+ [playingUrl, onPlayClick]
2485
+ );
2486
+ const stopEvent = React20.useCallback((e) => {
2487
+ e.stopPropagation();
2488
+ e.preventDefault();
2489
+ }, []);
2490
+ const createPlayHandler = React20.useCallback(
2491
+ (item) => (e) => {
2492
+ e.stopPropagation();
2493
+ e.preventDefault();
2494
+ handlePlay(item.url, item);
2495
+ },
2496
+ [handlePlay]
2497
+ );
2498
+ React20.useEffect(() => {
2499
+ const audio = audioRef.current;
2500
+ if (!audio) return;
2501
+ const onEnded = () => setPlayingUrl(null);
2502
+ audio.addEventListener("ended", onEnded);
2503
+ return () => audio.removeEventListener("ended", onEnded);
2504
+ }, []);
2505
+ return {
2506
+ value: currentValue,
2507
+ playingUrl,
2508
+ audioRef,
2509
+ handleValueChange,
2510
+ handleOpenChange,
2511
+ handlePlay,
2512
+ stopEvent,
2513
+ createPlayHandler,
2514
+ pauseAudio
2515
+ };
2516
+ }
2517
+
2518
+ // src/select/play-select.tsx
2519
+ import { jsx as jsx18, jsxs as jsxs12 } from "react/jsx-runtime";
2520
+ var PlaySelect = React21.forwardRef(
2521
+ ({
2522
+ dropdownListItems,
2523
+ label = "Title",
2524
+ placeholder = "Select audio",
2525
+ showSearch = true,
2526
+ searchPlaceholder = "Search...",
2527
+ value: controlledValue,
2528
+ defaultValue,
2529
+ onValueChange,
2530
+ onPlayClick,
2531
+ onSelectValue,
2532
+ onCloseDropdown,
2533
+ disabled = false,
2534
+ size = "regular",
2535
+ triggerLeadIcon,
2536
+ className,
2537
+ minWidth = "196px"
2538
+ }, ref) => {
2539
+ const {
2540
+ value,
2541
+ playingUrl,
2542
+ audioRef,
2543
+ handleValueChange,
2544
+ handleOpenChange,
2545
+ createPlayHandler,
2546
+ stopEvent
2547
+ } = usePlaySelect({
2548
+ value: controlledValue,
2549
+ defaultValue,
2550
+ onValueChange,
2551
+ onPlayClick,
2552
+ onSelectValue,
2553
+ onCloseDropdown
2554
+ });
2555
+ const items = React21.useMemo(
2556
+ () => dropdownListItems.map((item) => {
2557
+ const isPlaying = playingUrl === item.url;
2558
+ return {
2559
+ value: item.value,
2560
+ label: item.label,
2561
+ subtext: item.subtext,
2562
+ leadIconSize: "md",
2563
+ leadIcon: /* @__PURE__ */ jsx18(
2564
+ "div",
2565
+ {
2566
+ className: "shrink-0 flex items-center justify-center",
2567
+ role: "presentation",
2568
+ onPointerDown: stopEvent,
2569
+ onPointerUp: createPlayHandler(item),
2570
+ onMouseDown: stopEvent,
2571
+ onClick: stopEvent,
2572
+ children: /* @__PURE__ */ jsx18(
2573
+ PlaybackControl,
2574
+ {
2575
+ size: "iconSm",
2576
+ className: "h-8 w-8 border-foreground [&>svg]:size-4",
2577
+ state: isPlaying ? "pause" : "play",
2578
+ "aria-label": isPlaying ? `Pause ${item.label}` : `Play ${item.label}`
2579
+ }
2580
+ )
2581
+ }
2582
+ )
2583
+ };
2584
+ }),
2585
+ [dropdownListItems, playingUrl, stopEvent, createPlayHandler]
2586
+ );
2587
+ return /* @__PURE__ */ jsxs12("div", { className: cn("flex flex-col gap-2", className), style: minWidth ? { minWidth } : void 0, children: [
2588
+ /* @__PURE__ */ jsx18("audio", { ref: audioRef, className: "sr-only" }),
2589
+ /* @__PURE__ */ jsx18(SelectFormLabel, { label, mandatory: true }),
2590
+ /* @__PURE__ */ jsxs12(
2591
+ Select,
2592
+ {
2593
+ value,
2594
+ onValueChange: handleValueChange,
2595
+ onOpenChange: handleOpenChange,
2596
+ disabled,
2597
+ children: [
2598
+ /* @__PURE__ */ jsx18(SelectTrigger, { ref, showLead: true, leadIcon: triggerLeadIcon, size, children: /* @__PURE__ */ jsx18(SelectValue, { placeholder }) }),
2599
+ /* @__PURE__ */ jsx18(
2600
+ SelectContent,
2601
+ {
2602
+ items,
2603
+ sectionLabel: "Audio",
2604
+ showSearch,
2605
+ searchPlaceholder
2606
+ }
2607
+ )
2608
+ ]
2609
+ }
2610
+ ),
2611
+ playingUrl && /* @__PURE__ */ jsx18("p", { className: "text-xs text-muted-foreground", children: "Playing audio..." })
2612
+ ] });
2613
+ }
2614
+ );
2615
+ PlaySelect.displayName = "PlaySelect";
2616
+
2617
+ // src/select/use-select.ts
2618
+ import * as React22 from "react";
2619
+ function useSelect({ value, defaultValue, onValueChange }) {
2620
+ const [internalValue, setInternalValue] = React22.useState(defaultValue);
2621
+ const currentValue = value !== void 0 ? value : internalValue;
2622
+ React22.useEffect(() => {
2623
+ if (value === void 0 && defaultValue !== void 0) {
2624
+ setInternalValue(defaultValue);
2625
+ }
2626
+ }, [defaultValue, value]);
2627
+ const handleValueChange = React22.useCallback(
2628
+ (newValue) => {
2629
+ if (value === void 0) {
2630
+ setInternalValue(newValue);
2631
+ }
2632
+ onValueChange == null ? void 0 : onValueChange(newValue);
2633
+ },
2634
+ [value, onValueChange]
2635
+ );
2636
+ return {
2637
+ value: currentValue,
2638
+ setValue: setInternalValue,
2639
+ handleValueChange
2640
+ };
2641
+ }
2642
+
2643
+ // src/empty-state/empty-state.tsx
2644
+ import * as React23 from "react";
2645
+
2646
+ // src/empty-state/variables.ts
2647
+ var EMPTY_STATE_TOKENS = {
2648
+ /** Outer container: centered column layout with gap-24px, p-24px, rounded-sm */
2649
+ container: "flex flex-col gap-6 items-center justify-center p-6 rounded-[var(--rounded-sm,4px)]",
2650
+ /** Inner content wrapper: illustration + text block */
2651
+ content: "flex flex-col gap-4 items-center shrink-0",
2652
+ /** Illustration area: 120×120 */
2653
+ illustration: "shrink-0 size-[120px]",
2654
+ /** Text wrapper: title + description */
2655
+ textWrap: "flex flex-col gap-2 items-center shrink-0 tracking-normal",
2656
+ /** Title: text-base/regular, foreground */
2657
+ title: "text-base leading-6 font-normal text-foreground",
2658
+ /** Description: text-sm/regular, muted-foreground, centered, max-width ~351px */
2659
+ description: "text-sm leading-5 font-normal text-muted-foreground text-center max-w-[351px]"
2660
+ };
2661
+
2662
+ // src/empty-state/empty-state.tsx
2663
+ import { jsx as jsx19, jsxs as jsxs13 } from "react/jsx-runtime";
2664
+ var EmptyState = React23.forwardRef(
2665
+ ({ className, illustration, title, description, action, ...props }, ref) => /* @__PURE__ */ jsxs13(
2666
+ "div",
2667
+ {
2668
+ ref,
2669
+ className: cn(EMPTY_STATE_TOKENS.container, className),
2670
+ ...props,
2671
+ children: [
2672
+ /* @__PURE__ */ jsxs13("div", { className: EMPTY_STATE_TOKENS.content, children: [
2673
+ illustration && /* @__PURE__ */ jsx19("div", { className: EMPTY_STATE_TOKENS.illustration, children: illustration }),
2674
+ /* @__PURE__ */ jsxs13("div", { className: EMPTY_STATE_TOKENS.textWrap, children: [
2675
+ /* @__PURE__ */ jsx19("p", { className: EMPTY_STATE_TOKENS.title, children: title }),
2676
+ description && /* @__PURE__ */ jsx19("p", { className: EMPTY_STATE_TOKENS.description, children: description })
2677
+ ] })
2678
+ ] }),
2679
+ action
2680
+ ]
2681
+ }
2682
+ )
2683
+ );
2684
+ EmptyState.displayName = "EmptyState";
2685
+
2686
+ // src/list-card/list-card.tsx
2687
+ import * as React24 from "react";
2688
+
2689
+ // src/list-card/variables.ts
2690
+ var LIST_TOKENS = {
2691
+ base: "overflow-hidden transition-colors cursor-pointer relative after:content-[''] after:absolute after:inset-0 after:pointer-events-none after:rounded-[inherit] after:bg-black/10 after:opacity-0 after:transition-opacity hover:after:opacity-100",
2692
+ type: {
2693
+ card: "flex flex-col gap-4 items-start p-6",
2694
+ list: "flex gap-4 items-center py-4 px-6"
2695
+ },
2696
+ variant: {
2697
+ card: {
2698
+ default: "bg-card",
2699
+ outline: "bg-card border border-border px-6",
2700
+ muted: "bg-background"
2701
+ },
2702
+ list: {
2703
+ default: "",
2704
+ outline: "border border-border px-4",
2705
+ muted: "bg-background"
2706
+ }
2707
+ },
2708
+ radius: {
2709
+ none: `${DEFAULT_THEME.radius.mode1.roundedNone}px`,
2710
+ soft: `${DEFAULT_THEME.radius.mode1.roundedMd}px`,
2711
+ rounded: `${DEFAULT_THEME.radius.mode1.rounded2xl}px`
2712
+ }
2713
+ };
2714
+
2715
+ // src/list-card/list-card.tsx
2716
+ import { jsx as jsx20 } from "react/jsx-runtime";
2717
+ var List = React24.forwardRef(
2718
+ ({
2719
+ type = "card",
2720
+ variant = "default",
2721
+ list_border_radius: list_border_radiusProp,
2722
+ className,
2723
+ style,
2724
+ children,
2725
+ ...props
2726
+ }, ref) => {
2727
+ const list_border_radius = list_border_radiusProp != null ? list_border_radiusProp : type === "card" ? "rounded" : "soft";
2728
+ return /* @__PURE__ */ jsx20(
2729
+ "div",
2730
+ {
2731
+ ref,
2732
+ className: cn(
2733
+ LIST_TOKENS.base,
2734
+ LIST_TOKENS.type[type],
2735
+ LIST_TOKENS.variant[type][variant],
2736
+ className
2737
+ ),
2738
+ style: {
2739
+ borderRadius: LIST_TOKENS.radius[list_border_radius],
2740
+ ...style
2741
+ },
2742
+ ...props,
2743
+ children
2744
+ }
2745
+ );
2746
+ }
2747
+ );
2748
+ List.displayName = "List";
2749
+
2750
+ // src/tooltip/tooltip.tsx
2751
+ import * as React25 from "react";
2752
+ import * as TooltipPrimitive from "@radix-ui/react-tooltip";
2753
+
2754
+ // src/tooltip/variables.ts
2755
+ var TOOLTIP_TOKENS = {
2756
+ content: {
2757
+ base: "z-50 overflow-hidden rounded-md px-3 py-2 text-xs leading-4",
2758
+ bg: "bg-primary text-primary-foreground",
2759
+ shadow: "shadow-md"
2760
+ },
2761
+ arrow: "fill-primary",
2762
+ shortcut: {
2763
+ base: "ml-2 inline-flex h-5 min-w-5 items-center justify-center rounded-sm px-1 text-xs leading-4 font-normal",
2764
+ bg: "bg-muted",
2765
+ text: "text-muted-foreground"
2766
+ }
2767
+ };
2768
+
2769
+ // src/tooltip/tooltip.tsx
2770
+ import { jsx as jsx21, jsxs as jsxs14 } from "react/jsx-runtime";
2771
+ var useTooltipContainer = () => {
2772
+ const [container, setContainer] = React25.useState(void 0);
2773
+ React25.useEffect(() => {
2774
+ if (typeof document === "undefined") return;
2775
+ const el = document.querySelector(".lego-land");
2776
+ setContainer(el != null ? el : void 0);
2777
+ }, []);
2778
+ return container;
2779
+ };
2780
+ var TooltipProvider = TooltipPrimitive.Provider;
2781
+ var Tooltip = TooltipPrimitive.Root;
2782
+ var TooltipTrigger = TooltipPrimitive.Trigger;
2783
+ var TooltipContent = React25.forwardRef(({ className, sideOffset = 6, shortcut, children, ...props }, ref) => {
2784
+ const container = useTooltipContainer();
2785
+ const content = /* @__PURE__ */ jsxs14(
2786
+ TooltipPrimitive.Content,
2787
+ {
2788
+ ref,
2789
+ sideOffset,
2790
+ className: cn(
2791
+ TOOLTIP_TOKENS.content.base,
2792
+ TOOLTIP_TOKENS.content.bg,
2793
+ TOOLTIP_TOKENS.content.shadow,
2794
+ "animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
2795
+ className
2796
+ ),
2797
+ ...props,
2798
+ children: [
2799
+ /* @__PURE__ */ jsxs14("div", { className: "flex items-center", children: [
2800
+ children,
2801
+ shortcut && /* @__PURE__ */ jsx21(
2802
+ "span",
2803
+ {
2804
+ className: cn(
2805
+ TOOLTIP_TOKENS.shortcut.base,
2806
+ TOOLTIP_TOKENS.shortcut.bg,
2807
+ TOOLTIP_TOKENS.shortcut.text
2808
+ ),
2809
+ children: shortcut
2810
+ }
2811
+ )
2812
+ ] }),
2813
+ /* @__PURE__ */ jsx21(TooltipPrimitive.Arrow, { className: TOOLTIP_TOKENS.arrow })
2814
+ ]
2815
+ }
2816
+ );
2817
+ return container ? /* @__PURE__ */ jsx21(TooltipPrimitive.Portal, { container, children: content }) : content;
2818
+ });
2819
+ TooltipContent.displayName = TooltipPrimitive.Content.displayName;
2820
+
2821
+ // src/dialog/dialog.tsx
2822
+ import * as React26 from "react";
2823
+ import { X } from "lucide-react";
2824
+
2825
+ // src/dialog/variables.ts
2826
+ var DIALOG_TOKENS = {
2827
+ overlay: "fixed inset-0 z-50 flex items-center justify-center bg-black/30",
2828
+ container: "bg-card border border-border rounded-lg shadow-lg overflow-hidden flex flex-col",
2829
+ size: {
2830
+ sm: "w-[400px]",
2831
+ default: "w-[512px]",
2832
+ wide: "w-[960px]"
2833
+ },
2834
+ icon: {
2835
+ wrapper: "bg-primary/10 rounded-full p-6 self-center mx-6 mt-6 shrink-0"
2836
+ },
2837
+ header: {
2838
+ wrapper: "flex flex-col shrink-0",
2839
+ row: "flex items-center gap-[10px] px-6 py-6",
2840
+ title: "flex-1 text-lg font-semibold leading-7 text-foreground",
2841
+ closeBtn: "size-9 flex items-center justify-center rounded-md text-foreground hover:bg-muted transition-colors cursor-pointer",
2842
+ divider: "h-px bg-border"
2843
+ },
2844
+ body: {
2845
+ base: "flex flex-col gap-4 px-6 py-4",
2846
+ scrollable: "flex-1 overflow-y-auto max-h-[507px]"
2847
+ },
2848
+ footer: {
2849
+ wrapper: "flex flex-col shrink-0",
2850
+ divider: "h-px bg-border",
2851
+ row: "flex gap-2 items-center justify-end px-6 py-4"
2852
+ }
2853
+ };
2854
+
2855
+ // src/dialog/dialog.tsx
2856
+ import { jsx as jsx22, jsxs as jsxs15 } from "react/jsx-runtime";
2857
+ var DialogContext = React26.createContext({ close: () => {
2858
+ } });
2859
+ var Dialog = React26.forwardRef(
2860
+ ({
2861
+ open,
2862
+ onOpenChange,
2863
+ type = "default",
2864
+ size = "default",
2865
+ title,
2866
+ icon,
2867
+ children,
2868
+ cancelLabel = "Cancel",
2869
+ confirmLabel = "Continue",
2870
+ showCancel = true,
2871
+ onCancel,
2872
+ onConfirm,
2873
+ className
2874
+ }, ref) => {
2875
+ const close = React26.useCallback(() => onOpenChange(false), [onOpenChange]);
2876
+ React26.useEffect(() => {
2877
+ if (!open) return;
2878
+ const handler = (e) => {
2879
+ if (e.key === "Escape") close();
2880
+ };
2881
+ document.addEventListener("keydown", handler);
2882
+ return () => document.removeEventListener("keydown", handler);
2883
+ }, [open, close]);
2884
+ if (!open) return null;
2885
+ const isScrollable = type === "scrollable" || type === "scrollable-fixed";
2886
+ const hasFixedDividers = type === "scrollable-fixed";
2887
+ const hasIcon = type === "icon";
2888
+ const showClose = !hasIcon;
2889
+ return /* @__PURE__ */ jsx22(DialogContext.Provider, { value: { close }, children: /* @__PURE__ */ jsx22("div", { className: DIALOG_TOKENS.overlay, onClick: close, children: /* @__PURE__ */ jsxs15(
2890
+ "div",
2891
+ {
2892
+ ref,
2893
+ role: "dialog",
2894
+ "aria-modal": "true",
2895
+ "aria-labelledby": title ? "dialog-title" : void 0,
2896
+ className: cn(
2897
+ DIALOG_TOKENS.container,
2898
+ DIALOG_TOKENS.size[size],
2899
+ className
2900
+ ),
2901
+ onClick: (e) => e.stopPropagation(),
2902
+ children: [
2903
+ hasIcon && icon && /* @__PURE__ */ jsx22("div", { className: DIALOG_TOKENS.icon.wrapper, children: icon }),
2904
+ title && /* @__PURE__ */ jsxs15("div", { className: DIALOG_TOKENS.header.wrapper, children: [
2905
+ /* @__PURE__ */ jsxs15("div", { className: DIALOG_TOKENS.header.row, children: [
2906
+ /* @__PURE__ */ jsx22("h2", { id: "dialog-title", className: DIALOG_TOKENS.header.title, children: title }),
2907
+ showClose && /* @__PURE__ */ jsx22(
2908
+ "button",
2909
+ {
2910
+ type: "button",
2911
+ onClick: close,
2912
+ className: DIALOG_TOKENS.header.closeBtn,
2913
+ "aria-label": "Close dialog",
2914
+ children: /* @__PURE__ */ jsx22(X, { className: "size-[18px]" })
2915
+ }
2916
+ )
2917
+ ] }),
2918
+ hasFixedDividers && /* @__PURE__ */ jsx22("div", { className: DIALOG_TOKENS.header.divider })
2919
+ ] }),
2920
+ /* @__PURE__ */ jsx22(
2921
+ "div",
2922
+ {
2923
+ className: cn(
2924
+ DIALOG_TOKENS.body.base,
2925
+ isScrollable && DIALOG_TOKENS.body.scrollable
2926
+ ),
2927
+ children
2928
+ }
2929
+ ),
2930
+ /* @__PURE__ */ jsxs15("div", { className: DIALOG_TOKENS.footer.wrapper, children: [
2931
+ hasFixedDividers && /* @__PURE__ */ jsx22("div", { className: DIALOG_TOKENS.footer.divider }),
2932
+ /* @__PURE__ */ jsxs15("div", { className: DIALOG_TOKENS.footer.row, children: [
2933
+ showCancel && /* @__PURE__ */ jsx22(
2934
+ Button,
2935
+ {
2936
+ variant: "outline",
2937
+ button_border_radius: "rounded",
2938
+ onClick: onCancel != null ? onCancel : close,
2939
+ children: cancelLabel
2940
+ }
2941
+ ),
2942
+ /* @__PURE__ */ jsx22(
2943
+ Button,
2944
+ {
2945
+ variant: "primary",
2946
+ button_border_radius: "rounded",
2947
+ onClick: onConfirm,
2948
+ children: confirmLabel
2949
+ }
2950
+ )
2951
+ ] })
2952
+ ] })
2953
+ ]
2954
+ }
2955
+ ) }) });
2956
+ }
2957
+ );
2958
+ Dialog.displayName = "Dialog";
2959
+ var DialogIcon = React26.forwardRef(
2960
+ ({ children, className }, ref) => /* @__PURE__ */ jsx22("div", { ref, className: cn(DIALOG_TOKENS.icon.wrapper, className), children })
2961
+ );
2962
+ DialogIcon.displayName = "DialogIcon";
2963
+ var DialogHeader = React26.forwardRef(
2964
+ ({ title, showClose = true, showDivider = false, className }, ref) => {
2965
+ const { close } = React26.useContext(DialogContext);
2966
+ return /* @__PURE__ */ jsxs15("div", { ref, className: cn(DIALOG_TOKENS.header.wrapper, className), children: [
2967
+ /* @__PURE__ */ jsxs15("div", { className: DIALOG_TOKENS.header.row, children: [
2968
+ /* @__PURE__ */ jsx22("h2", { className: DIALOG_TOKENS.header.title, children: title }),
2969
+ showClose && /* @__PURE__ */ jsx22(
2970
+ "button",
2971
+ {
2972
+ type: "button",
2973
+ onClick: close,
2974
+ className: DIALOG_TOKENS.header.closeBtn,
2975
+ "aria-label": "Close dialog",
2976
+ children: /* @__PURE__ */ jsx22(X, { className: "size-[18px]" })
2977
+ }
2978
+ )
2979
+ ] }),
2980
+ showDivider && /* @__PURE__ */ jsx22("div", { className: DIALOG_TOKENS.header.divider })
2981
+ ] });
2982
+ }
2983
+ );
2984
+ DialogHeader.displayName = "DialogHeader";
2985
+ var DialogBody = React26.forwardRef(
2986
+ ({ children, scrollable = false, className }, ref) => /* @__PURE__ */ jsx22(
2987
+ "div",
2988
+ {
2989
+ ref,
2990
+ className: cn(
2991
+ DIALOG_TOKENS.body.base,
2992
+ scrollable && DIALOG_TOKENS.body.scrollable,
2993
+ className
2994
+ ),
2995
+ children
2996
+ }
2997
+ )
2998
+ );
2999
+ DialogBody.displayName = "DialogBody";
3000
+ var DialogFooter = React26.forwardRef(
3001
+ ({
3002
+ cancelLabel = "Cancel",
3003
+ confirmLabel = "Continue",
3004
+ showCancel = true,
3005
+ onCancel,
3006
+ onConfirm,
3007
+ showDivider = false,
3008
+ className
3009
+ }, ref) => {
3010
+ const { close } = React26.useContext(DialogContext);
3011
+ return /* @__PURE__ */ jsxs15("div", { ref, className: cn(DIALOG_TOKENS.footer.wrapper, className), children: [
3012
+ showDivider && /* @__PURE__ */ jsx22("div", { className: DIALOG_TOKENS.footer.divider }),
3013
+ /* @__PURE__ */ jsxs15("div", { className: DIALOG_TOKENS.footer.row, children: [
3014
+ showCancel && /* @__PURE__ */ jsx22(
3015
+ Button,
3016
+ {
3017
+ variant: "outline",
3018
+ button_border_radius: "rounded",
3019
+ onClick: onCancel != null ? onCancel : close,
3020
+ children: cancelLabel
3021
+ }
3022
+ ),
3023
+ /* @__PURE__ */ jsx22(
3024
+ Button,
3025
+ {
3026
+ variant: "primary",
3027
+ button_border_radius: "rounded",
3028
+ onClick: onConfirm,
3029
+ children: confirmLabel
3030
+ }
3031
+ )
3032
+ ] })
3033
+ ] });
3034
+ }
3035
+ );
3036
+ DialogFooter.displayName = "DialogFooter";
3037
+
3038
+ // src/toast/toast.tsx
3039
+ import * as React27 from "react";
3040
+ import { Toaster as SonnerToaster, toast as sonnerToast } from "sonner";
3041
+ import { ChevronRight, CircleCheck, CircleAlert, ThumbsUp } from "lucide-react";
3042
+
3043
+ // src/toast/variables.ts
3044
+ var TOAST_TOKENS = {
3045
+ root: "relative bg-background border border-border rounded-lg overflow-hidden flex items-center gap-3 px-4 py-3 w-full",
3046
+ icon: {
3047
+ success: "text-success shrink-0",
3048
+ error: "text-destructive shrink-0",
3049
+ default: "text-foreground shrink-0"
3050
+ },
3051
+ content: "flex flex-col gap-0.5 flex-1 min-w-0",
3052
+ title: {
3053
+ success: "text-success text-sm font-medium leading-5",
3054
+ error: "text-destructive text-sm font-medium leading-5",
3055
+ default: "text-foreground text-sm font-medium leading-5"
3056
+ },
3057
+ subtextRow: "flex items-center gap-1",
3058
+ subtextIcon: "size-4 text-muted-foreground shrink-0",
3059
+ subtext: "text-muted-foreground text-sm font-light leading-5",
3060
+ // Cancel button on the right
3061
+ cancelBtn: "size-10 shrink-0 flex items-center justify-center border border-border rounded-full text-foreground hover:bg-muted transition-colors cursor-pointer",
3062
+ // Thin progress bar pinned to the bottom (track + fill overlay)
3063
+ progress: {
3064
+ wrapper: "absolute bottom-0 left-0 right-0 h-1 overflow-hidden rounded-b-lg",
3065
+ track: "absolute inset-0 h-full w-full bg-muted",
3066
+ fill: {
3067
+ base: "absolute left-0 top-0 bottom-0 h-full transition-[width] ease-out",
3068
+ success: "bg-success",
3069
+ error: "bg-destructive",
3070
+ default: "bg-primary"
3071
+ }
3072
+ }
3073
+ };
3074
+
3075
+ // src/toast/toast.tsx
3076
+ import { jsx as jsx23, jsxs as jsxs16 } from "react/jsx-runtime";
3077
+ var Toaster = ({
3078
+ position = "bottom-right",
3079
+ ...props
3080
+ }) => /* @__PURE__ */ jsx23(
3081
+ SonnerToaster,
3082
+ {
3083
+ position,
3084
+ toastOptions: { unstyled: true, classNames: { toast: "w-[360px]" } },
3085
+ ...props
3086
+ }
3087
+ );
3088
+ Toaster.displayName = "Toaster";
3089
+ var TOAST_ICON = {
3090
+ success: CircleCheck,
3091
+ error: CircleAlert,
3092
+ default: ThumbsUp
3093
+ };
3094
+ var Toast = React27.forwardRef(
3095
+ ({
3096
+ variant = "default",
3097
+ title,
3098
+ subtext,
3099
+ showCancel = false,
3100
+ onCancel,
3101
+ showProgress = false,
3102
+ progress = 0,
3103
+ className,
3104
+ style
3105
+ }, ref) => {
3106
+ const Icon2 = TOAST_ICON[variant];
3107
+ const clampedProgress = Math.min(100, Math.max(0, progress));
3108
+ return /* @__PURE__ */ jsxs16(
3109
+ "div",
3110
+ {
3111
+ ref,
3112
+ className: cn(TOAST_TOKENS.root, className),
3113
+ style,
3114
+ children: [
3115
+ /* @__PURE__ */ jsx23(Icon2, { className: cn("size-6", TOAST_TOKENS.icon[variant]) }),
3116
+ /* @__PURE__ */ jsxs16("div", { className: TOAST_TOKENS.content, children: [
3117
+ /* @__PURE__ */ jsx23("span", { className: TOAST_TOKENS.title[variant], children: title }),
3118
+ subtext && /* @__PURE__ */ jsxs16("div", { className: TOAST_TOKENS.subtextRow, children: [
3119
+ /* @__PURE__ */ jsx23(CircleCheck, { className: TOAST_TOKENS.subtextIcon }),
3120
+ /* @__PURE__ */ jsx23("span", { className: TOAST_TOKENS.subtext, children: subtext })
3121
+ ] })
3122
+ ] }),
3123
+ showCancel && /* @__PURE__ */ jsx23(
3124
+ "button",
3125
+ {
3126
+ type: "button",
3127
+ onClick: onCancel,
3128
+ className: TOAST_TOKENS.cancelBtn,
3129
+ "aria-label": "Dismiss",
3130
+ children: /* @__PURE__ */ jsx23(ChevronRight, { className: "size-5" })
3131
+ }
3132
+ ),
3133
+ showProgress && /* @__PURE__ */ jsxs16("div", { className: TOAST_TOKENS.progress.wrapper, children: [
3134
+ /* @__PURE__ */ jsx23("div", { className: TOAST_TOKENS.progress.track }),
3135
+ /* @__PURE__ */ jsx23(
3136
+ "div",
3137
+ {
3138
+ className: cn(
3139
+ TOAST_TOKENS.progress.fill.base,
3140
+ TOAST_TOKENS.progress.fill[variant]
3141
+ ),
3142
+ style: { width: `${clampedProgress}%` }
3143
+ }
3144
+ )
3145
+ ] })
3146
+ ]
3147
+ }
3148
+ );
3149
+ }
3150
+ );
3151
+ Toast.displayName = "Toast";
3152
+ var showToast = ({
3153
+ duration,
3154
+ ...props
3155
+ }) => {
3156
+ return sonnerToast.custom(
3157
+ (id) => /* @__PURE__ */ jsx23(
3158
+ Toast,
3159
+ {
3160
+ ...props,
3161
+ onCancel: props.showCancel ? () => sonnerToast.dismiss(id) : void 0
3162
+ }
3163
+ ),
3164
+ { duration }
3165
+ );
3166
+ };
3167
+
3168
+ // src/stepper/stepper.tsx
3169
+ import * as React28 from "react";
3170
+ import { Check as Check3 } from "lucide-react";
3171
+
3172
+ // src/stepper/variables.ts
3173
+ var STEPPER_TOKENS = {
3174
+ // --- StepperBar ---
3175
+ bar: {
3176
+ root: "flex gap-1 items-center w-full",
3177
+ segment: {
3178
+ base: "flex-1 h-1 rounded-sm",
3179
+ active: "bg-primary",
3180
+ inactive: "bg-border"
3181
+ }
3182
+ },
3183
+ // --- Stepper ---
3184
+ stepper: {
3185
+ root: "flex items-center w-full",
3186
+ connector: "flex-1 h-px bg-border min-w-2",
3187
+ step: {
3188
+ wrapper: "flex gap-2 items-center shrink-0",
3189
+ indicator: {
3190
+ base: "size-6 rounded-full flex items-center justify-center shrink-0",
3191
+ incomplete: "bg-neutral-300",
3192
+ active: "bg-primary",
3193
+ complete: "bg-primary"
3194
+ },
3195
+ number: {
3196
+ incomplete: "text-muted-foreground text-xs font-medium leading-4",
3197
+ active: "text-primary-foreground text-xs font-medium leading-4"
3198
+ },
3199
+ checkIcon: "size-3.5 text-primary-foreground stroke-2",
3200
+ label: {
3201
+ base: "text-xs leading-4",
3202
+ incomplete: "text-muted-foreground font-normal",
3203
+ active: "text-foreground font-medium",
3204
+ complete: "text-muted-foreground font-normal"
3205
+ }
3206
+ }
3207
+ }
3208
+ };
3209
+
3210
+ // src/stepper/stepper.tsx
3211
+ import { jsx as jsx24, jsxs as jsxs17 } from "react/jsx-runtime";
3212
+ var StepperBar = React28.forwardRef(
3213
+ ({ totalSteps = 4, currentStep, className, style }, ref) => {
3214
+ return /* @__PURE__ */ jsx24(
3215
+ "div",
3216
+ {
3217
+ ref,
3218
+ className: cn(STEPPER_TOKENS.bar.root, className),
3219
+ style,
3220
+ children: Array.from({ length: totalSteps }).map((_, index) => /* @__PURE__ */ jsx24(
3221
+ "div",
3222
+ {
3223
+ className: cn(
3224
+ STEPPER_TOKENS.bar.segment.base,
3225
+ index < currentStep ? STEPPER_TOKENS.bar.segment.active : STEPPER_TOKENS.bar.segment.inactive
3226
+ )
3227
+ },
3228
+ index
3229
+ ))
3230
+ }
3231
+ );
3232
+ }
3233
+ );
3234
+ StepperBar.displayName = "StepperBar";
3235
+ var Stepper = React28.forwardRef(
3236
+ ({ steps, className, style }, ref) => {
3237
+ return /* @__PURE__ */ jsx24(
3238
+ "div",
3239
+ {
3240
+ ref,
3241
+ className: cn(STEPPER_TOKENS.stepper.root, className),
3242
+ style,
3243
+ children: steps.map((step, index) => {
3244
+ var _a5;
3245
+ const state = (_a5 = step.state) != null ? _a5 : "incomplete";
3246
+ return /* @__PURE__ */ jsxs17(React28.Fragment, { children: [
3247
+ /* @__PURE__ */ jsxs17("div", { className: STEPPER_TOKENS.stepper.step.wrapper, children: [
3248
+ /* @__PURE__ */ jsx24(
3249
+ "div",
3250
+ {
3251
+ className: cn(
3252
+ STEPPER_TOKENS.stepper.step.indicator.base,
3253
+ STEPPER_TOKENS.stepper.step.indicator[state]
3254
+ ),
3255
+ children: state === "complete" ? /* @__PURE__ */ jsx24(Check3, { className: STEPPER_TOKENS.stepper.step.checkIcon }) : /* @__PURE__ */ jsx24(
3256
+ "span",
3257
+ {
3258
+ className: state === "active" ? STEPPER_TOKENS.stepper.step.number.active : STEPPER_TOKENS.stepper.step.number.incomplete,
3259
+ children: index + 1
3260
+ }
3261
+ )
3262
+ }
3263
+ ),
3264
+ /* @__PURE__ */ jsx24(
3265
+ "span",
3266
+ {
3267
+ className: cn(
3268
+ STEPPER_TOKENS.stepper.step.label.base,
3269
+ STEPPER_TOKENS.stepper.step.label[state]
3270
+ ),
3271
+ children: step.label
3272
+ }
3273
+ )
3274
+ ] }),
3275
+ index < steps.length - 1 && /* @__PURE__ */ jsx24("div", { className: STEPPER_TOKENS.stepper.connector })
3276
+ ] }, index);
3277
+ })
3278
+ }
3279
+ );
3280
+ }
3281
+ );
3282
+ Stepper.displayName = "Stepper";
3283
+
3284
+ // src/shadow-dom-wrapper.tsx
3285
+ import * as React29 from "react";
1916
3286
  import { createPortal } from "react-dom";
1917
- import { Fragment as Fragment3, jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
3287
+ import { Fragment as Fragment4, jsx as jsx25, jsxs as jsxs18 } from "react/jsx-runtime";
1918
3288
  var ShadowDOMWrapper = ({
1919
3289
  children,
1920
3290
  styles,
@@ -1922,10 +3292,10 @@ var ShadowDOMWrapper = ({
1922
3292
  additionalStyles = "",
1923
3293
  copyCSSVariables = true
1924
3294
  }) => {
1925
- const containerRef = React17.useRef(null);
1926
- const shadowRootRef = React17.useRef(null);
1927
- const [shadowRoot, setShadowRoot] = React17.useState(null);
1928
- React17.useEffect(() => {
3295
+ const containerRef = React29.useRef(null);
3296
+ const shadowRootRef = React29.useRef(null);
3297
+ const [shadowRoot, setShadowRoot] = React29.useState(null);
3298
+ React29.useEffect(() => {
1929
3299
  if (!containerRef.current) return;
1930
3300
  if (!shadowRootRef.current) {
1931
3301
  shadowRootRef.current = containerRef.current.attachShadow({ mode });
@@ -2014,8 +3384,8 @@ var ShadowDOMWrapper = ({
2014
3384
  return () => {
2015
3385
  };
2016
3386
  }, [styles, mode, additionalStyles, copyCSSVariables]);
2017
- return /* @__PURE__ */ jsxs11(Fragment3, { children: [
2018
- /* @__PURE__ */ jsx15("div", { ref: containerRef }),
3387
+ return /* @__PURE__ */ jsxs18(Fragment4, { children: [
3388
+ /* @__PURE__ */ jsx25("div", { ref: containerRef }),
2019
3389
  shadowRoot && createPortal(children, shadowRoot)
2020
3390
  ] });
2021
3391
  };
@@ -2032,16 +3402,38 @@ export {
2032
3402
  Button,
2033
3403
  Checkbox,
2034
3404
  DEFAULT_THEME,
3405
+ Dialog,
3406
+ DialogBody,
3407
+ DialogFooter,
3408
+ DialogHeader,
2035
3409
  DialogHeaderNavigation,
3410
+ DialogIcon,
3411
+ EmptyState,
2036
3412
  FileInput,
2037
3413
  Input,
2038
3414
  InputGroup,
2039
3415
  LegoLandWrapper,
3416
+ List,
2040
3417
  NumberBadge,
2041
3418
  NurixThemeProvider,
3419
+ PlaySelect,
3420
+ PlaybackControl,
2042
3421
  RadioGroup,
2043
3422
  RadioGroupItem,
3423
+ Select,
3424
+ SelectContent,
3425
+ SelectFormLabel,
3426
+ SelectGroup,
3427
+ SelectItem,
3428
+ SelectLabel,
3429
+ SelectScrollDownButton,
3430
+ SelectScrollUpButton,
3431
+ SelectSeparator,
3432
+ SelectTrigger,
3433
+ SelectValue,
2044
3434
  ShadowDOMWrapper,
3435
+ Stepper,
3436
+ StepperBar,
2045
3437
  Switch,
2046
3438
  Tabs,
2047
3439
  TabsContent,
@@ -2049,5 +3441,15 @@ export {
2049
3441
  TabsTrigger,
2050
3442
  Textarea,
2051
3443
  ThemeProvider,
3444
+ Toast,
3445
+ Toaster,
3446
+ Tooltip,
3447
+ TooltipContent,
3448
+ TooltipProvider,
3449
+ TooltipTrigger,
3450
+ Typography,
3451
+ showToast,
3452
+ usePlaySelect,
3453
+ useSelect,
2052
3454
  useTheme
2053
3455
  };