@agg-market/ui 0.0.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 (192) hide show
  1. package/dist/badge.d.mts +26 -0
  2. package/dist/badge.d.ts +26 -0
  3. package/dist/badge.js +70 -0
  4. package/dist/badge.mjs +9 -0
  5. package/dist/button.d.mts +20 -0
  6. package/dist/button.d.ts +20 -0
  7. package/dist/button.js +197 -0
  8. package/dist/button.mjs +8 -0
  9. package/dist/card.d.mts +8 -0
  10. package/dist/card.d.ts +8 -0
  11. package/dist/card.js +84 -0
  12. package/dist/card.mjs +7 -0
  13. package/dist/chart.d.mts +40 -0
  14. package/dist/chart.d.ts +40 -0
  15. package/dist/chart.js +418 -0
  16. package/dist/chart.mjs +8 -0
  17. package/dist/chunk-2PGUPOXY.mjs +285 -0
  18. package/dist/chunk-3DV3D2LH.mjs +155 -0
  19. package/dist/chunk-44UEI6KD.mjs +280 -0
  20. package/dist/chunk-4ADCXJE6.mjs +297 -0
  21. package/dist/chunk-4GSXVVSA.mjs +64 -0
  22. package/dist/chunk-4NK2FNAG.mjs +581 -0
  23. package/dist/chunk-4XWCYUV3.mjs +355 -0
  24. package/dist/chunk-5MN6ZNFA.mjs +355 -0
  25. package/dist/chunk-6RRBINER.mjs +50 -0
  26. package/dist/chunk-765JPQDG.mjs +280 -0
  27. package/dist/chunk-7CD7GIZC.mjs +850 -0
  28. package/dist/chunk-7XRKA6XF.mjs +462 -0
  29. package/dist/chunk-AOFP74IB.mjs +850 -0
  30. package/dist/chunk-BNDFQPHF.mjs +9 -0
  31. package/dist/chunk-C4OI72SM.mjs +14 -0
  32. package/dist/chunk-CB2MLGCJ.mjs +279 -0
  33. package/dist/chunk-CKTAVEW2.mjs +212 -0
  34. package/dist/chunk-DA6KZWSK.mjs +807 -0
  35. package/dist/chunk-DBD5GHHD.mjs +147 -0
  36. package/dist/chunk-DQ6XFBYJ.mjs +37 -0
  37. package/dist/chunk-FACIYUNK.mjs +217 -0
  38. package/dist/chunk-FUJQIYOF.mjs +37 -0
  39. package/dist/chunk-FZTAHWOS.mjs +82 -0
  40. package/dist/chunk-GC3QIIH7.mjs +112 -0
  41. package/dist/chunk-GPBLZGJ2.mjs +136 -0
  42. package/dist/chunk-H4LELROL.mjs +262 -0
  43. package/dist/chunk-H7P6DIX4.mjs +262 -0
  44. package/dist/chunk-H7YEBGYY.mjs +42 -0
  45. package/dist/chunk-HJOBAMDU.mjs +142 -0
  46. package/dist/chunk-IJG5I642.mjs +462 -0
  47. package/dist/chunk-IY2AA3OL.mjs +50 -0
  48. package/dist/chunk-J6L5BLKX.mjs +136 -0
  49. package/dist/chunk-J7OETCZ7.mjs +147 -0
  50. package/dist/chunk-JLLMIPIX.mjs +42 -0
  51. package/dist/chunk-KBRLFTJT.mjs +741 -0
  52. package/dist/chunk-KDBYDMYV.mjs +64 -0
  53. package/dist/chunk-L6E6Q4C4.mjs +217 -0
  54. package/dist/chunk-LY6474C4.mjs +297 -0
  55. package/dist/chunk-M23S2DVV.mjs +581 -0
  56. package/dist/chunk-MG243DSX.mjs +44 -0
  57. package/dist/chunk-MRHSN2B7.mjs +279 -0
  58. package/dist/chunk-MXWRCVRJ.mjs +285 -0
  59. package/dist/chunk-NFYS557L.mjs +481 -0
  60. package/dist/chunk-NNSY462N.mjs +212 -0
  61. package/dist/chunk-OUOIDPGX.mjs +25 -0
  62. package/dist/chunk-P5PFQX75.mjs +31 -0
  63. package/dist/chunk-P674XRDY.mjs +481 -0
  64. package/dist/chunk-PAQ542ER.mjs +170 -0
  65. package/dist/chunk-QE46DVJG.mjs +323 -0
  66. package/dist/chunk-QXFDXXDB.mjs +792 -0
  67. package/dist/chunk-R3DRVI4J.mjs +741 -0
  68. package/dist/chunk-TTOR7JCT.mjs +155 -0
  69. package/dist/chunk-V5WIYMKS.mjs +25 -0
  70. package/dist/chunk-VAZE267Q.mjs +82 -0
  71. package/dist/chunk-VLIJ7PQK.mjs +792 -0
  72. package/dist/chunk-VYNVBJK6.mjs +44 -0
  73. package/dist/chunk-WIWJ6DIE.mjs +323 -0
  74. package/dist/chunk-XDAEEJYR.mjs +142 -0
  75. package/dist/chunk-YUIZZ6XE.mjs +31 -0
  76. package/dist/connect-button.d.mts +40 -0
  77. package/dist/connect-button.d.ts +40 -0
  78. package/dist/connect-button.js +1815 -0
  79. package/dist/connect-button.mjs +14 -0
  80. package/dist/event-list-item-details.d.mts +11 -0
  81. package/dist/event-list-item-details.d.ts +11 -0
  82. package/dist/event-list-item-details.js +2140 -0
  83. package/dist/event-list-item-details.mjs +19 -0
  84. package/dist/event-list-item-details.types-CMbXOrT-.d.ts +53 -0
  85. package/dist/event-list-item-details.types-CxWr4Qn1.d.ts +53 -0
  86. package/dist/event-list-item-details.types-DRi99PZq.d.mts +53 -0
  87. package/dist/event-list-item-details.types-DekJKeMD.d.mts +53 -0
  88. package/dist/event-list-item.d.mts +10 -0
  89. package/dist/event-list-item.d.ts +10 -0
  90. package/dist/event-list-item.js +2097 -0
  91. package/dist/event-list-item.mjs +17 -0
  92. package/dist/event-list-item.types-B1490EQm.d.mts +46 -0
  93. package/dist/event-list-item.types-B1490EQm.d.ts +46 -0
  94. package/dist/event-list-item.types-Y6IeJ4e4.d.mts +46 -0
  95. package/dist/event-list-item.types-Y6IeJ4e4.d.ts +46 -0
  96. package/dist/event-list.d.mts +9 -0
  97. package/dist/event-list.d.ts +9 -0
  98. package/dist/event-list.js +3151 -0
  99. package/dist/event-list.mjs +20 -0
  100. package/dist/event-list.types-Bpp6Vn-t.d.mts +13 -0
  101. package/dist/event-list.types-Bpp6Vn-t.d.ts +13 -0
  102. package/dist/event-list.types-CkAAUqwW.d.mts +13 -0
  103. package/dist/event-list.types-CkAAUqwW.d.ts +13 -0
  104. package/dist/event-market-page.d.mts +52 -0
  105. package/dist/event-market-page.d.ts +52 -0
  106. package/dist/event-market-page.js +5369 -0
  107. package/dist/event-market-page.mjs +29 -0
  108. package/dist/hello-world.d.mts +8 -0
  109. package/dist/hello-world.d.ts +8 -0
  110. package/dist/hello-world.js +80 -0
  111. package/dist/hello-world.mjs +8 -0
  112. package/dist/home-page.d.mts +51 -0
  113. package/dist/home-page.d.ts +51 -0
  114. package/dist/home-page.js +3415 -0
  115. package/dist/home-page.mjs +21 -0
  116. package/dist/icon.d.mts +123 -0
  117. package/dist/icon.d.ts +123 -0
  118. package/dist/icon.js +922 -0
  119. package/dist/icon.mjs +57 -0
  120. package/dist/index.d.mts +70 -0
  121. package/dist/index.d.ts +70 -0
  122. package/dist/index.js +8184 -0
  123. package/dist/index.mjs +307 -0
  124. package/dist/loading-icon.d.mts +14 -0
  125. package/dist/loading-icon.d.ts +14 -0
  126. package/dist/loading-icon.js +115 -0
  127. package/dist/loading-icon.mjs +8 -0
  128. package/dist/market-details.d.mts +73 -0
  129. package/dist/market-details.d.ts +73 -0
  130. package/dist/market-details.js +3923 -0
  131. package/dist/market-details.mjs +22 -0
  132. package/dist/modal.d.mts +66 -0
  133. package/dist/modal.d.ts +66 -0
  134. package/dist/modal.js +317 -0
  135. package/dist/modal.mjs +9 -0
  136. package/dist/number-value.d.mts +14 -0
  137. package/dist/number-value.d.ts +14 -0
  138. package/dist/number-value.js +67 -0
  139. package/dist/number-value.mjs +7 -0
  140. package/dist/onboarding-modal.d.mts +88 -0
  141. package/dist/onboarding-modal.d.ts +88 -0
  142. package/dist/onboarding-modal.js +2242 -0
  143. package/dist/onboarding-modal.mjs +24 -0
  144. package/dist/place-order.d.mts +20 -0
  145. package/dist/place-order.d.ts +20 -0
  146. package/dist/place-order.js +2916 -0
  147. package/dist/place-order.mjs +18 -0
  148. package/dist/registry-CVn79H3I.d.mts +106 -0
  149. package/dist/registry-CVn79H3I.d.ts +106 -0
  150. package/dist/search.d.mts +69 -0
  151. package/dist/search.d.ts +69 -0
  152. package/dist/search.js +1465 -0
  153. package/dist/search.mjs +12 -0
  154. package/dist/select.d.mts +19 -0
  155. package/dist/select.d.ts +19 -0
  156. package/dist/select.js +920 -0
  157. package/dist/select.mjs +11 -0
  158. package/dist/settlement.d.mts +16 -0
  159. package/dist/settlement.d.ts +16 -0
  160. package/dist/settlement.js +1769 -0
  161. package/dist/settlement.mjs +15 -0
  162. package/dist/skeleton.d.mts +22 -0
  163. package/dist/skeleton.d.ts +22 -0
  164. package/dist/skeleton.js +523 -0
  165. package/dist/skeleton.mjs +10 -0
  166. package/dist/styles.css +2 -0
  167. package/dist/switch-button.d.mts +21 -0
  168. package/dist/switch-button.d.ts +21 -0
  169. package/dist/switch-button.js +184 -0
  170. package/dist/switch-button.mjs +7 -0
  171. package/dist/tabs.d.mts +27 -0
  172. package/dist/tabs.d.ts +27 -0
  173. package/dist/tabs.js +1708 -0
  174. package/dist/tabs.mjs +12 -0
  175. package/dist/tailwind.css +2 -0
  176. package/dist/types-8VUuQVZq.d.mts +387 -0
  177. package/dist/types-8VUuQVZq.d.ts +387 -0
  178. package/dist/types-CayJ8tWA.d.mts +3 -0
  179. package/dist/types-CayJ8tWA.d.ts +3 -0
  180. package/dist/typography.d.mts +16 -0
  181. package/dist/typography.d.ts +16 -0
  182. package/dist/typography.js +62 -0
  183. package/dist/typography.mjs +7 -0
  184. package/dist/venue-logo.d.mts +12 -0
  185. package/dist/venue-logo.d.ts +12 -0
  186. package/dist/venue-logo.js +350 -0
  187. package/dist/venue-logo.mjs +10 -0
  188. package/dist/venue-logo.types-4hmCg3D3.d.ts +17 -0
  189. package/dist/venue-logo.types-B1iPJgiD.d.mts +17 -0
  190. package/dist/venue-logo.types-Bg8eXtGp.d.ts +17 -0
  191. package/dist/venue-logo.types-QNDwiQ77.d.mts +17 -0
  192. package/package.json +195 -0
