@avenue-ticketing/ui 0.10.0 → 0.12.0-beta.1

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 (225) hide show
  1. package/README.md +47 -0
  2. package/dist/badge-types-B67wcd4m.d.ts +22 -0
  3. package/dist/react/app-store-buttons-outline.d.ts +17 -0
  4. package/dist/react/app-store-buttons-outline.js +582 -0
  5. package/dist/react/app-store-buttons-outline.js.map +1 -0
  6. package/dist/react/app-store-buttons.d.ts +20 -0
  7. package/dist/react/app-store-buttons.js +817 -0
  8. package/dist/react/app-store-buttons.js.map +1 -0
  9. package/dist/react/avatar-label-group.d.ts +14 -0
  10. package/dist/react/avatar-label-group.js +183 -0
  11. package/dist/react/avatar-label-group.js.map +1 -0
  12. package/dist/react/avatar-profile-photo.d.ts +9 -0
  13. package/dist/react/avatar-profile-photo.js +202 -0
  14. package/dist/react/avatar-profile-photo.js.map +1 -0
  15. package/dist/react/avatar.d.ts +66 -40
  16. package/dist/react/avatar.js +159 -149
  17. package/dist/react/avatar.js.map +1 -1
  18. package/dist/react/badge-groups.d.ts +25 -0
  19. package/dist/react/badge-groups.js +162 -0
  20. package/dist/react/badge-groups.js.map +1 -0
  21. package/dist/react/badge.d.ts +123 -59
  22. package/dist/react/badge.js +314 -86
  23. package/dist/react/badge.js.map +1 -1
  24. package/dist/react/button-group.d.ts +43 -0
  25. package/dist/react/button-group.js +108 -0
  26. package/dist/react/button-group.js.map +1 -0
  27. package/dist/react/button-utility.d.ts +47 -0
  28. package/dist/react/button-utility.js +158 -0
  29. package/dist/react/button-utility.js.map +1 -0
  30. package/dist/react/button.d.ts +112 -37
  31. package/dist/react/button.js +270 -55
  32. package/dist/react/button.js.map +1 -1
  33. package/dist/react/checkbox.d.ts +25 -8
  34. package/dist/react/checkbox.js +112 -110
  35. package/dist/react/checkbox.js.map +1 -1
  36. package/dist/react/close-button.d.ts +25 -0
  37. package/dist/react/close-button.js +54 -0
  38. package/dist/react/close-button.js.map +1 -0
  39. package/dist/react/combobox.d.ts +17 -0
  40. package/dist/react/combobox.js +322 -0
  41. package/dist/react/combobox.js.map +1 -0
  42. package/dist/react/dialog.d.ts +15 -15
  43. package/dist/react/dialog.js +43 -108
  44. package/dist/react/dialog.js.map +1 -1
  45. package/dist/react/dropdown-account-breadcrumb.d.ts +5 -0
  46. package/dist/react/dropdown-account-breadcrumb.js +319 -0
  47. package/dist/react/dropdown-account-breadcrumb.js.map +1 -0
  48. package/dist/react/dropdown-account-button.d.ts +5 -0
  49. package/dist/react/dropdown-account-button.js +773 -0
  50. package/dist/react/dropdown-account-button.js.map +1 -0
  51. package/dist/react/dropdown-account-card-md.d.ts +5 -0
  52. package/dist/react/dropdown-account-card-md.js +549 -0
  53. package/dist/react/dropdown-account-card-md.js.map +1 -0
  54. package/dist/react/dropdown-account-card-sm.d.ts +5 -0
  55. package/dist/react/dropdown-account-card-sm.js +527 -0
  56. package/dist/react/dropdown-account-card-sm.js.map +1 -0
  57. package/dist/react/dropdown-account-card-xs.d.ts +5 -0
  58. package/dist/react/dropdown-account-card-xs.js +507 -0
  59. package/dist/react/dropdown-account-card-xs.js.map +1 -0
  60. package/dist/react/dropdown-avatar.d.ts +5 -0
  61. package/dist/react/dropdown-avatar.js +790 -0
  62. package/dist/react/dropdown-avatar.js.map +1 -0
  63. package/dist/react/dropdown-button-advanced.d.ts +5 -0
  64. package/dist/react/dropdown-button-advanced.js +799 -0
  65. package/dist/react/dropdown-button-advanced.js.map +1 -0
  66. package/dist/react/dropdown-button-link.d.ts +5 -0
  67. package/dist/react/dropdown-button-link.js +501 -0
  68. package/dist/react/dropdown-button-link.js.map +1 -0
  69. package/dist/react/dropdown-button-simple.d.ts +5 -0
  70. package/dist/react/dropdown-button-simple.js +754 -0
  71. package/dist/react/dropdown-button-simple.js.map +1 -0
  72. package/dist/react/dropdown-icon-advanced.d.ts +5 -0
  73. package/dist/react/dropdown-icon-advanced.js +543 -0
  74. package/dist/react/dropdown-icon-advanced.js.map +1 -0
  75. package/dist/react/dropdown-icon-simple.d.ts +5 -0
  76. package/dist/react/dropdown-icon-simple.js +505 -0
  77. package/dist/react/dropdown-icon-simple.js.map +1 -0
  78. package/dist/react/dropdown-integration.d.ts +5 -0
  79. package/dist/react/dropdown-integration.js +1325 -0
  80. package/dist/react/dropdown-integration.js.map +1 -0
  81. package/dist/react/dropdown-search-advanced.d.ts +5 -0
  82. package/dist/react/dropdown-search-advanced.js +998 -0
  83. package/dist/react/dropdown-search-advanced.js.map +1 -0
  84. package/dist/react/dropdown-search-simple.d.ts +5 -0
  85. package/dist/react/dropdown-search-simple.js +960 -0
  86. package/dist/react/dropdown-search-simple.js.map +1 -0
  87. package/dist/react/dropdown.d.ts +32 -133
  88. package/dist/react/dropdown.js +404 -1351
  89. package/dist/react/dropdown.js.map +1 -1
  90. package/dist/react/file-upload-trigger.d.ts +34 -0
  91. package/dist/react/file-upload-trigger.js +39 -0
  92. package/dist/react/file-upload-trigger.js.map +1 -0
  93. package/dist/react/form.d.ts +10 -0
  94. package/dist/react/form.js +11 -0
  95. package/dist/react/form.js.map +1 -0
  96. package/dist/react/hint-text.d.ts +17 -0
  97. package/dist/react/hint-text.js +36 -0
  98. package/dist/react/hint-text.js.map +1 -0
  99. package/dist/react/hook-form.d.ts +35 -0
  100. package/dist/react/hook-form.js +50 -0
  101. package/dist/react/hook-form.js.map +1 -0
  102. package/dist/react/input-date.d.ts +43 -0
  103. package/dist/react/input-date.js +306 -0
  104. package/dist/react/input-date.js.map +1 -0
  105. package/dist/react/input-file.d.ts +45 -0
  106. package/dist/react/input-file.js +748 -0
  107. package/dist/react/input-file.js.map +1 -0
  108. package/dist/react/input-group.d.ts +37 -0
  109. package/dist/react/input-group.js +251 -0
  110. package/dist/react/input-group.js.map +1 -0
  111. package/dist/react/input-number.d.ts +32 -0
  112. package/dist/react/input-number.js +553 -0
  113. package/dist/react/input-number.js.map +1 -0
  114. package/dist/react/input-payment.d.ts +16 -0
  115. package/dist/react/input-payment.js +593 -0
  116. package/dist/react/input-payment.js.map +1 -0
  117. package/dist/react/input-tags-outer.d.ts +53 -0
  118. package/dist/react/input-tags-outer.js +607 -0
  119. package/dist/react/input-tags-outer.js.map +1 -0
  120. package/dist/react/input-tags.d.ts +53 -0
  121. package/dist/react/input-tags.js +565 -0
  122. package/dist/react/input-tags.js.map +1 -0
  123. package/dist/react/input.d.ts +71 -22
  124. package/dist/react/input.js +332 -45
  125. package/dist/react/input.js.map +1 -1
  126. package/dist/react/label.d.ts +18 -0
  127. package/dist/react/label.js +112 -0
  128. package/dist/react/label.js.map +1 -0
  129. package/dist/react/multi-select.d.ts +89 -0
  130. package/dist/react/multi-select.js +1036 -0
  131. package/dist/react/multi-select.js.map +1 -0
  132. package/dist/react/pin-input.d.ts +59 -0
  133. package/dist/react/pin-input.js +229 -0
  134. package/dist/react/pin-input.js.map +1 -0
  135. package/dist/react/popover.d.ts +7 -73
  136. package/dist/react/popover.js +23 -569
  137. package/dist/react/popover.js.map +1 -1
  138. package/dist/react/progress-circle.d.ts +9 -0
  139. package/dist/react/progress-circle.js +36 -0
  140. package/dist/react/progress-circle.js.map +1 -0
  141. package/dist/react/progress-circles.d.ts +14 -0
  142. package/dist/react/progress-circles.js +160 -0
  143. package/dist/react/progress-circles.js.map +1 -0
  144. package/dist/react/progress-indicators.d.ts +52 -0
  145. package/dist/react/progress-indicators.js +78 -0
  146. package/dist/react/progress-indicators.js.map +1 -0
  147. package/dist/react/radio-buttons.d.ts +35 -0
  148. package/dist/react/radio-buttons.js +116 -0
  149. package/dist/react/radio-buttons.js.map +1 -0
  150. package/dist/react/scroll-header.d.ts +6 -0
  151. package/dist/react/scroll-header.js +42 -61
  152. package/dist/react/scroll-header.js.map +1 -1
  153. package/dist/react/scroll-wheel.d.ts +4 -5
  154. package/dist/react/scroll-wheel.js +19 -15
  155. package/dist/react/scroll-wheel.js.map +1 -1
  156. package/dist/react/select-item.d.ts +13 -0
  157. package/dist/react/select-item.js +336 -0
  158. package/dist/react/select-item.js.map +1 -0
  159. package/dist/react/select-native.d.ts +17 -0
  160. package/dist/react/select-native.js +203 -0
  161. package/dist/react/select-native.js.map +1 -0
  162. package/dist/react/select.d.ts +18 -61
  163. package/dist/react/select.js +625 -923
  164. package/dist/react/select.js.map +1 -1
  165. package/dist/react/sheet.d.ts +19 -19
  166. package/dist/react/sheet.js +97 -219
  167. package/dist/react/sheet.js.map +1 -1
  168. package/dist/react/slider.d.ts +15 -0
  169. package/dist/react/slider.js +66 -0
  170. package/dist/react/slider.js.map +1 -0
  171. package/dist/react/social-button.d.ts +55 -0
  172. package/dist/react/social-button.js +263 -0
  173. package/dist/react/social-button.js.map +1 -0
  174. package/dist/react/social-logos.d.ts +20 -0
  175. package/dist/react/social-logos.js +131 -0
  176. package/dist/react/social-logos.js.map +1 -0
  177. package/dist/react/switch.d.ts +21 -36
  178. package/dist/react/switch.js +121 -109
  179. package/dist/react/switch.js.map +1 -1
  180. package/dist/react/tag-select.d.ts +44 -0
  181. package/dist/react/tag-select.js +1062 -0
  182. package/dist/react/tag-select.js.map +1 -0
  183. package/dist/react/tags.d.ts +30 -0
  184. package/dist/react/tags.js +228 -0
  185. package/dist/react/tags.js.map +1 -0
  186. package/dist/react/textarea.d.ts +40 -4
  187. package/dist/react/textarea.js +193 -27
  188. package/dist/react/textarea.js.map +1 -1
  189. package/dist/react/tooltip.d.ts +30 -43
  190. package/dist/react/tooltip.js +65 -521
  191. package/dist/react/tooltip.js.map +1 -1
  192. package/dist/select-shared-B3Y5SMXU.d.ts +62 -0
  193. package/package.json +28 -21
  194. package/source.css +2 -12
  195. package/theme.css +883 -79
  196. package/dist/react/calendar.d.ts +0 -13
  197. package/dist/react/calendar.js +0 -4639
  198. package/dist/react/calendar.js.map +0 -1
  199. package/dist/react/card.d.ts +0 -11
  200. package/dist/react/card.js +0 -113
  201. package/dist/react/card.js.map +0 -1
  202. package/dist/react/datetime-picker.d.ts +0 -21
  203. package/dist/react/datetime-picker.js +0 -6142
  204. package/dist/react/datetime-picker.js.map +0 -1
  205. package/dist/react/pagination.d.ts +0 -28
  206. package/dist/react/pagination.js +0 -262
  207. package/dist/react/pagination.js.map +0 -1
  208. package/dist/react/table-pagination.d.ts +0 -15
  209. package/dist/react/table-pagination.js +0 -1247
  210. package/dist/react/table-pagination.js.map +0 -1
  211. package/dist/react/table-view/column-menu.d.ts +0 -15
  212. package/dist/react/table-view/column-menu.js +0 -1049
  213. package/dist/react/table-view/column-menu.js.map +0 -1
  214. package/dist/react/table-view/index.d.ts +0 -70
  215. package/dist/react/table-view/index.js +0 -2284
  216. package/dist/react/table-view/index.js.map +0 -1
  217. package/dist/react/table.d.ts +0 -86
  218. package/dist/react/table.js +0 -414
  219. package/dist/react/table.js.map +0 -1
  220. package/dist/react/tabs.d.ts +0 -34
  221. package/dist/react/tabs.js +0 -423
  222. package/dist/react/tabs.js.map +0 -1
  223. package/dist/react/time-picker.d.ts +0 -22
  224. package/dist/react/time-picker.js +0 -856
  225. package/dist/react/time-picker.js.map +0 -1
