@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/README.md +1 -1
- package/dist/index.d.mts +561 -71
- package/dist/index.d.ts +561 -71
- package/dist/index.js +1460 -26
- package/dist/index.mjs +1428 -26
- package/dist/styles.css +538 -42
- package/package.json +3 -1
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: "#
|
|
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: "#
|
|
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: "#
|
|
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-
|
|
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-
|
|
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-
|
|
463
|
-
link: "bg-transparent text-
|
|
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-
|
|
467
|
-
iconOutline: "border border-border bg-transparent text-foreground hover:bg-foreground/5 disabled:border-
|
|
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-
|
|
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
|
-
|
|
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-
|
|
550
|
-
fieldBase: "border border-transparent focus-within:border-
|
|
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-
|
|
733
|
-
fieldBase: "border border-transparent focus-within:border-
|
|
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
|
|
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/
|
|
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
|
|
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 =
|
|
1926
|
-
const shadowRootRef =
|
|
1927
|
-
const [shadowRoot, setShadowRoot] =
|
|
1928
|
-
|
|
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__ */
|
|
2018
|
-
/* @__PURE__ */
|
|
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
|
};
|