@@ -0,0 +1,792 @@
1
+ import {
2
+ Select
3
+ } from "./chunk-IY2AA3OL.mjs";
4
+ import {
5
+ Icon
6
+ } from "./chunk-DA6KZWSK.mjs";
7
+ import {
8
+ AGG_ROOT_CLASS_NAME,
9
+ __spreadProps,
10
+ __spreadValues,
11
+ cn,
12
+ getMotionClassName,
13
+ getScrollBehavior
14
+ } from "./chunk-GC3QIIH7.mjs";
15
+
16
+ // src/primitives/tabs/index.tsx
17
+ import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
18
+ import { useLabels, useSdkUiConfig } from "@agg-market/hooks";
19
+ import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
20
+
21
+ // src/primitives/tabs/tabs.utils.ts
22
+ var findNextEnabledIndex = (items, startIndex, direction) => {
23
+ var _a;
24
+ if (items.length === 0)
25
+ return -1;
26
+ for (let step = 1; step <= items.length; step += 1) {
27
+ const nextIndex = (startIndex + direction * step + items.length) % items.length;
28
+ if (!((_a = items[nextIndex]) == null ? void 0 : _a.disabled))
29
+ return nextIndex;
30
+ }
31
+ return -1;
32
+ };
33
+ var findEdgeEnabledIndex = (items, direction) => {
34
+ var _a;
35
+ if (direction === 1) {
36
+ return items.findIndex((item) => !item.disabled);
37
+ }
38
+ for (let index = items.length - 1; index >= 0; index -= 1) {
39
+ if (!((_a = items[index]) == null ? void 0 : _a.disabled))
40
+ return index;
41
+ }
42
+ return -1;
43
+ };
44
+ var FALLBACK_TAB_WIDTH = 112;
45
+ var FALLBACK_MORE_WIDTH = 56;
46
+ var sumWidths = (indices, widths) => {
47
+ return [...indices].reduce((accumulator, index) => {
48
+ var _a;
49
+ return accumulator + ((_a = widths[index]) != null ? _a : 0);
50
+ }, 0);
51
+ };
52
+ var resolveTabsOverflowLayout = ({
53
+ items,
54
+ value,
55
+ containerWidth,
56
+ moreButtonWidth,
57
+ itemWidthByValue
58
+ }) => {
59
+ var _a;
60
+ if (items.length === 0) {
61
+ return {
62
+ visibleItems: [],
63
+ hiddenItems: []
64
+ };
65
+ }
66
+ if (!Number.isFinite(containerWidth) || containerWidth <= 0) {
67
+ return {
68
+ visibleItems: items,
69
+ hiddenItems: []
70
+ };
71
+ }
72
+ const resolvedItemWidths = items.map((item) => {
73
+ var _a2;
74
+ const measuredWidth = (_a2 = itemWidthByValue.get(item.value)) != null ? _a2 : FALLBACK_TAB_WIDTH;
75
+ return Math.max(1, measuredWidth);
76
+ });
77
+ const totalItemsWidth = resolvedItemWidths.reduce((sum, width) => {
78
+ return sum + width;
79
+ }, 0);
80
+ if (totalItemsWidth <= containerWidth) {
81
+ return {
82
+ visibleItems: items,
83
+ hiddenItems: []
84
+ };
85
+ }
86
+ const reservedMoreWidth = Math.max(1, moreButtonWidth || FALLBACK_MORE_WIDTH);
87
+ const visibleIndices = /* @__PURE__ */ new Set();
88
+ let usedWidth = 0;
89
+ for (let index = 0; index < items.length; index += 1) {
90
+ const itemWidth = (_a = resolvedItemWidths[index]) != null ? _a : FALLBACK_TAB_WIDTH;
91
+ const hasRemainingItems = index < items.length - 1;
92
+ const requiredExtraWidth = hasRemainingItems ? reservedMoreWidth : 0;
93
+ if (usedWidth + itemWidth + requiredExtraWidth > containerWidth)
94
+ break;
95
+ visibleIndices.add(index);
96
+ usedWidth += itemWidth;
97
+ }
98
+ if (visibleIndices.size === 0) {
99
+ visibleIndices.add(0);
100
+ }
101
+ const activeIndex = items.findIndex((item) => item.value === value);
102
+ const isActiveHidden = activeIndex >= 0 && !visibleIndices.has(activeIndex);
103
+ if (isActiveHidden && activeIndex >= 0) {
104
+ visibleIndices.add(activeIndex);
105
+ while (visibleIndices.size > 1) {
106
+ const visibleWidth = sumWidths(visibleIndices, resolvedItemWidths);
107
+ if (visibleWidth + reservedMoreWidth <= containerWidth)
108
+ break;
109
+ const removableIndex = [...visibleIndices].sort((left, right) => right - left).find((index) => index !== activeIndex);
110
+ if (removableIndex == null)
111
+ break;
112
+ visibleIndices.delete(removableIndex);
113
+ }
114
+ }
115
+ return {
116
+ visibleItems: items.filter((_, index) => visibleIndices.has(index)),
117
+ hiddenItems: items.filter((_, index) => !visibleIndices.has(index))
118
+ };
119
+ };
120
+
121
+ // src/primitives/tabs/index.tsx
122
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
123
+ var mobileTabsMediaQuery = "(max-width: 767px)";
124
+ var getTabButtonClassName = ({
125
+ enableAnimations,
126
+ isBarVariant,
127
+ isActive,
128
+ isDisabled,
129
+ size
130
+ }) => {
131
+ const isSmall = size === "s";
132
+ return cn(
133
+ "cursor-pointer disabled:cursor-not-allowed",
134
+ "relative inline-flex h-full shrink-0 items-center justify-center gap-2 font-agg-sans",
135
+ getMotionClassName(enableAnimations, "transition-colors motion-reduce:transition-none"),
136
+ isBarVariant ? cn(
137
+ "min-w-20 overflow-hidden border-r border-agg-separator last:border-r-0",
138
+ isSmall ? "px-3 text-agg-sm leading-agg-5" : "px-4 text-agg-base leading-agg-6"
139
+ ) : cn(isSmall ? "px-4 text-agg-sm leading-agg-5" : "px-5 text-agg-base leading-agg-6"),
140
+ isBarVariant && isActive && "font-agg-bold text-agg-primary",
141
+ isBarVariant && !isActive && "font-agg-normal text-agg-foreground",
142
+ !isBarVariant && isActive && "font-agg-bold text-agg-primary",
143
+ !isBarVariant && !isActive && "font-agg-normal text-agg-foreground",
144
+ isDisabled && "cursor-not-allowed opacity-60"
145
+ );
146
+ };
147
+ var getMeasureTabClassName = ({
148
+ isBarVariant,
149
+ size
150
+ }) => {
151
+ const isSmall = size === "s";
152
+ return cn(
153
+ "relative inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap font-agg-sans",
154
+ isBarVariant ? cn(
155
+ "h-8 min-w-20 border-r border-agg-separator font-agg-bold",
156
+ isSmall ? "px-3 text-agg-sm leading-agg-5" : "px-4 text-agg-base leading-agg-6"
157
+ ) : cn(
158
+ "h-12 font-agg-bold",
159
+ isSmall ? "px-4 text-agg-sm leading-agg-5" : "px-5 text-agg-base leading-agg-6"
160
+ )
161
+ );
162
+ };
163
+ var getMoreButtonClassName = ({
164
+ enableAnimations,
165
+ isBarVariant,
166
+ size
167
+ }) => {
168
+ const isSmall = size === "s";
169
+ return cn(
170
+ "cursor-pointer disabled:cursor-not-allowed",
171
+ "relative inline-flex shrink-0 items-center justify-center overflow-hidden font-agg-sans text-agg-foreground hover:bg-agg-secondary-hover",
172
+ getMotionClassName(enableAnimations, "transition-colors motion-reduce:transition-none"),
173
+ isBarVariant ? "h-8 rounded-r-agg-sm border border-agg-separator bg-agg-secondary px-2" : cn("h-12 bg-agg-secondary", isSmall ? "px-3 text-agg-sm" : "px-4 text-agg-base")
174
+ );
175
+ };
176
+ var Tabs = ({
177
+ items,
178
+ value,
179
+ onChange,
180
+ variant = "bar",
181
+ size = "m",
182
+ overflowBehavior,
183
+ overflowMenuAriaLabel,
184
+ ariaLabel,
185
+ className
186
+ }) => {
187
+ const labels = useLabels();
188
+ const { enableAnimations, rootClassName } = useSdkUiConfig();
189
+ const buttonRefs = useRef([]);
190
+ const dragStateRef = useRef({
191
+ isPointerDown: false,
192
+ isDragging: false,
193
+ pointerId: null,
194
+ startClientX: 0,
195
+ startClientY: 0,
196
+ startScrollLeft: 0
197
+ });
198
+ const suppressClickRef = useRef(false);
199
+ const resolvedAriaLabel = ariaLabel != null ? ariaLabel : labels.common.tabsAria;
200
+ const resolvedOverflowMenuAriaLabel = overflowMenuAriaLabel != null ? overflowMenuAriaLabel : labels.common.hiddenTabsAria;
201
+ const [isMoreMenuOpen, setIsMoreMenuOpen] = useState(false);
202
+ const [isMobileViewport, setIsMobileViewport] = useState(false);
203
+ const [isDraggingTabs, setIsDraggingTabs] = useState(false);
204
+ const [activeUnderlineStyle, setActiveUnderlineStyle] = useState({
205
+ transform: "translateX(0px)",
206
+ width: 0,
207
+ opacity: 0
208
+ });
209
+ const [overflowLayout, setOverflowLayout] = useState({
210
+ visibleItems: items,
211
+ hiddenItems: []
212
+ });
213
+ const [scrollAffordanceState, setScrollAffordanceState] = useState({
214
+ showStart: false,
215
+ showEnd: false
216
+ });
217
+ const containerRef = useRef(null);
218
+ const tabListRef = useRef(null);
219
+ const moreButtonMeasureRef = useRef(null);
220
+ const tabMeasureRefs = useRef(/* @__PURE__ */ new Map());
221
+ const isBarVariant = variant === "bar";
222
+ const resolvedOverflowBehavior = useMemo(() => {
223
+ if (overflowBehavior)
224
+ return overflowBehavior;
225
+ if (!isBarVariant)
226
+ return "scroll";
227
+ return isMobileViewport ? "select" : "menu";
228
+ }, [isBarVariant, isMobileViewport, overflowBehavior]);
229
+ const shouldUseOverflowMenu = resolvedOverflowBehavior === "menu";
230
+ const shouldUseOverflowScroll = resolvedOverflowBehavior === "scroll";
231
+ const shouldUseOverflowSelect = resolvedOverflowBehavior === "select";
232
+ const handleMeasureTabRef = useCallback(
233
+ (tabValue, tabElement) => {
234
+ if (!tabElement) {
235
+ tabMeasureRefs.current.delete(tabValue);
236
+ return;
237
+ }
238
+ tabMeasureRefs.current.set(tabValue, tabElement);
239
+ },
240
+ []
241
+ );
242
+ useEffect(() => {
243
+ if (typeof window === "undefined")
244
+ return;
245
+ const mediaQueryList = window.matchMedia(mobileTabsMediaQuery);
246
+ const handleMediaQueryChange = (event) => {
247
+ setIsMobileViewport(event.matches);
248
+ };
249
+ handleMediaQueryChange(mediaQueryList);
250
+ if (typeof mediaQueryList.addEventListener === "function") {
251
+ mediaQueryList.addEventListener("change", handleMediaQueryChange);
252
+ return () => {
253
+ mediaQueryList.removeEventListener("change", handleMediaQueryChange);
254
+ };
255
+ }
256
+ mediaQueryList.addListener(handleMediaQueryChange);
257
+ return () => {
258
+ mediaQueryList.removeListener(handleMediaQueryChange);
259
+ };
260
+ }, []);
261
+ const handleRecalculateOverflow = useCallback(() => {
262
+ var _a, _b, _c, _d;
263
+ if (!shouldUseOverflowMenu) {
264
+ setOverflowLayout({
265
+ visibleItems: items,
266
+ hiddenItems: []
267
+ });
268
+ return;
269
+ }
270
+ const containerWidth = (_b = (_a = containerRef.current) == null ? void 0 : _a.clientWidth) != null ? _b : 0;
271
+ const moreButtonWidth = (_d = (_c = moreButtonMeasureRef.current) == null ? void 0 : _c.offsetWidth) != null ? _d : 0;
272
+ const itemWidthByValue = new Map(
273
+ items.map((item) => {
274
+ var _a2, _b2;
275
+ return [item.value, (_b2 = (_a2 = tabMeasureRefs.current.get(item.value)) == null ? void 0 : _a2.offsetWidth) != null ? _b2 : 0];
276
+ })
277
+ );
278
+ setOverflowLayout(
279
+ resolveTabsOverflowLayout({
280
+ items,
281
+ value,
282
+ containerWidth,
283
+ moreButtonWidth,
284
+ itemWidthByValue
285
+ })
286
+ );
287
+ }, [items, shouldUseOverflowMenu, value]);
288
+ useEffect(() => {
289
+ handleRecalculateOverflow();
290
+ }, [handleRecalculateOverflow]);
291
+ useEffect(() => {
292
+ if (!shouldUseOverflowMenu)
293
+ return;
294
+ const container = containerRef.current;
295
+ if (!container || typeof ResizeObserver === "undefined")
296
+ return;
297
+ const resizeObserver = new ResizeObserver(() => {
298
+ handleRecalculateOverflow();
299
+ });
300
+ resizeObserver.observe(container);
301
+ return () => {
302
+ resizeObserver.disconnect();
303
+ };
304
+ }, [handleRecalculateOverflow, shouldUseOverflowMenu]);
305
+ useEffect(() => {
306
+ if (overflowLayout.hiddenItems.length > 0)
307
+ return;
308
+ setIsMoreMenuOpen(false);
309
+ }, [overflowLayout.hiddenItems.length]);
310
+ const updateScrollAffordances = useCallback(() => {
311
+ if (!shouldUseOverflowScroll) {
312
+ setScrollAffordanceState({
313
+ showStart: false,
314
+ showEnd: false
315
+ });
316
+ return;
317
+ }
318
+ const tabListElement = tabListRef.current;
319
+ if (!tabListElement)
320
+ return;
321
+ const maxScrollLeft = tabListElement.scrollWidth - tabListElement.clientWidth;
322
+ setScrollAffordanceState({
323
+ showStart: tabListElement.scrollLeft > 4,
324
+ showEnd: maxScrollLeft - tabListElement.scrollLeft > 4
325
+ });
326
+ }, [shouldUseOverflowScroll]);
327
+ const renderedItems = shouldUseOverflowMenu ? overflowLayout.visibleItems : items;
328
+ const shouldShowMoreButton = shouldUseOverflowMenu && overflowLayout.hiddenItems.length > 0;
329
+ const selectItems = useMemo(() => {
330
+ return items.map((item) => ({
331
+ value: item.value,
332
+ label: item.label,
333
+ disabled: item.disabled
334
+ }));
335
+ }, [items]);
336
+ const isSelectDisabled = !items.some((item) => !item.disabled);
337
+ const handleSelect = (nextValue) => {
338
+ if (nextValue === value)
339
+ return;
340
+ onChange(nextValue);
341
+ };
342
+ const handleMoveFocus = (index) => {
343
+ var _a;
344
+ if (index < 0)
345
+ return;
346
+ const nextItem = renderedItems[index];
347
+ if (!nextItem)
348
+ return;
349
+ handleSelect(nextItem.value);
350
+ (_a = buttonRefs.current[index]) == null ? void 0 : _a.focus();
351
+ };
352
+ const handleKeyDown = (event, index) => {
353
+ switch (event.key) {
354
+ case "ArrowRight": {
355
+ event.preventDefault();
356
+ handleMoveFocus(findNextEnabledIndex(renderedItems, index, 1));
357
+ return;
358
+ }
359
+ case "ArrowLeft": {
360
+ event.preventDefault();
361
+ handleMoveFocus(findNextEnabledIndex(renderedItems, index, -1));
362
+ return;
363
+ }
364
+ case "Home": {
365
+ event.preventDefault();
366
+ handleMoveFocus(findEdgeEnabledIndex(renderedItems, 1));
367
+ return;
368
+ }
369
+ case "End": {
370
+ event.preventDefault();
371
+ handleMoveFocus(findEdgeEnabledIndex(renderedItems, -1));
372
+ return;
373
+ }
374
+ default:
375
+ return;
376
+ }
377
+ };
378
+ const activeHiddenItem = useMemo(() => {
379
+ if (!shouldUseOverflowMenu)
380
+ return void 0;
381
+ return overflowLayout.hiddenItems.find((item) => item.value === value);
382
+ }, [overflowLayout.hiddenItems, shouldUseOverflowMenu, value]);
383
+ const tabListClassName = cn(
384
+ "inline-flex items-stretch bg-agg-secondary",
385
+ shouldUseOverflowMenu ? "min-w-0 flex-1 overflow-hidden" : shouldUseOverflowScroll ? cn(
386
+ "overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",
387
+ getMotionClassName(enableAnimations, "scroll-smooth")
388
+ ) : "overflow-x-auto",
389
+ isBarVariant ? "h-8 rounded-agg-sm border border-agg-separator" : "h-12 border-b border-agg-separator -mb-[1px]",
390
+ shouldUseOverflowScroll && "select-none",
391
+ shouldUseOverflowScroll && !isBarVariant && "snap-x snap-mandatory",
392
+ shouldUseOverflowScroll && (isDraggingTabs ? "cursor-grabbing" : "cursor-grab"),
393
+ shouldShowMoreButton && isBarVariant && "rounded-r-none border-r-0"
394
+ );
395
+ const handleTabListWheel = (event) => {
396
+ if (!shouldUseOverflowScroll)
397
+ return;
398
+ const tabListElement = event.currentTarget;
399
+ if (tabListElement.scrollWidth <= tabListElement.clientWidth)
400
+ return;
401
+ if (Math.abs(event.deltaX) > Math.abs(event.deltaY))
402
+ return;
403
+ event.preventDefault();
404
+ tabListElement.scrollLeft += event.deltaY;
405
+ };
406
+ const handleTabListPointerDown = (event) => {
407
+ if (!shouldUseOverflowScroll)
408
+ return;
409
+ if (event.pointerType !== "mouse")
410
+ return;
411
+ if (event.button !== 0)
412
+ return;
413
+ const tabListElement = tabListRef.current;
414
+ if (!tabListElement)
415
+ return;
416
+ if (tabListElement.scrollWidth <= tabListElement.clientWidth)
417
+ return;
418
+ dragStateRef.current = {
419
+ isPointerDown: true,
420
+ isDragging: false,
421
+ pointerId: event.pointerId,
422
+ startClientX: event.clientX,
423
+ startClientY: event.clientY,
424
+ startScrollLeft: tabListElement.scrollLeft
425
+ };
426
+ };
427
+ const handleTabListPointerMove = (event) => {
428
+ if (!shouldUseOverflowScroll)
429
+ return;
430
+ const dragState = dragStateRef.current;
431
+ const tabListElement = tabListRef.current;
432
+ if (!dragState.isPointerDown)
433
+ return;
434
+ if (dragState.pointerId !== event.pointerId)
435
+ return;
436
+ if (!tabListElement)
437
+ return;
438
+ const deltaX = event.clientX - dragState.startClientX;
439
+ const deltaY = event.clientY - dragState.startClientY;
440
+ const horizontalDistance = Math.abs(deltaX);
441
+ const verticalDistance = Math.abs(deltaY);
442
+ const hasExceededDragThreshold = horizontalDistance > 10 && horizontalDistance > verticalDistance;
443
+ if (hasExceededDragThreshold && !dragState.isDragging) {
444
+ dragState.isDragging = true;
445
+ setIsDraggingTabs(true);
446
+ tabListElement.setPointerCapture(event.pointerId);
447
+ }
448
+ if (!dragState.isDragging)
449
+ return;
450
+ event.preventDefault();
451
+ tabListElement.scrollLeft = dragState.startScrollLeft - deltaX;
452
+ };
453
+ const handleEndTabListDrag = (event) => {
454
+ const dragState = dragStateRef.current;
455
+ const tabListElement = tabListRef.current;
456
+ if (!dragState.isPointerDown)
457
+ return;
458
+ if (dragState.pointerId !== event.pointerId)
459
+ return;
460
+ if (tabListElement == null ? void 0 : tabListElement.hasPointerCapture(event.pointerId)) {
461
+ tabListElement.releasePointerCapture(event.pointerId);
462
+ }
463
+ if (dragState.isDragging) {
464
+ suppressClickRef.current = true;
465
+ window.setTimeout(() => {
466
+ suppressClickRef.current = false;
467
+ }, 0);
468
+ }
469
+ dragStateRef.current = {
470
+ isPointerDown: false,
471
+ isDragging: false,
472
+ pointerId: null,
473
+ startClientX: 0,
474
+ startClientY: 0,
475
+ startScrollLeft: 0
476
+ };
477
+ setIsDraggingTabs(false);
478
+ };
479
+ const handleTabListClickCapture = (event) => {
480
+ if (!suppressClickRef.current)
481
+ return;
482
+ event.preventDefault();
483
+ event.stopPropagation();
484
+ suppressClickRef.current = false;
485
+ };
486
+ const handleSelectHiddenItem = (nextValue) => {
487
+ handleSelect(nextValue);
488
+ setIsMoreMenuOpen(false);
489
+ };
490
+ const updateActiveUnderline = useCallback(() => {
491
+ if (isBarVariant) {
492
+ setActiveUnderlineStyle({
493
+ transform: "translateX(0px)",
494
+ width: 0,
495
+ opacity: 0
496
+ });
497
+ return;
498
+ }
499
+ const activeIndex = renderedItems.findIndex((item) => item.value === value);
500
+ const activeButton = activeIndex >= 0 ? buttonRefs.current[activeIndex] : null;
501
+ if (!activeButton || !tabListRef.current) {
502
+ setActiveUnderlineStyle((currentStyle) => __spreadProps(__spreadValues({}, currentStyle), {
503
+ opacity: 0
504
+ }));
505
+ return;
506
+ }
507
+ setActiveUnderlineStyle({
508
+ transform: `translateX(${activeButton.offsetLeft}px)`,
509
+ width: activeButton.offsetWidth,
510
+ opacity: 1
511
+ });
512
+ }, [isBarVariant, renderedItems, value]);
513
+ useLayoutEffect(() => {
514
+ updateActiveUnderline();
515
+ }, [updateActiveUnderline]);
516
+ useEffect(() => {
517
+ if (isBarVariant || !shouldUseOverflowScroll)
518
+ return;
519
+ const tabListElement = tabListRef.current;
520
+ if (!tabListElement)
521
+ return;
522
+ const handleScroll = () => {
523
+ updateActiveUnderline();
524
+ updateScrollAffordances();
525
+ };
526
+ tabListElement.addEventListener("scroll", handleScroll, { passive: true });
527
+ updateScrollAffordances();
528
+ return () => {
529
+ tabListElement.removeEventListener("scroll", handleScroll);
530
+ };
531
+ }, [isBarVariant, shouldUseOverflowScroll, updateActiveUnderline, updateScrollAffordances]);
532
+ useEffect(() => {
533
+ if (!shouldUseOverflowScroll)
534
+ return;
535
+ updateScrollAffordances();
536
+ }, [renderedItems, shouldUseOverflowScroll, updateScrollAffordances, value]);
537
+ useEffect(() => {
538
+ if (isBarVariant && !shouldUseOverflowScroll)
539
+ return;
540
+ if (typeof ResizeObserver === "undefined")
541
+ return;
542
+ const tabListElement = tabListRef.current;
543
+ if (!tabListElement)
544
+ return;
545
+ const resizeObserver = new ResizeObserver(() => {
546
+ updateActiveUnderline();
547
+ updateScrollAffordances();
548
+ });
549
+ resizeObserver.observe(tabListElement);
550
+ return () => {
551
+ resizeObserver.disconnect();
552
+ };
553
+ }, [isBarVariant, shouldUseOverflowScroll, updateActiveUnderline, updateScrollAffordances]);
554
+ useEffect(() => {
555
+ if (!shouldUseOverflowScroll)
556
+ return;
557
+ const activeIndex = renderedItems.findIndex((item) => item.value === value);
558
+ const activeButton = activeIndex >= 0 ? buttonRefs.current[activeIndex] : null;
559
+ if (!activeButton)
560
+ return;
561
+ activeButton.scrollIntoView({
562
+ behavior: getScrollBehavior(enableAnimations),
563
+ block: "nearest",
564
+ inline: "nearest"
565
+ });
566
+ }, [enableAnimations, renderedItems, shouldUseOverflowScroll, value]);
567
+ if (shouldUseOverflowSelect) {
568
+ return /* @__PURE__ */ jsx("div", { className: cn("w-full", className), children: /* @__PURE__ */ jsx(
569
+ Select,
570
+ {
571
+ ariaLabel,
572
+ className: "w-full",
573
+ disabled: isSelectDisabled,
574
+ items: selectItems,
575
+ onChange: handleSelect,
576
+ value
577
+ }
578
+ ) });
579
+ }
580
+ return /* @__PURE__ */ jsxs(
581
+ "div",
582
+ {
583
+ ref: containerRef,
584
+ className: cn(
585
+ "relative inline-flex max-w-full items-stretch font-agg-sans bg-agg-secondary",
586
+ className
587
+ ),
588
+ children: [
589
+ /* @__PURE__ */ jsxs(
590
+ "div",
591
+ {
592
+ ref: tabListRef,
593
+ role: "tablist",
594
+ "aria-label": resolvedAriaLabel,
595
+ className: cn("relative", tabListClassName),
596
+ onClickCapture: handleTabListClickCapture,
597
+ onPointerCancel: handleEndTabListDrag,
598
+ onPointerDown: handleTabListPointerDown,
599
+ onPointerMove: handleTabListPointerMove,
600
+ onPointerUp: handleEndTabListDrag,
601
+ onWheel: handleTabListWheel,
602
+ children: [
603
+ renderedItems.map((item, index) => {
604
+ const isActive = item.value === value;
605
+ return /* @__PURE__ */ jsxs(
606
+ "button",
607
+ {
608
+ ref: (buttonElement) => {
609
+ buttonRefs.current[index] = buttonElement;
610
+ },
611
+ type: "button",
612
+ role: "tab",
613
+ tabIndex: isActive ? 0 : -1,
614
+ "aria-selected": isActive,
615
+ "aria-label": item.label,
616
+ disabled: item.disabled,
617
+ onClick: () => handleSelect(item.value),
618
+ onKeyDown: (event) => handleKeyDown(event, index),
619
+ className: cn(
620
+ getTabButtonClassName({
621
+ enableAnimations,
622
+ isBarVariant,
623
+ isActive,
624
+ isDisabled: !!item.disabled,
625
+ size
626
+ }),
627
+ shouldUseOverflowScroll && !isBarVariant && "snap-start"
628
+ ),
629
+ children: [
630
+ isBarVariant ? /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
631
+ "span",
632
+ {
633
+ "aria-hidden": true,
634
+ className: cn(
635
+ "pointer-events-none absolute inset-px origin-bottom rounded-[2px] bg-agg-secondary-hover",
636
+ getMotionClassName(
637
+ enableAnimations,
638
+ "transition-[transform,opacity] duration-300 ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:transition-none"
639
+ ),
640
+ isActive ? "scale-y-100 opacity-100" : "scale-y-0 opacity-0"
641
+ )
642
+ }
643
+ ) }) : null,
644
+ item.icon ? /* @__PURE__ */ jsx("span", { className: "relative z-10 inline-flex shrink-0 items-center justify-center", children: item.icon }) : null,
645
+ /* @__PURE__ */ jsx("span", { className: "relative z-10 truncate whitespace-nowrap [&::first-letter]:uppercase", children: item.label })
646
+ ]
647
+ },
648
+ item.value
649
+ );
650
+ }),
651
+ !isBarVariant ? /* @__PURE__ */ jsx(
652
+ "span",
653
+ {
654
+ "aria-hidden": true,
655
+ className: cn(
656
+ "pointer-events-none absolute bottom-0 left-0 rounded-t-agg-sm bg-agg-primary",
657
+ getMotionClassName(
658
+ enableAnimations,
659
+ "transition-[transform,width,opacity] duration-300 ease-[cubic-bezier(0.4,0,0.2,1)]"
660
+ ),
661
+ "h-[3px]"
662
+ ),
663
+ style: activeUnderlineStyle
664
+ }
665
+ ) : null
666
+ ]
667
+ }
668
+ ),
669
+ shouldUseOverflowScroll && !isBarVariant ? /* @__PURE__ */ jsxs(Fragment, { children: [
670
+ /* @__PURE__ */ jsx(
671
+ "span",
672
+ {
673
+ "aria-hidden": true,
674
+ className: cn(
675
+ "pointer-events-none absolute top-0 bottom-0 left-0 z-10 w-12 md:w-18 bg-gradient-to-r from-agg-secondary via-agg-secondary to-transparent",
676
+ getMotionClassName(enableAnimations, "transition-opacity duration-200"),
677
+ scrollAffordanceState.showStart ? "opacity-100" : "opacity-0"
678
+ )
679
+ }
680
+ ),
681
+ /* @__PURE__ */ jsx(
682
+ "span",
683
+ {
684
+ "aria-hidden": true,
685
+ className: cn(
686
+ "pointer-events-none absolute top-0 right-0 bottom-0 z-10 w-12 md:w-18 bg-gradient-to-l from-agg-secondary via-agg-secondary to-transparent",
687
+ getMotionClassName(enableAnimations, "transition-opacity duration-200"),
688
+ scrollAffordanceState.showEnd ? "opacity-100" : "opacity-0"
689
+ )
690
+ }
691
+ )
692
+ ] }) : null,
693
+ shouldShowMoreButton ? /* @__PURE__ */ jsxs(DropdownMenu.Root, { open: isMoreMenuOpen, onOpenChange: setIsMoreMenuOpen, children: [
694
+ /* @__PURE__ */ jsx(DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsx(
695
+ "button",
696
+ {
697
+ type: "button",
698
+ "aria-label": resolvedOverflowMenuAriaLabel,
699
+ className: cn(
700
+ getMoreButtonClassName({
701
+ enableAnimations,
702
+ isBarVariant,
703
+ size
704
+ }),
705
+ activeHiddenItem ? "font-agg-bold text-agg-primary" : "font-agg-normal text-agg-foreground"
706
+ ),
707
+ children: /* @__PURE__ */ jsx(Icon, { name: "dots-horizontal", size: isBarVariant ? "s" : "m", color: "currentColor" })
708
+ }
709
+ ) }),
710
+ /* @__PURE__ */ jsx(DropdownMenu.Portal, { children: /* @__PURE__ */ jsx(
711
+ DropdownMenu.Content,
712
+ {
713
+ align: "end",
714
+ "aria-label": resolvedOverflowMenuAriaLabel,
715
+ className: cn(
716
+ AGG_ROOT_CLASS_NAME,
717
+ rootClassName,
718
+ "z-agg-dropdown mt-2 min-w-48 overflow-hidden rounded-agg-md border border-agg-separator bg-agg-secondary shadow-agg-popover outline-none"
719
+ ),
720
+ "data-agg-animations": enableAnimations ? "true" : "false",
721
+ sideOffset: 8,
722
+ children: overflowLayout.hiddenItems.map((item) => {
723
+ const isSelected = item.value === value;
724
+ return /* @__PURE__ */ jsxs(
725
+ DropdownMenu.Item,
726
+ {
727
+ disabled: item.disabled,
728
+ onSelect: () => handleSelectHiddenItem(item.value),
729
+ className: cn(
730
+ "cursor-pointer disabled:cursor-not-allowed",
731
+ "flex w-full items-center gap-2 px-4 py-2 text-left text-agg-sm leading-agg-5 outline-none",
732
+ getMotionClassName(enableAnimations, "transition-colors"),
733
+ "focus:bg-agg-secondary-hover data-[highlighted]:bg-agg-secondary-hover",
734
+ isSelected ? "font-agg-bold text-agg-primary" : "font-agg-normal text-agg-foreground",
735
+ item.disabled && "cursor-not-allowed opacity-60"
736
+ ),
737
+ children: [
738
+ item.icon ? /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0 items-center justify-center", children: item.icon }) : null,
739
+ /* @__PURE__ */ jsx("span", { className: "truncate whitespace-nowrap [&::first-letter]:uppercase", children: item.label })
740
+ ]
741
+ },
742
+ item.value
743
+ );
744
+ })
745
+ }
746
+ ) })
747
+ ] }) : null,
748
+ shouldUseOverflowMenu ? /* @__PURE__ */ jsxs(
749
+ "div",
750
+ {
751
+ "aria-hidden": true,
752
+ className: "pointer-events-none invisible fixed top-0 left-0 -z-10 h-0 overflow-hidden whitespace-nowrap",
753
+ children: [
754
+ items.map((item) => /* @__PURE__ */ jsxs(
755
+ "span",
756
+ {
757
+ ref: (tabElement) => handleMeasureTabRef(item.value, tabElement),
758
+ className: getMeasureTabClassName({
759
+ isBarVariant,
760
+ size
761
+ }),
762
+ children: [
763
+ item.icon ? /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0 items-center justify-center", children: item.icon }) : null,
764
+ /* @__PURE__ */ jsx("span", { children: item.label })
765
+ ]
766
+ },
767
+ `measure-${item.value}`
768
+ )),
769
+ /* @__PURE__ */ jsx(
770
+ "span",
771
+ {
772
+ ref: moreButtonMeasureRef,
773
+ className: getMoreButtonClassName({
774
+ enableAnimations,
775
+ isBarVariant,
776
+ size
777
+ }),
778
+ children: /* @__PURE__ */ jsx(Icon, { name: "dots-horizontal", size: isBarVariant ? "s" : "m", color: "currentColor" })
779
+ }
780
+ )
781
+ ]
782
+ }
783
+ ) : null
784
+ ]
785
+ }
786
+ );
787
+ };
788
+ Tabs.displayName = "Tabs";
789
+
790
+ export {
791
+ Tabs
792
+ };