@@ -0,0 +1,501 @@
1
+ import { createContext, useState, useCallback, useRef, useLayoutEffect } from 'react';
2
+ import { CaretDownIcon } from '@phosphor-icons/react/dist/csr/CaretDown';
3
+ import { TrashIcon } from '@phosphor-icons/react/dist/csr/Trash';
4
+ import { MenuTrigger, Button, MenuSection, Popover, Menu, MenuItem, Separator } from 'react-aria-components';
5
+ import { CheckIcon } from '@phosphor-icons/react/dist/csr/Check';
6
+ import { CaretRightIcon } from '@phosphor-icons/react/dist/csr/CaretRight';
7
+ import '@phosphor-icons/react/dist/csr/DotsThreeVertical';
8
+ import { extendTailwindMerge } from 'tailwind-merge';
9
+ import { UserIcon } from '@phosphor-icons/react/dist/csr/User';
10
+ import '@phosphor-icons/react/dist/csr/Plus';
11
+ import { jsxs, jsx } from 'react/jsx-runtime';
12
+
13
+ var twMerge = extendTailwindMerge({
14
+ extend: {
15
+ theme: {
16
+ text: ["display-xs", "display-sm", "display-md", "display-lg", "display-xl", "display-2xl"]
17
+ }
18
+ }
19
+ });
20
+ var cx = twMerge;
21
+ var sizes = {
22
+ xs: "size-1.5",
23
+ sm: "size-2",
24
+ md: "size-2.5",
25
+ lg: "size-3",
26
+ xl: "size-3.5",
27
+ "2xl": "size-4",
28
+ "3xl": "size-4.5",
29
+ "4xl": "size-5"
30
+ };
31
+ var AvatarOnlineIndicator = ({ size, status, className }) => /* @__PURE__ */ jsx(
32
+ "span",
33
+ {
34
+ className: cx(
35
+ "absolute right-0 bottom-0 flex justify-center rounded-full ring-[1.5px] ring-bg-primary",
36
+ status === "online" ? "bg-fg-success-secondary" : "bg-utility-neutral-300",
37
+ sizes[size],
38
+ className
39
+ ),
40
+ style: {
41
+ backgroundImage: "radial-gradient(43.75% 43.75% at 50% 28.75%, rgba(255, 255, 255, 0.05) 0%, rgba(255, 255, 255, 0.00) 100%), radial-gradient(50% 50% at 50% 50%, rgba(255, 255, 255, 0.00) 74.66%, rgba(255, 255, 255, 0.18) 100%), radial-gradient(75% 75% at 50% 0%, rgba(255, 255, 255, 0.00) 0%, rgba(255, 255, 255, 0.00) 50%, rgba(255, 255, 255, 0.08) 99%, rgba(255, 255, 255, 0.00) 100%)"
42
+ },
43
+ children: /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 7.2 2.85", fill: "none", className: "mt-[10%] h-[20%] w-[60%]", children: [
44
+ /* @__PURE__ */ jsx(
45
+ "path",
46
+ {
47
+ d: "M7.2 1.83107C7.2 2.84235 5.58823 2.19729 3.6 2.19729C1.61177 2.19729 0 2.84235 0 1.83107C0 0.8198 1.61177 0 3.6 0C5.58823 0 7.2 0.8198 7.2 1.83107Z",
48
+ fill: "url(#reflection-gradient)",
49
+ fillOpacity: "0.4"
50
+ }
51
+ ),
52
+ /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs("linearGradient", { id: "reflection-gradient", x1: "3.6", y1: "0", x2: "3.6", y2: "2.4", gradientUnits: "userSpaceOnUse", children: [
53
+ /* @__PURE__ */ jsx("stop", { stopColor: "white" }),
54
+ /* @__PURE__ */ jsx("stop", { offset: "1", stopColor: "white", stopOpacity: "0.1" })
55
+ ] }) })
56
+ ] })
57
+ }
58
+ );
59
+ var sizes2 = {
60
+ xs: "size-2.5",
61
+ sm: "size-3",
62
+ md: "size-3.5",
63
+ lg: "size-4",
64
+ xl: "size-4.5",
65
+ "2xl": "size-5",
66
+ "3xl": "size-6",
67
+ "4xl": "size-8"
68
+ };
69
+ var VerifiedTick = ({ size, className }) => /* @__PURE__ */ jsxs("svg", { className: cx("z-10 text-utility-blue-500", sizes2[size], className), viewBox: "0 0 10 10", fill: "none", children: [
70
+ /* @__PURE__ */ jsx(
71
+ "path",
72
+ {
73
+ d: "M7.72237 1.77098C7.81734 2.00068 7.99965 2.18326 8.2292 2.27858L9.03413 2.61199C9.26384 2.70714 9.44635 2.88965 9.5415 3.11936C9.63665 3.34908 9.63665 3.60718 9.5415 3.83689L9.20833 4.64125C9.11313 4.87106 9.113 5.12943 9.20863 5.35913L9.54122 6.16325C9.58839 6.27702 9.61268 6.39897 9.6127 6.52214C9.61272 6.6453 9.58847 6.76726 9.54134 6.88105C9.4942 6.99484 9.42511 7.09823 9.33801 7.18531C9.2509 7.27238 9.14749 7.34144 9.03369 7.38854L8.22934 7.72171C7.99964 7.81669 7.81706 7.99899 7.72174 8.22855L7.38833 9.03348C7.29318 9.26319 7.11067 9.4457 6.88096 9.54085C6.65124 9.636 6.39314 9.636 6.16343 9.54085L5.35907 9.20767C5.12935 9.11276 4.87134 9.11295 4.64177 9.20821L3.83684 9.54115C3.60725 9.63608 3.34937 9.636 3.11984 9.54092C2.89032 9.44585 2.70791 9.26356 2.6127 9.03409L2.27918 8.22892C2.18421 7.99923 2.0019 7.81665 1.77235 7.72133L0.967421 7.38792C0.737807 7.29281 0.555355 7.11041 0.460169 6.88083C0.364983 6.65125 0.364854 6.39327 0.45981 6.16359L0.792984 5.35924C0.8879 5.12952 0.887707 4.87151 0.792445 4.64193L0.459749 3.83642C0.41258 3.72265 0.388291 3.60069 0.388272 3.47753C0.388252 3.35436 0.412501 3.2324 0.459634 3.11861C0.506767 3.00482 0.57586 2.90144 0.662965 2.81436C0.75007 2.72728 0.853479 2.65822 0.967283 2.61113L1.77164 2.27795C2.00113 2.18306 2.1836 2.00099 2.27899 1.7717L2.6124 0.966768C2.70755 0.737054 2.89006 0.554547 3.11978 0.459397C3.34949 0.364246 3.60759 0.364246 3.83731 0.459397L4.64166 0.792571C4.87138 0.887487 5.12939 0.887293 5.35897 0.792031L6.16424 0.459913C6.39392 0.364816 6.65197 0.364836 6.88164 0.459968C7.11131 0.555099 7.29379 0.737554 7.38895 0.967208L7.72247 1.77238L7.72237 1.77098Z",
74
+ className: "fill-current"
75
+ }
76
+ ),
77
+ /* @__PURE__ */ jsx(
78
+ "path",
79
+ {
80
+ fillRule: "evenodd",
81
+ clipRule: "evenodd",
82
+ d: "M6.95829 3.68932C7.02509 3.58439 7.04747 3.45723 7.02051 3.3358C6.99356 3.21437 6.91946 3.10862 6.81454 3.04182C6.70961 2.97502 6.58245 2.95264 6.46102 2.97959C6.33959 3.00655 6.23384 3.08064 6.16704 3.18557L4.33141 6.06995L3.49141 5.01995C3.41375 4.92281 3.30069 4.8605 3.17709 4.84673C3.05349 4.83296 2.92949 4.86885 2.83235 4.94651C2.73522 5.02417 2.67291 5.13723 2.65914 5.26083C2.64536 5.38443 2.68125 5.50843 2.75891 5.60557L4.00891 7.16807C4.0555 7.22638 4.11533 7.27271 4.18344 7.30323C4.25154 7.33375 4.32595 7.34757 4.40047 7.34353C4.47499 7.3395 4.54747 7.31773 4.61188 7.28004C4.67629 7.24234 4.73077 7.18981 4.77079 7.12682L6.95829 3.68932Z",
83
+ fill: "white"
84
+ }
85
+ )
86
+ ] });
87
+ var AvatarCount = ({ count, className }) => /* @__PURE__ */ jsx("div", { className: cx("absolute right-0 bottom-0 p-px", className), children: /* @__PURE__ */ jsx("div", { className: "flex size-3.5 items-center justify-center rounded-full bg-fg-error-primary text-center text-[10px] leading-[13px] font-bold text-white", children: count }) });
88
+ var styles = {
89
+ xs: { root: "size-6", rootWithBorder: "p-px", initials: "text-xs font-semibold", icon: "size-4" },
90
+ sm: { root: "size-8", rootWithBorder: "p-px", initials: "text-sm font-semibold", icon: "size-5" },
91
+ md: { root: "size-10", rootWithBorder: "p-px", initials: "text-md font-semibold", icon: "size-6" },
92
+ lg: { root: "size-12", rootWithBorder: "p-[1.5px]", initials: "text-lg font-semibold", icon: "size-7" },
93
+ xl: { root: "size-14", rootWithBorder: "p-0.5", initials: "text-xl font-semibold", icon: "size-8" },
94
+ "2xl": { root: "size-16", rootWithBorder: "p-0.5", initials: "text-display-xs font-semibold", icon: "size-8" }
95
+ };
96
+ var Avatar = ({
97
+ size = "md",
98
+ src,
99
+ alt,
100
+ initials,
101
+ placeholder,
102
+ placeholderIcon: PlaceholderIcon,
103
+ border,
104
+ badge,
105
+ status,
106
+ verified,
107
+ count,
108
+ focusable = false,
109
+ rounded = true,
110
+ className,
111
+ contentClassName
112
+ }) => {
113
+ const [isFailed, setIsFailed] = useState(false);
114
+ const canShowImage = src && !isFailed;
115
+ const renderMainContent = () => {
116
+ if (canShowImage) {
117
+ return /* @__PURE__ */ jsx("img", { "data-avatar-img": true, className: "size-full object-cover", src, alt, onError: () => setIsFailed(true) });
118
+ }
119
+ if (initials) {
120
+ return /* @__PURE__ */ jsx("span", { className: cx("text-quaternary", styles[size].initials), children: initials });
121
+ }
122
+ if (PlaceholderIcon) {
123
+ return /* @__PURE__ */ jsx(PlaceholderIcon, { className: cx("text-fg-quaternary", styles[size].icon) });
124
+ }
125
+ return placeholder || /* @__PURE__ */ jsx(UserIcon, { className: cx("text-fg-quaternary", styles[size].icon) });
126
+ };
127
+ const renderBadgeContent = () => {
128
+ if (status) {
129
+ return /* @__PURE__ */ jsx(AvatarOnlineIndicator, { status, size });
130
+ }
131
+ if (verified) {
132
+ return /* @__PURE__ */ jsx(VerifiedTick, { size, className: cx("absolute right-0 bottom-0", size === "xs" && "-right-px -bottom-px") });
133
+ }
134
+ if (count) {
135
+ return /* @__PURE__ */ jsx(AvatarCount, { count });
136
+ }
137
+ return badge;
138
+ };
139
+ return /* @__PURE__ */ jsxs(
140
+ "div",
141
+ {
142
+ "data-avatar": true,
143
+ className: cx(
144
+ "relative inline-flex shrink-0 rounded-[7px]",
145
+ rounded && "rounded-full",
146
+ // Focus styles
147
+ focusable && "outline-none group-focus-visible:[box-shadow:0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]",
148
+ border && "ring-1 ring-secondary_alt",
149
+ border && styles[size].rootWithBorder,
150
+ styles[size].root,
151
+ className
152
+ ),
153
+ children: [
154
+ /* @__PURE__ */ jsx(
155
+ "div",
156
+ {
157
+ className: cx(
158
+ "relative inline-flex size-full shrink-0 items-center justify-center overflow-hidden rounded-md bg-tertiary outline-[0.5px] -outline-offset-[0.5px] outline-black/16 before:inset-[0.5px]",
159
+ rounded && "rounded-full",
160
+ canShowImage && size !== "xs" && "before:absolute before:inset-0 before:rounded-[inherit] before:border before:border-white/32 before:mask-[linear-gradient(to_bottom,black_0%,transparent_25%,transparent_75%,black_100%)]",
161
+ contentClassName
162
+ ),
163
+ children: renderMainContent()
164
+ }
165
+ ),
166
+ renderBadgeContent()
167
+ ]
168
+ }
169
+ );
170
+ };
171
+ var CHECKBOX_TICK_DELAY_MS = 60;
172
+ var CHECKBOX_TICK_DRAW_MS = 100;
173
+ function CheckboxAnimatedCheckMark({ className }) {
174
+ const pathRef = useRef(null);
175
+ useLayoutEffect(() => {
176
+ const path = pathRef.current;
177
+ if (!path || typeof path.getTotalLength !== "function") return;
178
+ const len = path.getTotalLength();
179
+ if (len <= 0) return;
180
+ path.style.strokeDasharray = `${len}`;
181
+ path.style.strokeDashoffset = `${len}`;
182
+ if (typeof path.animate !== "function") {
183
+ path.style.strokeDashoffset = "0";
184
+ return;
185
+ }
186
+ const anim = path.animate([{ strokeDashoffset: len }, { strokeDashoffset: 0 }], {
187
+ duration: CHECKBOX_TICK_DRAW_MS,
188
+ delay: CHECKBOX_TICK_DELAY_MS,
189
+ easing: "cubic-bezier(0.45, 0, 0.2, 1)",
190
+ fill: "forwards"
191
+ });
192
+ return () => anim.cancel();
193
+ }, []);
194
+ return /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", viewBox: "0 0 14 14", fill: "none", className: cx("block shrink-0", className), children: /* @__PURE__ */ jsx(
195
+ "path",
196
+ {
197
+ ref: pathRef,
198
+ d: "M2.33325 7L5.24992 9.91667L11.6666 3.5",
199
+ stroke: "currentColor",
200
+ strokeWidth: "2",
201
+ strokeLinecap: "round",
202
+ strokeLinejoin: "round"
203
+ }
204
+ ) });
205
+ }
206
+ var focusRingShadow = "outline-none [box-shadow:0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]";
207
+ var CheckboxBase = ({ className, isSelected, isDisabled, isIndeterminate, size = "sm", isFocusVisible = false }) => {
208
+ const isChecked = isSelected || isIndeterminate;
209
+ const iconClassName = size === "sm" ? "size-2.5" : "size-3.5";
210
+ return /* @__PURE__ */ jsxs(
211
+ "div",
212
+ {
213
+ className: cx(
214
+ "relative flex shrink-0 cursor-pointer appearance-none items-center justify-center border border-solid border-primary",
215
+ size === "sm" ? "size-4 rounded-xs" : "size-5 rounded-sm",
216
+ isChecked ? "border-transparent bg-brand-solid" : "bg-primary",
217
+ isDisabled && "cursor-not-allowed opacity-50",
218
+ isDisabled && !isChecked && "bg-tertiary",
219
+ isFocusVisible && !isDisabled && focusRingShadow,
220
+ className
221
+ ),
222
+ children: [
223
+ isIndeterminate && /* @__PURE__ */ jsx(
224
+ "svg",
225
+ {
226
+ "aria-hidden": "true",
227
+ viewBox: "0 0 14 14",
228
+ fill: "none",
229
+ className: cx("pointer-events-none block shrink-0 text-fg-white", iconClassName),
230
+ children: /* @__PURE__ */ jsx("path", { d: "M2.91675 7H11.0834", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" })
231
+ }
232
+ ),
233
+ isSelected && !isIndeterminate && /* @__PURE__ */ jsx(CheckboxAnimatedCheckMark, { className: cx("pointer-events-none text-fg-white", iconClassName) })
234
+ ]
235
+ }
236
+ );
237
+ };
238
+ CheckboxBase.displayName = "CheckboxBase";
239
+ var RADIO_DOT_DELAY_MS = 60;
240
+ var RADIO_DOT_POP_MS = 100;
241
+ function RadioAnimatedDot({ className }) {
242
+ const dotRef = useRef(null);
243
+ useLayoutEffect(() => {
244
+ const dot = dotRef.current;
245
+ if (!dot) return;
246
+ if (typeof dot.animate !== "function") {
247
+ dot.style.opacity = "1";
248
+ dot.style.transform = "scale(1)";
249
+ return;
250
+ }
251
+ const anim = dot.animate(
252
+ [
253
+ { opacity: 0, transform: "scale(0)" },
254
+ { opacity: 1, transform: "scale(1)" }
255
+ ],
256
+ {
257
+ duration: RADIO_DOT_POP_MS,
258
+ delay: RADIO_DOT_DELAY_MS,
259
+ easing: "cubic-bezier(0.45, 0, 0.2, 1)",
260
+ fill: "forwards"
261
+ }
262
+ );
263
+ return () => anim.cancel();
264
+ }, []);
265
+ return /* @__PURE__ */ jsx("div", { ref: dotRef, "aria-hidden": "true", className: cx("rounded-full bg-fg-white", className), style: { opacity: 0, transform: "scale(0)" } });
266
+ }
267
+ var focusRingShadow2 = "outline-none [box-shadow:0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]";
268
+ createContext(null);
269
+ var RadioButtonBase = ({ className, isFocusVisible, isSelected, isDisabled, size = "sm" }) => {
270
+ const dotClassName = size === "sm" ? "size-1.5" : "size-2";
271
+ return /* @__PURE__ */ jsx(
272
+ "div",
273
+ {
274
+ className: cx(
275
+ "relative flex shrink-0 cursor-pointer appearance-none items-center justify-center overflow-clip rounded-full border border-solid border-primary bg-primary",
276
+ size === "sm" ? "size-4" : "size-5",
277
+ isSelected && "border-transparent bg-brand-solid",
278
+ isDisabled && "cursor-not-allowed opacity-50",
279
+ isDisabled && !isSelected && "bg-tertiary",
280
+ isFocusVisible && !isDisabled && focusRingShadow2,
281
+ className
282
+ ),
283
+ children: isSelected && /* @__PURE__ */ jsx(RadioAnimatedDot, { className: cx("pointer-events-none", dotClassName) })
284
+ }
285
+ );
286
+ };
287
+ RadioButtonBase.displayName = "RadioButtonBase";
288
+ var focusRingShadow3 = "outline-none [box-shadow:0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]";
289
+ var ToggleBase = ({ className, isHovered, isDisabled, isFocusVisible, isSelected, slim, size = "sm" }) => {
290
+ const styles2 = {
291
+ default: {
292
+ sm: {
293
+ track: "h-5 w-9 p-0.5",
294
+ thumb: "size-4",
295
+ thumbPosition: isSelected ? "left-[calc(100%-1rem-0.125rem)]" : "left-0.5"
296
+ },
297
+ md: {
298
+ track: "h-6 w-11 p-0.5",
299
+ thumb: "size-5",
300
+ thumbPosition: isSelected ? "left-[calc(100%-1.25rem-0.125rem)]" : "left-0.5"
301
+ }
302
+ },
303
+ slim: {
304
+ sm: {
305
+ track: "h-4 w-8",
306
+ thumb: "size-4",
307
+ thumbPosition: isSelected ? "left-4" : "left-0"
308
+ },
309
+ md: {
310
+ track: "h-5 w-10",
311
+ thumb: "size-5",
312
+ thumbPosition: isSelected ? "left-5" : "left-0"
313
+ }
314
+ }
315
+ };
316
+ const classes = slim ? styles2.slim[size] : styles2.default[size];
317
+ const offTrackBackground = (() => {
318
+ if (isDisabled) return "bg-tertiary";
319
+ if (isHovered) return slim ? "bg-tertiary" : "bg-brand-primary";
320
+ return "bg-quaternary";
321
+ })();
322
+ return /* @__PURE__ */ jsx(
323
+ "div",
324
+ {
325
+ className: cx(
326
+ "relative inline-flex shrink-0 cursor-pointer overflow-clip rounded-full outline-none transition duration-150 ease-linear",
327
+ !isSelected && offTrackBackground,
328
+ !slim && "ring-[0.5px] ring-secondary ring-inset",
329
+ slim && "ring-1 ring-secondary ring-inset",
330
+ isSelected && "bg-brand-solid",
331
+ isSelected && isHovered && "bg-brand-solid_hover",
332
+ isSelected && "ring-transparent",
333
+ isDisabled && "cursor-not-allowed opacity-50",
334
+ isFocusVisible && !isDisabled && focusRingShadow3,
335
+ classes.track,
336
+ className
337
+ ),
338
+ children: /* @__PURE__ */ jsx(
339
+ "div",
340
+ {
341
+ className: cx(
342
+ "absolute rounded-full bg-fg-white shadow-sm transition-[left] duration-150 ease-in-out",
343
+ slim ? "top-0 shadow-xs" : "top-0.5",
344
+ slim && "border border-toggle-border",
345
+ slim && isSelected && "border-toggle-slim-border_pressed",
346
+ slim && isSelected && isHovered && "border-toggle-slim-border_pressed-hover",
347
+ classes.thumb,
348
+ classes.thumbPosition
349
+ )
350
+ }
351
+ )
352
+ }
353
+ );
354
+ };
355
+ var focusShadowInset = "[box-shadow:0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]";
356
+ var DropdownItem = ({ label, children, addon, icon: Icon, avatarUrl, unstyled, selectionIndicator = "checkmark", ...props }) => {
357
+ const SelectionIndicator = useCallback(
358
+ (state) => {
359
+ if (selectionIndicator === "checkmark") {
360
+ return /* @__PURE__ */ jsx(
361
+ CheckIcon,
362
+ {
363
+ "aria-hidden": "true",
364
+ className: cx("size-4 shrink-0 stroke-[2.25px] text-fg-brand-primary", !state.isSelected && "invisible", state.className)
365
+ }
366
+ );
367
+ }
368
+ if (selectionIndicator === "checkbox") {
369
+ return /* @__PURE__ */ jsx(
370
+ CheckboxBase,
371
+ {
372
+ isSelected: state.isSelected && !state.hasSubmenu,
373
+ isIndeterminate: state.isSelected && state.hasSubmenu,
374
+ size: "sm",
375
+ className: cx("shrink-0", state.className)
376
+ }
377
+ );
378
+ }
379
+ if (selectionIndicator === "radio") {
380
+ return /* @__PURE__ */ jsx(RadioButtonBase, { isSelected: state.isSelected, className: cx("shrink-0", state.className) });
381
+ }
382
+ if (selectionIndicator === "toggle") {
383
+ return /* @__PURE__ */ jsx(ToggleBase, { slim: true, size: "sm", isSelected: state.isSelected, className: cx("shrink-0", state.className) });
384
+ }
385
+ return null;
386
+ },
387
+ [selectionIndicator]
388
+ );
389
+ if (unstyled) {
390
+ return /* @__PURE__ */ jsx(MenuItem, { id: label, textValue: label, ...props });
391
+ }
392
+ return /* @__PURE__ */ jsx(
393
+ MenuItem,
394
+ {
395
+ ...props,
396
+ className: (state) => cx(
397
+ "group block cursor-pointer px-1.5 py-px outline-hidden",
398
+ state.isDisabled && "cursor-not-allowed opacity-50",
399
+ typeof props.className === "function" ? props.className(state) : props.className
400
+ ),
401
+ children: (state) => /* @__PURE__ */ jsxs(
402
+ "div",
403
+ {
404
+ className: cx(
405
+ "relative flex items-center rounded-md px-2.5 py-2 transition duration-100 ease-linear",
406
+ !state.isDisabled && "group-hover:bg-primary_hover",
407
+ state.isFocused && "bg-primary_hover",
408
+ state.isFocusVisible && focusShadowInset,
409
+ state.hasSubmenu && "pr-1.5"
410
+ ),
411
+ children: [
412
+ state.selectionMode !== "none" && !avatarUrl && !Icon && /* @__PURE__ */ jsx(SelectionIndicator, { ...state, className: "mr-2" }),
413
+ avatarUrl && /* @__PURE__ */ jsx("div", { className: "mr-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ jsx(Avatar, { "aria-hidden": "true", size: "xs", src: avatarUrl, alt: label, className: "size-5" }) }),
414
+ Icon && /* @__PURE__ */ jsx(Icon, { "aria-hidden": "true", className: "mr-2 size-4 shrink-0 stroke-[2.25px] text-fg-quaternary" }),
415
+ /* @__PURE__ */ jsx("span", { className: cx("grow truncate text-sm font-semibold text-secondary", state.isFocused && "text-secondary_hover"), children: label || (typeof children === "function" ? children(state) : children) }),
416
+ addon && /* @__PURE__ */ jsx("span", { className: "ml-1 shrink-0 pr-1 text-xs font-medium text-quaternary", children: addon }),
417
+ state.selectionMode !== "none" && (avatarUrl || Icon) && /* @__PURE__ */ jsx(SelectionIndicator, { ...state, className: "ml-1" }),
418
+ state.hasSubmenu && /* @__PURE__ */ jsx(CaretRightIcon, { "aria-hidden": "true", className: "ml-auto size-4 shrink-0 stroke-[2.25px] text-fg-quaternary" })
419
+ ]
420
+ }
421
+ )
422
+ }
423
+ );
424
+ };
425
+ var DropdownMenu = (props) => {
426
+ return /* @__PURE__ */ jsx(
427
+ Menu,
428
+ {
429
+ ...props,
430
+ className: (state) => cx("h-min overflow-y-auto py-1 outline-hidden select-none", typeof props.className === "function" ? props.className(state) : props.className)
431
+ }
432
+ );
433
+ };
434
+ var DropdownPopover = (props) => {
435
+ return /* @__PURE__ */ jsx(
436
+ Popover,
437
+ {
438
+ placement: "bottom right",
439
+ ...props,
440
+ className: (state) => cx(
441
+ "w-62 origin-(--trigger-anchor-point) overflow-auto rounded-lg bg-primary shadow-lg ring-1 ring-secondary_alt will-change-transform",
442
+ state.isEntering && "duration-150 ease-out animate-in fade-in placement-right:slide-in-from-left-0.5 placement-top:slide-in-from-bottom-0.5 placement-bottom:slide-in-from-top-0.5",
443
+ state.isExiting && "duration-100 ease-in animate-out fade-out placement-right:slide-out-to-left-0.5 placement-top:slide-out-to-bottom-0.5 placement-bottom:slide-out-to-top-0.5",
444
+ typeof props.className === "function" ? props.className(state) : props.className
445
+ ),
446
+ children: props.children
447
+ }
448
+ );
449
+ };
450
+ var DropdownSeparator = (props) => {
451
+ return /* @__PURE__ */ jsx(Separator, { ...props, className: cx("my-1 h-px w-full bg-border-secondary", props.className) });
452
+ };
453
+ var Dropdown = {
454
+ Root: MenuTrigger,
455
+ Popover: DropdownPopover,
456
+ Menu: DropdownMenu,
457
+ Section: MenuSection,
458
+ Item: DropdownItem,
459
+ Separator: DropdownSeparator};
460
+ var focusShadowPlain2 = "focus-visible:outline-none focus-visible:[box-shadow:0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]";
461
+ var permissions = [
462
+ { id: "owner", label: "Owner" },
463
+ { id: "can-edit", label: "Can edit" },
464
+ { id: "can-view", label: "Can view" }
465
+ ];
466
+ var DropdownButtonLink = () => {
467
+ const [selectedPermission, setSelectedPermission] = useState(permissions[1].id);
468
+ return /* @__PURE__ */ jsxs(Dropdown.Root, { children: [
469
+ /* @__PURE__ */ jsxs(
470
+ Button,
471
+ {
472
+ className: ({ isPressed }) => cx(
473
+ "flex cursor-pointer items-center gap-1 rounded text-sm font-semibold text-tertiary",
474
+ isPressed && "text-tertiary_hover",
475
+ focusShadowPlain2
476
+ ),
477
+ children: [
478
+ permissions.find((permission) => permission.id === selectedPermission.toString())?.label,
479
+ /* @__PURE__ */ jsx(CaretDownIcon, { className: "size-3 shrink-0 stroke-3 text-fg-quaternary" })
480
+ ]
481
+ }
482
+ ),
483
+ /* @__PURE__ */ jsx(Dropdown.Popover, { className: "w-40", children: /* @__PURE__ */ jsxs(Dropdown.Menu, { children: [
484
+ /* @__PURE__ */ jsx(
485
+ Dropdown.Section,
486
+ {
487
+ selectionMode: "single",
488
+ selectedKeys: [selectedPermission],
489
+ onSelectionChange: (keys) => setSelectedPermission(typeof keys === "string" ? keys : keys.keys().toArray()[0]),
490
+ children: permissions.map((permission) => /* @__PURE__ */ jsx(Dropdown.Item, { id: permission.id, children: permission.label }, permission.id))
491
+ }
492
+ ),
493
+ /* @__PURE__ */ jsx(Dropdown.Separator, {}),
494
+ /* @__PURE__ */ jsx(Dropdown.Section, { children: /* @__PURE__ */ jsx(Dropdown.Item, { icon: TrashIcon, children: "Delete" }) })
495
+ ] }) })
496
+ ] });
497
+ };
498
+
499
+ export { DropdownButtonLink };
500
+ //# sourceMappingURL=dropdown-button-link.js.map
501
+ //# sourceMappingURL=dropdown-button-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../utils/cx.ts","../../../../components/base/avatar/base-components/avatar-online-indicator.tsx","../../../../components/base/avatar/base-components/verified-tick.tsx","../../../../components/base/avatar/base-components/avatar-count.tsx","../../../../components/base/avatar/avatar.tsx","../../../../components/base/checkbox/checkbox.tsx","../../../../components/base/radio-buttons/radio-buttons.tsx","../../../../components/base/toggle/toggle.tsx","../../../../components/base/dropdown/dropdown.tsx","../../../../components/base/dropdown/dropdown-button-link.tsx"],"names":["jsx","jsxs","sizes","User01","useRef","useLayoutEffect","focusRingShadow","styles","Check","AriaMenuItem","ChevronRight","AriaMenu","AriaPopover","AriaSeparator","AriaMenuTrigger","AriaMenuSection","focusShadowPlain","useState","AriaButton","ChevronDown","Trash01"],"mappings":"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","file":"dropdown-button-link.js","sourcesContent":["import { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({\n extend: {\n theme: {\n text: [\"display-xs\", \"display-sm\", \"display-md\", \"display-lg\", \"display-xl\", \"display-2xl\"],\n },\n },\n});\n\n/**\n * This function is a wrapper around the twMerge function.\n * It is used to merge the classes inside style objects.\n */\nexport const cx = twMerge;\n\n/**\n * This function does nothing besides helping us to be able to\n * sort the classes inside style objects which is not supported\n * by the Tailwind IntelliSense by default.\n */\nexport function sortCx<T extends Record<string, string | number | Record<string, string | number | Record<string, string | number>>>>(classes: T): T {\n return classes;\n}\n","\"use client\";\n\nimport { cx } from \"@/utils/cx\";\n\nconst sizes = {\n xs: \"size-1.5\",\n sm: \"size-2\",\n md: \"size-2.5\",\n lg: \"size-3\",\n xl: \"size-3.5\",\n \"2xl\": \"size-4\",\n \"3xl\": \"size-4.5\",\n \"4xl\": \"size-5\",\n};\n\ninterface AvatarOnlineIndicatorProps {\n size: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\" | \"4xl\";\n status: \"online\" | \"offline\";\n className?: string;\n}\n\nexport const AvatarOnlineIndicator = ({ size, status, className }: AvatarOnlineIndicatorProps) => (\n <span\n className={cx(\n \"absolute right-0 bottom-0 flex justify-center rounded-full ring-[1.5px] ring-bg-primary\",\n status === \"online\" ? \"bg-fg-success-secondary\" : \"bg-utility-neutral-300\",\n sizes[size],\n className,\n )}\n style={{\n backgroundImage:\n \"radial-gradient(43.75% 43.75% at 50% 28.75%, rgba(255, 255, 255, 0.05) 0%, rgba(255, 255, 255, 0.00) 100%), radial-gradient(50% 50% at 50% 50%, rgba(255, 255, 255, 0.00) 74.66%, rgba(255, 255, 255, 0.18) 100%), radial-gradient(75% 75% at 50% 0%, rgba(255, 255, 255, 0.00) 0%, rgba(255, 255, 255, 0.00) 50%, rgba(255, 255, 255, 0.08) 99%, rgba(255, 255, 255, 0.00) 100%)\",\n }}\n >\n {/* Reflection */}\n <svg viewBox=\"0 0 7.2 2.85\" fill=\"none\" className=\"mt-[10%] h-[20%] w-[60%]\">\n <path\n d=\"M7.2 1.83107C7.2 2.84235 5.58823 2.19729 3.6 2.19729C1.61177 2.19729 0 2.84235 0 1.83107C0 0.8198 1.61177 0 3.6 0C5.58823 0 7.2 0.8198 7.2 1.83107Z\"\n fill=\"url(#reflection-gradient)\"\n fillOpacity=\"0.4\"\n />\n <defs>\n <linearGradient id=\"reflection-gradient\" x1=\"3.6\" y1=\"0\" x2=\"3.6\" y2=\"2.4\" gradientUnits=\"userSpaceOnUse\">\n <stop stopColor=\"white\" />\n <stop offset=\"1\" stopColor=\"white\" stopOpacity=\"0.1\" />\n </linearGradient>\n </defs>\n </svg>\n </span>\n);\n","\"use client\";\n\nimport { cx } from \"@/utils/cx\";\n\nconst sizes = {\n xs: \"size-2.5\",\n sm: \"size-3\",\n md: \"size-3.5\",\n lg: \"size-4\",\n xl: \"size-4.5\",\n \"2xl\": \"size-5\",\n \"3xl\": \"size-6\",\n \"4xl\": \"size-8\",\n};\n\ninterface VerifiedTickProps {\n size: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\" | \"4xl\";\n className?: string;\n}\n\nexport const VerifiedTick = ({ size, className }: VerifiedTickProps) => (\n <svg className={cx(\"z-10 text-utility-blue-500\", sizes[size], className)} viewBox=\"0 0 10 10\" fill=\"none\">\n <path\n d=\"M7.72237 1.77098C7.81734 2.00068 7.99965 2.18326 8.2292 2.27858L9.03413 2.61199C9.26384 2.70714 9.44635 2.88965 9.5415 3.11936C9.63665 3.34908 9.63665 3.60718 9.5415 3.83689L9.20833 4.64125C9.11313 4.87106 9.113 5.12943 9.20863 5.35913L9.54122 6.16325C9.58839 6.27702 9.61268 6.39897 9.6127 6.52214C9.61272 6.6453 9.58847 6.76726 9.54134 6.88105C9.4942 6.99484 9.42511 7.09823 9.33801 7.18531C9.2509 7.27238 9.14749 7.34144 9.03369 7.38854L8.22934 7.72171C7.99964 7.81669 7.81706 7.99899 7.72174 8.22855L7.38833 9.03348C7.29318 9.26319 7.11067 9.4457 6.88096 9.54085C6.65124 9.636 6.39314 9.636 6.16343 9.54085L5.35907 9.20767C5.12935 9.11276 4.87134 9.11295 4.64177 9.20821L3.83684 9.54115C3.60725 9.63608 3.34937 9.636 3.11984 9.54092C2.89032 9.44585 2.70791 9.26356 2.6127 9.03409L2.27918 8.22892C2.18421 7.99923 2.0019 7.81665 1.77235 7.72133L0.967421 7.38792C0.737807 7.29281 0.555355 7.11041 0.460169 6.88083C0.364983 6.65125 0.364854 6.39327 0.45981 6.16359L0.792984 5.35924C0.8879 5.12952 0.887707 4.87151 0.792445 4.64193L0.459749 3.83642C0.41258 3.72265 0.388291 3.60069 0.388272 3.47753C0.388252 3.35436 0.412501 3.2324 0.459634 3.11861C0.506767 3.00482 0.57586 2.90144 0.662965 2.81436C0.75007 2.72728 0.853479 2.65822 0.967283 2.61113L1.77164 2.27795C2.00113 2.18306 2.1836 2.00099 2.27899 1.7717L2.6124 0.966768C2.70755 0.737054 2.89006 0.554547 3.11978 0.459397C3.34949 0.364246 3.60759 0.364246 3.83731 0.459397L4.64166 0.792571C4.87138 0.887487 5.12939 0.887293 5.35897 0.792031L6.16424 0.459913C6.39392 0.364816 6.65197 0.364836 6.88164 0.459968C7.11131 0.555099 7.29379 0.737554 7.38895 0.967208L7.72247 1.77238L7.72237 1.77098Z\"\n className=\"fill-current\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.95829 3.68932C7.02509 3.58439 7.04747 3.45723 7.02051 3.3358C6.99356 3.21437 6.91946 3.10862 6.81454 3.04182C6.70961 2.97502 6.58245 2.95264 6.46102 2.97959C6.33959 3.00655 6.23384 3.08064 6.16704 3.18557L4.33141 6.06995L3.49141 5.01995C3.41375 4.92281 3.30069 4.8605 3.17709 4.84673C3.05349 4.83296 2.92949 4.86885 2.83235 4.94651C2.73522 5.02417 2.67291 5.13723 2.65914 5.26083C2.64536 5.38443 2.68125 5.50843 2.75891 5.60557L4.00891 7.16807C4.0555 7.22638 4.11533 7.27271 4.18344 7.30323C4.25154 7.33375 4.32595 7.34757 4.40047 7.34353C4.47499 7.3395 4.54747 7.31773 4.61188 7.28004C4.67629 7.24234 4.73077 7.18981 4.77079 7.12682L6.95829 3.68932Z\"\n fill=\"white\"\n />\n </svg>\n);\n","\"use client\";\n\nimport { cx } from \"@/utils/cx\";\n\ninterface AvatarCountProps {\n count: number;\n className?: string;\n}\n\nexport const AvatarCount = ({ count, className }: AvatarCountProps) => (\n <div className={cx(\"absolute right-0 bottom-0 p-px\", className)}>\n <div className=\"flex size-3.5 items-center justify-center rounded-full bg-fg-error-primary text-center text-[10px] leading-[13px] font-bold text-white\">\n {count}\n </div>\n </div>\n);\n","\"use client\";\n\n/** Figma: Avatar (18:1350) */\n\nimport { type FC, type ReactNode, useState } from \"react\";\nimport { UserIcon as User01 } from \"@phosphor-icons/react/dist/csr/User\";\nimport { cx } from \"@/utils/cx\";\nimport { AvatarOnlineIndicator, VerifiedTick } from \"./base-components\";\nimport { AvatarCount } from \"./base-components/avatar-count\";\n\nexport interface AvatarProps {\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n className?: string;\n /**\n * The class name for the main child of the avatar.\n */\n contentClassName?: string;\n src?: string | null;\n alt?: string;\n /**\n * Display an inner contrast border around the avatar image.\n */\n contrastBorder?: boolean;\n /**\n * Whether the avatar should be rounded.\n * @default true\n */\n rounded?: boolean;\n /**\n * Display an outer border around the avatar.\n */\n border?: boolean;\n /**\n * Display a badge (i.e. company logo).\n */\n badge?: ReactNode;\n /**\n * Display a status indicator.\n */\n status?: \"online\" | \"offline\";\n /**\n * Display a verified tick icon.\n *\n * @default false\n */\n verified?: boolean;\n /**\n * Display a count badge.\n */\n count?: number;\n /**\n * The initials of the user to display if no image is available.\n */\n initials?: string;\n /**\n * An icon to display if no image is available.\n */\n placeholderIcon?: FC<{ className?: string }>;\n /**\n * A placeholder to display if no image is available.\n */\n placeholder?: ReactNode;\n\n /**\n * Whether the avatar should show a focus ring when the parent group is in focus.\n * For example, when the avatar is wrapped inside a link.\n *\n * @default false\n */\n focusable?: boolean;\n}\n\nconst styles = {\n xs: { root: \"size-6\", rootWithBorder: \"p-px\", initials: \"text-xs font-semibold\", icon: \"size-4\" },\n sm: { root: \"size-8\", rootWithBorder: \"p-px\", initials: \"text-sm font-semibold\", icon: \"size-5\" },\n md: { root: \"size-10\", rootWithBorder: \"p-px\", initials: \"text-md font-semibold\", icon: \"size-6\" },\n lg: { root: \"size-12\", rootWithBorder: \"p-[1.5px]\", initials: \"text-lg font-semibold\", icon: \"size-7\" },\n xl: { root: \"size-14\", rootWithBorder: \"p-0.5\", initials: \"text-xl font-semibold\", icon: \"size-8\" },\n \"2xl\": { root: \"size-16\", rootWithBorder: \"p-0.5\", initials: \"text-display-xs font-semibold\", icon: \"size-8\" },\n};\n\nexport const Avatar = ({\n size = \"md\",\n src,\n alt,\n initials,\n placeholder,\n placeholderIcon: PlaceholderIcon,\n border,\n badge,\n status,\n verified,\n count,\n focusable = false,\n rounded = true,\n className,\n contentClassName,\n}: AvatarProps) => {\n const [isFailed, setIsFailed] = useState(false);\n\n const canShowImage = src && !isFailed;\n\n const renderMainContent = () => {\n if (canShowImage) {\n return <img data-avatar-img className=\"size-full object-cover\" src={src} alt={alt} onError={() => setIsFailed(true)} />;\n }\n\n if (initials) {\n return <span className={cx(\"text-quaternary\", styles[size].initials)}>{initials}</span>;\n }\n\n if (PlaceholderIcon) {\n return <PlaceholderIcon className={cx(\"text-fg-quaternary\", styles[size].icon)} />;\n }\n\n return placeholder || <User01 className={cx(\"text-fg-quaternary\", styles[size].icon)} />;\n };\n\n const renderBadgeContent = () => {\n if (status) {\n return <AvatarOnlineIndicator status={status} size={size} />;\n }\n\n if (verified) {\n return <VerifiedTick size={size} className={cx(\"absolute right-0 bottom-0\", size === \"xs\" && \"-right-px -bottom-px\")} />;\n }\n\n if (count) {\n return <AvatarCount count={count} />;\n }\n\n return badge;\n };\n\n return (\n <div\n data-avatar\n className={cx(\n \"relative inline-flex shrink-0 rounded-[7px]\",\n rounded && \"rounded-full\",\n // Focus styles\n focusable &&\n \"outline-none group-focus-visible:[box-shadow:0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]\",\n border && \"ring-1 ring-secondary_alt\",\n border && styles[size].rootWithBorder,\n styles[size].root,\n className,\n )}\n >\n <div\n className={cx(\n \"relative inline-flex size-full shrink-0 items-center justify-center overflow-hidden rounded-md bg-tertiary outline-[0.5px] -outline-offset-[0.5px] outline-black/16 before:inset-[0.5px]\",\n rounded && \"rounded-full\",\n canShowImage &&\n size !== \"xs\" &&\n \"before:absolute before:inset-0 before:rounded-[inherit] before:border before:border-white/32 before:mask-[linear-gradient(to_bottom,black_0%,transparent_25%,transparent_75%,black_100%)]\",\n contentClassName,\n )}\n >\n {renderMainContent()}\n </div>\n {renderBadgeContent()}\n </div>\n );\n};\n","\"use client\";\n\nimport { useLayoutEffect, useRef, type ReactNode, type Ref } from \"react\";\nimport { Checkbox as AriaCheckbox, type CheckboxProps as AriaCheckboxProps } from \"react-aria-components\";\nimport { cx } from \"@/utils/cx\";\n\nconst CHECKBOX_TICK_DELAY_MS = 60;\nconst CHECKBOX_TICK_DRAW_MS = 100;\n\n/** Draw-on-check tick animation — remounts when checked so it replays each time. */\nfunction CheckboxAnimatedCheckMark({ className }: { className?: string }) {\n const pathRef = useRef<SVGPathElement>(null);\n\n useLayoutEffect(() => {\n const path = pathRef.current;\n if (!path || typeof path.getTotalLength !== \"function\") return;\n const len = path.getTotalLength();\n if (len <= 0) return;\n\n path.style.strokeDasharray = `${len}`;\n path.style.strokeDashoffset = `${len}`;\n\n if (typeof path.animate !== \"function\") {\n path.style.strokeDashoffset = \"0\";\n return;\n }\n\n const anim = path.animate([{ strokeDashoffset: len }, { strokeDashoffset: 0 }], {\n duration: CHECKBOX_TICK_DRAW_MS,\n delay: CHECKBOX_TICK_DELAY_MS,\n easing: \"cubic-bezier(0.45, 0, 0.2, 1)\",\n fill: \"forwards\",\n });\n return () => anim.cancel();\n }, []);\n\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 14 14\" fill=\"none\" className={cx(\"block shrink-0\", className)}>\n <path\n ref={pathRef}\n d=\"M2.33325 7L5.24992 9.91667L11.6666 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n/** Figma Focus rings/focus-ring — 2px surface gap + 4px brand ring (matches Button). */\nconst focusRingShadow =\n \"outline-none [box-shadow:0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]\";\n\nexport interface CheckboxBaseProps {\n size?: \"sm\" | \"md\";\n className?: string;\n isFocusVisible?: boolean;\n isSelected?: boolean;\n isDisabled?: boolean;\n isIndeterminate?: boolean;\n}\n\nexport const CheckboxBase = ({ className, isSelected, isDisabled, isIndeterminate, size = \"sm\", isFocusVisible = false }: CheckboxBaseProps) => {\n const isChecked = isSelected || isIndeterminate;\n const iconClassName = size === \"sm\" ? \"size-2.5\" : \"size-3.5\";\n\n return (\n <div\n className={cx(\n \"relative flex shrink-0 cursor-pointer appearance-none items-center justify-center border border-solid border-primary\",\n size === \"sm\" ? \"size-4 rounded-xs\" : \"size-5 rounded-sm\",\n isChecked ? \"border-transparent bg-brand-solid\" : \"bg-primary\",\n isDisabled && \"cursor-not-allowed opacity-50\",\n isDisabled && !isChecked && \"bg-tertiary\",\n isFocusVisible && !isDisabled && focusRingShadow,\n className,\n )}\n >\n {isIndeterminate && (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n className={cx(\"pointer-events-none block shrink-0 text-fg-white\", iconClassName)}\n >\n <path d=\"M2.91675 7H11.0834\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n\n {isSelected && !isIndeterminate && (\n <CheckboxAnimatedCheckMark className={cx(\"pointer-events-none text-fg-white\", iconClassName)} />\n )}\n </div>\n );\n};\nCheckboxBase.displayName = \"CheckboxBase\";\n\ninterface CheckboxProps extends AriaCheckboxProps {\n ref?: Ref<HTMLLabelElement>;\n size?: \"sm\" | \"md\";\n label?: ReactNode;\n hint?: ReactNode;\n}\n\nexport const Checkbox = ({ label, hint, size = \"sm\", className, ...ariaCheckboxProps }: CheckboxProps) => {\n const sizes = {\n sm: {\n root: \"gap-2\",\n textWrapper: \"\",\n label: \"text-sm font-medium\",\n hint: \"text-sm\",\n },\n md: {\n root: \"gap-3\",\n textWrapper: \"gap-0.5 break-words\",\n label: \"text-md font-medium\",\n hint: \"text-md\",\n },\n };\n\n return (\n <AriaCheckbox\n {...ariaCheckboxProps}\n className={(state) =>\n cx(\n \"relative flex items-start\",\n state.isDisabled && \"cursor-not-allowed\",\n sizes[size].root,\n typeof className === \"function\" ? className(state) : className,\n )\n }\n >\n {({ isSelected, isIndeterminate, isDisabled, isFocusVisible }) => (\n <>\n <CheckboxBase\n size={size}\n isSelected={isSelected}\n isIndeterminate={isIndeterminate}\n isDisabled={isDisabled}\n isFocusVisible={isFocusVisible}\n className={label || hint ? \"mt-0.5\" : \"\"}\n />\n {(label || hint) && (\n <div className={cx(\"inline-flex flex-col\", sizes[size].textWrapper)}>\n {label && <p className={cx(\"text-secondary select-none\", sizes[size].label)}>{label}</p>}\n {hint && (\n <span className={cx(\"text-tertiary\", sizes[size].hint)} onClick={(event) => event.stopPropagation()}>\n {hint}\n </span>\n )}\n </div>\n )}\n </>\n )}\n </AriaCheckbox>\n );\n};\nCheckbox.displayName = \"Checkbox\";\n","\"use client\";\n\nimport { useLayoutEffect, useRef, type ReactNode, type Ref, createContext, useContext } from \"react\";\nimport {\n Radio as AriaRadio,\n RadioGroup as AriaRadioGroup,\n type RadioGroupProps as AriaRadioGroupProps,\n type RadioProps as AriaRadioProps,\n} from \"react-aria-components\";\nimport { cx } from \"@/utils/cx\";\n\nconst RADIO_DOT_DELAY_MS = 60;\nconst RADIO_DOT_POP_MS = 100;\n\n/** Pop-in dot animation — remounts when selected so it replays each time (matches Checkbox tick timing). */\nfunction RadioAnimatedDot({ className }: { className?: string }) {\n const dotRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n const dot = dotRef.current;\n if (!dot) return;\n\n if (typeof dot.animate !== \"function\") {\n dot.style.opacity = \"1\";\n dot.style.transform = \"scale(1)\";\n return;\n }\n\n const anim = dot.animate(\n [\n { opacity: 0, transform: \"scale(0)\" },\n { opacity: 1, transform: \"scale(1)\" },\n ],\n {\n duration: RADIO_DOT_POP_MS,\n delay: RADIO_DOT_DELAY_MS,\n easing: \"cubic-bezier(0.45, 0, 0.2, 1)\",\n fill: \"forwards\",\n },\n );\n return () => anim.cancel();\n }, []);\n\n return <div ref={dotRef} aria-hidden=\"true\" className={cx(\"rounded-full bg-fg-white\", className)} style={{ opacity: 0, transform: \"scale(0)\" }} />;\n}\n\n/** Figma: _Radio button base (1097:63638) — spread focus ring (2px surface gap + 4px focus-ring). */\nconst focusRingShadow =\n \"outline-none [box-shadow:0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]\";\n\nexport interface RadioGroupContextType {\n size?: \"sm\" | \"md\";\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextType | null>(null);\n\nexport interface RadioButtonBaseProps {\n size?: \"sm\" | \"md\";\n className?: string;\n isFocusVisible?: boolean;\n isSelected?: boolean;\n isDisabled?: boolean;\n}\n\nexport const RadioButtonBase = ({ className, isFocusVisible, isSelected, isDisabled, size = \"sm\" }: RadioButtonBaseProps) => {\n const dotClassName = size === \"sm\" ? \"size-1.5\" : \"size-2\";\n\n return (\n <div\n className={cx(\n \"relative flex shrink-0 cursor-pointer appearance-none items-center justify-center overflow-clip rounded-full border border-solid border-primary bg-primary\",\n size === \"sm\" ? \"size-4\" : \"size-5\",\n isSelected && \"border-transparent bg-brand-solid\",\n isDisabled && \"cursor-not-allowed opacity-50\",\n isDisabled && !isSelected && \"bg-tertiary\",\n isFocusVisible && !isDisabled && focusRingShadow,\n className,\n )}\n >\n {isSelected && <RadioAnimatedDot className={cx(\"pointer-events-none\", dotClassName)} />}\n </div>\n );\n};\nRadioButtonBase.displayName = \"RadioButtonBase\";\n\ninterface RadioButtonProps extends AriaRadioProps {\n size?: \"sm\" | \"md\";\n label?: ReactNode;\n hint?: ReactNode;\n ref?: Ref<HTMLLabelElement>;\n}\n\nexport const RadioButton = ({ label, hint, className, size = \"sm\", ...ariaRadioProps }: RadioButtonProps) => {\n const context = useContext(RadioGroupContext);\n\n size = context?.size ?? size;\n\n const sizes = {\n sm: {\n root: \"gap-2\",\n textWrapper: \"\",\n label: \"text-sm font-medium\",\n hint: \"text-sm\",\n },\n md: {\n root: \"gap-3\",\n textWrapper: \"gap-0.5\",\n label: \"text-md font-medium\",\n hint: \"text-md\",\n },\n };\n\n return (\n <AriaRadio\n {...ariaRadioProps}\n className={(state) =>\n cx(\n \"relative flex items-start\",\n state.isDisabled && \"cursor-not-allowed\",\n sizes[size].root,\n typeof className === \"function\" ? className(state) : className,\n )\n }\n >\n {({ isSelected, isDisabled, isFocusVisible }) => (\n <>\n <RadioButtonBase\n size={size}\n isSelected={isSelected}\n isDisabled={isDisabled}\n isFocusVisible={isFocusVisible}\n className={label || hint ? \"mt-0.5\" : \"\"}\n />\n {(label || hint) && (\n <div className={cx(\"inline-flex flex-col\", sizes[size].textWrapper)}>\n {label && <p className={cx(\"text-secondary select-none\", sizes[size].label)}>{label}</p>}\n {hint && (\n <span className={cx(\"text-tertiary\", sizes[size].hint)} onClick={(event) => event.stopPropagation()}>\n {hint}\n </span>\n )}\n </div>\n )}\n </>\n )}\n </AriaRadio>\n );\n};\nRadioButton.displayName = \"RadioButton\";\n\ninterface RadioGroupProps extends RadioGroupContextType, AriaRadioGroupProps {\n children: ReactNode;\n className?: string;\n}\n\nexport const RadioGroup = ({ children, className, size = \"sm\", ...props }: RadioGroupProps) => {\n return (\n <RadioGroupContext.Provider value={{ size }}>\n <AriaRadioGroup {...props} className={cx(\"flex flex-col gap-4\", className)}>\n {children}\n </AriaRadioGroup>\n </RadioGroupContext.Provider>\n );\n};\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport type { SwitchProps as AriaSwitchProps } from \"react-aria-components\";\nimport { Switch as AriaSwitch } from \"react-aria-components\";\nimport { cx } from \"@/utils/cx\";\n\n/** Figma: Toggle (1102:4631) — spread focus ring (2px surface gap + 4px focus-ring). */\nconst focusRingShadow =\n \"outline-none [box-shadow:0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]\";\n\ninterface ToggleBaseProps {\n size?: \"sm\" | \"md\";\n slim?: boolean;\n className?: string;\n isHovered?: boolean;\n isFocusVisible?: boolean;\n isSelected?: boolean;\n isDisabled?: boolean;\n}\n\nexport const ToggleBase = ({ className, isHovered, isDisabled, isFocusVisible, isSelected, slim, size = \"sm\" }: ToggleBaseProps) => {\n const styles = {\n default: {\n sm: {\n track: \"h-5 w-9 p-0.5\",\n thumb: \"size-4\",\n thumbPosition: isSelected ? \"left-[calc(100%-1rem-0.125rem)]\" : \"left-0.5\",\n },\n md: {\n track: \"h-6 w-11 p-0.5\",\n thumb: \"size-5\",\n thumbPosition: isSelected ? \"left-[calc(100%-1.25rem-0.125rem)]\" : \"left-0.5\",\n },\n },\n slim: {\n sm: {\n track: \"h-4 w-8\",\n thumb: \"size-4\",\n thumbPosition: isSelected ? \"left-4\" : \"left-0\",\n },\n md: {\n track: \"h-5 w-10\",\n thumb: \"size-5\",\n thumbPosition: isSelected ? \"left-5\" : \"left-0\",\n },\n },\n };\n\n const classes = slim ? styles.slim[size] : styles.default[size];\n\n const offTrackBackground = (() => {\n if (isDisabled) return \"bg-tertiary\";\n if (isHovered) return slim ? \"bg-tertiary\" : \"bg-brand-primary\";\n return \"bg-quaternary\";\n })();\n\n return (\n <div\n className={cx(\n \"relative inline-flex shrink-0 cursor-pointer overflow-clip rounded-full outline-none transition duration-150 ease-linear\",\n !isSelected && offTrackBackground,\n !slim && \"ring-[0.5px] ring-secondary ring-inset\",\n slim && \"ring-1 ring-secondary ring-inset\",\n isSelected && \"bg-brand-solid\",\n isSelected && isHovered && \"bg-brand-solid_hover\",\n isSelected && \"ring-transparent\",\n isDisabled && \"cursor-not-allowed opacity-50\",\n isFocusVisible && !isDisabled && focusRingShadow,\n classes.track,\n className,\n )}\n >\n <div\n className={cx(\n \"absolute rounded-full bg-fg-white shadow-sm transition-[left] duration-150 ease-in-out\",\n slim ? \"top-0 shadow-xs\" : \"top-0.5\",\n slim && \"border border-toggle-border\",\n slim && isSelected && \"border-toggle-slim-border_pressed\",\n slim && isSelected && isHovered && \"border-toggle-slim-border_pressed-hover\",\n classes.thumb,\n classes.thumbPosition,\n )}\n />\n </div>\n );\n};\n\nconst styles = {\n sm: {\n root: \"gap-2\",\n textWrapper: \"\",\n label: \"text-sm font-medium\",\n hint: \"text-sm\",\n },\n md: {\n root: \"gap-3\",\n textWrapper: \"gap-0.5\",\n label: \"text-md font-medium\",\n hint: \"text-md\",\n },\n};\n\ninterface ToggleProps extends AriaSwitchProps {\n size?: \"sm\" | \"md\";\n label?: string;\n hint?: ReactNode;\n slim?: boolean;\n}\n\nexport const Toggle = ({ label, hint, className, size = \"sm\", slim, ...ariaSwitchProps }: ToggleProps) => {\n return (\n <AriaSwitch\n {...ariaSwitchProps}\n className={(state) =>\n cx(\n \"relative flex w-max items-start\",\n state.isDisabled && \"cursor-not-allowed\",\n styles[size].root,\n typeof className === \"function\" ? className(state) : className,\n )\n }\n >\n {({ isSelected, isDisabled, isFocusVisible, isHovered }) => (\n <>\n <ToggleBase\n slim={slim}\n size={size}\n isHovered={isHovered}\n isDisabled={isDisabled}\n isFocusVisible={isFocusVisible}\n isSelected={isSelected}\n className={label || hint ? \"mt-0.5\" : \"\"}\n />\n\n {(label || hint) && (\n <div className={cx(\"flex flex-col\", styles[size].textWrapper)}>\n {label && <p className={cx(\"text-secondary select-none\", styles[size].label)}>{label}</p>}\n {hint && (\n <span className={cx(\"text-tertiary\", styles[size].hint)} onClick={(event) => event.stopPropagation()}>\n {hint}\n </span>\n )}\n </div>\n )}\n </>\n )}\n </AriaSwitch>\n );\n};\n","\"use client\";\n\n/** Figma: Dropdown (18:0) */\n\nimport { type FC, type RefAttributes, useCallback } from \"react\";\nimport { CheckIcon as Check } from \"@phosphor-icons/react/dist/csr/Check\";\nimport { CaretRightIcon as ChevronRight } from \"@phosphor-icons/react/dist/csr/CaretRight\";\nimport { DotsThreeVerticalIcon as DotsVertical } from \"@phosphor-icons/react/dist/csr/DotsThreeVertical\";\nimport type {\n ButtonProps as AriaButtonProps,\n MenuItemProps as AriaMenuItemProps,\n MenuProps as AriaMenuProps,\n PopoverProps as AriaPopoverProps,\n SeparatorProps as AriaSeparatorProps,\n MenuItemRenderProps,\n} from \"react-aria-components\";\nimport {\n Button as AriaButton,\n Header as AriaHeader,\n Menu as AriaMenu,\n MenuItem as AriaMenuItem,\n MenuSection as AriaMenuSection,\n MenuTrigger as AriaMenuTrigger,\n Popover as AriaPopover,\n Separator as AriaSeparator,\n} from \"react-aria-components\";\nimport { cx } from \"@/utils/cx\";\nimport { Avatar } from \"../avatar/avatar\";\nimport { CheckboxBase } from \"../checkbox/checkbox\";\nimport { RadioButtonBase } from \"../radio-buttons/radio-buttons\";\nimport { ToggleBase } from \"../toggle/toggle\";\n\nconst focusShadowPlain =\n \"focus-visible:outline-none focus-visible:[box-shadow:0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]\";\n\nconst focusShadowInset =\n \"[box-shadow:0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]\";\n\ninterface DropdownItemProps extends AriaMenuItemProps {\n /** The label of the item to be displayed. */\n label?: string;\n /** An addon to be displayed on the right side of the item. */\n addon?: string;\n /** If true, the item will not have any styles. */\n unstyled?: boolean;\n /** An icon to be displayed on the left side of the item. */\n icon?: FC<{ className?: string }>;\n /** Avatar URL to be displayed on the left side of the item. */\n avatarUrl?: string;\n /** The selection indicator to be displayed on the item. */\n selectionIndicator?: \"checkmark\" | \"checkbox\" | \"radio\" | \"toggle\" | \"none\";\n}\n\nconst DropdownItem = ({ label, children, addon, icon: Icon, avatarUrl, unstyled, selectionIndicator = \"checkmark\", ...props }: DropdownItemProps) => {\n const SelectionIndicator = useCallback(\n (state: MenuItemRenderProps & { className?: string }) => {\n if (selectionIndicator === \"checkmark\") {\n return (\n <Check\n aria-hidden=\"true\"\n className={cx(\"size-4 shrink-0 stroke-[2.25px] text-fg-brand-primary\", !state.isSelected && \"invisible\", state.className)}\n />\n );\n }\n if (selectionIndicator === \"checkbox\") {\n return (\n <CheckboxBase\n isSelected={state.isSelected && !state.hasSubmenu}\n isIndeterminate={state.isSelected && state.hasSubmenu}\n size=\"sm\"\n className={cx(\"shrink-0\", state.className)}\n />\n );\n }\n if (selectionIndicator === \"radio\") {\n return <RadioButtonBase isSelected={state.isSelected} className={cx(\"shrink-0\", state.className)} />;\n }\n if (selectionIndicator === \"toggle\") {\n return <ToggleBase slim size=\"sm\" isSelected={state.isSelected} className={cx(\"shrink-0\", state.className)} />;\n }\n return null;\n },\n [selectionIndicator],\n );\n\n if (unstyled) {\n return <AriaMenuItem id={label} textValue={label} {...props} />;\n }\n\n return (\n <AriaMenuItem\n {...props}\n className={(state) =>\n cx(\n \"group block cursor-pointer px-1.5 py-px outline-hidden\",\n state.isDisabled && \"cursor-not-allowed opacity-50\",\n typeof props.className === \"function\" ? props.className(state) : props.className,\n )\n }\n >\n {(state) => (\n <div\n className={cx(\n \"relative flex items-center rounded-md px-2.5 py-2 transition duration-100 ease-linear\",\n !state.isDisabled && \"group-hover:bg-primary_hover\",\n state.isFocused && \"bg-primary_hover\",\n state.isFocusVisible && focusShadowInset,\n state.hasSubmenu && \"pr-1.5\",\n )}\n >\n {state.selectionMode !== \"none\" && !avatarUrl && !Icon && <SelectionIndicator {...state} className=\"mr-2\" />}\n\n {avatarUrl && (\n <div className=\"mr-2 flex size-4 items-center justify-center\">\n <Avatar aria-hidden=\"true\" size=\"xs\" src={avatarUrl} alt={label} className=\"size-5\" />\n </div>\n )}\n\n {Icon && <Icon aria-hidden=\"true\" className=\"mr-2 size-4 shrink-0 stroke-[2.25px] text-fg-quaternary\" />}\n\n <span className={cx(\"grow truncate text-sm font-semibold text-secondary\", state.isFocused && \"text-secondary_hover\")}>\n {label || (typeof children === \"function\" ? children(state) : children)}\n </span>\n\n {addon && <span className=\"ml-1 shrink-0 pr-1 text-xs font-medium text-quaternary\">{addon}</span>}\n\n {state.selectionMode !== \"none\" && (avatarUrl || Icon) && <SelectionIndicator {...state} className=\"ml-1\" />}\n\n {state.hasSubmenu && <ChevronRight aria-hidden=\"true\" className=\"ml-auto size-4 shrink-0 stroke-[2.25px] text-fg-quaternary\" />}\n </div>\n )}\n </AriaMenuItem>\n );\n};\n\ninterface DropdownMenuProps<T extends object> extends AriaMenuProps<T> {}\n\nconst DropdownMenu = <T extends object>(props: DropdownMenuProps<T>) => {\n return (\n <AriaMenu\n {...props}\n className={(state) =>\n cx(\"h-min overflow-y-auto py-1 outline-hidden select-none\", typeof props.className === \"function\" ? props.className(state) : props.className)\n }\n />\n );\n};\n\ninterface DropdownPopoverProps extends AriaPopoverProps {}\n\nconst DropdownPopover = (props: DropdownPopoverProps) => {\n return (\n <AriaPopover\n placement=\"bottom right\"\n {...props}\n className={(state) =>\n cx(\n \"w-62 origin-(--trigger-anchor-point) overflow-auto rounded-lg bg-primary shadow-lg ring-1 ring-secondary_alt will-change-transform\",\n state.isEntering &&\n \"duration-150 ease-out animate-in fade-in placement-right:slide-in-from-left-0.5 placement-top:slide-in-from-bottom-0.5 placement-bottom:slide-in-from-top-0.5\",\n state.isExiting &&\n \"duration-100 ease-in animate-out fade-out placement-right:slide-out-to-left-0.5 placement-top:slide-out-to-bottom-0.5 placement-bottom:slide-out-to-top-0.5\",\n typeof props.className === \"function\" ? props.className(state) : props.className,\n )\n }\n >\n {props.children}\n </AriaPopover>\n );\n};\n\nconst DropdownSeparator = (props: AriaSeparatorProps) => {\n return <AriaSeparator {...props} className={cx(\"my-1 h-px w-full bg-border-secondary\", props.className)} />;\n};\n\nconst DropdownDotsButton = (props: AriaButtonProps & RefAttributes<HTMLButtonElement>) => {\n return (\n <AriaButton\n {...props}\n aria-label=\"Open menu\"\n className={(state) =>\n cx(\n \"cursor-pointer rounded-md text-fg-quaternary transition duration-100 ease-linear\",\n (state.isPressed || state.isHovered) && \"text-fg-quaternary_hover\",\n focusShadowPlain,\n typeof props.className === \"function\" ? props.className(state) : props.className,\n )\n }\n >\n <DotsVertical className=\"size-5 transition-inherit-all\" />\n </AriaButton>\n );\n};\n\nexport const Dropdown = {\n Root: AriaMenuTrigger,\n Popover: DropdownPopover,\n Menu: DropdownMenu,\n Section: AriaMenuSection,\n SectionHeader: AriaHeader,\n Item: DropdownItem,\n Separator: DropdownSeparator,\n DotsButton: DropdownDotsButton,\n};\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { CaretDownIcon as ChevronDown } from \"@phosphor-icons/react/dist/csr/CaretDown\";\nimport { TrashIcon as Trash01 } from \"@phosphor-icons/react/dist/csr/Trash\";\nimport { Button as AriaButton } from \"react-aria-components\";\nimport { Dropdown } from \"@/components/base/dropdown/dropdown\";\nimport { cx } from \"@/utils/cx\";\n\nconst focusShadowPlain =\n \"focus-visible:outline-none focus-visible:[box-shadow:0px_0px_0px_2px_var(--color-bg-primary),0px_0px_0px_4px_var(--color-focus-ring)]\";\n\nconst permissions = [\n { id: \"owner\", label: \"Owner\" },\n { id: \"can-edit\", label: \"Can edit\" },\n { id: \"can-view\", label: \"Can view\" },\n];\n\nexport const DropdownButtonLink = () => {\n const [selectedPermission, setSelectedPermission] = useState<string>(permissions[1].id);\n\n return (\n <Dropdown.Root>\n <AriaButton\n className={({ isPressed }) =>\n cx(\n \"flex cursor-pointer items-center gap-1 rounded text-sm font-semibold text-tertiary\",\n isPressed && \"text-tertiary_hover\",\n focusShadowPlain,\n )\n }\n >\n {permissions.find((permission) => permission.id === selectedPermission.toString())?.label}\n <ChevronDown className=\"size-3 shrink-0 stroke-3 text-fg-quaternary\" />\n </AriaButton>\n\n <Dropdown.Popover className=\"w-40\">\n <Dropdown.Menu>\n <Dropdown.Section\n selectionMode=\"single\"\n selectedKeys={[selectedPermission]}\n onSelectionChange={(keys) => setSelectedPermission(typeof keys === \"string\" ? keys : (keys.keys().toArray()[0] as string))}\n >\n {permissions.map((permission) => (\n <Dropdown.Item key={permission.id} id={permission.id}>\n {permission.label}\n </Dropdown.Item>\n ))}\n </Dropdown.Section>\n <Dropdown.Separator />\n <Dropdown.Section>\n <Dropdown.Item icon={Trash01}>Delete</Dropdown.Item>\n </Dropdown.Section>\n </Dropdown.Menu>\n </Dropdown.Popover>\n </Dropdown.Root>\n );\n};\n"]}