@fanvue/ui 0.1.0-alpha.3 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -8
- package/dist/cjs/components/Alert/Alert.cjs +72 -0
- package/dist/cjs/components/Alert/Alert.cjs.map +1 -0
- package/dist/cjs/components/Avatar/Avatar.cjs +162 -0
- package/dist/cjs/components/Avatar/Avatar.cjs.map +1 -0
- package/dist/cjs/components/Badge/Badge.cjs +99 -0
- package/dist/cjs/components/Badge/Badge.cjs.map +1 -0
- package/dist/cjs/components/Button/Button.cjs +172 -0
- package/dist/cjs/components/Button/Button.cjs.map +1 -0
- package/dist/cjs/components/Checkbox/Checkbox.cjs +157 -0
- package/dist/cjs/components/Checkbox/Checkbox.cjs.map +1 -0
- package/dist/cjs/components/Chip/Chip.cjs +92 -0
- package/dist/cjs/components/Chip/Chip.cjs.map +1 -0
- package/dist/cjs/components/Count/Count.cjs +56 -0
- package/dist/cjs/components/Count/Count.cjs.map +1 -0
- package/dist/cjs/components/DatePicker/DatePicker.cjs +133 -0
- package/dist/cjs/components/DatePicker/DatePicker.cjs.map +1 -0
- package/dist/cjs/components/Divider/Divider.cjs +69 -0
- package/dist/cjs/components/Divider/Divider.cjs.map +1 -0
- package/dist/cjs/components/IconButton/IconButton.cjs +92 -0
- package/dist/cjs/components/IconButton/IconButton.cjs.map +1 -0
- package/dist/cjs/components/Icons/ArrowRightIcon.cjs +47 -0
- package/dist/cjs/components/Icons/ArrowRightIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/ArrowUpRightIcon.cjs +47 -0
- package/dist/cjs/components/Icons/ArrowUpRightIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/CheckCircleIcon.cjs +47 -0
- package/dist/cjs/components/Icons/CheckCircleIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/CheckIcon.cjs +49 -0
- package/dist/cjs/components/Icons/CheckIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/ChevronLeftIcon.cjs +49 -0
- package/dist/cjs/components/Icons/ChevronLeftIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/ChevronRightIcon.cjs +49 -0
- package/dist/cjs/components/Icons/ChevronRightIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/CloseIcon.cjs +46 -0
- package/dist/cjs/components/Icons/CloseIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/CrossIcon.cjs +40 -0
- package/dist/cjs/components/Icons/CrossIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/CrownIcon.cjs +40 -0
- package/dist/cjs/components/Icons/CrownIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/ErrorCircleIcon.cjs +47 -0
- package/dist/cjs/components/Icons/ErrorCircleIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/ErrorIcon.cjs +30 -0
- package/dist/cjs/components/Icons/ErrorIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/FireIcon.cjs +47 -0
- package/dist/cjs/components/Icons/FireIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/HomeIcon.cjs +40 -0
- package/dist/cjs/components/Icons/HomeIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/InfoCircleIcon.cjs +47 -0
- package/dist/cjs/components/Icons/InfoCircleIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/InfoIcon.cjs +30 -0
- package/dist/cjs/components/Icons/InfoIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/MicrophoneIcon.cjs +55 -0
- package/dist/cjs/components/Icons/MicrophoneIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/MinusIcon.cjs +40 -0
- package/dist/cjs/components/Icons/MinusIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/PlusIcon.cjs +40 -0
- package/dist/cjs/components/Icons/PlusIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/SpinnerIcon.cjs +43 -0
- package/dist/cjs/components/Icons/SpinnerIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/StopIcon.cjs +46 -0
- package/dist/cjs/components/Icons/StopIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/SuccessIcon.cjs +30 -0
- package/dist/cjs/components/Icons/SuccessIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/VipBadgeIcon.cjs +97 -0
- package/dist/cjs/components/Icons/VipBadgeIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/WarningIcon.cjs +30 -0
- package/dist/cjs/components/Icons/WarningIcon.cjs.map +1 -0
- package/dist/cjs/components/Icons/WarningTriangleIcon.cjs +47 -0
- package/dist/cjs/components/Icons/WarningTriangleIcon.cjs.map +1 -0
- package/dist/cjs/components/Logo/Logo.cjs +182 -0
- package/dist/cjs/components/Logo/Logo.cjs.map +1 -0
- package/dist/cjs/components/Pagination/Pagination.cjs +144 -0
- package/dist/cjs/components/Pagination/Pagination.cjs.map +1 -0
- package/dist/cjs/components/Pill/Pill.cjs +69 -0
- package/dist/cjs/components/Pill/Pill.cjs.map +1 -0
- package/dist/cjs/components/ProgressBar/ProgressBar.cjs +112 -0
- package/dist/cjs/components/ProgressBar/ProgressBar.cjs.map +1 -0
- package/dist/cjs/components/Radio/Radio.cjs +74 -0
- package/dist/cjs/components/Radio/Radio.cjs.map +1 -0
- package/dist/cjs/components/RadioGroup/RadioGroup.cjs +30 -0
- package/dist/cjs/components/RadioGroup/RadioGroup.cjs.map +1 -0
- package/dist/cjs/components/Slider/Slider.cjs +96 -0
- package/dist/cjs/components/Slider/Slider.cjs.map +1 -0
- package/dist/cjs/components/Slider/SliderLayout.cjs +31 -0
- package/dist/cjs/components/Slider/SliderLayout.cjs.map +1 -0
- package/dist/cjs/components/Slider/SliderThumb.cjs +87 -0
- package/dist/cjs/components/Slider/SliderThumb.cjs.map +1 -0
- package/dist/cjs/components/Snackbar/Snackbar.cjs +215 -0
- package/dist/cjs/components/Snackbar/Snackbar.cjs.map +1 -0
- package/dist/cjs/components/Switch/Switch.cjs +57 -0
- package/dist/cjs/components/Switch/Switch.cjs.map +1 -0
- package/dist/cjs/components/SwitchField/SwitchField.cjs +103 -0
- package/dist/cjs/components/SwitchField/SwitchField.cjs.map +1 -0
- package/dist/cjs/components/SwitchToggle/SwitchToggle.cjs +110 -0
- package/dist/cjs/components/SwitchToggle/SwitchToggle.cjs.map +1 -0
- package/dist/cjs/components/Tabs/Tabs.cjs +24 -0
- package/dist/cjs/components/Tabs/Tabs.cjs.map +1 -0
- package/dist/cjs/components/Tabs/TabsContent.cjs +36 -0
- package/dist/cjs/components/Tabs/TabsContent.cjs.map +1 -0
- package/dist/cjs/components/Tabs/TabsList.cjs +42 -0
- package/dist/cjs/components/Tabs/TabsList.cjs.map +1 -0
- package/dist/cjs/components/Tabs/TabsTrigger.cjs +50 -0
- package/dist/cjs/components/Tabs/TabsTrigger.cjs.map +1 -0
- package/dist/cjs/components/Toast/Toast.cjs +128 -0
- package/dist/cjs/components/Toast/Toast.cjs.map +1 -0
- package/dist/cjs/index.cjs +111 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/utils/cn.cjs +10 -0
- package/dist/cjs/utils/cn.cjs.map +1 -0
- package/dist/components/Alert/Alert.mjs +55 -0
- package/dist/components/Alert/Alert.mjs.map +1 -0
- package/dist/components/Avatar/Avatar.mjs +144 -0
- package/dist/components/Avatar/Avatar.mjs.map +1 -0
- package/dist/components/Badge/Badge.mjs +82 -0
- package/dist/components/Badge/Badge.mjs.map +1 -0
- package/dist/components/Button/Button.mjs +155 -0
- package/dist/components/Button/Button.mjs.map +1 -0
- package/dist/components/Checkbox/Checkbox.mjs +139 -0
- package/dist/components/Checkbox/Checkbox.mjs.map +1 -0
- package/dist/components/Chip/Chip.mjs +75 -0
- package/dist/components/Chip/Chip.mjs.map +1 -0
- package/dist/components/Count/Count.mjs +39 -0
- package/dist/components/Count/Count.mjs.map +1 -0
- package/dist/components/DatePicker/DatePicker.mjs +133 -0
- package/dist/components/DatePicker/DatePicker.mjs.map +1 -0
- package/dist/components/Divider/Divider.mjs +51 -0
- package/dist/components/Divider/Divider.mjs.map +1 -0
- package/dist/components/IconButton/IconButton.mjs +75 -0
- package/dist/components/IconButton/IconButton.mjs.map +1 -0
- package/dist/components/Icons/ArrowRightIcon.mjs +30 -0
- package/dist/components/Icons/ArrowRightIcon.mjs.map +1 -0
- package/dist/components/Icons/ArrowUpRightIcon.mjs +30 -0
- package/dist/components/Icons/ArrowUpRightIcon.mjs.map +1 -0
- package/dist/components/Icons/CheckCircleIcon.mjs +30 -0
- package/dist/components/Icons/CheckCircleIcon.mjs.map +1 -0
- package/dist/components/Icons/CheckIcon.mjs +32 -0
- package/dist/components/Icons/CheckIcon.mjs.map +1 -0
- package/dist/components/Icons/ChevronLeftIcon.mjs +32 -0
- package/dist/components/Icons/ChevronLeftIcon.mjs.map +1 -0
- package/dist/components/Icons/ChevronRightIcon.mjs +32 -0
- package/dist/components/Icons/ChevronRightIcon.mjs.map +1 -0
- package/dist/components/Icons/CloseIcon.mjs +29 -0
- package/dist/components/Icons/CloseIcon.mjs.map +1 -0
- package/dist/components/Icons/CrossIcon.mjs +23 -0
- package/dist/components/Icons/CrossIcon.mjs.map +1 -0
- package/dist/components/Icons/CrownIcon.mjs +23 -0
- package/dist/components/Icons/CrownIcon.mjs.map +1 -0
- package/dist/components/Icons/ErrorCircleIcon.mjs +30 -0
- package/dist/components/Icons/ErrorCircleIcon.mjs.map +1 -0
- package/dist/components/Icons/ErrorIcon.mjs +30 -0
- package/dist/components/Icons/ErrorIcon.mjs.map +1 -0
- package/dist/components/Icons/FireIcon.mjs +30 -0
- package/dist/components/Icons/FireIcon.mjs.map +1 -0
- package/dist/components/Icons/HomeIcon.mjs +23 -0
- package/dist/components/Icons/HomeIcon.mjs.map +1 -0
- package/dist/components/Icons/InfoCircleIcon.mjs +30 -0
- package/dist/components/Icons/InfoCircleIcon.mjs.map +1 -0
- package/dist/components/Icons/InfoIcon.mjs +30 -0
- package/dist/components/Icons/InfoIcon.mjs.map +1 -0
- package/dist/components/Icons/MicrophoneIcon.mjs +38 -0
- package/dist/components/Icons/MicrophoneIcon.mjs.map +1 -0
- package/dist/components/Icons/MinusIcon.mjs +23 -0
- package/dist/components/Icons/MinusIcon.mjs.map +1 -0
- package/dist/components/Icons/PlusIcon.mjs +23 -0
- package/dist/components/Icons/PlusIcon.mjs.map +1 -0
- package/dist/components/Icons/SpinnerIcon.mjs +26 -0
- package/dist/components/Icons/SpinnerIcon.mjs.map +1 -0
- package/dist/components/Icons/StopIcon.mjs +29 -0
- package/dist/components/Icons/StopIcon.mjs.map +1 -0
- package/dist/components/Icons/SuccessIcon.mjs +30 -0
- package/dist/components/Icons/SuccessIcon.mjs.map +1 -0
- package/dist/components/Icons/VipBadgeIcon.mjs +80 -0
- package/dist/components/Icons/VipBadgeIcon.mjs.map +1 -0
- package/dist/components/Icons/WarningIcon.mjs +30 -0
- package/dist/components/Icons/WarningIcon.mjs.map +1 -0
- package/dist/components/Icons/WarningTriangleIcon.mjs +30 -0
- package/dist/components/Icons/WarningTriangleIcon.mjs.map +1 -0
- package/dist/components/Logo/Logo.mjs +165 -0
- package/dist/components/Logo/Logo.mjs.map +1 -0
- package/dist/components/Pagination/Pagination.mjs +127 -0
- package/dist/components/Pagination/Pagination.mjs.map +1 -0
- package/dist/components/Pill/Pill.mjs +52 -0
- package/dist/components/Pill/Pill.mjs.map +1 -0
- package/dist/components/ProgressBar/ProgressBar.mjs +95 -0
- package/dist/components/ProgressBar/ProgressBar.mjs.map +1 -0
- package/dist/components/Radio/Radio.mjs +56 -0
- package/dist/components/Radio/Radio.mjs.map +1 -0
- package/dist/components/RadioGroup/RadioGroup.mjs +12 -0
- package/dist/components/RadioGroup/RadioGroup.mjs.map +1 -0
- package/dist/components/Slider/Slider.mjs +78 -0
- package/dist/components/Slider/Slider.mjs.map +1 -0
- package/dist/components/Slider/SliderLayout.mjs +31 -0
- package/dist/components/Slider/SliderLayout.mjs.map +1 -0
- package/dist/components/Slider/SliderThumb.mjs +69 -0
- package/dist/components/Slider/SliderThumb.mjs.map +1 -0
- package/dist/components/Snackbar/Snackbar.mjs +198 -0
- package/dist/components/Snackbar/Snackbar.mjs.map +1 -0
- package/dist/components/Switch/Switch.mjs +39 -0
- package/dist/components/Switch/Switch.mjs.map +1 -0
- package/dist/components/SwitchField/SwitchField.mjs +86 -0
- package/dist/components/SwitchField/SwitchField.mjs.map +1 -0
- package/dist/components/SwitchToggle/SwitchToggle.mjs +93 -0
- package/dist/components/SwitchToggle/SwitchToggle.mjs.map +1 -0
- package/dist/components/Tabs/Tabs.mjs +7 -0
- package/dist/components/Tabs/Tabs.mjs.map +1 -0
- package/dist/components/Tabs/TabsContent.mjs +18 -0
- package/dist/components/Tabs/TabsContent.mjs.map +1 -0
- package/dist/components/Tabs/TabsList.mjs +24 -0
- package/dist/components/Tabs/TabsList.mjs.map +1 -0
- package/dist/components/Tabs/TabsTrigger.mjs +32 -0
- package/dist/components/Tabs/TabsTrigger.mjs.map +1 -0
- package/dist/components/Toast/Toast.mjs +110 -0
- package/dist/components/Toast/Toast.mjs.map +1 -0
- package/dist/index.d.ts +41 -61
- package/dist/index.mjs +107 -10507
- package/dist/index.mjs.map +1 -1
- package/dist/styles/theme.css +1 -1
- package/dist/utils/cn.mjs +10 -0
- package/dist/utils/cn.mjs.map +1 -0
- package/package.json +15 -4
- package/dist/index.cjs +0 -2
- package/dist/index.cjs.map +0 -1
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as SliderPrimitive from "@radix-ui/react-slider";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { cn } from "../../utils/cn.mjs";
|
|
6
|
+
import { SliderLayout } from "./SliderLayout.mjs";
|
|
7
|
+
import { SliderThumb } from "./SliderThumb.mjs";
|
|
8
|
+
const Slider = React.forwardRef(
|
|
9
|
+
({
|
|
10
|
+
className,
|
|
11
|
+
label,
|
|
12
|
+
labelPosition = "top",
|
|
13
|
+
minLabel,
|
|
14
|
+
maxLabel,
|
|
15
|
+
showTooltip = false,
|
|
16
|
+
formatTooltip,
|
|
17
|
+
disabled,
|
|
18
|
+
value,
|
|
19
|
+
defaultValue,
|
|
20
|
+
"aria-label": ariaLabel,
|
|
21
|
+
"aria-labelledby": ariaLabelledBy,
|
|
22
|
+
...props
|
|
23
|
+
}, ref) => {
|
|
24
|
+
const labelId = React.useId();
|
|
25
|
+
const thumbCount = value?.length ?? defaultValue?.length ?? 1;
|
|
26
|
+
const resolvedLabelledBy = ariaLabelledBy ?? (label ? labelId : void 0);
|
|
27
|
+
const resolvedAriaLabel = !resolvedLabelledBy ? ariaLabel : void 0;
|
|
28
|
+
const sliderTrack = /* @__PURE__ */ jsxs(
|
|
29
|
+
SliderPrimitive.Root,
|
|
30
|
+
{
|
|
31
|
+
ref,
|
|
32
|
+
disabled,
|
|
33
|
+
value,
|
|
34
|
+
defaultValue,
|
|
35
|
+
"aria-label": resolvedAriaLabel,
|
|
36
|
+
"aria-labelledby": resolvedLabelledBy,
|
|
37
|
+
className: cn(
|
|
38
|
+
"group/slider relative flex w-full touch-none select-none items-center",
|
|
39
|
+
disabled && "pointer-events-none opacity-50",
|
|
40
|
+
className
|
|
41
|
+
),
|
|
42
|
+
...props,
|
|
43
|
+
children: [
|
|
44
|
+
/* @__PURE__ */ jsx(SliderPrimitive.Track, { className: "relative h-3 w-full overflow-hidden rounded-full border border-neutral-100 bg-neutral-100", children: /* @__PURE__ */ jsx(SliderPrimitive.Range, { className: "absolute h-full rounded-full bg-brand-green-500" }) }),
|
|
45
|
+
Array.from({ length: thumbCount }, (_, i) => /* @__PURE__ */ jsx(
|
|
46
|
+
SliderThumb,
|
|
47
|
+
{
|
|
48
|
+
showTooltip,
|
|
49
|
+
formatTooltip,
|
|
50
|
+
index: i,
|
|
51
|
+
"aria-label": resolvedAriaLabel,
|
|
52
|
+
"aria-labelledby": resolvedLabelledBy
|
|
53
|
+
},
|
|
54
|
+
i
|
|
55
|
+
))
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
const hasLayout = Boolean(label || minLabel || maxLabel);
|
|
60
|
+
if (!hasLayout) return sliderTrack;
|
|
61
|
+
return /* @__PURE__ */ jsx(
|
|
62
|
+
SliderLayout,
|
|
63
|
+
{
|
|
64
|
+
label,
|
|
65
|
+
labelId,
|
|
66
|
+
labelPosition,
|
|
67
|
+
minLabel,
|
|
68
|
+
maxLabel,
|
|
69
|
+
children: sliderTrack
|
|
70
|
+
}
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
);
|
|
74
|
+
Slider.displayName = "Slider";
|
|
75
|
+
export {
|
|
76
|
+
Slider
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=Slider.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Slider.mjs","sources":["../../../src/components/Slider/Slider.tsx"],"sourcesContent":["import * as SliderPrimitive from \"@radix-ui/react-slider\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { SliderLayout } from \"./SliderLayout\";\nimport { SliderThumb } from \"./SliderThumb\";\n\nexport type SliderLabelPosition = \"top\" | \"left\";\n\nexport interface SliderProps\n extends Omit<\n React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>,\n \"asChild\" | \"children\"\n > {\n /** Label text displayed alongside the slider */\n label?: string;\n /** Position of the label relative to the slider track */\n labelPosition?: SliderLabelPosition;\n /** Text shown at the minimum end of the track */\n minLabel?: string;\n /** Text shown at the maximum end of the track */\n maxLabel?: string;\n /** Whether to show a tooltip with the current value above the thumb */\n showTooltip?: boolean;\n /** Override the displayed tooltip value (e.g. for formatting) */\n formatTooltip?: (value: number) => string;\n}\n\nexport const Slider = React.forwardRef<\n React.ComponentRef<typeof SliderPrimitive.Root>,\n SliderProps\n>(\n (\n {\n className,\n label,\n labelPosition = \"top\",\n minLabel,\n maxLabel,\n showTooltip = false,\n formatTooltip,\n disabled,\n value,\n defaultValue,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n ...props\n },\n ref,\n ) => {\n const labelId = React.useId();\n const thumbCount = value?.length ?? defaultValue?.length ?? 1;\n const resolvedLabelledBy = ariaLabelledBy ?? (label ? labelId : undefined);\n const resolvedAriaLabel = !resolvedLabelledBy ? ariaLabel : undefined;\n\n const sliderTrack = (\n <SliderPrimitive.Root\n ref={ref}\n disabled={disabled}\n value={value}\n defaultValue={defaultValue}\n aria-label={resolvedAriaLabel}\n aria-labelledby={resolvedLabelledBy}\n className={cn(\n \"group/slider relative flex w-full touch-none select-none items-center\",\n disabled && \"pointer-events-none opacity-50\",\n className,\n )}\n {...props}\n >\n <SliderPrimitive.Track className=\"relative h-3 w-full overflow-hidden rounded-full border border-neutral-100 bg-neutral-100\">\n <SliderPrimitive.Range className=\"absolute h-full rounded-full bg-brand-green-500\" />\n </SliderPrimitive.Track>\n\n {Array.from({ length: thumbCount }, (_, i) => (\n <SliderThumb\n // biome-ignore lint/suspicious/noArrayIndexKey: thumbs are fixed-count and never reorder\n key={i}\n showTooltip={showTooltip}\n formatTooltip={formatTooltip}\n index={i}\n aria-label={resolvedAriaLabel}\n aria-labelledby={resolvedLabelledBy}\n />\n ))}\n </SliderPrimitive.Root>\n );\n\n const hasLayout = Boolean(label || minLabel || maxLabel);\n\n if (!hasLayout) return sliderTrack;\n\n return (\n <SliderLayout\n label={label}\n labelId={labelId}\n labelPosition={labelPosition}\n minLabel={minLabel}\n maxLabel={maxLabel}\n >\n {sliderTrack}\n </SliderLayout>\n );\n },\n);\n\nSlider.displayName = \"Slider\";\n"],"names":[],"mappings":";;;;;;;AA2BO,MAAM,SAAS,MAAM;AAAA,EAI1B,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,GAAG;AAAA,EAAA,GAEL,QACG;AACH,UAAM,UAAU,MAAM,MAAA;AACtB,UAAM,aAAa,OAAO,UAAU,cAAc,UAAU;AAC5D,UAAM,qBAAqB,mBAAmB,QAAQ,UAAU;AAChE,UAAM,oBAAoB,CAAC,qBAAqB,YAAY;AAE5D,UAAM,cACJ;AAAA,MAAC,gBAAgB;AAAA,MAAhB;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAY;AAAA,QACZ,mBAAiB;AAAA,QACjB,WAAW;AAAA,UACT;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,QAAA;AAAA,QAED,GAAG;AAAA,QAEJ,UAAA;AAAA,UAAA,oBAAC,gBAAgB,OAAhB,EAAsB,WAAU,6FAC/B,UAAA,oBAAC,gBAAgB,OAAhB,EAAsB,WAAU,kDAAA,CAAkD,EAAA,CACrF;AAAA,UAEC,MAAM,KAAK,EAAE,QAAQ,cAAc,CAAC,GAAG,MACtC;AAAA,YAAC;AAAA,YAAA;AAAA,cAGC;AAAA,cACA;AAAA,cACA,OAAO;AAAA,cACP,cAAY;AAAA,cACZ,mBAAiB;AAAA,YAAA;AAAA,YALZ;AAAA,UAAA,CAOR;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAIL,UAAM,YAAY,QAAQ,SAAS,YAAY,QAAQ;AAEvD,QAAI,CAAC,UAAW,QAAO;AAEvB,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QAEC,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACF;AAEA,OAAO,cAAc;"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
3
|
+
function SliderLayout({
|
|
4
|
+
label,
|
|
5
|
+
labelId,
|
|
6
|
+
labelPosition,
|
|
7
|
+
minLabel,
|
|
8
|
+
maxLabel,
|
|
9
|
+
children
|
|
10
|
+
}) {
|
|
11
|
+
if (labelPosition === "left") {
|
|
12
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
13
|
+
label && /* @__PURE__ */ jsx("span", { id: labelId, className: "typography-body-1-semibold shrink-0 text-body-100", children: label }),
|
|
14
|
+
minLabel && /* @__PURE__ */ jsx("span", { className: "typography-body-2-regular shrink-0 text-body-200", children: minLabel }),
|
|
15
|
+
children,
|
|
16
|
+
maxLabel && /* @__PURE__ */ jsx("span", { className: "typography-body-2-regular shrink-0 text-body-200", children: maxLabel })
|
|
17
|
+
] });
|
|
18
|
+
}
|
|
19
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex w-full flex-col gap-3", children: [
|
|
20
|
+
label && /* @__PURE__ */ jsx("span", { id: labelId, className: "typography-body-1-semibold text-body-100", children: label }),
|
|
21
|
+
(minLabel || maxLabel) && /* @__PURE__ */ jsxs("div", { className: "flex w-full items-start justify-between text-body-200 text-sm leading-[18px]", children: [
|
|
22
|
+
minLabel && /* @__PURE__ */ jsx("span", { children: minLabel }),
|
|
23
|
+
maxLabel && /* @__PURE__ */ jsx("span", { className: "ml-auto", children: maxLabel })
|
|
24
|
+
] }),
|
|
25
|
+
children
|
|
26
|
+
] });
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
SliderLayout
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=SliderLayout.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SliderLayout.mjs","sources":["../../../src/components/Slider/SliderLayout.tsx"],"sourcesContent":["import type * as React from \"react\";\nimport type { SliderLabelPosition } from \"./Slider\";\n\ninterface SliderLayoutProps {\n label?: string;\n labelId: string;\n labelPosition: SliderLabelPosition;\n minLabel?: string;\n maxLabel?: string;\n children: React.ReactNode;\n}\n\nexport function SliderLayout({\n label,\n labelId,\n labelPosition,\n minLabel,\n maxLabel,\n children,\n}: SliderLayoutProps) {\n if (labelPosition === \"left\") {\n return (\n <div className=\"flex items-center gap-3\">\n {label && (\n <span id={labelId} className=\"typography-body-1-semibold shrink-0 text-body-100\">\n {label}\n </span>\n )}\n {minLabel && (\n <span className=\"typography-body-2-regular shrink-0 text-body-200\">{minLabel}</span>\n )}\n {children}\n {maxLabel && (\n <span className=\"typography-body-2-regular shrink-0 text-body-200\">{maxLabel}</span>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"flex w-full flex-col gap-3\">\n {label && (\n <span id={labelId} className=\"typography-body-1-semibold text-body-100\">\n {label}\n </span>\n )}\n {(minLabel || maxLabel) && (\n <div className=\"flex w-full items-start justify-between text-body-200 text-sm leading-[18px]\">\n {minLabel && <span>{minLabel}</span>}\n {maxLabel && <span className=\"ml-auto\">{maxLabel}</span>}\n </div>\n )}\n {children}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAYO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsB;AACpB,MAAI,kBAAkB,QAAQ;AAC5B,WACE,qBAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,MAAA,6BACE,QAAA,EAAK,IAAI,SAAS,WAAU,qDAC1B,UAAA,OACH;AAAA,MAED,YACC,oBAAC,QAAA,EAAK,WAAU,oDAAoD,UAAA,UAAS;AAAA,MAE9E;AAAA,MACA,YACC,oBAAC,QAAA,EAAK,WAAU,oDAAoD,UAAA,SAAA,CAAS;AAAA,IAAA,GAEjF;AAAA,EAEJ;AAEA,SACE,qBAAC,OAAA,EAAI,WAAU,8BACZ,UAAA;AAAA,IAAA,6BACE,QAAA,EAAK,IAAI,SAAS,WAAU,4CAC1B,UAAA,OACH;AAAA,KAEA,YAAY,aACZ,qBAAC,OAAA,EAAI,WAAU,gFACZ,UAAA;AAAA,MAAA,YAAY,oBAAC,UAAM,UAAA,SAAA,CAAS;AAAA,MAC5B,YAAY,oBAAC,QAAA,EAAK,WAAU,WAAW,UAAA,SAAA,CAAS;AAAA,IAAA,GACnD;AAAA,IAED;AAAA,EAAA,GACH;AAEJ;"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as SliderPrimitive from "@radix-ui/react-slider";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { cn } from "../../utils/cn.mjs";
|
|
6
|
+
function SliderThumb({
|
|
7
|
+
showTooltip,
|
|
8
|
+
formatTooltip,
|
|
9
|
+
index,
|
|
10
|
+
"aria-label": ariaLabel,
|
|
11
|
+
"aria-labelledby": ariaLabelledBy
|
|
12
|
+
}) {
|
|
13
|
+
const thumbRef = React.useCallback(
|
|
14
|
+
(el) => {
|
|
15
|
+
if (!el || !showTooltip) return;
|
|
16
|
+
syncTooltipText(el, formatTooltip);
|
|
17
|
+
},
|
|
18
|
+
[showTooltip, formatTooltip]
|
|
19
|
+
);
|
|
20
|
+
return /* @__PURE__ */ jsxs(
|
|
21
|
+
SliderPrimitive.Thumb,
|
|
22
|
+
{
|
|
23
|
+
ref: thumbRef,
|
|
24
|
+
"data-index": index,
|
|
25
|
+
"aria-label": ariaLabel,
|
|
26
|
+
"aria-labelledby": ariaLabelledBy,
|
|
27
|
+
onPointerDown: (e) => {
|
|
28
|
+
if (showTooltip) syncTooltipText(e.currentTarget, formatTooltip);
|
|
29
|
+
},
|
|
30
|
+
onPointerMove: (e) => {
|
|
31
|
+
if (showTooltip) syncTooltipText(e.currentTarget, formatTooltip);
|
|
32
|
+
},
|
|
33
|
+
onKeyDown: (e) => {
|
|
34
|
+
if (showTooltip) {
|
|
35
|
+
requestAnimationFrame(() => syncTooltipText(e.currentTarget, formatTooltip));
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
className: cn(
|
|
39
|
+
"flex size-6 items-center justify-center rounded-full border border-neutral-100 bg-background-inverse-solid shadow-sm",
|
|
40
|
+
"transition-shadow duration-150",
|
|
41
|
+
"hover:ring-2 hover:ring-brand-green-500",
|
|
42
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-purple-500 focus-visible:ring-offset-2 focus-visible:ring-offset-background-inverse-solid",
|
|
43
|
+
"data-disabled:cursor-not-allowed"
|
|
44
|
+
),
|
|
45
|
+
children: [
|
|
46
|
+
/* @__PURE__ */ jsx("span", { className: "block size-3 rounded-full bg-brand-green-500 shadow-[inset_0px_1px_2px_0px_rgba(0,0,0,0.1)]" }),
|
|
47
|
+
showTooltip && /* @__PURE__ */ jsx(
|
|
48
|
+
"span",
|
|
49
|
+
{
|
|
50
|
+
role: "tooltip",
|
|
51
|
+
"data-slider-tooltip": true,
|
|
52
|
+
className: "typography-caption-semibold pointer-events-none absolute bottom-full mb-2 rounded-3xl bg-background-solid px-2 py-1 text-background-inverse-solid shadow-sm"
|
|
53
|
+
}
|
|
54
|
+
)
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
function syncTooltipText(thumb, formatTooltip) {
|
|
60
|
+
const raw = thumb.getAttribute("aria-valuenow");
|
|
61
|
+
const tooltip = thumb.querySelector("[data-slider-tooltip]");
|
|
62
|
+
if (raw == null || !tooltip) return;
|
|
63
|
+
const num = Number(raw);
|
|
64
|
+
tooltip.textContent = formatTooltip ? formatTooltip(num) : String(num);
|
|
65
|
+
}
|
|
66
|
+
export {
|
|
67
|
+
SliderThumb
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=SliderThumb.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SliderThumb.mjs","sources":["../../../src/components/Slider/SliderThumb.tsx"],"sourcesContent":["import * as SliderPrimitive from \"@radix-ui/react-slider\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\ninterface SliderThumbProps {\n showTooltip: boolean;\n formatTooltip?: (value: number) => string;\n index: number;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n}\n\nexport function SliderThumb({\n showTooltip,\n formatTooltip,\n index,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n}: SliderThumbProps) {\n const thumbRef = React.useCallback(\n (el: HTMLSpanElement | null) => {\n if (!el || !showTooltip) return;\n syncTooltipText(el, formatTooltip);\n },\n [showTooltip, formatTooltip],\n );\n\n return (\n <SliderPrimitive.Thumb\n ref={thumbRef}\n data-index={index}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n onPointerDown={(e) => {\n if (showTooltip) syncTooltipText(e.currentTarget, formatTooltip);\n }}\n onPointerMove={(e) => {\n if (showTooltip) syncTooltipText(e.currentTarget, formatTooltip);\n }}\n onKeyDown={(e) => {\n if (showTooltip) {\n requestAnimationFrame(() => syncTooltipText(e.currentTarget, formatTooltip));\n }\n }}\n className={cn(\n \"flex size-6 items-center justify-center rounded-full border border-neutral-100 bg-background-inverse-solid shadow-sm\",\n \"transition-shadow duration-150\",\n \"hover:ring-2 hover:ring-brand-green-500\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-purple-500 focus-visible:ring-offset-2 focus-visible:ring-offset-background-inverse-solid\",\n \"data-disabled:cursor-not-allowed\",\n )}\n >\n <span className=\"block size-3 rounded-full bg-brand-green-500 shadow-[inset_0px_1px_2px_0px_rgba(0,0,0,0.1)]\" />\n\n {showTooltip && (\n <span\n role=\"tooltip\"\n data-slider-tooltip\n className=\"typography-caption-semibold pointer-events-none absolute bottom-full mb-2 rounded-3xl bg-background-solid px-2 py-1 text-background-inverse-solid shadow-sm\"\n />\n )}\n </SliderPrimitive.Thumb>\n );\n}\n\nfunction syncTooltipText(thumb: HTMLElement, formatTooltip?: (value: number) => string) {\n const raw = thumb.getAttribute(\"aria-valuenow\");\n const tooltip = thumb.querySelector<HTMLSpanElement>(\"[data-slider-tooltip]\");\n if (raw == null || !tooltip) return;\n const num = Number(raw);\n tooltip.textContent = formatTooltip ? formatTooltip(num) : String(num);\n}\n"],"names":[],"mappings":";;;;;AAYO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,mBAAmB;AACrB,GAAqB;AACnB,QAAM,WAAW,MAAM;AAAA,IACrB,CAAC,OAA+B;AAC9B,UAAI,CAAC,MAAM,CAAC,YAAa;AACzB,sBAAgB,IAAI,aAAa;AAAA,IACnC;AAAA,IACA,CAAC,aAAa,aAAa;AAAA,EAAA;AAG7B,SACE;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,KAAK;AAAA,MACL,cAAY;AAAA,MACZ,cAAY;AAAA,MACZ,mBAAiB;AAAA,MACjB,eAAe,CAAC,MAAM;AACpB,YAAI,YAAa,iBAAgB,EAAE,eAAe,aAAa;AAAA,MACjE;AAAA,MACA,eAAe,CAAC,MAAM;AACpB,YAAI,YAAa,iBAAgB,EAAE,eAAe,aAAa;AAAA,MACjE;AAAA,MACA,WAAW,CAAC,MAAM;AAChB,YAAI,aAAa;AACf,gCAAsB,MAAM,gBAAgB,EAAE,eAAe,aAAa,CAAC;AAAA,QAC7E;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,WAAU,8FAAA,CAA8F;AAAA,QAE7G,eACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,uBAAmB;AAAA,YACnB,WAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MACZ;AAAA,IAAA;AAAA,EAAA;AAIR;AAEA,SAAS,gBAAgB,OAAoB,eAA2C;AACtF,QAAM,MAAM,MAAM,aAAa,eAAe;AAC9C,QAAM,UAAU,MAAM,cAA+B,uBAAuB;AAC5E,MAAI,OAAO,QAAQ,CAAC,QAAS;AAC7B,QAAM,MAAM,OAAO,GAAG;AACtB,UAAQ,cAAc,gBAAgB,cAAc,GAAG,IAAI,OAAO,GAAG;AACvE;"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { cn } from "../../utils/cn.mjs";
|
|
5
|
+
import { Button } from "../Button/Button.mjs";
|
|
6
|
+
import { CrossIcon } from "../Icons/CrossIcon.mjs";
|
|
7
|
+
function CloseButton({ onClose, className }) {
|
|
8
|
+
return /* @__PURE__ */ jsx(
|
|
9
|
+
Button,
|
|
10
|
+
{
|
|
11
|
+
variant: "tertiary",
|
|
12
|
+
size: "24",
|
|
13
|
+
onClick: onClose,
|
|
14
|
+
className: cn("h-auto shrink-0", className),
|
|
15
|
+
"aria-label": "Close snackbar",
|
|
16
|
+
children: /* @__PURE__ */ jsx(CrossIcon, {})
|
|
17
|
+
}
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
function resolveCtaSlot(slot, label, onClick, buttonProps) {
|
|
21
|
+
if (slot) return slot;
|
|
22
|
+
if (label) {
|
|
23
|
+
return /* @__PURE__ */ jsx(Button, { onClick, ...buttonProps, children: label });
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
function VipEarnContent({
|
|
28
|
+
icon,
|
|
29
|
+
title,
|
|
30
|
+
description,
|
|
31
|
+
showActions,
|
|
32
|
+
primarySlot,
|
|
33
|
+
primaryLabel,
|
|
34
|
+
primaryOnClick
|
|
35
|
+
}) {
|
|
36
|
+
const primary = resolveCtaSlot(primarySlot, primaryLabel, primaryOnClick, {
|
|
37
|
+
variant: "text",
|
|
38
|
+
size: "24"
|
|
39
|
+
});
|
|
40
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
41
|
+
icon && /* @__PURE__ */ jsx("span", { className: "flex shrink-0", "aria-hidden": "true", children: icon }),
|
|
42
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-4", children: [
|
|
43
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
|
|
44
|
+
title && /* @__PURE__ */ jsx("p", { className: "typography-body-1-semibold text-body-100 leading-6", children: title }),
|
|
45
|
+
description && /* @__PURE__ */ jsx("p", { className: "typography-body-2-regular text-body-200", children: description })
|
|
46
|
+
] }),
|
|
47
|
+
showActions && primary && /* @__PURE__ */ jsx("div", { className: "self-start", children: primary })
|
|
48
|
+
] })
|
|
49
|
+
] });
|
|
50
|
+
}
|
|
51
|
+
function WelcomeContent({
|
|
52
|
+
title,
|
|
53
|
+
description,
|
|
54
|
+
showActions,
|
|
55
|
+
primarySlot,
|
|
56
|
+
primaryLabel,
|
|
57
|
+
primaryOnClick,
|
|
58
|
+
secondarySlot,
|
|
59
|
+
secondaryLabel,
|
|
60
|
+
secondaryOnClick
|
|
61
|
+
}) {
|
|
62
|
+
const primary = resolveCtaSlot(primarySlot, primaryLabel, primaryOnClick, {
|
|
63
|
+
variant: "primary"
|
|
64
|
+
});
|
|
65
|
+
const secondary = resolveCtaSlot(secondarySlot, secondaryLabel, secondaryOnClick, {
|
|
66
|
+
variant: "secondary"
|
|
67
|
+
});
|
|
68
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
69
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-2 px-8 text-center text-body-100", children: [
|
|
70
|
+
title && /* @__PURE__ */ jsx("p", { className: "typography-heading-4 text-body-100", children: title }),
|
|
71
|
+
description && /* @__PURE__ */ jsx("p", { className: "typography-body-2-regular text-body-200", children: description })
|
|
72
|
+
] }),
|
|
73
|
+
showActions && (primary || secondary) && /* @__PURE__ */ jsxs("div", { className: "flex w-full flex-col gap-4 px-8 sm:flex-row sm:*:flex-1", children: [
|
|
74
|
+
secondary,
|
|
75
|
+
primary
|
|
76
|
+
] })
|
|
77
|
+
] });
|
|
78
|
+
}
|
|
79
|
+
function DefaultContent({
|
|
80
|
+
children,
|
|
81
|
+
showActions,
|
|
82
|
+
primarySlot,
|
|
83
|
+
primaryLabel,
|
|
84
|
+
primaryOnClick,
|
|
85
|
+
secondarySlot,
|
|
86
|
+
secondaryLabel,
|
|
87
|
+
secondaryOnClick
|
|
88
|
+
}) {
|
|
89
|
+
const primary = resolveCtaSlot(primarySlot, primaryLabel, primaryOnClick, {
|
|
90
|
+
variant: "primary",
|
|
91
|
+
size: "40"
|
|
92
|
+
});
|
|
93
|
+
const secondary = resolveCtaSlot(secondarySlot, secondaryLabel, secondaryOnClick, {
|
|
94
|
+
variant: "tertiary",
|
|
95
|
+
size: "40"
|
|
96
|
+
});
|
|
97
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
98
|
+
/* @__PURE__ */ jsx("div", { className: "typography-body-1-medium flex min-w-0 flex-1 items-center self-stretch text-body-100", children }),
|
|
99
|
+
showActions && (primary || secondary) && /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-start gap-2", children: [
|
|
100
|
+
primary,
|
|
101
|
+
secondary
|
|
102
|
+
] })
|
|
103
|
+
] });
|
|
104
|
+
}
|
|
105
|
+
const Snackbar = React.forwardRef(
|
|
106
|
+
({
|
|
107
|
+
className,
|
|
108
|
+
variant = "default",
|
|
109
|
+
icon,
|
|
110
|
+
title,
|
|
111
|
+
description,
|
|
112
|
+
showActions = true,
|
|
113
|
+
primaryLabel,
|
|
114
|
+
primaryOnClick,
|
|
115
|
+
primarySlot,
|
|
116
|
+
secondaryLabel,
|
|
117
|
+
secondaryOnClick,
|
|
118
|
+
secondarySlot,
|
|
119
|
+
closable = false,
|
|
120
|
+
onClose,
|
|
121
|
+
children,
|
|
122
|
+
...props
|
|
123
|
+
}, ref) => {
|
|
124
|
+
return (
|
|
125
|
+
/* biome-ignore lint/a11y/useSemanticElements: output cannot contain div children; browsers would break the wrapper. */
|
|
126
|
+
/* @__PURE__ */ jsxs(
|
|
127
|
+
"div",
|
|
128
|
+
{
|
|
129
|
+
ref,
|
|
130
|
+
role: "status",
|
|
131
|
+
"data-testid": "snackbar",
|
|
132
|
+
className: cn(
|
|
133
|
+
"flex gap-4 rounded-2xl",
|
|
134
|
+
(variant === "default" || variant === "vipEarn") && "border border-neutral-50 bg-background-200 p-4 backdrop-blur-md",
|
|
135
|
+
variant === "default" && "flex-wrap items-start",
|
|
136
|
+
variant === "vipEarn" && "items-start",
|
|
137
|
+
variant === "welcome" && "relative flex-col items-center bg-background-inverse-solid py-6",
|
|
138
|
+
className
|
|
139
|
+
),
|
|
140
|
+
...props,
|
|
141
|
+
children: [
|
|
142
|
+
variant === "vipEarn" && /* @__PURE__ */ jsx(
|
|
143
|
+
VipEarnContent,
|
|
144
|
+
{
|
|
145
|
+
icon,
|
|
146
|
+
title,
|
|
147
|
+
description,
|
|
148
|
+
showActions,
|
|
149
|
+
primarySlot,
|
|
150
|
+
primaryLabel,
|
|
151
|
+
primaryOnClick
|
|
152
|
+
}
|
|
153
|
+
),
|
|
154
|
+
variant === "welcome" && /* @__PURE__ */ jsx(
|
|
155
|
+
WelcomeContent,
|
|
156
|
+
{
|
|
157
|
+
title,
|
|
158
|
+
description,
|
|
159
|
+
showActions,
|
|
160
|
+
primarySlot,
|
|
161
|
+
primaryLabel,
|
|
162
|
+
primaryOnClick,
|
|
163
|
+
secondarySlot,
|
|
164
|
+
secondaryLabel,
|
|
165
|
+
secondaryOnClick
|
|
166
|
+
}
|
|
167
|
+
),
|
|
168
|
+
variant === "default" && /* @__PURE__ */ jsx(
|
|
169
|
+
DefaultContent,
|
|
170
|
+
{
|
|
171
|
+
showActions,
|
|
172
|
+
primarySlot,
|
|
173
|
+
primaryLabel,
|
|
174
|
+
primaryOnClick,
|
|
175
|
+
secondarySlot,
|
|
176
|
+
secondaryLabel,
|
|
177
|
+
secondaryOnClick,
|
|
178
|
+
children
|
|
179
|
+
}
|
|
180
|
+
),
|
|
181
|
+
closable && /* @__PURE__ */ jsx(
|
|
182
|
+
CloseButton,
|
|
183
|
+
{
|
|
184
|
+
onClose,
|
|
185
|
+
className: variant === "welcome" ? "absolute top-2 right-2" : void 0
|
|
186
|
+
}
|
|
187
|
+
)
|
|
188
|
+
]
|
|
189
|
+
}
|
|
190
|
+
)
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
);
|
|
194
|
+
Snackbar.displayName = "Snackbar";
|
|
195
|
+
export {
|
|
196
|
+
Snackbar
|
|
197
|
+
};
|
|
198
|
+
//# sourceMappingURL=Snackbar.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Snackbar.mjs","sources":["../../../src/components/Snackbar/Snackbar.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../Button/Button\";\nimport { CrossIcon } from \"../Icons/CrossIcon\";\n\nexport type SnackbarVariant = \"default\" | \"vipEarn\" | \"welcome\";\n\nexport interface SnackbarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Snackbar layout variant */\n variant?: SnackbarVariant;\n /** Left icon element */\n icon?: React.ReactNode;\n /** Title text */\n title?: React.ReactNode;\n /** Description text */\n description?: React.ReactNode;\n /** Whether to show the actions section */\n showActions?: boolean;\n /** Primary CTA label (renders a default Button) */\n primaryLabel?: string;\n /** Primary CTA click handler (used with primaryLabel) */\n primaryOnClick?: () => void;\n /** Custom element to render as primary CTA (overrides primaryLabel/primaryOnClick) */\n primarySlot?: React.ReactNode;\n /** Secondary CTA label (renders a default Button) */\n secondaryLabel?: string;\n /** Secondary CTA click handler (used with secondaryLabel) */\n secondaryOnClick?: () => void;\n /** Custom element to render as secondary CTA (overrides secondaryLabel/secondaryOnClick) */\n secondarySlot?: React.ReactNode;\n /** Show close button */\n closable?: boolean;\n /** Close button click handler */\n onClose?: () => void;\n}\n\nfunction CloseButton({ onClose, className }: { onClose?: () => void; className?: string }) {\n return (\n <Button\n variant=\"tertiary\"\n size=\"24\"\n onClick={onClose}\n className={cn(\"h-auto shrink-0\", className)}\n aria-label=\"Close snackbar\"\n >\n <CrossIcon />\n </Button>\n );\n}\n\n/**\n * Resolves a CTA slot. If a custom slot is provided it takes precedence,\n * otherwise a default Button is rendered from label + onClick.\n */\nfunction resolveCtaSlot(\n slot: React.ReactNode | undefined,\n label: string | undefined,\n onClick: (() => void) | undefined,\n buttonProps: React.ComponentProps<typeof Button>,\n): React.ReactNode | null {\n if (slot) return slot;\n if (label) {\n return (\n <Button onClick={onClick} {...buttonProps}>\n {label}\n </Button>\n );\n }\n return null;\n}\n\nfunction VipEarnContent({\n icon,\n title,\n description,\n showActions,\n primarySlot,\n primaryLabel,\n primaryOnClick,\n}: Pick<\n SnackbarProps,\n | \"icon\"\n | \"title\"\n | \"description\"\n | \"showActions\"\n | \"primarySlot\"\n | \"primaryLabel\"\n | \"primaryOnClick\"\n>) {\n const primary = resolveCtaSlot(primarySlot, primaryLabel, primaryOnClick, {\n variant: \"text\",\n size: \"24\",\n });\n\n return (\n <>\n {icon && (\n <span className=\"flex shrink-0\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <div className=\"flex min-w-0 flex-1 flex-col gap-4\">\n <div className=\"flex flex-col\">\n {title && <p className=\"typography-body-1-semibold text-body-100 leading-6\">{title}</p>}\n {description && <p className=\"typography-body-2-regular text-body-200\">{description}</p>}\n </div>\n {showActions && primary && <div className=\"self-start\">{primary}</div>}\n </div>\n </>\n );\n}\n\nfunction WelcomeContent({\n title,\n description,\n showActions,\n primarySlot,\n primaryLabel,\n primaryOnClick,\n secondarySlot,\n secondaryLabel,\n secondaryOnClick,\n}: Pick<\n SnackbarProps,\n | \"title\"\n | \"description\"\n | \"showActions\"\n | \"primarySlot\"\n | \"primaryLabel\"\n | \"primaryOnClick\"\n | \"secondarySlot\"\n | \"secondaryLabel\"\n | \"secondaryOnClick\"\n>) {\n const primary = resolveCtaSlot(primarySlot, primaryLabel, primaryOnClick, {\n variant: \"primary\",\n });\n const secondary = resolveCtaSlot(secondarySlot, secondaryLabel, secondaryOnClick, {\n variant: \"secondary\",\n });\n\n return (\n <>\n <div className=\"flex flex-col items-center gap-2 px-8 text-center text-body-100\">\n {title && <p className=\"typography-heading-4 text-body-100\">{title}</p>}\n {description && <p className=\"typography-body-2-regular text-body-200\">{description}</p>}\n </div>\n {showActions && (primary || secondary) && (\n <div className=\"flex w-full flex-col gap-4 px-8 sm:flex-row sm:*:flex-1\">\n {secondary}\n {primary}\n </div>\n )}\n </>\n );\n}\n\nfunction DefaultContent({\n children,\n showActions,\n primarySlot,\n primaryLabel,\n primaryOnClick,\n secondarySlot,\n secondaryLabel,\n secondaryOnClick,\n}: Pick<\n SnackbarProps,\n | \"children\"\n | \"showActions\"\n | \"primarySlot\"\n | \"primaryLabel\"\n | \"primaryOnClick\"\n | \"secondarySlot\"\n | \"secondaryLabel\"\n | \"secondaryOnClick\"\n>) {\n const primary = resolveCtaSlot(primarySlot, primaryLabel, primaryOnClick, {\n variant: \"primary\",\n size: \"40\",\n });\n const secondary = resolveCtaSlot(secondarySlot, secondaryLabel, secondaryOnClick, {\n variant: \"tertiary\",\n size: \"40\",\n });\n\n return (\n <>\n <div className=\"typography-body-1-medium flex min-w-0 flex-1 items-center self-stretch text-body-100\">\n {children}\n </div>\n {showActions && (primary || secondary) && (\n <div className=\"flex shrink-0 items-start gap-2\">\n {primary}\n {secondary}\n </div>\n )}\n </>\n );\n}\n\nexport const Snackbar = React.forwardRef<HTMLDivElement, SnackbarProps>(\n (\n {\n className,\n variant = \"default\",\n icon,\n title,\n description,\n showActions = true,\n primaryLabel,\n primaryOnClick,\n primarySlot,\n secondaryLabel,\n secondaryOnClick,\n secondarySlot,\n closable = false,\n onClose,\n children,\n ...props\n },\n ref,\n ) => {\n return (\n /* biome-ignore lint/a11y/useSemanticElements: output cannot contain div children; browsers would break the wrapper. */\n <div\n ref={ref}\n role=\"status\"\n data-testid=\"snackbar\"\n className={cn(\n \"flex gap-4 rounded-2xl\",\n (variant === \"default\" || variant === \"vipEarn\") &&\n \"border border-neutral-50 bg-background-200 p-4 backdrop-blur-md\",\n variant === \"default\" && \"flex-wrap items-start\",\n variant === \"vipEarn\" && \"items-start\",\n variant === \"welcome\" &&\n \"relative flex-col items-center bg-background-inverse-solid py-6\",\n className,\n )}\n {...props}\n >\n {variant === \"vipEarn\" && (\n <VipEarnContent\n icon={icon}\n title={title}\n description={description}\n showActions={showActions}\n primarySlot={primarySlot}\n primaryLabel={primaryLabel}\n primaryOnClick={primaryOnClick}\n />\n )}\n {variant === \"welcome\" && (\n <WelcomeContent\n title={title}\n description={description}\n showActions={showActions}\n primarySlot={primarySlot}\n primaryLabel={primaryLabel}\n primaryOnClick={primaryOnClick}\n secondarySlot={secondarySlot}\n secondaryLabel={secondaryLabel}\n secondaryOnClick={secondaryOnClick}\n />\n )}\n {variant === \"default\" && (\n <DefaultContent\n showActions={showActions}\n primarySlot={primarySlot}\n primaryLabel={primaryLabel}\n primaryOnClick={primaryOnClick}\n secondarySlot={secondarySlot}\n secondaryLabel={secondaryLabel}\n secondaryOnClick={secondaryOnClick}\n >\n {children}\n </DefaultContent>\n )}\n {closable && (\n <CloseButton\n onClose={onClose}\n className={variant === \"welcome\" ? \"absolute top-2 right-2\" : undefined}\n />\n )}\n </div>\n );\n },\n);\n\nSnackbar.displayName = \"Snackbar\";\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as SwitchPrimitive from "@radix-ui/react-switch";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { cn } from "../../utils/cn.mjs";
|
|
6
|
+
const Switch = React.forwardRef(({ className, size = "default", ...props }, ref) => {
|
|
7
|
+
const thumbSizeClass = size === "default" ? "size-4.5 translate-x-0.75 data-[state=checked]:translate-x-4.75" : "size-4 translate-x-0.5 data-[state=checked]:translate-x-4.25";
|
|
8
|
+
return /* @__PURE__ */ jsx(
|
|
9
|
+
SwitchPrimitive.Root,
|
|
10
|
+
{
|
|
11
|
+
ref,
|
|
12
|
+
className: cn(
|
|
13
|
+
"inline-flex shrink-0 cursor-pointer items-center rounded-full border border-transparent transition-colors duration-150",
|
|
14
|
+
"focus-visible:shadow-focus-ring focus-visible:outline-none",
|
|
15
|
+
"data-[state=checked]:border-neutral-200 data-[state=checked]:bg-brand-green-500",
|
|
16
|
+
"data-[state=unchecked]:bg-neutral-400",
|
|
17
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
18
|
+
size === "default" && "h-6 w-10.5",
|
|
19
|
+
size === "small" && "h-5 w-9",
|
|
20
|
+
className
|
|
21
|
+
),
|
|
22
|
+
...props,
|
|
23
|
+
children: /* @__PURE__ */ jsx(
|
|
24
|
+
SwitchPrimitive.Thumb,
|
|
25
|
+
{
|
|
26
|
+
className: cn(
|
|
27
|
+
"pointer-events-none rounded-full bg-body-white-solid-constant shadow-sm transition-transform duration-150 dark:bg-body-black-solid-constant",
|
|
28
|
+
thumbSizeClass
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
});
|
|
35
|
+
Switch.displayName = "Switch";
|
|
36
|
+
export {
|
|
37
|
+
Switch
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=Switch.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Switch.mjs","sources":["../../../src/components/Switch/Switch.tsx"],"sourcesContent":["import * as SwitchPrimitive from \"@radix-ui/react-switch\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type SwitchSize = \"default\" | \"small\";\n\nexport interface SwitchProps\n extends Omit<React.ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>, \"asChild\"> {\n /** Size variant of the switch */\n size?: SwitchSize;\n}\n\nexport const Switch = React.forwardRef<\n React.ComponentRef<typeof SwitchPrimitive.Root>,\n SwitchProps\n>(({ className, size = \"default\", ...props }, ref) => {\n const thumbSizeClass =\n size === \"default\"\n ? \"size-4.5 translate-x-0.75 data-[state=checked]:translate-x-4.75\"\n : \"size-4 translate-x-0.5 data-[state=checked]:translate-x-4.25\";\n\n return (\n <SwitchPrimitive.Root\n ref={ref}\n className={cn(\n \"inline-flex shrink-0 cursor-pointer items-center rounded-full border border-transparent transition-colors duration-150\",\n \"focus-visible:shadow-focus-ring focus-visible:outline-none\",\n \"data-[state=checked]:border-neutral-200 data-[state=checked]:bg-brand-green-500\",\n \"data-[state=unchecked]:bg-neutral-400\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n size === \"default\" && \"h-6 w-10.5\",\n size === \"small\" && \"h-5 w-9\",\n className,\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n className={cn(\n \"pointer-events-none rounded-full bg-body-white-solid-constant shadow-sm transition-transform duration-150 dark:bg-body-black-solid-constant\",\n thumbSizeClass,\n )}\n />\n </SwitchPrimitive.Root>\n );\n});\n\nSwitch.displayName = \"Switch\";\n"],"names":[],"mappings":";;;;;AAYO,MAAM,SAAS,MAAM,WAG1B,CAAC,EAAE,WAAW,OAAO,WAAW,GAAG,MAAA,GAAS,QAAQ;AACpD,QAAM,iBACJ,SAAS,YACL,oEACA;AAEN,SACE;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,aAAa;AAAA,QACtB,SAAS,WAAW;AAAA,QACpB;AAAA,MAAA;AAAA,MAED,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAC,gBAAgB;AAAA,QAAhB;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAGN,CAAC;AAED,OAAO,cAAc;"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { cn } from "../../utils/cn.mjs";
|
|
5
|
+
import { InfoCircleIcon } from "../Icons/InfoCircleIcon.mjs";
|
|
6
|
+
import { Switch } from "../Switch/Switch.mjs";
|
|
7
|
+
const SwitchField = React.forwardRef(
|
|
8
|
+
({
|
|
9
|
+
className,
|
|
10
|
+
orientation = "right",
|
|
11
|
+
size = "default",
|
|
12
|
+
label,
|
|
13
|
+
helperText,
|
|
14
|
+
infoText,
|
|
15
|
+
disabled,
|
|
16
|
+
id: propId,
|
|
17
|
+
...props
|
|
18
|
+
}, ref) => {
|
|
19
|
+
const generatedId = React.useId();
|
|
20
|
+
const id = propId ?? generatedId;
|
|
21
|
+
const helperTextId = helperText ? `${id}-helper` : void 0;
|
|
22
|
+
const switchElement = /* @__PURE__ */ jsx(
|
|
23
|
+
Switch,
|
|
24
|
+
{
|
|
25
|
+
ref,
|
|
26
|
+
id,
|
|
27
|
+
size,
|
|
28
|
+
disabled,
|
|
29
|
+
"aria-describedby": helperTextId,
|
|
30
|
+
...props
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
const labelContent = (label || helperText) && /* @__PURE__ */ jsxs(
|
|
34
|
+
"div",
|
|
35
|
+
{
|
|
36
|
+
className: cn(
|
|
37
|
+
"flex min-w-0 flex-1 flex-col items-start",
|
|
38
|
+
size === "default" ? "gap-1" : "gap-0.5"
|
|
39
|
+
),
|
|
40
|
+
children: [
|
|
41
|
+
label && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
42
|
+
/* @__PURE__ */ jsx(
|
|
43
|
+
"label",
|
|
44
|
+
{
|
|
45
|
+
htmlFor: id,
|
|
46
|
+
className: cn(
|
|
47
|
+
"cursor-pointer select-none text-body-100",
|
|
48
|
+
disabled && "cursor-not-allowed text-disabled-100",
|
|
49
|
+
size === "default" ? "typography-body-1-semibold" : "typography-body-2-semibold"
|
|
50
|
+
),
|
|
51
|
+
children: label
|
|
52
|
+
}
|
|
53
|
+
),
|
|
54
|
+
infoText && /* @__PURE__ */ jsxs("span", { className: "group relative flex shrink-0 pt-0.5", children: [
|
|
55
|
+
/* @__PURE__ */ jsx(InfoCircleIcon, { className: "size-5 text-body-200" }),
|
|
56
|
+
/* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute top-full left-1/2 mt-1 -translate-x-1/2 rounded-lg bg-neutral-400 px-3 py-1.5 text-body-white-solid-constant text-xs leading-none opacity-0 transition-opacity group-hover:opacity-100", children: infoText })
|
|
57
|
+
] })
|
|
58
|
+
] }),
|
|
59
|
+
helperText && /* @__PURE__ */ jsx(
|
|
60
|
+
"span",
|
|
61
|
+
{
|
|
62
|
+
id: helperTextId,
|
|
63
|
+
className: cn(
|
|
64
|
+
"text-body-200",
|
|
65
|
+
// !TODO https://linear.app/fanvue/issue/ENG-7301/swap-out-typography-tailwind-utility-classes
|
|
66
|
+
disabled && "text-disabled-100",
|
|
67
|
+
size === "default" ? "typography-body-2-regular" : "typography-caption-regular"
|
|
68
|
+
),
|
|
69
|
+
children: helperText
|
|
70
|
+
}
|
|
71
|
+
)
|
|
72
|
+
]
|
|
73
|
+
}
|
|
74
|
+
);
|
|
75
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("flex items-start gap-2", disabled && "cursor-not-allowed", className), children: [
|
|
76
|
+
orientation === "left" && switchElement,
|
|
77
|
+
labelContent,
|
|
78
|
+
orientation === "right" && switchElement
|
|
79
|
+
] });
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
SwitchField.displayName = "SwitchField";
|
|
83
|
+
export {
|
|
84
|
+
SwitchField
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=SwitchField.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwitchField.mjs","sources":["../../../src/components/SwitchField/SwitchField.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { InfoCircleIcon } from \"../Icons/InfoCircleIcon\";\nimport { Switch, type SwitchSize } from \"../Switch/Switch\";\n\nexport type SwitchFieldOrientation = \"right\" | \"left\";\n\nexport interface SwitchFieldProps\n extends Omit<React.ComponentPropsWithoutRef<typeof Switch>, \"size\" | \"className\"> {\n /** Position of the switch relative to the label */\n orientation?: SwitchFieldOrientation;\n /** Size variant of the switch and text */\n size?: SwitchSize;\n /** Label text displayed next to the switch */\n label?: string;\n /** Helper text displayed below the label */\n helperText?: string;\n /** Info tooltip text displayed on hover of the info icon */\n infoText?: string;\n /** Additional className for the wrapper */\n className?: string;\n}\n\nexport const SwitchField = React.forwardRef<React.ComponentRef<typeof Switch>, SwitchFieldProps>(\n (\n {\n className,\n orientation = \"right\",\n size = \"default\",\n label,\n helperText,\n infoText,\n disabled,\n id: propId,\n ...props\n },\n ref,\n ) => {\n const generatedId = React.useId();\n const id = propId ?? generatedId;\n const helperTextId = helperText ? `${id}-helper` : undefined;\n\n const switchElement = (\n <Switch\n ref={ref}\n id={id}\n size={size}\n disabled={disabled}\n aria-describedby={helperTextId}\n {...props}\n />\n );\n\n const labelContent = (label || helperText) && (\n <div\n className={cn(\n \"flex min-w-0 flex-1 flex-col items-start\",\n size === \"default\" ? \"gap-1\" : \"gap-0.5\",\n )}\n >\n {label && (\n <div className=\"flex items-center gap-1\">\n <label\n htmlFor={id}\n className={cn(\n \"cursor-pointer select-none text-body-100\",\n disabled && \"cursor-not-allowed text-disabled-100\",\n size === \"default\" ? \"typography-body-1-semibold\" : \"typography-body-2-semibold\",\n )}\n >\n {label}\n </label>\n {infoText && (\n <span className=\"group relative flex shrink-0 pt-0.5\">\n <InfoCircleIcon className=\"size-5 text-body-200\" />\n <span className=\"pointer-events-none absolute top-full left-1/2 mt-1 -translate-x-1/2 rounded-lg bg-neutral-400 px-3 py-1.5 text-body-white-solid-constant text-xs leading-none opacity-0 transition-opacity group-hover:opacity-100\">\n {/*!TODO Replace with Tooltip once built\n https://linear.app/fanvue/issue/ENG-7226/component-library-tooltip-component */}\n {infoText}\n </span>\n </span>\n )}\n </div>\n )}\n {helperText && (\n <span\n id={helperTextId}\n className={cn(\n \"text-body-200\", // !TODO https://linear.app/fanvue/issue/ENG-7301/swap-out-typography-tailwind-utility-classes\n disabled && \"text-disabled-100\",\n size === \"default\" ? \"typography-body-2-regular\" : \"typography-caption-regular\",\n )}\n >\n {helperText}\n </span>\n )}\n </div>\n );\n\n return (\n <div className={cn(\"flex items-start gap-2\", disabled && \"cursor-not-allowed\", className)}>\n {orientation === \"left\" && switchElement}\n {labelContent}\n {orientation === \"right\" && switchElement}\n </div>\n );\n },\n);\n\nSwitchField.displayName = \"SwitchField\";\n"],"names":[],"mappings":";;;;;;AAuBO,MAAM,cAAc,MAAM;AAAA,EAC/B,CACE;AAAA,IACE;AAAA,IACA,cAAc;AAAA,IACd,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,IAAI;AAAA,IACJ,GAAG;AAAA,EAAA,GAEL,QACG;AACH,UAAM,cAAc,MAAM,MAAA;AAC1B,UAAM,KAAK,UAAU;AACrB,UAAM,eAAe,aAAa,GAAG,EAAE,YAAY;AAEnD,UAAM,gBACJ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,oBAAkB;AAAA,QACjB,GAAG;AAAA,MAAA;AAAA,IAAA;AAIR,UAAM,gBAAgB,SAAS,eAC7B;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,SAAS,YAAY,UAAU;AAAA,QAAA;AAAA,QAGhC,UAAA;AAAA,UAAA,SACC,qBAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,YAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS;AAAA,gBACT,WAAW;AAAA,kBACT;AAAA,kBACA,YAAY;AAAA,kBACZ,SAAS,YAAY,+BAA+B;AAAA,gBAAA;AAAA,gBAGrD,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAEF,YACC,qBAAC,QAAA,EAAK,WAAU,uCACd,UAAA;AAAA,cAAA,oBAAC,gBAAA,EAAe,WAAU,uBAAA,CAAuB;AAAA,cACjD,oBAAC,QAAA,EAAK,WAAU,uNAGb,UAAA,SAAA,CACH;AAAA,YAAA,EAAA,CACF;AAAA,UAAA,GAEJ;AAAA,UAED,cACC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,cACJ,WAAW;AAAA,gBACT;AAAA;AAAA,gBACA,YAAY;AAAA,gBACZ,SAAS,YAAY,8BAA8B;AAAA,cAAA;AAAA,cAGpD,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACH;AAAA,MAAA;AAAA,IAAA;AAKN,WACE,qBAAC,SAAI,WAAW,GAAG,0BAA0B,YAAY,sBAAsB,SAAS,GACrF,UAAA;AAAA,MAAA,gBAAgB,UAAU;AAAA,MAC1B;AAAA,MACA,gBAAgB,WAAW;AAAA,IAAA,GAC9B;AAAA,EAEJ;AACF;AAEA,YAAY,cAAc;"}
|