@fanvue/ui 0.1.0-alpha.2 → 1.0.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.
Files changed (221) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/Alert/Alert.cjs +72 -0
  3. package/dist/cjs/components/Alert/Alert.cjs.map +1 -0
  4. package/dist/cjs/components/Avatar/Avatar.cjs +162 -0
  5. package/dist/cjs/components/Avatar/Avatar.cjs.map +1 -0
  6. package/dist/cjs/components/Badge/Badge.cjs +99 -0
  7. package/dist/cjs/components/Badge/Badge.cjs.map +1 -0
  8. package/dist/cjs/components/Button/Button.cjs +172 -0
  9. package/dist/cjs/components/Button/Button.cjs.map +1 -0
  10. package/dist/cjs/components/Checkbox/Checkbox.cjs +157 -0
  11. package/dist/cjs/components/Checkbox/Checkbox.cjs.map +1 -0
  12. package/dist/cjs/components/Chip/Chip.cjs +92 -0
  13. package/dist/cjs/components/Chip/Chip.cjs.map +1 -0
  14. package/dist/cjs/components/Count/Count.cjs +56 -0
  15. package/dist/cjs/components/Count/Count.cjs.map +1 -0
  16. package/dist/cjs/components/DatePicker/DatePicker.cjs +133 -0
  17. package/dist/cjs/components/DatePicker/DatePicker.cjs.map +1 -0
  18. package/dist/cjs/components/Divider/Divider.cjs +69 -0
  19. package/dist/cjs/components/Divider/Divider.cjs.map +1 -0
  20. package/dist/cjs/components/IconButton/IconButton.cjs +92 -0
  21. package/dist/cjs/components/IconButton/IconButton.cjs.map +1 -0
  22. package/dist/cjs/components/Icons/ArrowRightIcon.cjs +47 -0
  23. package/dist/cjs/components/Icons/ArrowRightIcon.cjs.map +1 -0
  24. package/dist/cjs/components/Icons/ArrowUpRightIcon.cjs +47 -0
  25. package/dist/cjs/components/Icons/ArrowUpRightIcon.cjs.map +1 -0
  26. package/dist/cjs/components/Icons/CheckCircleIcon.cjs +47 -0
  27. package/dist/cjs/components/Icons/CheckCircleIcon.cjs.map +1 -0
  28. package/dist/cjs/components/Icons/CheckIcon.cjs +49 -0
  29. package/dist/cjs/components/Icons/CheckIcon.cjs.map +1 -0
  30. package/dist/cjs/components/Icons/ChevronLeftIcon.cjs +49 -0
  31. package/dist/cjs/components/Icons/ChevronLeftIcon.cjs.map +1 -0
  32. package/dist/cjs/components/Icons/ChevronRightIcon.cjs +49 -0
  33. package/dist/cjs/components/Icons/ChevronRightIcon.cjs.map +1 -0
  34. package/dist/cjs/components/Icons/CloseIcon.cjs +46 -0
  35. package/dist/cjs/components/Icons/CloseIcon.cjs.map +1 -0
  36. package/dist/cjs/components/Icons/CrossIcon.cjs +40 -0
  37. package/dist/cjs/components/Icons/CrossIcon.cjs.map +1 -0
  38. package/dist/cjs/components/Icons/CrownIcon.cjs +40 -0
  39. package/dist/cjs/components/Icons/CrownIcon.cjs.map +1 -0
  40. package/dist/cjs/components/Icons/ErrorCircleIcon.cjs +47 -0
  41. package/dist/cjs/components/Icons/ErrorCircleIcon.cjs.map +1 -0
  42. package/dist/cjs/components/Icons/ErrorIcon.cjs +30 -0
  43. package/dist/cjs/components/Icons/ErrorIcon.cjs.map +1 -0
  44. package/dist/cjs/components/Icons/FireIcon.cjs +47 -0
  45. package/dist/cjs/components/Icons/FireIcon.cjs.map +1 -0
  46. package/dist/cjs/components/Icons/HomeIcon.cjs +40 -0
  47. package/dist/cjs/components/Icons/HomeIcon.cjs.map +1 -0
  48. package/dist/cjs/components/Icons/InfoCircleIcon.cjs +47 -0
  49. package/dist/cjs/components/Icons/InfoCircleIcon.cjs.map +1 -0
  50. package/dist/cjs/components/Icons/InfoIcon.cjs +30 -0
  51. package/dist/cjs/components/Icons/InfoIcon.cjs.map +1 -0
  52. package/dist/cjs/components/Icons/MicrophoneIcon.cjs +31 -0
  53. package/dist/cjs/components/Icons/MicrophoneIcon.cjs.map +1 -0
  54. package/dist/cjs/components/Icons/MinusIcon.cjs +40 -0
  55. package/dist/cjs/components/Icons/MinusIcon.cjs.map +1 -0
  56. package/dist/cjs/components/Icons/PlusIcon.cjs +40 -0
  57. package/dist/cjs/components/Icons/PlusIcon.cjs.map +1 -0
  58. package/dist/cjs/components/Icons/SpinnerIcon.cjs +43 -0
  59. package/dist/cjs/components/Icons/SpinnerIcon.cjs.map +1 -0
  60. package/dist/cjs/components/Icons/StopIcon.cjs +22 -0
  61. package/dist/cjs/components/Icons/StopIcon.cjs.map +1 -0
  62. package/dist/cjs/components/Icons/SuccessIcon.cjs +30 -0
  63. package/dist/cjs/components/Icons/SuccessIcon.cjs.map +1 -0
  64. package/dist/cjs/components/Icons/VipBadgeIcon.cjs +97 -0
  65. package/dist/cjs/components/Icons/VipBadgeIcon.cjs.map +1 -0
  66. package/dist/cjs/components/Icons/WarningIcon.cjs +30 -0
  67. package/dist/cjs/components/Icons/WarningIcon.cjs.map +1 -0
  68. package/dist/cjs/components/Icons/WarningTriangleIcon.cjs +47 -0
  69. package/dist/cjs/components/Icons/WarningTriangleIcon.cjs.map +1 -0
  70. package/dist/cjs/components/Logo/Logo.cjs +182 -0
  71. package/dist/cjs/components/Logo/Logo.cjs.map +1 -0
  72. package/dist/cjs/components/Pagination/Pagination.cjs +144 -0
  73. package/dist/cjs/components/Pagination/Pagination.cjs.map +1 -0
  74. package/dist/cjs/components/Pill/Pill.cjs +69 -0
  75. package/dist/cjs/components/Pill/Pill.cjs.map +1 -0
  76. package/dist/cjs/components/ProgressBar/ProgressBar.cjs +112 -0
  77. package/dist/cjs/components/ProgressBar/ProgressBar.cjs.map +1 -0
  78. package/dist/cjs/components/Radio/Radio.cjs +74 -0
  79. package/dist/cjs/components/Radio/Radio.cjs.map +1 -0
  80. package/dist/cjs/components/RadioGroup/RadioGroup.cjs +30 -0
  81. package/dist/cjs/components/RadioGroup/RadioGroup.cjs.map +1 -0
  82. package/dist/cjs/components/Slider/Slider.cjs +96 -0
  83. package/dist/cjs/components/Slider/Slider.cjs.map +1 -0
  84. package/dist/cjs/components/Slider/SliderLayout.cjs +31 -0
  85. package/dist/cjs/components/Slider/SliderLayout.cjs.map +1 -0
  86. package/dist/cjs/components/Slider/SliderThumb.cjs +87 -0
  87. package/dist/cjs/components/Slider/SliderThumb.cjs.map +1 -0
  88. package/dist/cjs/components/Snackbar/Snackbar.cjs +215 -0
  89. package/dist/cjs/components/Snackbar/Snackbar.cjs.map +1 -0
  90. package/dist/cjs/components/Switch/Switch.cjs +57 -0
  91. package/dist/cjs/components/Switch/Switch.cjs.map +1 -0
  92. package/dist/cjs/components/SwitchField/SwitchField.cjs +103 -0
  93. package/dist/cjs/components/SwitchField/SwitchField.cjs.map +1 -0
  94. package/dist/cjs/components/SwitchToggle/SwitchToggle.cjs +110 -0
  95. package/dist/cjs/components/SwitchToggle/SwitchToggle.cjs.map +1 -0
  96. package/dist/cjs/components/Tabs/Tabs.cjs +24 -0
  97. package/dist/cjs/components/Tabs/Tabs.cjs.map +1 -0
  98. package/dist/cjs/components/Tabs/TabsContent.cjs +36 -0
  99. package/dist/cjs/components/Tabs/TabsContent.cjs.map +1 -0
  100. package/dist/cjs/components/Tabs/TabsList.cjs +42 -0
  101. package/dist/cjs/components/Tabs/TabsList.cjs.map +1 -0
  102. package/dist/cjs/components/Tabs/TabsTrigger.cjs +50 -0
  103. package/dist/cjs/components/Tabs/TabsTrigger.cjs.map +1 -0
  104. package/dist/cjs/components/Toast/Toast.cjs +128 -0
  105. package/dist/cjs/components/Toast/Toast.cjs.map +1 -0
  106. package/dist/cjs/index.cjs +111 -0
  107. package/dist/cjs/index.cjs.map +1 -0
  108. package/dist/cjs/utils/cn.cjs +10 -0
  109. package/dist/cjs/utils/cn.cjs.map +1 -0
  110. package/dist/components/Alert/Alert.mjs +55 -0
  111. package/dist/components/Alert/Alert.mjs.map +1 -0
  112. package/dist/components/Avatar/Avatar.mjs +144 -0
  113. package/dist/components/Avatar/Avatar.mjs.map +1 -0
  114. package/dist/components/Badge/Badge.mjs +82 -0
  115. package/dist/components/Badge/Badge.mjs.map +1 -0
  116. package/dist/components/Button/Button.mjs +155 -0
  117. package/dist/components/Button/Button.mjs.map +1 -0
  118. package/dist/components/Checkbox/Checkbox.mjs +139 -0
  119. package/dist/components/Checkbox/Checkbox.mjs.map +1 -0
  120. package/dist/components/Chip/Chip.mjs +75 -0
  121. package/dist/components/Chip/Chip.mjs.map +1 -0
  122. package/dist/components/Count/Count.mjs +39 -0
  123. package/dist/components/Count/Count.mjs.map +1 -0
  124. package/dist/components/DatePicker/DatePicker.mjs +133 -0
  125. package/dist/components/DatePicker/DatePicker.mjs.map +1 -0
  126. package/dist/components/Divider/Divider.mjs +51 -0
  127. package/dist/components/Divider/Divider.mjs.map +1 -0
  128. package/dist/components/IconButton/IconButton.mjs +75 -0
  129. package/dist/components/IconButton/IconButton.mjs.map +1 -0
  130. package/dist/components/Icons/ArrowRightIcon.mjs +30 -0
  131. package/dist/components/Icons/ArrowRightIcon.mjs.map +1 -0
  132. package/dist/components/Icons/ArrowUpRightIcon.mjs +30 -0
  133. package/dist/components/Icons/ArrowUpRightIcon.mjs.map +1 -0
  134. package/dist/components/Icons/CheckCircleIcon.mjs +30 -0
  135. package/dist/components/Icons/CheckCircleIcon.mjs.map +1 -0
  136. package/dist/components/Icons/CheckIcon.mjs +32 -0
  137. package/dist/components/Icons/CheckIcon.mjs.map +1 -0
  138. package/dist/components/Icons/ChevronLeftIcon.mjs +32 -0
  139. package/dist/components/Icons/ChevronLeftIcon.mjs.map +1 -0
  140. package/dist/components/Icons/ChevronRightIcon.mjs +32 -0
  141. package/dist/components/Icons/ChevronRightIcon.mjs.map +1 -0
  142. package/dist/components/Icons/CloseIcon.mjs +29 -0
  143. package/dist/components/Icons/CloseIcon.mjs.map +1 -0
  144. package/dist/components/Icons/CrossIcon.mjs +23 -0
  145. package/dist/components/Icons/CrossIcon.mjs.map +1 -0
  146. package/dist/components/Icons/CrownIcon.mjs +23 -0
  147. package/dist/components/Icons/CrownIcon.mjs.map +1 -0
  148. package/dist/components/Icons/ErrorCircleIcon.mjs +30 -0
  149. package/dist/components/Icons/ErrorCircleIcon.mjs.map +1 -0
  150. package/dist/components/Icons/ErrorIcon.mjs +30 -0
  151. package/dist/components/Icons/ErrorIcon.mjs.map +1 -0
  152. package/dist/components/Icons/FireIcon.mjs +30 -0
  153. package/dist/components/Icons/FireIcon.mjs.map +1 -0
  154. package/dist/components/Icons/HomeIcon.mjs +23 -0
  155. package/dist/components/Icons/HomeIcon.mjs.map +1 -0
  156. package/dist/components/Icons/InfoCircleIcon.mjs +30 -0
  157. package/dist/components/Icons/InfoCircleIcon.mjs.map +1 -0
  158. package/dist/components/Icons/InfoIcon.mjs +30 -0
  159. package/dist/components/Icons/InfoIcon.mjs.map +1 -0
  160. package/dist/components/Icons/MicrophoneIcon.mjs +31 -0
  161. package/dist/components/Icons/MicrophoneIcon.mjs.map +1 -0
  162. package/dist/components/Icons/MinusIcon.mjs +23 -0
  163. package/dist/components/Icons/MinusIcon.mjs.map +1 -0
  164. package/dist/components/Icons/PlusIcon.mjs +23 -0
  165. package/dist/components/Icons/PlusIcon.mjs.map +1 -0
  166. package/dist/components/Icons/SpinnerIcon.mjs +26 -0
  167. package/dist/components/Icons/SpinnerIcon.mjs.map +1 -0
  168. package/dist/components/Icons/StopIcon.mjs +22 -0
  169. package/dist/components/Icons/StopIcon.mjs.map +1 -0
  170. package/dist/components/Icons/SuccessIcon.mjs +30 -0
  171. package/dist/components/Icons/SuccessIcon.mjs.map +1 -0
  172. package/dist/components/Icons/VipBadgeIcon.mjs +80 -0
  173. package/dist/components/Icons/VipBadgeIcon.mjs.map +1 -0
  174. package/dist/components/Icons/WarningIcon.mjs +30 -0
  175. package/dist/components/Icons/WarningIcon.mjs.map +1 -0
  176. package/dist/components/Icons/WarningTriangleIcon.mjs +30 -0
  177. package/dist/components/Icons/WarningTriangleIcon.mjs.map +1 -0
  178. package/dist/components/Logo/Logo.mjs +165 -0
  179. package/dist/components/Logo/Logo.mjs.map +1 -0
  180. package/dist/components/Pagination/Pagination.mjs +127 -0
  181. package/dist/components/Pagination/Pagination.mjs.map +1 -0
  182. package/dist/components/Pill/Pill.mjs +52 -0
  183. package/dist/components/Pill/Pill.mjs.map +1 -0
  184. package/dist/components/ProgressBar/ProgressBar.mjs +95 -0
  185. package/dist/components/ProgressBar/ProgressBar.mjs.map +1 -0
  186. package/dist/components/Radio/Radio.mjs +56 -0
  187. package/dist/components/Radio/Radio.mjs.map +1 -0
  188. package/dist/components/RadioGroup/RadioGroup.mjs +12 -0
  189. package/dist/components/RadioGroup/RadioGroup.mjs.map +1 -0
  190. package/dist/components/Slider/Slider.mjs +78 -0
  191. package/dist/components/Slider/Slider.mjs.map +1 -0
  192. package/dist/components/Slider/SliderLayout.mjs +31 -0
  193. package/dist/components/Slider/SliderLayout.mjs.map +1 -0
  194. package/dist/components/Slider/SliderThumb.mjs +69 -0
  195. package/dist/components/Slider/SliderThumb.mjs.map +1 -0
  196. package/dist/components/Snackbar/Snackbar.mjs +198 -0
  197. package/dist/components/Snackbar/Snackbar.mjs.map +1 -0
  198. package/dist/components/Switch/Switch.mjs +39 -0
  199. package/dist/components/Switch/Switch.mjs.map +1 -0
  200. package/dist/components/SwitchField/SwitchField.mjs +86 -0
  201. package/dist/components/SwitchField/SwitchField.mjs.map +1 -0
  202. package/dist/components/SwitchToggle/SwitchToggle.mjs +93 -0
  203. package/dist/components/SwitchToggle/SwitchToggle.mjs.map +1 -0
  204. package/dist/components/Tabs/Tabs.mjs +7 -0
  205. package/dist/components/Tabs/Tabs.mjs.map +1 -0
  206. package/dist/components/Tabs/TabsContent.mjs +18 -0
  207. package/dist/components/Tabs/TabsContent.mjs.map +1 -0
  208. package/dist/components/Tabs/TabsList.mjs +24 -0
  209. package/dist/components/Tabs/TabsList.mjs.map +1 -0
  210. package/dist/components/Tabs/TabsTrigger.mjs +32 -0
  211. package/dist/components/Tabs/TabsTrigger.mjs.map +1 -0
  212. package/dist/components/Toast/Toast.mjs +110 -0
  213. package/dist/components/Toast/Toast.mjs.map +1 -0
  214. package/dist/index.d.ts +30 -0
  215. package/dist/index.mjs +107 -10507
  216. package/dist/index.mjs.map +1 -1
  217. package/dist/utils/cn.mjs +10 -0
  218. package/dist/utils/cn.mjs.map +1 -0
  219. package/package.json +10 -4
  220. package/dist/index.cjs +0 -2
  221. package/dist/index.cjs.map +0 -1
