@avenue-ticketing/ui 0.11.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 -13
  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,322 @@
1
+ import { createContext, useRef, useState, useCallback, useEffect, useContext, isValidElement } from 'react';
2
+ import { MagnifyingGlassIcon } from '@phosphor-icons/react/dist/csr/MagnifyingGlass';
3
+ import { ComboBox as ComboBox$1, ListBox, Label as Label$1, ComboBoxStateContext, Group, Input, Popover as Popover$1, Text, TooltipTrigger as TooltipTrigger$1, Tooltip as Tooltip$1, OverlayArrow, Button } from 'react-aria-components';
4
+ import { extendTailwindMerge } from 'tailwind-merge';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
+ import { QuestionIcon } from '@phosphor-icons/react/dist/csr/Question';
7
+ import '@phosphor-icons/react/dist/csr/Eye';
8
+ import '@phosphor-icons/react/dist/csr/EyeSlash';
9
+ import '@phosphor-icons/react/dist/csr/Info';
10
+
11
+ var twMerge = extendTailwindMerge({
12
+ extend: {
13
+ theme: {
14
+ text: ["display-xs", "display-sm", "display-md", "display-lg", "display-xl", "display-2xl"]
15
+ }
16
+ }
17
+ });
18
+ var cx = twMerge;
19
+ var HintText = ({ isInvalid, className, size = "md", ...props }) => {
20
+ return /* @__PURE__ */ jsx(
21
+ Text,
22
+ {
23
+ ...props,
24
+ slot: isInvalid ? "errorMessage" : "description",
25
+ className: cx(
26
+ "text-sm text-tertiary",
27
+ // Size
28
+ size === "sm" && "text-xs",
29
+ "in-data-[input-size=sm]:text-xs",
30
+ // Invalid state
31
+ isInvalid && "text-error-primary",
32
+ "group-invalid:text-error-primary",
33
+ className
34
+ )
35
+ }
36
+ );
37
+ };
38
+ HintText.displayName = "HintText";
39
+ var Tooltip = ({
40
+ title,
41
+ description,
42
+ children,
43
+ arrow = false,
44
+ delay = 100,
45
+ closeDelay = 0,
46
+ trigger,
47
+ isDisabled,
48
+ isOpen,
49
+ defaultOpen,
50
+ offset = 6,
51
+ crossOffset,
52
+ placement = "top",
53
+ onOpenChange,
54
+ ...tooltipProps
55
+ }) => {
56
+ const isTopOrBottomLeft = ["top left", "top end", "bottom left", "bottom end"].includes(placement);
57
+ const isTopOrBottomRight = ["top right", "top start", "bottom right", "bottom start"].includes(placement);
58
+ const calculatedCrossOffset = isTopOrBottomLeft ? -12 : isTopOrBottomRight ? 12 : 0;
59
+ return /* @__PURE__ */ jsxs(TooltipTrigger$1, { ...{ trigger, delay, closeDelay, isDisabled, isOpen, defaultOpen, onOpenChange }, children: [
60
+ children,
61
+ /* @__PURE__ */ jsx(
62
+ Tooltip$1,
63
+ {
64
+ ...tooltipProps,
65
+ offset,
66
+ placement,
67
+ crossOffset: crossOffset ?? calculatedCrossOffset,
68
+ className: ({ isEntering, isExiting }) => cx(isEntering && "ease-out animate-in", isExiting && "ease-in animate-out"),
69
+ children: ({ isEntering, isExiting }) => /* @__PURE__ */ jsxs(
70
+ "div",
71
+ {
72
+ className: cx(
73
+ "z-50 flex max-w-xs origin-(--trigger-anchor-point) flex-col items-start gap-1 rounded-lg bg-primary-solid px-3 shadow-lg will-change-transform",
74
+ description ? "py-3" : "py-2",
75
+ isEntering && "ease-out animate-in fade-in zoom-in-95 in-placement-left:slide-in-from-right-0.5 in-placement-right:slide-in-from-left-0.5 in-placement-top:slide-in-from-bottom-0.5 in-placement-bottom:slide-in-from-top-0.5",
76
+ isExiting && "ease-in animate-out fade-out zoom-out-95 in-placement-left:slide-out-to-right-0.5 in-placement-right:slide-out-to-left-0.5 in-placement-top:slide-out-to-bottom-0.5 in-placement-bottom:slide-out-to-top-0.5"
77
+ ),
78
+ children: [
79
+ /* @__PURE__ */ jsx("span", { className: "text-xs font-semibold text-white", children: title }),
80
+ description && /* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-tooltip-supporting-text", children: description }),
81
+ arrow && /* @__PURE__ */ jsx(OverlayArrow, { children: /* @__PURE__ */ jsx(
82
+ "svg",
83
+ {
84
+ viewBox: "0 0 100 100",
85
+ className: "size-2.5 fill-bg-primary-solid in-placement-left:-rotate-90 in-placement-right:rotate-90 in-placement-top:rotate-0 in-placement-bottom:rotate-180",
86
+ children: /* @__PURE__ */ jsx("path", { d: "M0,0 L35.858,35.858 Q50,50 64.142,35.858 L100,0 Z" })
87
+ }
88
+ ) })
89
+ ]
90
+ }
91
+ )
92
+ }
93
+ )
94
+ ] });
95
+ };
96
+ var TooltipTrigger = ({ children, className, ...buttonProps }) => {
97
+ return /* @__PURE__ */ jsx(Button, { ...buttonProps, className: (values) => cx("h-max w-max outline-hidden", typeof className === "function" ? className(values) : className), children });
98
+ };
99
+ var Label = ({ isInvalid, isRequired, tooltip, tooltipDescription, className, ...props }) => {
100
+ return /* @__PURE__ */ jsxs(
101
+ Label$1,
102
+ {
103
+ "data-label": "true",
104
+ ...props,
105
+ className: cx("flex cursor-default items-center gap-0.5 text-sm font-medium text-secondary", className),
106
+ children: [
107
+ props.children,
108
+ /* @__PURE__ */ jsx(
109
+ "span",
110
+ {
111
+ className: cx(
112
+ "hidden text-brand-tertiary",
113
+ isRequired && "block",
114
+ typeof isRequired === "undefined" && "group-required:block",
115
+ isInvalid && "text-error-primary",
116
+ typeof isInvalid === "undefined" && "group-invalid:text-error-primary"
117
+ ),
118
+ children: "*"
119
+ }
120
+ ),
121
+ tooltip && /* @__PURE__ */ jsx(Tooltip, { title: tooltip, description: tooltipDescription, placement: "top", children: /* @__PURE__ */ jsx(
122
+ TooltipTrigger,
123
+ {
124
+ isDisabled: false,
125
+ className: "cursor-pointer text-fg-quaternary transition duration-200 hover:text-fg-quaternary_hover focus:text-fg-quaternary_hover",
126
+ children: /* @__PURE__ */ jsx(QuestionIcon, { className: "size-4" })
127
+ }
128
+ ) })
129
+ ]
130
+ }
131
+ );
132
+ };
133
+ Label.displayName = "Label";
134
+ var Popover = (props) => {
135
+ return /* @__PURE__ */ jsx(
136
+ Popover$1,
137
+ {
138
+ placement: "bottom",
139
+ containerPadding: 0,
140
+ offset: 4,
141
+ ...props,
142
+ className: (state) => cx(
143
+ "w-(--trigger-width) origin-(--trigger-anchor-point) overflow-x-hidden overflow-y-auto rounded-lg bg-primary py-1 shadow-lg ring-1 ring-secondary_alt outline-hidden will-change-transform",
144
+ 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",
145
+ 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",
146
+ props.size === "sm" && "max-h-56!",
147
+ props.size === "md" && "max-h-64!",
148
+ props.size === "lg" && "max-h-80!",
149
+ typeof props.className === "function" ? props.className(state) : props.className
150
+ )
151
+ }
152
+ );
153
+ };
154
+ var sizes = {
155
+ sm: {
156
+ root: "py-2 pl-3 pr-2.5 gap-2 *:data-icon:size-4 *:data-icon:stroke-[2.25px]",
157
+ withIcon: "",
158
+ text: "text-sm",
159
+ textContainer: "gap-x-1.5",
160
+ shortcut: "pr-2.5"
161
+ },
162
+ md: { root: "py-2 px-3 gap-2 *:data-icon:size-5", withIcon: "", text: "text-md", textContainer: "gap-x-1.5", shortcut: "pr-2.5" },
163
+ lg: { root: "py-2.5 px-3.5 gap-2 *:data-icon:size-5", withIcon: "", text: "text-md", textContainer: "gap-x-1.5", shortcut: "pr-3" }
164
+ };
165
+ var SelectContext = createContext({ size: "md" });
166
+ function hasResizeObserver() {
167
+ return typeof window.ResizeObserver !== "undefined";
168
+ }
169
+ function useResizeObserver(options) {
170
+ const { ref, box, onResize } = options;
171
+ useEffect(() => {
172
+ const element = ref?.current;
173
+ if (!element) {
174
+ return;
175
+ }
176
+ if (!hasResizeObserver()) {
177
+ window.addEventListener("resize", onResize, false);
178
+ return () => {
179
+ window.removeEventListener("resize", onResize, false);
180
+ };
181
+ } else {
182
+ const resizeObserverInstance = new window.ResizeObserver((entries) => {
183
+ if (!entries.length) {
184
+ return;
185
+ }
186
+ onResize();
187
+ });
188
+ resizeObserverInstance.observe(element, { box });
189
+ return () => {
190
+ if (element) {
191
+ resizeObserverInstance.unobserve(element);
192
+ }
193
+ };
194
+ }
195
+ }, [onResize, ref, box]);
196
+ }
197
+ var inputFocusRingShadow = "border-brand ring-1 ring-inset ring-brand";
198
+ var inputErrorFocusRingShadow = "border-error ring-1 ring-inset ring-error";
199
+ createContext({});
200
+
201
+ // ../../utils/is-react-component.ts
202
+ var isFunctionComponent = (component) => {
203
+ return typeof component === "function";
204
+ };
205
+ var isClassComponent = (component) => {
206
+ return typeof component === "function" && component.prototype && (!!component.prototype.isReactComponent || !!component.prototype.render);
207
+ };
208
+ var isForwardRefComponent = (component) => {
209
+ return typeof component === "object" && component !== null && component.$$typeof.toString() === "Symbol(react.forward_ref)";
210
+ };
211
+ var isReactComponent = (component) => {
212
+ return isFunctionComponent(component) || isForwardRefComponent(component) || isClassComponent(component);
213
+ };
214
+ var ComboBoxValue = ({ size, shortcut, placeholder, shortcutClassName, icon: IconProp, isInvalid, ref, ...otherProps }) => {
215
+ const state = useContext(ComboBoxStateContext);
216
+ const value = state?.selectedItem?.value || null;
217
+ const inputValue = state?.inputValue || null;
218
+ const first = inputValue?.split(value?.supportingText)?.[0] || "";
219
+ const last = inputValue?.split(first)[1];
220
+ return /* @__PURE__ */ jsxs(
221
+ Group,
222
+ {
223
+ ref,
224
+ ...otherProps,
225
+ isInvalid,
226
+ className: ({ isFocusWithin, isDisabled, isInvalid: isGroupInvalid }) => cx(
227
+ "relative flex w-full items-center gap-2 rounded-lg border border-solid border-primary bg-primary shadow-xs outline-hidden transition-[border-color,box-shadow] duration-100 ease-linear",
228
+ isDisabled && "cursor-not-allowed opacity-50",
229
+ !isGroupInvalid && isFocusWithin && inputFocusRingShadow,
230
+ isGroupInvalid && !isFocusWithin && "border-error_subtle",
231
+ isGroupInvalid && isFocusWithin && inputErrorFocusRingShadow,
232
+ // Icon styles
233
+ "*:data-icon:shrink-0 *:data-icon:text-fg-quaternary",
234
+ sizes[size].root
235
+ ),
236
+ children: [
237
+ isReactComponent(IconProp) ? /* @__PURE__ */ jsx(IconProp, { "data-icon": true, className: "pointer-events-none", "aria-hidden": "true" }) : isValidElement(IconProp) ? IconProp : /* @__PURE__ */ jsx(MagnifyingGlassIcon, { "data-icon": true, className: "pointer-events-none", "aria-hidden": "true" }),
238
+ /* @__PURE__ */ jsxs("div", { className: "relative flex w-full items-center", children: [
239
+ inputValue && /* @__PURE__ */ jsxs("span", { className: cx("absolute top-1/2 z-0 inline-flex w-full -translate-y-1/2 truncate", sizes[size].textContainer), "aria-hidden": "true", children: [
240
+ /* @__PURE__ */ jsx("p", { className: cx("font-medium text-primary", sizes[size].text), children: first }),
241
+ last && /* @__PURE__ */ jsx("p", { className: cx("-ml-0.75 text-tertiary", sizes[size].text), children: last })
242
+ ] }),
243
+ /* @__PURE__ */ jsx(
244
+ Input,
245
+ {
246
+ placeholder,
247
+ className: cx(
248
+ "z-10 w-full appearance-none bg-transparent text-transparent caret-alpha-black/90 placeholder:text-placeholder focus:outline-hidden disabled:cursor-not-allowed",
249
+ sizes[size].text
250
+ )
251
+ }
252
+ )
253
+ ] }),
254
+ shortcut && /* @__PURE__ */ jsx(
255
+ "div",
256
+ {
257
+ className: cx(
258
+ "absolute inset-y-0.5 right-0.5 z-10 hidden items-center rounded-r-[inherit] bg-linear-to-r from-transparent to-bg-primary to-40% pl-8 md:flex",
259
+ sizes[size].shortcut,
260
+ shortcutClassName
261
+ ),
262
+ children: /* @__PURE__ */ jsx(
263
+ "span",
264
+ {
265
+ className: "pointer-events-none rounded px-1 py-px text-xs font-medium text-quaternary ring-1 ring-secondary select-none ring-inset",
266
+ "aria-hidden": "true",
267
+ children: "\u2318K"
268
+ }
269
+ )
270
+ }
271
+ )
272
+ ]
273
+ }
274
+ );
275
+ };
276
+ var ComboBox = ({
277
+ placeholder = "Search",
278
+ shortcut = true,
279
+ size = "md",
280
+ children,
281
+ items,
282
+ shortcutClassName,
283
+ icon,
284
+ hideRequiredIndicator,
285
+ ...otherProps
286
+ }) => {
287
+ const placeholderRef = useRef(null);
288
+ const [popoverWidth, setPopoverWidth] = useState("");
289
+ const onResize = useCallback(() => {
290
+ if (!placeholderRef.current) return;
291
+ const divRect = placeholderRef.current?.getBoundingClientRect();
292
+ setPopoverWidth(divRect.width + "px");
293
+ }, [placeholderRef, setPopoverWidth]);
294
+ useResizeObserver({
295
+ ref: placeholderRef,
296
+ box: "border-box",
297
+ onResize
298
+ });
299
+ return /* @__PURE__ */ jsx(SelectContext.Provider, { value: { size }, children: /* @__PURE__ */ jsx(ComboBox$1, { menuTrigger: "focus", ...otherProps, children: (state) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
300
+ otherProps.label && /* @__PURE__ */ jsx(Label, { isRequired: hideRequiredIndicator ? false : state.isRequired, tooltip: otherProps.tooltip, children: otherProps.label }),
301
+ /* @__PURE__ */ jsx(
302
+ ComboBoxValue,
303
+ {
304
+ ref: placeholderRef,
305
+ placeholder,
306
+ shortcut,
307
+ shortcutClassName,
308
+ icon,
309
+ size,
310
+ isInvalid: state.isInvalid,
311
+ onFocus: onResize,
312
+ onPointerEnter: onResize
313
+ }
314
+ ),
315
+ /* @__PURE__ */ jsx(Popover, { size, triggerRef: placeholderRef, style: { width: popoverWidth }, className: otherProps.popoverClassName, children: /* @__PURE__ */ jsx(ListBox, { items, className: "size-full outline-hidden", children }) }),
316
+ otherProps.hint && /* @__PURE__ */ jsx(HintText, { isInvalid: state.isInvalid, className: cx(size === "sm" && "text-xs"), children: otherProps.hint })
317
+ ] }) }) });
318
+ };
319
+
320
+ export { ComboBox };
321
+ //# sourceMappingURL=combobox.js.map
322
+ //# sourceMappingURL=combobox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../utils/cx.ts","../../../../components/base/input/hint-text.tsx","../../../../components/base/tooltip/tooltip.tsx","../../../../components/base/input/label.tsx","../../../../components/base/select/popover.tsx","../../../../components/base/select/select-shared.tsx","../../../../hooks/use-resize-observer.ts","../../../../components/base/input/input.tsx","../../../../utils/is-react-component.ts","../../../../components/base/select/combobox.tsx"],"names":["AriaText","AriaTooltipTrigger","jsx","AriaTooltip","AriaOverlayArrow","AriaButton","jsxs","AriaLabel","HelpCircle","AriaPopover","createContext","useContext","AriaGroup","SearchLg","AriaInput","useState","AriaComboBox","AriaListBox"],"mappings":"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","file":"combobox.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 type { ReactNode, Ref } from \"react\";\nimport type { TextProps as AriaTextProps } from \"react-aria-components\";\nimport { Text as AriaText } from \"react-aria-components\";\nimport { cx } from \"@/utils/cx\";\n\ninterface HintTextProps extends AriaTextProps {\n /** Indicates that the hint text is an error message. */\n isInvalid?: boolean;\n ref?: Ref<HTMLElement>;\n size?: \"sm\" | \"md\";\n children: ReactNode;\n}\n\nexport const HintText = ({ isInvalid, className, size = \"md\", ...props }: HintTextProps) => {\n return (\n <AriaText\n {...props}\n slot={isInvalid ? \"errorMessage\" : \"description\"}\n className={cx(\n \"text-sm text-tertiary\",\n\n // Size\n size === \"sm\" && \"text-xs\",\n \"in-data-[input-size=sm]:text-xs\",\n\n // Invalid state\n isInvalid && \"text-error-primary\",\n \"group-invalid:text-error-primary\",\n\n className,\n )}\n />\n );\n};\n\nHintText.displayName = \"HintText\";\n","\"use client\";\n\n/** Figma: Tooltip (1052:485) */\n\nimport type { ReactNode } from \"react\";\nimport type {\n ButtonProps as AriaButtonProps,\n TooltipProps as AriaTooltipProps,\n TooltipTriggerComponentProps as AriaTooltipTriggerComponentProps,\n} from \"react-aria-components\";\nimport { Button as AriaButton, OverlayArrow as AriaOverlayArrow, Tooltip as AriaTooltip, TooltipTrigger as AriaTooltipTrigger } from \"react-aria-components\";\nimport { cx } from \"@/utils/cx\";\n\ninterface TooltipProps extends AriaTooltipTriggerComponentProps, Omit<AriaTooltipProps, \"children\"> {\n /**\n * The title of the tooltip.\n */\n title: ReactNode;\n /**\n * The description of the tooltip.\n */\n description?: ReactNode;\n /**\n * Whether to show the arrow on the tooltip.\n *\n * @default false\n */\n arrow?: boolean;\n /**\n * Delay in milliseconds before the tooltip is shown on first hover.\n *\n * @default 100\n */\n delay?: number;\n}\n\nexport const Tooltip = ({\n title,\n description,\n children,\n arrow = false,\n delay = 100,\n closeDelay = 0,\n trigger,\n isDisabled,\n isOpen,\n defaultOpen,\n offset = 6,\n crossOffset,\n placement = \"top\",\n onOpenChange,\n ...tooltipProps\n}: TooltipProps) => {\n const isTopOrBottomLeft = [\"top left\", \"top end\", \"bottom left\", \"bottom end\"].includes(placement);\n const isTopOrBottomRight = [\"top right\", \"top start\", \"bottom right\", \"bottom start\"].includes(placement);\n // Set negative cross offset for left and right placement to visually balance the tooltip.\n const calculatedCrossOffset = isTopOrBottomLeft ? -12 : isTopOrBottomRight ? 12 : 0;\n\n return (\n <AriaTooltipTrigger {...{ trigger, delay, closeDelay, isDisabled, isOpen, defaultOpen, onOpenChange }}>\n {children}\n\n <AriaTooltip\n {...tooltipProps}\n offset={offset}\n placement={placement}\n crossOffset={crossOffset ?? calculatedCrossOffset}\n className={({ isEntering, isExiting }) => cx(isEntering && \"ease-out animate-in\", isExiting && \"ease-in animate-out\")}\n >\n {({ isEntering, isExiting }) => (\n <div\n className={cx(\n \"z-50 flex max-w-xs origin-(--trigger-anchor-point) flex-col items-start gap-1 rounded-lg bg-primary-solid px-3 shadow-lg will-change-transform\",\n description ? \"py-3\" : \"py-2\",\n\n isEntering &&\n \"ease-out animate-in fade-in zoom-in-95 in-placement-left:slide-in-from-right-0.5 in-placement-right:slide-in-from-left-0.5 in-placement-top:slide-in-from-bottom-0.5 in-placement-bottom:slide-in-from-top-0.5\",\n isExiting &&\n \"ease-in animate-out fade-out zoom-out-95 in-placement-left:slide-out-to-right-0.5 in-placement-right:slide-out-to-left-0.5 in-placement-top:slide-out-to-bottom-0.5 in-placement-bottom:slide-out-to-top-0.5\",\n )}\n >\n <span className=\"text-xs font-semibold text-white\">{title}</span>\n\n {description && <span className=\"text-xs font-medium text-tooltip-supporting-text\">{description}</span>}\n\n {arrow && (\n <AriaOverlayArrow>\n <svg\n viewBox=\"0 0 100 100\"\n className=\"size-2.5 fill-bg-primary-solid in-placement-left:-rotate-90 in-placement-right:rotate-90 in-placement-top:rotate-0 in-placement-bottom:rotate-180\"\n >\n <path d=\"M0,0 L35.858,35.858 Q50,50 64.142,35.858 L100,0 Z\" />\n </svg>\n </AriaOverlayArrow>\n )}\n </div>\n )}\n </AriaTooltip>\n </AriaTooltipTrigger>\n );\n};\n\ninterface TooltipTriggerProps extends AriaButtonProps {}\n\nexport const TooltipTrigger = ({ children, className, ...buttonProps }: TooltipTriggerProps) => {\n return (\n <AriaButton {...buttonProps} className={(values) => cx(\"h-max w-max outline-hidden\", typeof className === \"function\" ? className(values) : className)}>\n {children}\n </AriaButton>\n );\n};\n","\"use client\";\n\nimport type { ReactNode, Ref } from \"react\";\nimport { QuestionIcon as HelpCircle } from \"@phosphor-icons/react/dist/csr/Question\";\nimport type { LabelProps as AriaLabelProps } from \"react-aria-components\";\nimport { Label as AriaLabel } from \"react-aria-components\";\nimport { Tooltip, TooltipTrigger } from \"@/components/base/tooltip/tooltip\";\nimport { cx } from \"@/utils/cx\";\n\ninterface LabelProps extends AriaLabelProps {\n children: ReactNode;\n isInvalid?: boolean;\n isRequired?: boolean;\n tooltip?: string;\n tooltipDescription?: string;\n ref?: Ref<HTMLLabelElement>;\n}\n\nexport const Label = ({ isInvalid, isRequired, tooltip, tooltipDescription, className, ...props }: LabelProps) => {\n return (\n <AriaLabel\n // Used for conditionally hiding/showing the label element via CSS:\n // <Input label=\"Visible only on mobile\" className=\"lg:**:data-label:hidden\" />\n // or\n // <Input label=\"Visible only on mobile\" className=\"lg:label:hidden\" />\n data-label=\"true\"\n {...props}\n className={cx(\"flex cursor-default items-center gap-0.5 text-sm font-medium text-secondary\", className)}\n >\n {props.children}\n\n <span\n className={cx(\n \"hidden text-brand-tertiary\",\n isRequired && \"block\",\n typeof isRequired === \"undefined\" && \"group-required:block\",\n\n isInvalid && \"text-error-primary\",\n typeof isInvalid === \"undefined\" && \"group-invalid:text-error-primary\",\n )}\n >\n *\n </span>\n\n {tooltip && (\n <Tooltip title={tooltip} description={tooltipDescription} placement=\"top\">\n <TooltipTrigger\n // `TooltipTrigger` inherits the disabled state from the parent form field\n // but we don't that. We want the tooltip be enabled even if the parent\n // field is disabled.\n isDisabled={false}\n className=\"cursor-pointer text-fg-quaternary transition duration-200 hover:text-fg-quaternary_hover focus:text-fg-quaternary_hover\"\n >\n <HelpCircle className=\"size-4\" />\n </TooltipTrigger>\n </Tooltip>\n )}\n </AriaLabel>\n );\n};\n\nLabel.displayName = \"Label\";\n","\"use client\";\n\n/** Figma: Select menu popover (11132:11643) — floating menu border + shadow. */\n\nimport type { RefAttributes } from \"react\";\nimport type { PopoverProps as AriaPopoverProps } from \"react-aria-components\";\nimport { Popover as AriaPopover } from \"react-aria-components\";\nimport { cx } from \"@/utils/cx\";\n\ninterface PopoverProps extends AriaPopoverProps, RefAttributes<HTMLElement> {\n size: \"sm\" | \"md\" | \"lg\";\n}\n\nexport const Popover = (props: PopoverProps) => {\n return (\n <AriaPopover\n placement=\"bottom\"\n containerPadding={0}\n offset={4}\n {...props}\n className={(state) =>\n cx(\n \"w-(--trigger-width) origin-(--trigger-anchor-point) overflow-x-hidden overflow-y-auto rounded-lg bg-primary py-1 shadow-lg ring-1 ring-secondary_alt outline-hidden will-change-transform\",\n\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\n props.size === \"sm\" && \"max-h-56!\",\n props.size === \"md\" && \"max-h-64!\",\n props.size === \"lg\" && \"max-h-80!\",\n\n typeof props.className === \"function\" ? props.className(state) : props.className,\n )\n }\n />\n );\n};\n","\"use client\";\n\nimport type { FC, ReactNode } from \"react\";\nimport { createContext } from \"react\";\n\nexport type SelectItemType = {\n /** Unique identifier for the item. */\n id: string | number;\n /** The primary display text. */\n label?: string;\n /** Avatar image URL. */\n avatarUrl?: string;\n /** Whether the item is disabled. */\n isDisabled?: boolean;\n /** Secondary text displayed alongside the label. */\n supportingText?: string;\n /** Leading icon component or element. */\n icon?: FC | ReactNode;\n};\n\nexport interface CommonProps {\n /** Helper text displayed below the input. */\n hint?: string;\n /** Field label displayed above the input. */\n label?: string;\n /** Tooltip text for the help icon next to the label. */\n tooltip?: string;\n /**\n * The size of the component.\n * @default \"md\"\n */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Placeholder text when no value is selected. */\n placeholder?: string;\n /** Whether to hide the required indicator from the label. */\n hideRequiredIndicator?: boolean;\n}\n\nexport const sizes = {\n sm: {\n root: \"py-2 pl-3 pr-2.5 gap-2 *:data-icon:size-4 *:data-icon:stroke-[2.25px]\",\n withIcon: \"\",\n text: \"text-sm\",\n textContainer: \"gap-x-1.5\",\n shortcut: \"pr-2.5\",\n },\n md: { root: \"py-2 px-3 gap-2 *:data-icon:size-5\", withIcon: \"\", text: \"text-md\", textContainer: \"gap-x-1.5\", shortcut: \"pr-2.5\" },\n lg: { root: \"py-2.5 px-3.5 gap-2 *:data-icon:size-5\", withIcon: \"\", text: \"text-md\", textContainer: \"gap-x-1.5\", shortcut: \"pr-3\" },\n};\n\nexport const SelectContext = createContext<{ size: \"sm\" | \"md\" | \"lg\" }>({ size: \"md\" });\n","import { useEffect } from \"react\";\nimport type { RefObject } from \"@react-types/shared\";\n\n/**\n * Checks if the ResizeObserver API is supported.\n * @returns True if the ResizeObserver API is supported, false otherwise.\n */\nfunction hasResizeObserver() {\n return typeof window.ResizeObserver !== \"undefined\";\n}\n\n/**\n * The options for the useResizeObserver hook.\n */\ntype useResizeObserverOptionsType<T> = {\n /**\n * The ref to the element to observe.\n */\n ref: RefObject<T | undefined | null> | undefined;\n /**\n * The box to observe.\n */\n box?: ResizeObserverBoxOptions;\n /**\n * The callback function to call when the size changes.\n */\n onResize: () => void;\n};\n\n/**\n * A hook that observes the size of an element and calls a callback function when the size changes.\n * @param options - The options for the hook.\n */\nexport function useResizeObserver<T extends Element>(options: useResizeObserverOptionsType<T>) {\n const { ref, box, onResize } = options;\n\n useEffect(() => {\n const element = ref?.current;\n if (!element) {\n return;\n }\n\n if (!hasResizeObserver()) {\n window.addEventListener(\"resize\", onResize, false);\n\n return () => {\n window.removeEventListener(\"resize\", onResize, false);\n };\n } else {\n const resizeObserverInstance = new window.ResizeObserver((entries) => {\n if (!entries.length) {\n return;\n }\n\n onResize();\n });\n\n resizeObserverInstance.observe(element, { box });\n\n return () => {\n if (element) {\n resizeObserverInstance.unobserve(element);\n }\n };\n }\n }, [onResize, ref, box]);\n}\n","\"use client\";\n\nimport { type ComponentType, type HTMLAttributes, type ReactNode, type Ref, createContext, useContext, useState } from \"react\";\nimport { EyeIcon as Eye } from \"@phosphor-icons/react/dist/csr/Eye\";\nimport { EyeSlashIcon as EyeOff } from \"@phosphor-icons/react/dist/csr/EyeSlash\";\nimport { QuestionIcon as HelpCircle } from \"@phosphor-icons/react/dist/csr/Question\";\nimport { InfoIcon as InfoCircle } from \"@phosphor-icons/react/dist/csr/Info\";\nimport type { InputProps as AriaInputProps, TextFieldProps as AriaTextFieldProps } from \"react-aria-components\";\nimport { Button as AriaButton, Group as AriaGroup, Input as AriaInput, TextField as AriaTextField } from \"react-aria-components\";\nimport { HintText } from \"@/components/base/input/hint-text\";\nimport { Label } from \"@/components/base/input/label\";\nimport { Tooltip, TooltipTrigger } from \"@/components/base/tooltip/tooltip\";\nimport { cx, sortCx } from \"@/utils/cx\";\n\n/**\n * Figma: Inputs (85:1269)\n *\n * Default: border (1px) border-primary + shadow-xs.\n * Focus: 1px border-brand + inset ring-brand (2px visual, no layout shift from border-2).\n * Error default: border-error_subtle; error focus: border-error + inset ring-error.\n */\nexport const inputFocusRingShadow = \"border-brand ring-1 ring-inset ring-brand\";\nexport const inputErrorFocusRingShadow = \"border-error ring-1 ring-inset ring-error\";\n/** Shell focus overlay — border + inset ring on one ::after above children (no host border-brand; avoids double-ring gap). */\nexport const inputFocusRingShellOverlay =\n \"after:pointer-events-none after:absolute after:-inset-px after:z-10 after:rounded-lg after:border after:border-solid after:border-brand after:ring-1 after:ring-inset after:ring-brand after:content-['']\";\nexport const inputErrorFocusRingShellOverlay =\n \"after:pointer-events-none after:absolute after:-inset-px after:z-10 after:rounded-lg after:border after:border-solid after:border-error after:ring-1 after:ring-inset after:ring-error after:content-['']\";\nexport const inputErrorFocusRingGroupInvalidShellOverlay =\n \"group-invalid:focus-within:after:pointer-events-none group-invalid:focus-within:after:absolute group-invalid:focus-within:after:-inset-px group-invalid:focus-within:after:z-10 group-invalid:focus-within:after:rounded-lg group-invalid:focus-within:after:border group-invalid:focus-within:after:border-solid group-invalid:focus-within:after:border-error group-invalid:focus-within:after:ring-1 group-invalid:focus-within:after:ring-inset group-invalid:focus-within:after:ring-error group-invalid:focus-within:after:content-['']\";\nexport const inputFocusVisibleRingShadow =\n \"focus-visible:outline-none focus-visible:border-brand focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-brand\";\nexport const inputErrorFocusVisibleRingShadow =\n \"focus-visible:outline-none focus-visible:border-error focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-error\";\n\nexport interface InputBaseProps extends Omit<AriaInputProps, \"size\"> {\n /** Tooltip message on hover. */\n tooltip?: string;\n /** Whether the input is invalid. */\n isInvalid?: boolean;\n /** Whether the input is disabled. */\n isDisabled?: boolean;\n /** Whether the input is required. */\n isRequired?: boolean;\n /**\n * Input size.\n * @default \"sm\"\n */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Placeholder text. */\n placeholder?: string;\n /** Class name for the icon. */\n iconClassName?: string;\n /** Class name for the input. */\n inputClassName?: string;\n /** Class name for the input wrapper. */\n wrapperClassName?: string;\n /** Class name for the tooltip. */\n tooltipClassName?: string;\n /** Keyboard shortcut to display. */\n shortcut?: string | boolean;\n ref?: Ref<HTMLInputElement>;\n groupRef?: Ref<HTMLDivElement>;\n /** Icon component to display on the left side of the input. */\n icon?: ComponentType<HTMLAttributes<HTMLOrSVGElement>>;\n}\n\nexport const InputBase = ({\n ref,\n tooltip,\n shortcut,\n groupRef,\n size = \"md\",\n isInvalid,\n isDisabled,\n isRequired,\n icon: Icon,\n placeholder,\n wrapperClassName,\n tooltipClassName,\n inputClassName,\n iconClassName,\n type = \"text\",\n ...inputProps\n}: InputBaseProps) => {\n const [isPasswordVisible, setIsPasswordVisible] = useState(false);\n\n // Check if the input has a leading icon or tooltip\n const hasTrailingIcon = tooltip || isInvalid;\n const hasLeadingIcon = Icon;\n\n // If the input is inside a `TextFieldContext`, use its context to simplify applying styles\n const context = useContext(TextFieldContext);\n\n const inputSize = context?.size || size;\n\n const sizes = sortCx({\n sm: {\n root: cx(\"px-3 py-2 text-sm\", hasLeadingIcon && \"pl-9\", hasTrailingIcon && \"pr-9\"),\n iconLeading: \"left-3 size-4 stroke-[2.25px]\",\n iconTrailing: \"right-3\",\n shortcut: \"pr-1.5\",\n },\n md: {\n root: cx(\"px-3 py-2 text-md\", hasLeadingIcon && \"pl-10\", hasTrailingIcon && \"pr-9\"),\n iconLeading: \"left-3 size-5\",\n iconTrailing: \"right-3\",\n shortcut: \"pr-2\",\n },\n lg: {\n root: cx(\"px-3.5 py-2.5 text-md\", hasLeadingIcon && \"pl-10.5\", hasTrailingIcon && \"pr-9.5\"),\n iconLeading: \"left-3.5 size-5\",\n iconTrailing: \"right-3.5\",\n shortcut: \"pr-2.5\",\n },\n });\n\n return (\n <AriaGroup\n {...{ isDisabled, isInvalid }}\n ref={groupRef}\n className={({ isFocusWithin, isDisabled, isInvalid }) =>\n cx(\n \"group/input relative flex w-full flex-row place-content-center place-items-center rounded-lg border border-solid border-primary bg-primary shadow-xs transition-[border-color,box-shadow] duration-100 ease-linear\",\n\n isFocusWithin && !isDisabled && !isInvalid && inputFocusRingShadow,\n\n // Disabled state styles\n isDisabled && \"cursor-not-allowed opacity-50\",\n \"group-disabled:cursor-not-allowed group-disabled:opacity-50\",\n\n // Invalid state styles\n isInvalid && !isFocusWithin && \"border-error_subtle\",\n \"group-invalid:border-error_subtle\",\n \"group-invalid:focus-within:border-error group-invalid:focus-within:ring-1 group-invalid:focus-within:ring-inset group-invalid:focus-within:ring-error\",\n\n // Invalid + focus — darker error stroke (not brand)\n isInvalid && isFocusWithin && inputErrorFocusRingShadow,\n\n context?.wrapperClassName,\n wrapperClassName,\n )\n }\n >\n {/* Leading icon and Payment icon */}\n {Icon && (\n <Icon className={cx(\"pointer-events-none absolute text-fg-quaternary\", sizes[inputSize].iconLeading, context?.iconClassName, iconClassName)} />\n )}\n\n {/* Input field */}\n <AriaInput\n {...(inputProps as AriaInputProps)}\n ref={ref}\n required={isRequired}\n type={type === \"password\" && isPasswordVisible ? \"text\" : type}\n placeholder={placeholder}\n className={cx(\n \"m-0 w-full bg-transparent text-primary ring-0 outline-hidden placeholder:text-placeholder autofill:rounded-lg autofill:text-primary disabled:cursor-not-allowed\",\n sizes[inputSize].root,\n context?.inputClassName,\n inputClassName,\n )}\n />\n\n {/* Tooltip and help icon */}\n {tooltip && type !== \"password\" && (\n <Tooltip title={tooltip} placement=\"top\">\n <TooltipTrigger\n className={cx(\n \"absolute cursor-pointer text-fg-quaternary transition duration-100 ease-linear group-invalid/input:hidden hover:text-fg-quaternary_hover focus:text-fg-quaternary_hover\",\n sizes[inputSize].iconTrailing,\n context?.tooltipClassName,\n tooltipClassName,\n )}\n >\n <HelpCircle className=\"size-4 stroke-[2.25px]\" />\n </TooltipTrigger>\n </Tooltip>\n )}\n\n {/* Invalid icon */}\n {type !== \"password\" && (\n <InfoCircle\n className={cx(\n \"pointer-events-none absolute hidden size-4 stroke-[2.25px] text-fg-error-secondary group-invalid/input:block\",\n sizes[inputSize].iconTrailing,\n context?.tooltipClassName,\n tooltipClassName,\n )}\n />\n )}\n\n {/* Password visibility toggle */}\n {type === \"password\" && (\n <AriaButton\n aria-label=\"Toggle password visibility\"\n onClick={() => setIsPasswordVisible(!isPasswordVisible)}\n className={cx(\n \"absolute flex cursor-pointer items-center justify-center text-fg-quaternary transition duration-100 ease-linear hover:text-fg-quaternary_hover focus:text-fg-quaternary_hover focus:outline-hidden\",\n sizes[inputSize].iconTrailing,\n )}\n >\n {isPasswordVisible ? <EyeOff className=\"size-4 stroke-[2.25px]\" /> : <Eye className=\"size-4 stroke-[2.25px]\" />}\n </AriaButton>\n )}\n\n {/* Shortcut */}\n {shortcut && (\n <div\n className={cx(\n \"pointer-events-none absolute inset-y-0.5 right-0.5 z-10 hidden items-center rounded-r-[inherit] bg-linear-to-r from-transparent to-bg-primary to-40% pl-8 md:flex\",\n sizes[inputSize].shortcut,\n )}\n >\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none rounded px-1 py-px text-xs font-medium text-quaternary ring-1 ring-secondary select-none ring-inset\"\n >\n {typeof shortcut === \"string\" ? shortcut : \"⌘K\"}\n </span>\n </div>\n )}\n </AriaGroup>\n );\n};\n\nInputBase.displayName = \"InputBase\";\n\ninterface TextFieldContextProps extends Partial<Pick<InputBaseProps, \"size\" | \"wrapperClassName\" | \"inputClassName\" | \"iconClassName\" | \"tooltipClassName\">> {}\n\nconst TextFieldContext = createContext<TextFieldContextProps>({});\n\nexport interface TextFieldProps extends AriaTextFieldProps, TextFieldContextProps {}\n\nexport const TextField = ({ className, size = \"md\", inputClassName, wrapperClassName, iconClassName, tooltipClassName, ...props }: TextFieldProps) => {\n return (\n <TextFieldContext.Provider value={{ inputClassName, wrapperClassName, iconClassName, tooltipClassName, size }}>\n <AriaTextField\n {...props}\n data-input-wrapper\n data-input-size={size}\n className={(state) =>\n cx(\"group flex h-max w-full flex-col items-start justify-start gap-1.5\", typeof className === \"function\" ? className(state) : className)\n }\n />\n </TextFieldContext.Provider>\n );\n};\n\nTextField.displayName = \"TextField\";\n\nexport interface InputProps\n extends\n AriaTextFieldProps,\n Pick<\n InputBaseProps,\n | \"ref\"\n | \"placeholder\"\n | \"icon\"\n | \"shortcut\"\n | \"tooltip\"\n | \"groupRef\"\n | \"size\"\n | \"wrapperClassName\"\n | \"inputClassName\"\n | \"iconClassName\"\n | \"tooltipClassName\"\n > {\n /** Label text for the input */\n label?: string;\n /** Helper text displayed below the input */\n hint?: ReactNode;\n /** Whether to hide required indicator from label */\n hideRequiredIndicator?: boolean;\n}\n\nexport const Input = ({\n size = \"md\",\n placeholder,\n icon: Icon,\n label,\n hint,\n shortcut,\n hideRequiredIndicator,\n className,\n ref,\n groupRef,\n tooltip,\n iconClassName,\n inputClassName,\n wrapperClassName,\n tooltipClassName,\n type = \"text\",\n ...props\n}: InputProps) => {\n return (\n <TextField aria-label={!label ? placeholder : undefined} {...props} size={size} className={className}>\n {({ isRequired, isInvalid }) => (\n <>\n {label && (\n <Label isRequired={hideRequiredIndicator ? !hideRequiredIndicator : isRequired} isInvalid={isInvalid}>\n {label}\n </Label>\n )}\n\n <InputBase\n {...{\n ref,\n groupRef,\n size,\n placeholder,\n icon: Icon,\n shortcut,\n iconClassName,\n inputClassName,\n wrapperClassName,\n tooltipClassName,\n tooltip,\n type,\n isInvalid,\n }}\n />\n\n {hint && <HintText isInvalid={isInvalid}>{hint}</HintText>}\n </>\n )}\n </TextField>\n );\n};\n\nInput.displayName = \"Input\";\n","/* We cannot use type `unknown` instead of `any` here because it will break the type assertion `isReactComponent` function is providing. */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type React from \"react\";\n\ntype ReactComponent = React.FC<any> | React.ComponentClass<any, any>;\n\n/**\n * Checks if a given value is a function component.\n */\nexport const isFunctionComponent = (component: any): component is React.FC<any> => {\n return typeof component === \"function\";\n};\n\n/**\n * Checks if a given value is a class component.\n */\nexport const isClassComponent = (component: any): component is React.ComponentClass<any, any> => {\n return typeof component === \"function\" && component.prototype && (!!component.prototype.isReactComponent || !!component.prototype.render);\n};\n\n/**\n * Checks if a given value is a forward ref component.\n */\nexport const isForwardRefComponent = (component: any): component is React.ForwardRefExoticComponent<any> => {\n return typeof component === \"object\" && component !== null && component.$$typeof.toString() === \"Symbol(react.forward_ref)\";\n};\n\n/**\n * Checks if a given value is a valid React component.\n */\nexport const isReactComponent = (component: any): component is ReactComponent => {\n return isFunctionComponent(component) || isForwardRefComponent(component) || isClassComponent(component);\n};\n","\"use client\";\n\n/** Figma: Select / ComboBox (11132:11643) */\n\nimport type { FC, FocusEventHandler, PointerEventHandler, ReactNode, Ref, RefAttributes } from \"react\";\nimport { isValidElement, useCallback, useContext, useRef, useState } from \"react\";\nimport { MagnifyingGlassIcon as SearchLg } from \"@phosphor-icons/react/dist/csr/MagnifyingGlass\";\nimport type { ComboBoxProps as AriaComboBoxProps, GroupProps as AriaGroupProps, ListBoxProps as AriaListBoxProps } from \"react-aria-components\";\nimport { ComboBox as AriaComboBox, Group as AriaGroup, Input as AriaInput, ListBox as AriaListBox, ComboBoxStateContext } from \"react-aria-components\";\nimport { HintText } from \"@/components/base/input/hint-text\";\nimport { Label } from \"@/components/base/input/label\";\nimport { Popover } from \"@/components/base/select/popover\";\nimport { type CommonProps, SelectContext, type SelectItemType, sizes } from \"@/components/base/select/select-shared\";\nimport { useResizeObserver } from \"@/hooks/use-resize-observer\";\nimport { cx } from \"@/utils/cx\";\nimport { inputErrorFocusRingShadow, inputFocusRingShadow } from \"@/components/base/input/input\";\nimport { isReactComponent } from \"@/utils/is-react-component\";\n\ninterface ComboBoxProps extends Omit<AriaComboBoxProps<SelectItemType>, \"children\" | \"items\">, RefAttributes<HTMLDivElement>, CommonProps {\n shortcut?: boolean;\n items?: SelectItemType[];\n popoverClassName?: string;\n shortcutClassName?: string;\n /** Leading icon component displayed before the input. */\n icon?: FC | ReactNode;\n children: AriaListBoxProps<SelectItemType>[\"children\"];\n}\n\ninterface ComboBoxValueProps extends AriaGroupProps {\n size: \"sm\" | \"md\" | \"lg\";\n shortcut: boolean;\n placeholder?: string;\n shortcutClassName?: string;\n icon?: FC | ReactNode;\n isInvalid?: boolean;\n onFocus?: FocusEventHandler;\n onPointerEnter?: PointerEventHandler;\n ref?: Ref<HTMLDivElement>;\n}\n\nconst ComboBoxValue = ({ size, shortcut, placeholder, shortcutClassName, icon: IconProp, isInvalid, ref, ...otherProps }: ComboBoxValueProps) => {\n const state = useContext(ComboBoxStateContext);\n\n const value = state?.selectedItem?.value || null;\n const inputValue = state?.inputValue || null;\n\n const first = inputValue?.split(value?.supportingText)?.[0] || \"\";\n const last = inputValue?.split(first)[1];\n\n return (\n <AriaGroup\n ref={ref}\n {...otherProps}\n isInvalid={isInvalid}\n className={({ isFocusWithin, isDisabled, isInvalid: isGroupInvalid }) =>\n cx(\n \"relative flex w-full items-center gap-2 rounded-lg border border-solid border-primary bg-primary shadow-xs outline-hidden transition-[border-color,box-shadow] duration-100 ease-linear\",\n isDisabled && \"cursor-not-allowed opacity-50\",\n !isGroupInvalid && isFocusWithin && inputFocusRingShadow,\n isGroupInvalid && !isFocusWithin && \"border-error_subtle\",\n isGroupInvalid && isFocusWithin && inputErrorFocusRingShadow,\n\n // Icon styles\n \"*:data-icon:shrink-0 *:data-icon:text-fg-quaternary\",\n\n sizes[size].root,\n )\n }\n >\n {isReactComponent(IconProp) ? (\n <IconProp data-icon className=\"pointer-events-none\" aria-hidden=\"true\" />\n ) : isValidElement(IconProp) ? (\n IconProp\n ) : (\n <SearchLg data-icon className=\"pointer-events-none\" aria-hidden=\"true\" />\n )}\n\n <div className=\"relative flex w-full items-center\">\n {inputValue && (\n <span className={cx(\"absolute top-1/2 z-0 inline-flex w-full -translate-y-1/2 truncate\", sizes[size].textContainer)} aria-hidden=\"true\">\n <p className={cx(\"font-medium text-primary\", sizes[size].text)}>{first}</p>\n {last && <p className={cx(\"-ml-0.75 text-tertiary\", sizes[size].text)}>{last}</p>}\n </span>\n )}\n\n <AriaInput\n placeholder={placeholder}\n className={cx(\n \"z-10 w-full appearance-none bg-transparent text-transparent caret-alpha-black/90 placeholder:text-placeholder focus:outline-hidden disabled:cursor-not-allowed\",\n sizes[size].text,\n )}\n />\n </div>\n\n {shortcut && (\n <div\n className={cx(\n \"absolute inset-y-0.5 right-0.5 z-10 hidden items-center rounded-r-[inherit] bg-linear-to-r from-transparent to-bg-primary to-40% pl-8 md:flex\",\n sizes[size].shortcut,\n shortcutClassName,\n )}\n >\n <span\n className=\"pointer-events-none rounded px-1 py-px text-xs font-medium text-quaternary ring-1 ring-secondary select-none ring-inset\"\n aria-hidden=\"true\"\n >\n ⌘K\n </span>\n </div>\n )}\n </AriaGroup>\n );\n};\n\nexport const ComboBox = ({\n placeholder = \"Search\",\n shortcut = true,\n size = \"md\",\n children,\n items,\n shortcutClassName,\n icon,\n hideRequiredIndicator,\n ...otherProps\n}: ComboBoxProps) => {\n const placeholderRef = useRef<HTMLDivElement>(null);\n const [popoverWidth, setPopoverWidth] = useState(\"\");\n\n // Resize observer for popover width\n const onResize = useCallback(() => {\n if (!placeholderRef.current) return;\n\n const divRect = placeholderRef.current?.getBoundingClientRect();\n\n setPopoverWidth(divRect.width + \"px\");\n }, [placeholderRef, setPopoverWidth]);\n\n useResizeObserver({\n ref: placeholderRef,\n box: \"border-box\",\n onResize,\n });\n\n return (\n <SelectContext.Provider value={{ size }}>\n <AriaComboBox menuTrigger=\"focus\" {...otherProps}>\n {(state) => (\n <div className=\"flex flex-col gap-1.5\">\n {otherProps.label && (\n <Label isRequired={hideRequiredIndicator ? false : state.isRequired} tooltip={otherProps.tooltip}>\n {otherProps.label}\n </Label>\n )}\n\n <ComboBoxValue\n ref={placeholderRef}\n placeholder={placeholder}\n shortcut={shortcut}\n shortcutClassName={shortcutClassName}\n icon={icon}\n size={size}\n isInvalid={state.isInvalid}\n // This is a workaround to correctly calculating the trigger width\n // while using ResizeObserver wasn't 100% reliable.\n onFocus={onResize}\n onPointerEnter={onResize}\n />\n\n <Popover size={size} triggerRef={placeholderRef} style={{ width: popoverWidth }} className={otherProps.popoverClassName}>\n <AriaListBox items={items} className=\"size-full outline-hidden\">\n {children}\n </AriaListBox>\n </Popover>\n\n {otherProps.hint && (\n <HintText isInvalid={state.isInvalid} className={cx(size === \"sm\" && \"text-xs\")}>\n {otherProps.hint}\n </HintText>\n )}\n </div>\n )}\n </AriaComboBox>\n </SelectContext.Provider>\n );\n};\n"]}
@@ -1,28 +1,28 @@
1
- import React__default from 'react';
1
+ import react__default from 'react';
2
2
 