@@ -0,0 +1,74 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
+ const jsxRuntime = require("react/jsx-runtime");
5
+ const RadioGroupPrimitive = require("@radix-ui/react-radio-group");
6
+ const React = require("react");
7
+ const cn = require("../../utils/cn.cjs");
8
+ function _interopNamespaceDefault(e) {
9
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
10
+ if (e) {
11
+ for (const k in e) {
12
+ if (k !== "default") {
13
+ const d = Object.getOwnPropertyDescriptor(e, k);
14
+ Object.defineProperty(n, k, d.get ? d : {
15
+ enumerable: true,
16
+ get: () => e[k]
17
+ });
18
+ }
19
+ }
20
+ }
21
+ n.default = e;
22
+ return Object.freeze(n);
23
+ }
24
+ const RadioGroupPrimitive__namespace = /* @__PURE__ */ _interopNamespaceDefault(RadioGroupPrimitive);
25
+ const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
26
+ const Radio = React__namespace.forwardRef(({ className, size = "default", label, helperText, id, ...props }, ref) => {
27
+ const generatedId = React__namespace.useId();
28
+ const inputId = id || generatedId;
29
+ const helperTextId = `${inputId}-helper`;
30
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn.cn("group inline-flex items-center gap-2", className), children: [
31
+ /* @__PURE__ */ jsxRuntime.jsx(
32
+ RadioGroupPrimitive__namespace.Item,
33
+ {
34
+ ref,
35
+ id: inputId,
36
+ "data-testid": "radio",
37
+ "aria-describedby": helperText ? helperTextId : void 0,
38
+ className: cn.cn(
39
+ "relative h-4 w-4 shrink-0 cursor-pointer appearance-none rounded-full border border-body-100 bg-transparent outline-brand-purple-500 transition-colors hover:bg-brand-green-50 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:border-disabled-400 disabled:bg-transparent data-[state=checked]:border-body-100 data-[state=checked]:bg-transparent dark:border-body-100 dark:disabled:border-disabled-400",
40
+ helperText && "mt-1 self-start"
41
+ ),
42
+ ...props,
43
+ children: /* @__PURE__ */ jsxRuntime.jsx(RadioGroupPrimitive__namespace.Indicator, { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "size-2 rounded-full bg-body-100 group-has-disabled:bg-disabled-400 dark:bg-body-100 dark:group-has-disabled:bg-disabled-400" }) })
44
+ }
45
+ ),
46
+ (label || helperText) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-0.5", children: [
47
+ label && /* @__PURE__ */ jsxRuntime.jsx(
48
+ "label",
49
+ {
50
+ htmlFor: inputId,
51
+ className: cn.cn(
52
+ "cursor-pointer select-none text-body-100 group-has-disabled:cursor-not-allowed group-has-disabled:text-disabled-100",
53
+ size === "small" ? "typography-body-2-semibold" : "typography-body-1-semibold"
54
+ ),
55
+ children: label
56
+ }
57
+ ),
58
+ helperText && /* @__PURE__ */ jsxRuntime.jsx(
59
+ "span",
60
+ {
61
+ id: helperTextId,
62
+ className: cn.cn(
63
+ "text-body-200 group-has-disabled:cursor-not-allowed group-has-disabled:text-disabled-100",
64
+ size === "small" ? "typography-body-2-semibold" : "typography-caption-regular"
65
+ ),
66
+ children: helperText
67
+ }
68
+ )
69
+ ] })
70
+ ] });
71
+ });
72
+ Radio.displayName = "Radio";
73
+ exports.Radio = Radio;
74
+ //# sourceMappingURL=Radio.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Radio.cjs","sources":["../../../../src/components/Radio/Radio.tsx"],"sourcesContent":["import * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\";\nimport * as React from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface RadioProps\n extends Omit<React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>, \"asChild\"> {\n /** Size variant of the radio button */\n size?: \"default\" | \"small\";\n /** Label text for the radio button */\n label?: string;\n /** Optional helper text displayed below the label */\n helperText?: string;\n}\n\nexport const Radio = React.forwardRef<\n React.ComponentRef<typeof RadioGroupPrimitive.Item>,\n RadioProps\n>(({ className, size = \"default\", label, helperText, id, ...props }, ref) => {\n const generatedId = React.useId();\n const inputId = id || generatedId;\n const helperTextId = `${inputId}-helper`;\n\n return (\n <div className={cn(\"group inline-flex items-center gap-2\", className)}>\n <RadioGroupPrimitive.Item\n ref={ref}\n id={inputId}\n data-testid=\"radio\"\n aria-describedby={helperText ? helperTextId : undefined}\n className={cn(\n \"relative h-4 w-4 shrink-0 cursor-pointer appearance-none rounded-full border border-body-100 bg-transparent outline-brand-purple-500 transition-colors hover:bg-brand-green-50 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:border-disabled-400 disabled:bg-transparent data-[state=checked]:border-body-100 data-[state=checked]:bg-transparent dark:border-body-100 dark:disabled:border-disabled-400\",\n helperText && \"mt-1 self-start\",\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator className=\"absolute inset-0 flex items-center justify-center\">\n <span className=\"size-2 rounded-full bg-body-100 group-has-disabled:bg-disabled-400 dark:bg-body-100 dark:group-has-disabled:bg-disabled-400\" />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n {(label || helperText) && (\n <div className=\"flex flex-col gap-0.5\">\n {label && (\n <label\n htmlFor={inputId}\n className={cn(\n \"cursor-pointer select-none text-body-100 group-has-disabled:cursor-not-allowed group-has-disabled:text-disabled-100\",\n size === \"small\" ? \"typography-body-2-semibold\" : \"typography-body-1-semibold\",\n )}\n >\n {label}\n </label>\n )}\n {helperText && (\n <span\n id={helperTextId}\n className={cn(\n \"text-body-200 group-has-disabled:cursor-not-allowed group-has-disabled:text-disabled-100\",\n size === \"small\" ? \"typography-body-2-semibold\" : \"typography-caption-regular\",\n )}\n >\n {helperText}\n </span>\n )}\n </div>\n )}\n </div>\n );\n});\n\nRadio.displayName = \"Radio\";\n"],"names":["React","cn","jsx","RadioGroupPrimitive","jsxs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAcO,MAAM,QAAQA,iBAAM,WAGzB,CAAC,EAAE,WAAW,OAAO,WAAW,OAAO,YAAY,IAAI,GAAG,MAAA,GAAS,QAAQ;AAC3E,QAAM,cAAcA,iBAAM,MAAA;AAC1B,QAAM,UAAU,MAAM;AACtB,QAAM,eAAe,GAAG,OAAO;AAE/B,yCACG,OAAA,EAAI,WAAWC,GAAAA,GAAG,wCAAwC,SAAS,GAClE,UAAA;AAAA,IAAAC,2BAAAA;AAAAA,MAACC,+BAAoB;AAAA,MAApB;AAAA,QACC;AAAA,QACA,IAAI;AAAA,QACJ,eAAY;AAAA,QACZ,oBAAkB,aAAa,eAAe;AAAA,QAC9C,WAAWF,GAAAA;AAAAA,UACT;AAAA,UACA,cAAc;AAAA,QAAA;AAAA,QAEf,GAAG;AAAA,QAEJ,UAAAC,2BAAAA,IAACC,+BAAoB,WAApB,EAA8B,WAAU,qDACvC,UAAAD,2BAAAA,IAAC,QAAA,EAAK,WAAU,8HAAA,CAA8H,EAAA,CAChJ;AAAA,MAAA;AAAA,IAAA;AAAA,KAEA,SAAS,eACTE,2BAAAA,KAAC,OAAA,EAAI,WAAU,yBACZ,UAAA;AAAA,MAAA,SACCF,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS;AAAA,UACT,WAAWD,GAAAA;AAAAA,YACT;AAAA,YACA,SAAS,UAAU,+BAA+B;AAAA,UAAA;AAAA,UAGnD,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGJ,cACCC,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,IAAI;AAAA,UACJ,WAAWD,GAAAA;AAAAA,YACT;AAAA,YACA,SAAS,UAAU,+BAA+B;AAAA,UAAA;AAAA,UAGnD,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACH,EAAA,CAEJ;AAAA,EAAA,GAEJ;AAEJ,CAAC;AAED,MAAM,cAAc;;"}
@@ -0,0 +1,30 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
+ const jsxRuntime = require("react/jsx-runtime");
5
+ const RadioGroupPrimitive = require("@radix-ui/react-radio-group");
6
+ const React = require("react");
7
+ function _interopNamespaceDefault(e) {
8
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
9
+ if (e) {
10
+ for (const k in e) {
11
+ if (k !== "default") {
12
+ const d = Object.getOwnPropertyDescriptor(e, k);
13
+ Object.defineProperty(n, k, d.get ? d : {
14
+ enumerable: true,
15
+ get: () => e[k]
16
+ });
17
+ }
18
+ }
19
+ }
20
+ n.default = e;
21
+ return Object.freeze(n);
22
+ }
23
+ const RadioGroupPrimitive__namespace = /* @__PURE__ */ _interopNamespaceDefault(RadioGroupPrimitive);
24
+ const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
25
+ const RadioGroup = React__namespace.forwardRef((props, ref) => {
26
+ return /* @__PURE__ */ jsxRuntime.jsx(RadioGroupPrimitive__namespace.Root, { ref, ...props });
27
+ });
28
+ RadioGroup.displayName = "RadioGroup";
29
+ exports.RadioGroup = RadioGroup;
30
+ //# sourceMappingURL=RadioGroup.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RadioGroup.cjs","sources":["../../../../src/components/RadioGroup/RadioGroup.tsx"],"sourcesContent":["import * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\";\nimport * as React from \"react\";\n\nexport type RadioGroupProps = React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>;\n\nexport const RadioGroup = React.forwardRef<\n React.ComponentRef<typeof RadioGroupPrimitive.Root>,\n RadioGroupProps\n>((props, ref) => {\n return <RadioGroupPrimitive.Root ref={ref} {...props} />;\n});\n\nRadioGroup.displayName = \"RadioGroup\";\n"],"names":["React","RadioGroupPrimitive"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAKO,MAAM,aAAaA,iBAAM,WAG9B,CAAC,OAAO,QAAQ;AAChB,wCAAQC,+BAAoB,MAApB,EAAyB,KAAW,GAAG,OAAO;AACxD,CAAC;AAED,WAAW,cAAc;;"}
@@ -0,0 +1,96 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
+ const jsxRuntime = require("react/jsx-runtime");
5
+ const SliderPrimitive = require("@radix-ui/react-slider");
6
+ const React = require("react");
7
+ const cn = require("../../utils/cn.cjs");
8
+ const SliderLayout = require("./SliderLayout.cjs");
9
+ const SliderThumb = require("./SliderThumb.cjs");
10
+ function _interopNamespaceDefault(e) {
11
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
12
+ if (e) {
13
+ for (const k in e) {
14
+ if (k !== "default") {
15
+ const d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: () => e[k]
19
+ });
20
+ }
21
+ }
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+ const SliderPrimitive__namespace = /* @__PURE__ */ _interopNamespaceDefault(SliderPrimitive);
27
+ const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
28
+ const Slider = React__namespace.forwardRef(
29
+ ({
30
+ className,
31
+ label,
32
+ labelPosition = "top",
33
+ minLabel,
34
+ maxLabel,
35
+ showTooltip = false,
36
+ formatTooltip,
37
+ disabled,
38
+ value,
39
+ defaultValue,
40
+ "aria-label": ariaLabel,
41
+ "aria-labelledby": ariaLabelledBy,
42
+ ...props
43
+ }, ref) => {
44
+ const labelId = React__namespace.useId();
45
+ const thumbCount = value?.length ?? defaultValue?.length ?? 1;
46
+ const resolvedLabelledBy = ariaLabelledBy ?? (label ? labelId : void 0);
47
+ const resolvedAriaLabel = !resolvedLabelledBy ? ariaLabel : void 0;
48
+ const sliderTrack = /* @__PURE__ */ jsxRuntime.jsxs(
49
+ SliderPrimitive__namespace.Root,
50
+ {
51
+ ref,
52
+ disabled,
53
+ value,
54
+ defaultValue,
55
+ "aria-label": resolvedAriaLabel,
56
+ "aria-labelledby": resolvedLabelledBy,
57
+ className: cn.cn(
58
+ "group/slider relative flex w-full touch-none select-none items-center",
59
+ disabled && "pointer-events-none opacity-50",
60
+ className
61
+ ),
62
+ ...props,
63
+ children: [
64
+ /* @__PURE__ */ jsxRuntime.jsx(SliderPrimitive__namespace.Track, { className: "relative h-3 w-full overflow-hidden rounded-full border border-neutral-100 bg-neutral-100", children: /* @__PURE__ */ jsxRuntime.jsx(SliderPrimitive__namespace.Range, { className: "absolute h-full rounded-full bg-brand-green-500" }) }),
65
+ Array.from({ length: thumbCount }, (_, i) => /* @__PURE__ */ jsxRuntime.jsx(
66
+ SliderThumb.SliderThumb,
67
+ {
68
+ showTooltip,
69
+ formatTooltip,
70
+ index: i,
71
+ "aria-label": resolvedAriaLabel,
72
+ "aria-labelledby": resolvedLabelledBy
73
+ },
74
+ i
75
+ ))
76
+ ]
77
+ }
78
+ );
79
+ const hasLayout = Boolean(label || minLabel || maxLabel);
80
+ if (!hasLayout) return sliderTrack;
81
+ return /* @__PURE__ */ jsxRuntime.jsx(
82
+ SliderLayout.SliderLayout,
83
+ {
84
+ label,
85
+ labelId,
86
+ labelPosition,
87
+ minLabel,
88
+ maxLabel,
89
+ children: sliderTrack
90
+ }
91
+ );
92
+ }
93
+ );
94
+ Slider.displayName = "Slider";
95
+ exports.Slider = Slider;
96
+ //# sourceMappingURL=Slider.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Slider.cjs","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":["React","jsxs","SliderPrimitive","cn","jsx","SliderThumb","SliderLayout"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BO,MAAM,SAASA,iBAAM;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,UAAUA,iBAAM,MAAA;AACtB,UAAM,aAAa,OAAO,UAAU,cAAc,UAAU;AAC5D,UAAM,qBAAqB,mBAAmB,QAAQ,UAAU;AAChE,UAAM,oBAAoB,CAAC,qBAAqB,YAAY;AAE5D,UAAM,cACJC,2BAAAA;AAAAA,MAACC,2BAAgB;AAAA,MAAhB;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAY;AAAA,QACZ,mBAAiB;AAAA,QACjB,WAAWC,GAAAA;AAAAA,UACT;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,QAAA;AAAA,QAED,GAAG;AAAA,QAEJ,UAAA;AAAA,UAAAC,2BAAAA,IAACF,2BAAgB,OAAhB,EAAsB,WAAU,6FAC/B,UAAAE,+BAACF,2BAAgB,OAAhB,EAAsB,WAAU,kDAAA,CAAkD,EAAA,CACrF;AAAA,UAEC,MAAM,KAAK,EAAE,QAAQ,cAAc,CAAC,GAAG,MACtCE,2BAAAA;AAAAA,YAACC,YAAAA;AAAAA,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,WACED,2BAAAA;AAAAA,MAACE,aAAAA;AAAAA,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
+ "use strict";
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
+ const jsxRuntime = require("react/jsx-runtime");
5
+ function SliderLayout({
6
+ label,
7
+ labelId,
8
+ labelPosition,
9
+ minLabel,
10
+ maxLabel,
11
+ children
12
+ }) {
13
+ if (labelPosition === "left") {
14
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
15
+ label && /* @__PURE__ */ jsxRuntime.jsx("span", { id: labelId, className: "typography-body-1-semibold shrink-0 text-body-100", children: label }),
16
+ minLabel && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typography-body-2-regular shrink-0 text-body-200", children: minLabel }),
17
+ children,
18
+ maxLabel && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typography-body-2-regular shrink-0 text-body-200", children: maxLabel })
19
+ ] });
20
+ }
21
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full flex-col gap-3", children: [
22
+ label && /* @__PURE__ */ jsxRuntime.jsx("span", { id: labelId, className: "typography-body-1-semibold text-body-100", children: label }),
23
+ (minLabel || maxLabel) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full items-start justify-between text-body-200 text-sm leading-[18px]", children: [
24
+ minLabel && /* @__PURE__ */ jsxRuntime.jsx("span", { children: minLabel }),
25
+ maxLabel && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto", children: maxLabel })
26
+ ] }),
27
+ children
28
+ ] });
29
+ }
30
+ exports.SliderLayout = SliderLayout;
31
+ //# sourceMappingURL=SliderLayout.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SliderLayout.cjs","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":["jsxs","jsx"],"mappings":";;;;AAYO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsB;AACpB,MAAI,kBAAkB,QAAQ;AAC5B,WACEA,2BAAAA,KAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,MAAA,wCACE,QAAA,EAAK,IAAI,SAAS,WAAU,qDAC1B,UAAA,OACH;AAAA,MAED,YACCC,2BAAAA,IAAC,QAAA,EAAK,WAAU,oDAAoD,UAAA,UAAS;AAAA,MAE9E;AAAA,MACA,YACCA,2BAAAA,IAAC,QAAA,EAAK,WAAU,oDAAoD,UAAA,SAAA,CAAS;AAAA,IAAA,GAEjF;AAAA,EAEJ;AAEA,SACED,2BAAAA,KAAC,OAAA,EAAI,WAAU,8BACZ,UAAA;AAAA,IAAA,wCACE,QAAA,EAAK,IAAI,SAAS,WAAU,4CAC1B,UAAA,OACH;AAAA,KAEA,YAAY,aACZA,2BAAAA,KAAC,OAAA,EAAI,WAAU,gFACZ,UAAA;AAAA,MAAA,YAAYC,2BAAAA,IAAC,UAAM,UAAA,SAAA,CAAS;AAAA,MAC5B,YAAYA,2BAAAA,IAAC,QAAA,EAAK,WAAU,WAAW,UAAA,SAAA,CAAS;AAAA,IAAA,GACnD;AAAA,IAED;AAAA,EAAA,GACH;AAEJ;;"}
@@ -0,0 +1,87 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
+ const jsxRuntime = require("react/jsx-runtime");
5
+ const SliderPrimitive = require("@radix-ui/react-slider");
6
+ const React = require("react");
7
+ const cn = require("../../utils/cn.cjs");
8
+ function _interopNamespaceDefault(e) {
9
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
10
+ if (e) {
11
+ for (const k in e) {
12
+ if (k !== "default") {
13
+ const d = Object.getOwnPropertyDescriptor(e, k);
14
+ Object.defineProperty(n, k, d.get ? d : {
15
+ enumerable: true,
16
+ get: () => e[k]
17
+ });
18
+ }
19
+ }
20
+ }
21
+ n.default = e;
22
+ return Object.freeze(n);
23
+ }
24
+ const SliderPrimitive__namespace = /* @__PURE__ */ _interopNamespaceDefault(SliderPrimitive);
25
+ const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
26
+ function SliderThumb({
27
+ showTooltip,
28
+ formatTooltip,
29
+ index,
30
+ "aria-label": ariaLabel,
31
+ "aria-labelledby": ariaLabelledBy
32
+ }) {
33
+ const thumbRef = React__namespace.useCallback(
34
+ (el) => {
35
+ if (!el || !showTooltip) return;
36
+ syncTooltipText(el, formatTooltip);
37
+ },
38
+ [showTooltip, formatTooltip]
39
+ );
40
+ return /* @__PURE__ */ jsxRuntime.jsxs(
41
+ SliderPrimitive__namespace.Thumb,
42
+ {
43
+ ref: thumbRef,
44
+ "data-index": index,
45
+ "aria-label": ariaLabel,
46
+ "aria-labelledby": ariaLabelledBy,
47
+ onPointerDown: (e) => {
48
+ if (showTooltip) syncTooltipText(e.currentTarget, formatTooltip);
49
+ },
50
+ onPointerMove: (e) => {
51
+ if (showTooltip) syncTooltipText(e.currentTarget, formatTooltip);
52
+ },
53
+ onKeyDown: (e) => {
54
+ if (showTooltip) {
55
+ requestAnimationFrame(() => syncTooltipText(e.currentTarget, formatTooltip));
56
+ }
57
+ },
58
+ className: cn.cn(
59
+ "flex size-6 items-center justify-center rounded-full border border-neutral-100 bg-background-inverse-solid shadow-sm",
60
+ "transition-shadow duration-150",
61
+ "hover:ring-2 hover:ring-brand-green-500",
62
+ "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",
63
+ "data-disabled:cursor-not-allowed"
64
+ ),
65
+ children: [
66
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block size-3 rounded-full bg-brand-green-500 shadow-[inset_0px_1px_2px_0px_rgba(0,0,0,0.1)]" }),
67
+ showTooltip && /* @__PURE__ */ jsxRuntime.jsx(
68
+ "span",
69
+ {
70
+ role: "tooltip",
71
+ "data-slider-tooltip": true,
72
+ 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"
73
+ }
74
+ )
75
+ ]
76
+ }
77
+ );
78
+ }
79
+ function syncTooltipText(thumb, formatTooltip) {
80
+ const raw = thumb.getAttribute("aria-valuenow");
81
+ const tooltip = thumb.querySelector("[data-slider-tooltip]");
82
+ if (raw == null || !tooltip) return;
83
+ const num = Number(raw);
84
+ tooltip.textContent = formatTooltip ? formatTooltip(num) : String(num);
85
+ }
86
+ exports.SliderThumb = SliderThumb;
87
+ //# sourceMappingURL=SliderThumb.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SliderThumb.cjs","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":["React","jsxs","SliderPrimitive","cn","jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAYO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,mBAAmB;AACrB,GAAqB;AACnB,QAAM,WAAWA,iBAAM;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,SACEC,2BAAAA;AAAAA,IAACC,2BAAgB;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,WAAWC,GAAAA;AAAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAAC,2BAAAA,IAAC,QAAA,EAAK,WAAU,8FAAA,CAA8F;AAAA,QAE7G,eACCA,2BAAAA;AAAAA,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,215 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
+ const jsxRuntime = require("react/jsx-runtime");
5
+ const React = require("react");
6
+ const cn = require("../../utils/cn.cjs");
7
+ const Button = require("../Button/Button.cjs");
8
+ const CrossIcon = require("../Icons/CrossIcon.cjs");
9
+ function _interopNamespaceDefault(e) {
10
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
11
+ if (e) {
12
+ for (const k in e) {
13
+ if (k !== "default") {
14
+ const d = Object.getOwnPropertyDescriptor(e, k);
15
+ Object.defineProperty(n, k, d.get ? d : {
16
+ enumerable: true,
17
+ get: () => e[k]
18
+ });
19
+ }
20
+ }
21
+ }
22
+ n.default = e;
23
+ return Object.freeze(n);
24
+ }
25
+ const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
26
+ function CloseButton({ onClose, className }) {
27
+ return /* @__PURE__ */ jsxRuntime.jsx(
28
+ Button.Button,
29
+ {
30
+ variant: "tertiary",
31
+ size: "24",
32
+ onClick: onClose,
33
+ className: cn.cn("h-auto shrink-0", className),
34
+ "aria-label": "Close snackbar",
35
+ children: /* @__PURE__ */ jsxRuntime.jsx(CrossIcon.CrossIcon, {})
36
+ }
37
+ );
38
+ }
39
+ function resolveCtaSlot(slot, label, onClick, buttonProps) {
40
+ if (slot) return slot;
41
+ if (label) {
42
+ return /* @__PURE__ */ jsxRuntime.jsx(Button.Button, { onClick, ...buttonProps, children: label });
43
+ }
44
+ return null;
45
+ }
46
+ function VipEarnContent({
47
+ icon,
48
+ title,
49
+ description,
50
+ showActions,
51
+ primarySlot,
52
+ primaryLabel,
53
+ primaryOnClick
54
+ }) {
55
+ const primary = resolveCtaSlot(primarySlot, primaryLabel, primaryOnClick, {
56
+ variant: "text",
57
+ size: "24"
58
+ });
59
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
60
+ icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex shrink-0", "aria-hidden": "true", children: icon }),
61
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-4", children: [
62
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
63
+ title && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "typography-body-1-semibold text-body-100 leading-6", children: title }),
64
+ description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "typography-body-2-regular text-body-200", children: description })
65
+ ] }),
66
+ showActions && primary && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "self-start", children: primary })
67
+ ] })
68
+ ] });
69
+ }
70
+ function WelcomeContent({
71
+ title,
72
+ description,
73
+ showActions,
74
+ primarySlot,
75
+ primaryLabel,
76
+ primaryOnClick,
77
+ secondarySlot,
78
+ secondaryLabel,
79
+ secondaryOnClick
80
+ }) {
81
+ const primary = resolveCtaSlot(primarySlot, primaryLabel, primaryOnClick, {
82
+ variant: "primary"
83
+ });
84
+ const secondary = resolveCtaSlot(secondarySlot, secondaryLabel, secondaryOnClick, {
85
+ variant: "secondary"
86
+ });
87
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
88
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-2 px-8 text-center text-body-100", children: [
89
+ title && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "typography-heading-4 text-body-100", children: title }),
90
+ description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "typography-body-2-regular text-body-200", children: description })
91
+ ] }),
92
+ showActions && (primary || secondary) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full flex-col gap-4 px-8 sm:flex-row sm:*:flex-1", children: [
93
+ secondary,
94
+ primary
95
+ ] })
96
+ ] });
97
+ }
98
+ function DefaultContent({
99
+ children,
100
+ showActions,
101
+ primarySlot,
102
+ primaryLabel,
103
+ primaryOnClick,
104
+ secondarySlot,
105
+ secondaryLabel,
106
+ secondaryOnClick
107
+ }) {
108
+ const primary = resolveCtaSlot(primarySlot, primaryLabel, primaryOnClick, {
109
+ variant: "primary",
110
+ size: "40"
111
+ });
112
+ const secondary = resolveCtaSlot(secondarySlot, secondaryLabel, secondaryOnClick, {
113
+ variant: "tertiary",
114
+ size: "40"
115
+ });
116
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
117
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "typography-body-1-medium flex min-w-0 flex-1 items-center self-stretch text-body-100", children }),
118
+ showActions && (primary || secondary) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex shrink-0 items-start gap-2", children: [
119
+ primary,
120
+ secondary
121
+ ] })
122
+ ] });
123
+ }
124
+ const Snackbar = React__namespace.forwardRef(
125
+ ({
126
+ className,
127
+ variant = "default",
128
+ icon,
129
+ title,
130
+ description,
131
+ showActions = true,
132
+ primaryLabel,
133
+ primaryOnClick,
134
+ primarySlot,
135
+ secondaryLabel,
136
+ secondaryOnClick,
137
+ secondarySlot,
138
+ closable = false,
139
+ onClose,
140
+ children,
141
+ ...props
142
+ }, ref) => {
143
+ return (
144
+ /* biome-ignore lint/a11y/useSemanticElements: output cannot contain div children; browsers would break the wrapper. */
145
+ /* @__PURE__ */ jsxRuntime.jsxs(
146
+ "div",
147
+ {
148
+ ref,
149
+ role: "status",
150
+ "data-testid": "snackbar",
151
+ className: cn.cn(
152
+ "flex gap-4 rounded-2xl",
153
+ (variant === "default" || variant === "vipEarn") && "border border-neutral-50 bg-background-200 p-4 backdrop-blur-md",
154
+ variant === "default" && "flex-wrap items-start",
155
+ variant === "vipEarn" && "items-start",
156
+ variant === "welcome" && "relative flex-col items-center bg-background-inverse-solid py-6",
157
+ className
158
+ ),
159
+ ...props,
160
+ children: [
161
+ variant === "vipEarn" && /* @__PURE__ */ jsxRuntime.jsx(
162
+ VipEarnContent,
163
+ {
164
+ icon,
165
+ title,
166
+ description,
167
+ showActions,
168
+ primarySlot,
169
+ primaryLabel,
170
+ primaryOnClick
171
+ }
172
+ ),
173
+ variant === "welcome" && /* @__PURE__ */ jsxRuntime.jsx(
174
+ WelcomeContent,
175
+ {
176
+ title,
177
+ description,
178
+ showActions,
179
+ primarySlot,
180
+ primaryLabel,
181
+ primaryOnClick,
182
+ secondarySlot,
183
+ secondaryLabel,
184
+ secondaryOnClick
185
+ }
186
+ ),
187
+ variant === "default" && /* @__PURE__ */ jsxRuntime.jsx(
188
+ DefaultContent,
189
+ {
190
+ showActions,
191
+ primarySlot,
192
+ primaryLabel,
193
+ primaryOnClick,
194
+ secondarySlot,
195
+ secondaryLabel,
196
+ secondaryOnClick,
197
+ children
198
+ }
199
+ ),
200
+ closable && /* @__PURE__ */ jsxRuntime.jsx(
201
+ CloseButton,
202
+ {
203
+ onClose,
204
+ className: variant === "welcome" ? "absolute top-2 right-2" : void 0
205
+ }
206
+ )
207
+ ]
208
+ }
209
+ )
210
+ );
211
+ }
212
+ );
213
+ Snackbar.displayName = "Snackbar";
214
+ exports.Snackbar = Snackbar;
215
+ //# sourceMappingURL=Snackbar.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Snackbar.cjs","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":["jsx","Button","cn","CrossIcon","jsxs","Fragment","React"],"mappings":"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"}