3
3
  interface DialogProps {
4
- children: React__default.ReactNode;
4
+ children: react__default.ReactNode;
5
5
  open?: boolean;
6
6
  onOpenChange?: (open: boolean) => void;
7
7
  }
8
- declare const Dialog: React__default.FC<DialogProps>;
9
- declare const DialogTrigger: React__default.FC<{
10
- children: React__default.ReactNode;
8
+ declare const Dialog: react__default.FC<DialogProps>;
9
+ declare const DialogTrigger: react__default.FC<{
10
+ children: react__default.ReactNode;
11
11
  asChild?: boolean;
12
12
  }>;
13
- declare const DialogClose: React__default.FC<{
14
- children: React__default.ReactNode;
13
+ declare const DialogClose: react__default.FC<{
14
+ children: react__default.ReactNode;
15
15
  asChild?: boolean;
16
16
  }>;
17
- interface DialogCloseButtonProps extends React__default.ButtonHTMLAttributes<HTMLButtonElement> {
17
+ interface DialogCloseButtonProps extends react__default.ButtonHTMLAttributes<HTMLButtonElement> {
18
18
  }
19
19
  /**
20
20
  * Default dismiss control for {@link DialogContent}. Includes absolute top-right
21
21
  * placement; pass `className` to adjust or replace positioning.
22
22
  * When `onClick` is omitted, closes via the surrounding `Dialog` context (`setOpen(false)`).
23
23
  */
24
- declare const DialogCloseButton: React__default.ForwardRefExoticComponent<DialogCloseButtonProps & React__default.RefAttributes<HTMLButtonElement>>;
25
- interface DialogContentProps extends React__default.HTMLAttributes<HTMLDivElement> {
24
+ declare const DialogCloseButton: react__default.ForwardRefExoticComponent<DialogCloseButtonProps & react__default.RefAttributes<HTMLButtonElement>>;
25
+ interface DialogContentProps extends react__default.HTMLAttributes<HTMLDivElement> {
26
26
  size?: "sm" | "md" | "lg" | "xl" | "full";
27
27
  duration?: number;
28
28
  closeOnOverlayClick?: boolean;
@@ -42,14 +42,14 @@ interface DialogContentProps extends React__default.HTMLAttributes<HTMLDivElemen
42
42
  /** Override slide distance (px); default follows `size` via `SLIDE_ENTRANCE_OFFSET_PX`. */
43
43
  slideEntranceOffsetPx?: number;
44
44
  }
45
- declare const DialogContent: React__default.FC<DialogContentProps>;
46
- declare const DialogHeader: React__default.FC<React__default.HTMLAttributes<HTMLDivElement> & {
45
+ declare const DialogContent: react__default.FC<DialogContentProps>;
46
+ declare const DialogHeader: react__default.FC<react__default.HTMLAttributes<HTMLDivElement> & {
47
47
  fixed?: boolean;
48
48
  }>;
49
- declare const DialogFooter: React__default.FC<React__default.HTMLAttributes<HTMLDivElement> & {
49
+ declare const DialogFooter: react__default.FC<react__default.HTMLAttributes<HTMLDivElement> & {
50
50
  fixed?: boolean;
51
51
  }>;
52
- declare const DialogTitle: React__default.FC<React__default.HTMLAttributes<HTMLHeadingElement>>;
53
- declare const DialogDescription: React__default.FC<React__default.HTMLAttributes<HTMLParagraphElement>>;
52
+ declare const DialogTitle: react__default.FC<react__default.HTMLAttributes<HTMLHeadingElement>>;
53
+ declare const DialogDescription: react__default.FC<react__default.HTMLAttributes<HTMLParagraphElement>>;
54
54
 
55
55
  export { Dialog, DialogClose, DialogCloseButton, type DialogCloseButtonProps, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger };