@psnext/design-system 2.5.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (440) hide show
  1. package/DESIGN.md +7 -2
  2. package/SKILL.md +1 -1
  3. package/dist/Header.cjs +2 -2
  4. package/dist/Header.js +2 -2
  5. package/dist/Logo.cjs +322 -315
  6. package/dist/Logo.cjs.map +1 -1
  7. package/dist/Logo.js +322 -315
  8. package/dist/Logo.js.map +1 -1
  9. package/dist/Mosaic.cjs +72 -15
  10. package/dist/Mosaic.cjs.map +1 -1
  11. package/dist/Mosaic.js +72 -15
  12. package/dist/Mosaic.js.map +1 -1
  13. package/dist/index.cjs +12 -2
  14. package/dist/index.d.cts +5 -5
  15. package/dist/index.d.ts +5 -5
  16. package/dist/index.js +4 -3
  17. package/dist/index10.d.cts +6 -6
  18. package/dist/index10.d.cts.map +1 -1
  19. package/dist/index10.d.ts +6 -6
  20. package/dist/index11.d.cts +3 -3
  21. package/dist/index11.d.cts.map +1 -1
  22. package/dist/index11.d.ts +3 -3
  23. package/dist/index12.d.cts +11 -11
  24. package/dist/index12.d.ts +11 -11
  25. package/dist/index13.d.cts +6 -6
  26. package/dist/index13.d.ts +6 -6
  27. package/dist/index14.d.cts +5 -5
  28. package/dist/index14.d.cts.map +1 -1
  29. package/dist/index14.d.ts +5 -5
  30. package/dist/index15.d.cts +2 -2
  31. package/dist/index15.d.ts +2 -2
  32. package/dist/index16.d.cts +3 -3
  33. package/dist/index16.d.cts.map +1 -1
  34. package/dist/index16.d.ts +3 -3
  35. package/dist/index17.d.cts +2 -2
  36. package/dist/index17.d.ts +2 -2
  37. package/dist/index18.d.cts +4 -4
  38. package/dist/index18.d.cts.map +1 -1
  39. package/dist/index18.d.ts +4 -4
  40. package/dist/index19.d.cts +11 -11
  41. package/dist/index19.d.cts.map +1 -1
  42. package/dist/index19.d.ts +11 -11
  43. package/dist/index2.d.cts +8 -8
  44. package/dist/index2.d.ts +8 -8
  45. package/dist/index2.d.ts.map +1 -1
  46. package/dist/index20.d.cts +10 -10
  47. package/dist/index20.d.ts +10 -10
  48. package/dist/index21.d.cts +30 -81
  49. package/dist/index21.d.cts.map +1 -1
  50. package/dist/index21.d.ts +30 -81
  51. package/dist/index21.d.ts.map +1 -1
  52. package/dist/index22.d.cts +114 -27
  53. package/dist/index22.d.cts.map +1 -1
  54. package/dist/index22.d.ts +114 -27
  55. package/dist/index22.d.ts.map +1 -1
  56. package/dist/index23.d.cts +75 -53
  57. package/dist/index23.d.cts.map +1 -1
  58. package/dist/index23.d.ts +75 -53
  59. package/dist/index23.d.ts.map +1 -1
  60. package/dist/index24.d.cts +28 -93
  61. package/dist/index24.d.cts.map +1 -1
  62. package/dist/index24.d.ts +28 -93
  63. package/dist/index24.d.ts.map +1 -1
  64. package/dist/index25.d.cts +58 -33
  65. package/dist/index25.d.cts.map +1 -1
  66. package/dist/index25.d.ts +58 -33
  67. package/dist/index25.d.ts.map +1 -1
  68. package/dist/index26.d.cts +93 -11
  69. package/dist/index26.d.cts.map +1 -1
  70. package/dist/index26.d.ts +93 -11
  71. package/dist/index26.d.ts.map +1 -1
  72. package/dist/index27.d.cts +32 -63
  73. package/dist/index27.d.cts.map +1 -1
  74. package/dist/index27.d.ts +32 -63
  75. package/dist/index27.d.ts.map +1 -1
  76. package/dist/index28.d.cts +11 -48
  77. package/dist/index28.d.cts.map +1 -1
  78. package/dist/index28.d.ts +11 -48
  79. package/dist/index28.d.ts.map +1 -1
  80. package/dist/index29.d.cts +68 -59
  81. package/dist/index29.d.cts.map +1 -1
  82. package/dist/index29.d.ts +68 -59
  83. package/dist/index29.d.ts.map +1 -1
  84. package/dist/index3.d.cts +13 -13
  85. package/dist/index3.d.cts.map +1 -1
  86. package/dist/index3.d.ts +13 -13
  87. package/dist/index30.d.cts +47 -30
  88. package/dist/index30.d.cts.map +1 -1
  89. package/dist/index30.d.ts +47 -30
  90. package/dist/index30.d.ts.map +1 -1
  91. package/dist/index31.d.cts +63 -17
  92. package/dist/index31.d.cts.map +1 -1
  93. package/dist/index31.d.ts +63 -17
  94. package/dist/index31.d.ts.map +1 -1
  95. package/dist/index32.d.cts +29 -80
  96. package/dist/index32.d.cts.map +1 -1
  97. package/dist/index32.d.ts +29 -80
  98. package/dist/index32.d.ts.map +1 -1
  99. package/dist/index33.d.cts +19 -34
  100. package/dist/index33.d.cts.map +1 -1
  101. package/dist/index33.d.ts +19 -34
  102. package/dist/index33.d.ts.map +1 -1
  103. package/dist/index34.d.cts +80 -18
  104. package/dist/index34.d.cts.map +1 -1
  105. package/dist/index34.d.ts +80 -18
  106. package/dist/index34.d.ts.map +1 -1
  107. package/dist/index35.d.cts +32 -51
  108. package/dist/index35.d.cts.map +1 -1
  109. package/dist/index35.d.ts +32 -51
  110. package/dist/index35.d.ts.map +1 -1
  111. package/dist/index36.d.cts +19 -36
  112. package/dist/index36.d.cts.map +1 -1
  113. package/dist/index36.d.ts +19 -36
  114. package/dist/index36.d.ts.map +1 -1
  115. package/dist/index37.d.cts +43 -61
  116. package/dist/index37.d.cts.map +1 -1
  117. package/dist/index37.d.ts +43 -61
  118. package/dist/index37.d.ts.map +1 -1
  119. package/dist/index38.d.cts +35 -11
  120. package/dist/index38.d.cts.map +1 -1
  121. package/dist/index38.d.ts +35 -11
  122. package/dist/index38.d.ts.map +1 -1
  123. package/dist/index39.d.cts +68 -20
  124. package/dist/index39.d.cts.map +1 -1
  125. package/dist/index39.d.ts +68 -20
  126. package/dist/index39.d.ts.map +1 -1
  127. package/dist/index4.d.cts +2 -2
  128. package/dist/index4.d.cts.map +1 -1
  129. package/dist/index4.d.ts +2 -2
  130. package/dist/index40.d.cts +14 -15
  131. package/dist/index40.d.cts.map +1 -1
  132. package/dist/index40.d.ts +14 -15
  133. package/dist/index40.d.ts.map +1 -1
  134. package/dist/index41.d.cts +22 -98
  135. package/dist/index41.d.cts.map +1 -1
  136. package/dist/index41.d.ts +22 -98
  137. package/dist/index41.d.ts.map +1 -1
  138. package/dist/index42.d.cts +16 -120
  139. package/dist/index42.d.cts.map +1 -1
  140. package/dist/index42.d.ts +16 -120
  141. package/dist/index42.d.ts.map +1 -1
  142. package/dist/index43.d.cts +99 -16
  143. package/dist/index43.d.cts.map +1 -1
  144. package/dist/index43.d.ts +99 -16
  145. package/dist/index43.d.ts.map +1 -1
  146. package/dist/index44.d.cts +184 -49
  147. package/dist/index44.d.cts.map +1 -1
  148. package/dist/index44.d.ts +184 -49
  149. package/dist/index44.d.ts.map +1 -1
  150. package/dist/index45.d.cts +16 -39
  151. package/dist/index45.d.cts.map +1 -1
  152. package/dist/index45.d.ts +16 -39
  153. package/dist/index45.d.ts.map +1 -1
  154. package/dist/index46.d.cts +37 -77
  155. package/dist/index46.d.cts.map +1 -1
  156. package/dist/index46.d.ts +37 -77
  157. package/dist/index46.d.ts.map +1 -1
  158. package/dist/index47.d.cts +96 -1
  159. package/dist/index47.d.cts.map +1 -0
  160. package/dist/index47.d.ts +96 -1
  161. package/dist/index47.d.ts.map +1 -0
  162. package/dist/index48.d.cts +1 -127
  163. package/dist/index48.d.ts +1 -127
  164. package/dist/index49.d.cts +121 -42
  165. package/dist/index49.d.cts.map +1 -1
  166. package/dist/index49.d.ts +121 -42
  167. package/dist/index49.d.ts.map +1 -1
  168. package/dist/index5.d.cts +7 -7
  169. package/dist/index5.d.cts.map +1 -1
  170. package/dist/index5.d.ts +7 -7
  171. package/dist/index50.d.cts +42 -22
  172. package/dist/index50.d.cts.map +1 -1
  173. package/dist/index50.d.ts +42 -22
  174. package/dist/index50.d.ts.map +1 -1
  175. package/dist/index51.d.cts +21 -34
  176. package/dist/index51.d.cts.map +1 -1
  177. package/dist/index51.d.ts +21 -34
  178. package/dist/index51.d.ts.map +1 -1
  179. package/dist/index52.d.cts +33 -17
  180. package/dist/index52.d.cts.map +1 -1
  181. package/dist/index52.d.ts +33 -17
  182. package/dist/index52.d.ts.map +1 -1
  183. package/dist/index53.d.cts +18 -14
  184. package/dist/index53.d.cts.map +1 -1
  185. package/dist/index53.d.ts +18 -14
  186. package/dist/index53.d.ts.map +1 -1
  187. package/dist/index54.d.cts +12 -60
  188. package/dist/index54.d.cts.map +1 -1
  189. package/dist/index54.d.ts +12 -60
  190. package/dist/index54.d.ts.map +1 -1
  191. package/dist/index55.d.cts +51 -80
  192. package/dist/index55.d.cts.map +1 -1
  193. package/dist/index55.d.ts +51 -80
  194. package/dist/index55.d.ts.map +1 -1
  195. package/dist/index56.d.cts +91 -24
  196. package/dist/index56.d.cts.map +1 -1
  197. package/dist/index56.d.ts +91 -24
  198. package/dist/index56.d.ts.map +1 -1
  199. package/dist/index57.d.cts +25 -203
  200. package/dist/index57.d.cts.map +1 -1
  201. package/dist/index57.d.ts +25 -203
  202. package/dist/index57.d.ts.map +1 -1
  203. package/dist/index58.d.cts +198 -15
  204. package/dist/index58.d.cts.map +1 -1
  205. package/dist/index58.d.ts +198 -15
  206. package/dist/index58.d.ts.map +1 -1
  207. package/dist/index59.d.cts +21 -23
  208. package/dist/index59.d.cts.map +1 -1
  209. package/dist/index59.d.ts +21 -23
  210. package/dist/index59.d.ts.map +1 -1
  211. package/dist/index6.d.cts +5 -5
  212. package/dist/index6.d.ts +5 -5
  213. package/dist/index60.d.cts +21 -18
  214. package/dist/index60.d.cts.map +1 -1
  215. package/dist/index60.d.ts +21 -18
  216. package/dist/index60.d.ts.map +1 -1
  217. package/dist/index61.d.cts +21 -8
  218. package/dist/index61.d.cts.map +1 -1
  219. package/dist/index61.d.ts +21 -8
  220. package/dist/index61.d.ts.map +1 -1
  221. package/dist/index62.d.cts +6 -44
  222. package/dist/index62.d.cts.map +1 -1
  223. package/dist/index62.d.ts +6 -44
  224. package/dist/index62.d.ts.map +1 -1
  225. package/dist/index63.d.cts +46 -47
  226. package/dist/index63.d.cts.map +1 -1
  227. package/dist/index63.d.ts +46 -47
  228. package/dist/index63.d.ts.map +1 -1
  229. package/dist/index64.d.cts +47 -59
  230. package/dist/index64.d.cts.map +1 -1
  231. package/dist/index64.d.ts +47 -59
  232. package/dist/index64.d.ts.map +1 -1
  233. package/dist/index65.d.cts +56 -38
  234. package/dist/index65.d.cts.map +1 -1
  235. package/dist/index65.d.ts +56 -38
  236. package/dist/index65.d.ts.map +1 -1
  237. package/dist/index66.d.cts +37 -16
  238. package/dist/index66.d.cts.map +1 -1
  239. package/dist/index66.d.ts +37 -16
  240. package/dist/index66.d.ts.map +1 -1
  241. package/dist/index67.d.cts +20 -41
  242. package/dist/index67.d.cts.map +1 -1
  243. package/dist/index67.d.ts +20 -41
  244. package/dist/index67.d.ts.map +1 -1
  245. package/dist/index68.d.cts +41 -19
  246. package/dist/index68.d.cts.map +1 -1
  247. package/dist/index68.d.ts +41 -19
  248. package/dist/index68.d.ts.map +1 -1
  249. package/dist/index69.d.cts +14 -39
  250. package/dist/index69.d.cts.map +1 -1
  251. package/dist/index69.d.ts +14 -39
  252. package/dist/index69.d.ts.map +1 -1
  253. package/dist/index7.d.cts +8 -8
  254. package/dist/index7.d.cts.map +1 -1
  255. package/dist/index7.d.ts +8 -8
  256. package/dist/index70.d.cts +39 -16
  257. package/dist/index70.d.cts.map +1 -1
  258. package/dist/index70.d.ts +39 -16
  259. package/dist/index70.d.ts.map +1 -1
  260. package/dist/index71.d.cts +17 -83
  261. package/dist/index71.d.cts.map +1 -1
  262. package/dist/index71.d.ts +15 -81
  263. package/dist/index71.d.ts.map +1 -1
  264. package/dist/index72.d.cts +83 -11
  265. package/dist/index72.d.cts.map +1 -1
  266. package/dist/index72.d.ts +83 -11
  267. package/dist/index72.d.ts.map +1 -1
  268. package/dist/index73.d.cts +12 -30
  269. package/dist/index73.d.cts.map +1 -1
  270. package/dist/index73.d.ts +12 -30
  271. package/dist/index73.d.ts.map +1 -1
  272. package/dist/index74.d.cts +28 -27
  273. package/dist/index74.d.cts.map +1 -1
  274. package/dist/index74.d.ts +28 -27
  275. package/dist/index74.d.ts.map +1 -1
  276. package/dist/index75.d.cts +33 -83
  277. package/dist/index75.d.cts.map +1 -1
  278. package/dist/index75.d.ts +33 -83
  279. package/dist/index75.d.ts.map +1 -1
  280. package/dist/index76.d.cts +82 -273
  281. package/dist/index76.d.cts.map +1 -1
  282. package/dist/index76.d.ts +82 -273
  283. package/dist/index76.d.ts.map +1 -1
  284. package/dist/index77.d.cts +278 -0
  285. package/dist/index77.d.cts.map +1 -0
  286. package/dist/index77.d.ts +278 -0
  287. package/dist/index77.d.ts.map +1 -0
  288. package/dist/index8.d.cts +4 -4
  289. package/dist/index8.d.cts.map +1 -1
  290. package/dist/index8.d.ts +3 -3
  291. package/dist/index9.d.cts +2 -2
  292. package/dist/index9.d.ts +2 -2
  293. package/dist/layouts/Container/index.d.cts +1 -1
  294. package/dist/layouts/Container/index.d.ts +1 -1
  295. package/dist/layouts/MultiColumn/index.d.cts +1 -1
  296. package/dist/layouts/MultiColumn/index.d.ts +1 -1
  297. package/dist/layouts/PageBackground/index.d.cts +1 -1
  298. package/dist/layouts/PageBackground/index.d.ts +1 -1
  299. package/dist/layouts/Stack/index.d.cts +1 -1
  300. package/dist/layouts/Stack/index.d.ts +1 -1
  301. package/dist/layouts/TwoColumn/index.d.cts +1 -1
  302. package/dist/layouts/TwoColumn/index.d.ts +1 -1
  303. package/dist/layouts/index.d.cts +5 -5
  304. package/dist/layouts/index.d.ts +5 -5
  305. package/dist/patterns/DataTable/index.d.cts +3 -3
  306. package/dist/patterns/DataTable/index.d.cts.map +1 -1
  307. package/dist/patterns/DataTable/index.d.ts +3 -3
  308. package/dist/patterns/Footer/index.d.cts +7 -7
  309. package/dist/patterns/Footer/index.d.ts +7 -7
  310. package/dist/patterns/Header/index.d.cts +1 -1
  311. package/dist/patterns/Header/index.d.ts +1 -1
  312. package/dist/patterns/MediaObject/index.d.cts +14 -14
  313. package/dist/patterns/MediaObject/index.d.cts.map +1 -1
  314. package/dist/patterns/MediaObject/index.d.ts +11 -11
  315. package/dist/patterns/MediaObject/index.d.ts.map +1 -1
  316. package/dist/patterns/NavRail/index.d.cts +1 -1
  317. package/dist/patterns/NavRail/index.d.ts +1 -1
  318. package/dist/patterns/SectionCard/index.d.cts +2 -2
  319. package/dist/patterns/SectionCard/index.d.cts.map +1 -1
  320. package/dist/patterns/SectionCard/index.d.ts +2 -2
  321. package/dist/patterns/SectionHeading/index.d.cts +3 -3
  322. package/dist/patterns/SectionHeading/index.d.cts.map +1 -1
  323. package/dist/patterns/SectionHeading/index.d.ts +3 -3
  324. package/dist/patterns/SectionHeading/index.d.ts.map +1 -1
  325. package/dist/patterns/index.d.cts +2 -2
  326. package/dist/patterns/index.d.ts +2 -2
  327. package/dist/primitives/Combobox/index.cjs +210 -0
  328. package/dist/primitives/Combobox/index.cjs.map +1 -0
  329. package/dist/primitives/Combobox/index.d.cts +2 -0
  330. package/dist/primitives/Combobox/index.d.ts +2 -0
  331. package/dist/primitives/Combobox/index.js +199 -0
  332. package/dist/primitives/Combobox/index.js.map +1 -0
  333. package/dist/primitives/ContextMenu/index.d.cts +1 -1
  334. package/dist/primitives/ContextMenu/index.d.ts +1 -1
  335. package/dist/primitives/Credits/index.d.cts +1 -1
  336. package/dist/primitives/Credits/index.d.ts +1 -1
  337. package/dist/primitives/Drawer/index.d.cts +1 -1
  338. package/dist/primitives/Drawer/index.d.ts +1 -1
  339. package/dist/primitives/DropdownMenu/index.d.cts +1 -1
  340. package/dist/primitives/DropdownMenu/index.d.ts +1 -1
  341. package/dist/primitives/Empty/index.d.cts +1 -1
  342. package/dist/primitives/Empty/index.d.ts +1 -1
  343. package/dist/primitives/Field/index.d.cts +1 -1
  344. package/dist/primitives/Field/index.d.ts +1 -1
  345. package/dist/primitives/FileUpload/index.d.cts +1 -1
  346. package/dist/primitives/FileUpload/index.d.ts +1 -1
  347. package/dist/primitives/Form/index.d.cts +1 -1
  348. package/dist/primitives/Form/index.d.ts +1 -1
  349. package/dist/primitives/Heading/index.d.cts +1 -1
  350. package/dist/primitives/Heading/index.d.ts +1 -1
  351. package/dist/primitives/HoverCard/index.d.cts +1 -1
  352. package/dist/primitives/HoverCard/index.d.ts +1 -1
  353. package/dist/primitives/Icon/index.d.cts +1 -1
  354. package/dist/primitives/Icon/index.d.ts +1 -1
  355. package/dist/primitives/InfoBanner/index.d.cts +1 -1
  356. package/dist/primitives/InfoBanner/index.d.ts +1 -1
  357. package/dist/primitives/Input/index.d.cts +1 -1
  358. package/dist/primitives/Input/index.d.ts +1 -1
  359. package/dist/primitives/InputGroup/index.d.cts +1 -1
  360. package/dist/primitives/InputGroup/index.d.ts +1 -1
  361. package/dist/primitives/InputOtp/index.d.cts +1 -1
  362. package/dist/primitives/InputOtp/index.d.ts +1 -1
  363. package/dist/primitives/Item/index.d.cts +1 -1
  364. package/dist/primitives/Item/index.d.ts +1 -1
  365. package/dist/primitives/Kbd/index.d.cts +1 -1
  366. package/dist/primitives/Kbd/index.d.ts +1 -1
  367. package/dist/primitives/Label/index.d.cts +1 -1
  368. package/dist/primitives/Label/index.d.ts +1 -1
  369. package/dist/primitives/Link/index.d.cts +1 -1
  370. package/dist/primitives/Link/index.d.ts +1 -1
  371. package/dist/primitives/Logo/index.d.cts +1 -1
  372. package/dist/primitives/Logo/index.d.ts +1 -1
  373. package/dist/primitives/Menubar/index.d.cts +1 -1
  374. package/dist/primitives/Menubar/index.d.ts +1 -1
  375. package/dist/primitives/Mosaic/index.d.cts +2 -2
  376. package/dist/primitives/Mosaic/index.d.ts +2 -2
  377. package/dist/primitives/NativeSelect/index.d.cts +1 -1
  378. package/dist/primitives/NativeSelect/index.d.ts +1 -1
  379. package/dist/primitives/NavRail/index.d.cts +2 -2
  380. package/dist/primitives/NavRail/index.d.ts +2 -2
  381. package/dist/primitives/NavigationMenu/index.d.cts +1 -1
  382. package/dist/primitives/NavigationMenu/index.d.ts +1 -1
  383. package/dist/primitives/NotchedCard/index.d.cts +1 -1
  384. package/dist/primitives/NotchedCard/index.d.ts +1 -1
  385. package/dist/primitives/Pagination/index.d.cts +1 -1
  386. package/dist/primitives/Pagination/index.d.ts +1 -1
  387. package/dist/primitives/Popover/index.d.cts +1 -1
  388. package/dist/primitives/Popover/index.d.ts +1 -1
  389. package/dist/primitives/Progress/index.d.cts +1 -1
  390. package/dist/primitives/Progress/index.d.ts +1 -1
  391. package/dist/primitives/RadioGroup/index.d.cts +1 -1
  392. package/dist/primitives/RadioGroup/index.d.ts +1 -1
  393. package/dist/primitives/Resizable/index.d.cts +1 -1
  394. package/dist/primitives/Resizable/index.d.ts +1 -1
  395. package/dist/primitives/ScrollArea/index.d.cts +1 -1
  396. package/dist/primitives/ScrollArea/index.d.ts +1 -1
  397. package/dist/primitives/Select/index.d.cts +1 -1
  398. package/dist/primitives/Select/index.d.ts +1 -1
  399. package/dist/primitives/Sheet/index.d.cts +1 -1
  400. package/dist/primitives/Sheet/index.d.ts +1 -1
  401. package/dist/primitives/Sidebar/index.d.cts +1 -1
  402. package/dist/primitives/Sidebar/index.d.ts +1 -1
  403. package/dist/primitives/Skeleton/index.d.cts +1 -1
  404. package/dist/primitives/Skeleton/index.d.ts +1 -1
  405. package/dist/primitives/Slider/index.d.cts +1 -1
  406. package/dist/primitives/Slider/index.d.ts +1 -1
  407. package/dist/primitives/Sonner/index.d.cts +1 -1
  408. package/dist/primitives/Sonner/index.d.ts +1 -1
  409. package/dist/primitives/Spinner/index.d.cts +1 -1
  410. package/dist/primitives/Spinner/index.d.ts +1 -1
  411. package/dist/primitives/Switch/index.d.cts +1 -1
  412. package/dist/primitives/Switch/index.d.ts +1 -1
  413. package/dist/primitives/Table/index.d.cts +1 -1
  414. package/dist/primitives/Table/index.d.ts +1 -1
  415. package/dist/primitives/Tabs/index.cjs +153 -10
  416. package/dist/primitives/Tabs/index.cjs.map +1 -1
  417. package/dist/primitives/Tabs/index.d.cts +1 -1
  418. package/dist/primitives/Tabs/index.d.ts +1 -1
  419. package/dist/primitives/Tabs/index.js +153 -10
  420. package/dist/primitives/Tabs/index.js.map +1 -1
  421. package/dist/primitives/Text/index.d.cts +1 -1
  422. package/dist/primitives/Text/index.d.ts +1 -1
  423. package/dist/primitives/Textarea/index.d.cts +1 -1
  424. package/dist/primitives/Textarea/index.d.ts +1 -1
  425. package/dist/primitives/ThemeProvider/index.d.cts +1 -1
  426. package/dist/primitives/ThemeProvider/index.d.ts +1 -1
  427. package/dist/primitives/Toggle/index.d.cts +1 -1
  428. package/dist/primitives/Toggle/index.d.ts +1 -1
  429. package/dist/primitives/ToggleGroup/index.d.cts +1 -1
  430. package/dist/primitives/ToggleGroup/index.d.ts +1 -1
  431. package/dist/primitives/Tooltip/index.d.cts +1 -1
  432. package/dist/primitives/Tooltip/index.d.ts +1 -1
  433. package/dist/primitives/index.cjs +12 -2
  434. package/dist/primitives/index.d.cts +50 -49
  435. package/dist/primitives/index.d.ts +50 -49
  436. package/dist/primitives/index.js +4 -3
  437. package/dist/styles/tokens/mode-dark.css +1 -1
  438. package/package.json +1 -1
  439. package/dist/index48.d.cts.map +0 -1
  440. package/dist/index48.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["React","TabsPrimitive","cn"],"sources":["../../../src/primitives/Tabs/Tabs.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport { Tabs as TabsPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\n// Tabs — built on Radix Tabs (content panels + roving-focus keyboard nav + a11y).\n// One component, four visual `variant`s, each supporting horizontal/vertical\n// `orientation`:\n// - \"line\": underline under the active tab.\n// - \"pill\" (default): a muted track; the active tab is an elevated pill.\n// - \"segmented\": a muted track with a single sliding indicator that animates\n// between tabs.\n// - \"fancy\": translucent glass card tabs; the active tab merges into the glass\n// content panel below (login-style). `size` controls the fancy vertical padding.\n// `variant`/`size`/`orientation` are set on the root and shared via context.\n\ntype TabsVariant = \"line\" | \"pill\" | \"segmented\" | \"fancy\";\ntype TabsSize = \"sm\" | \"md\" | \"lg\";\ntype TabsOrientation = \"horizontal\" | \"vertical\";\n\nconst TabsContext = React.createContext<{\n variant: TabsVariant;\n size: TabsSize;\n orientation: TabsOrientation;\n}>({ variant: \"pill\", size: \"md\", orientation: \"horizontal\" });\n\n/**\n * Tabbed interface root: holds the active value and shares `variant`/`size`/\n * `orientation` with its `TabsList`/`TabsTrigger`/`TabsContent` via context.\n */\nfunction Tabs({\n className,\n variant = \"pill\",\n size = \"md\",\n orientation = \"horizontal\",\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root> & {\n /** Visual style of the tabs: underline, pill track, sliding segmented, or glass cards. */\n variant?: TabsVariant;\n /** Control density — drives padding and text size of the triggers. */\n size?: TabsSize;\n}) {\n const resolvedOrientation: TabsOrientation =\n orientation === \"vertical\" ? \"vertical\" : \"horizontal\";\n const ctx = React.useMemo(\n () => ({ variant, size, orientation: resolvedOrientation }),\n [variant, size, resolvedOrientation],\n );\n return (\n <TabsContext.Provider value={ctx}>\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-variant={variant}\n data-orientation={resolvedOrientation}\n orientation={resolvedOrientation}\n className={cn(\n \"group/tabs flex data-[orientation=horizontal]:flex-col\",\n variant === \"fancy\" ? \"gap-0\" : \"gap-2\",\n className,\n )}\n {...props}\n />\n </TabsContext.Provider>\n );\n}\n\nconst tabsListVariants = cva(\"relative inline-flex items-center text-muted-txt\", {\n variants: {\n variant: {\n line: \"gap-1 bg-transparent\",\n pill: \"justify-center rounded-10 bg-muted-bg p-0.75\",\n segmented: \"justify-center rounded-12 bg-muted-bg p-1\",\n fancy: \"w-full items-stretch gap-1 bg-transparent\",\n },\n orientation: {\n horizontal: \"\",\n vertical: \"h-fit flex-col\",\n },\n size: { sm: \"\", md: \"\", lg: \"\" },\n },\n compoundVariants: [\n // Track height for the horizontal pill/segmented variants.\n { variant: [\"pill\", \"segmented\"], orientation: \"horizontal\", size: \"sm\", class: \"h-6 p-0.5\" },\n { variant: [\"pill\", \"segmented\"], orientation: \"horizontal\", size: \"md\", class: \"h-8.75\" },\n { variant: [\"pill\", \"segmented\"], orientation: \"horizontal\", size: \"lg\", class: \"h-10 p-1\" },\n ],\n defaultVariants: { variant: \"pill\", orientation: \"horizontal\", size: \"md\" },\n});\n\n/** Row (or column) of tab triggers; renders the sliding indicator for the `segmented` variant. */\nfunction TabsList({\n className,\n children,\n tabPrefix,\n tabSuffix,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.List> & {\n tabPrefix?: React.ReactNode;\n tabSuffix?: React.ReactNode;\n}) {\n const { variant, size, orientation } = React.useContext(TabsContext);\n const isSegmented = variant === \"segmented\";\n const listRef = React.useRef<HTMLDivElement>(null);\n const [indicator, setIndicator] = React.useState<{\n left: number;\n top: number;\n width: number;\n height: number;\n } | null>(null);\n\n React.useEffect(() => {\n if (!isSegmented) return;\n const list = listRef.current;\n if (!list) return;\n const update = () => {\n const active = list.querySelector<HTMLElement>(\n '[data-slot=\"tabs-trigger\"][data-state=\"active\"]',\n );\n if (!active) {\n setIndicator(null);\n return;\n }\n setIndicator({\n left: active.offsetLeft,\n top: active.offsetTop,\n width: active.offsetWidth,\n height: active.offsetHeight,\n });\n };\n update();\n const mutation = new MutationObserver(update);\n mutation.observe(list, { attributes: true, attributeFilter: [\"data-state\"], subtree: true });\n const resize = new ResizeObserver(update);\n resize.observe(list);\n return () => {\n mutation.disconnect();\n resize.disconnect();\n };\n }, [isSegmented]);\n\n return (\n <TabsPrimitive.List\n ref={listRef}\n data-slot=\"tabs-list\"\n className={cn(tabsListVariants({ variant, size, orientation }), className)}\n {...props}\n >\n {tabPrefix}\n {isSegmented && indicator && (\n <span\n data-slot=\"tabs-indicator\"\n aria-hidden\n className=\"absolute z-0 rounded-8 bg-primary-bg shadow-sm transition-all duration-200 ease-out motion-reduce:transition-none\"\n style={\n orientation === \"vertical\"\n ? { top: indicator.top, height: indicator.height, left: 4, right: 4 }\n : { left: indicator.left, width: indicator.width, top: 4, bottom: 4 }\n }\n />\n )}\n {children}\n {tabSuffix}\n </TabsPrimitive.List>\n );\n}\n\nconst tabsTriggerVariants = cva(\n \"relative inline-flex items-center justify-center gap-1.5 font-medium whitespace-nowrap text-primary-txt outline-none transition-all focus-visible:ring-3 focus-visible:ring-focus disabled:pointer-events-none disabled:opacity-50 data-[state=active]:text-primary-txt [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n line: \"h-[calc(100%-1px)] flex-1 rounded-none\",\n pill: \"h-[calc(100%-1px)] flex-1 rounded-10 border border-transparent data-[state=active]:bg-primary-bg data-[state=active]:shadow-sm\",\n segmented: \"z-[1] h-[calc(100%-1px)] flex-1 rounded-8\",\n // Fancy (Figma Components file, node 1:6831): default = glass-60→glass-20\n // vertical gradient card; hover = solid glass-none; selected = 4px taller,\n // flat-bottomed, glass-none→glass-40 (72.6% stop), semibold, with concave\n // 16px corner curves where it meets the panel.\n fancy: cn(\n \"mb-1 flex-1 justify-between rounded-16 font-normal backdrop-blur-glass\",\n \"bg-gradient-to-b from-glass-60-bg from-[3.4%] to-glass-20-bg\",\n \"data-[state=inactive]:hover:bg-none data-[state=inactive]:hover:bg-glass-none-bg\",\n \"data-[state=active]:mb-0 data-[state=active]:rounded-b-none data-[state=active]:from-glass-none-bg data-[state=active]:to-glass-40-bg data-[state=active]:to-[72.6%] data-[state=active]:font-semibold\",\n \"data-[state=active]:before:absolute data-[state=active]:before:-left-4 data-[state=active]:before:bottom-0 data-[state=active]:before:size-4 data-[state=active]:before:bg-[radial-gradient(circle_at_top_left,transparent_15.5px,var(--glass-40-bg)_16px)]\",\n \"data-[state=active]:after:absolute data-[state=active]:after:-right-4 data-[state=active]:after:bottom-0 data-[state=active]:after:size-4 data-[state=active]:after:bg-[radial-gradient(circle_at_top_right,transparent_15.5px,var(--glass-40-bg)_16px)]\",\n // The curves flow into NEIGHBOURING tabs only — never past the group edge.\n \"first:before:hidden last:after:hidden\",\n ),\n },\n orientation: { horizontal: \"\", vertical: \"w-full justify-start\" },\n size: { sm: \"\", md: \"\", lg: \"\" },\n },\n compoundVariants: [\n // Padding + text size for the track variants.\n {\n variant: [\"line\", \"pill\", \"segmented\"],\n size: \"sm\",\n class: \"px-2 py-0.5 text-xs leading-4\",\n },\n { variant: [\"line\", \"pill\", \"segmented\"], size: \"md\", class: \"px-2 py-1 text-sm leading-5\" },\n {\n variant: [\"line\", \"pill\", \"segmented\"],\n size: \"lg\",\n class: \"px-2 py-1.5 text-sm leading-5\",\n },\n // Fancy footprint scales with size; the active tab adds bottom padding so it\n // merges into the panel while inactive tabs stay shorter (gap above content).\n { variant: \"fancy\", size: \"sm\", class: \"px-4 py-2 text-sm\" },\n { variant: \"fancy\", size: \"md\", class: \"px-6 py-3 text-sm\" },\n { variant: \"fancy\", size: \"lg\", class: \"px-6 py-4 text-base\" },\n // Underline position for the line variant (per orientation).\n {\n variant: \"line\",\n orientation: \"horizontal\",\n class:\n \"after:absolute after:inset-x-0 after:bottom-[-5px] after:h-0.5 after:bg-primary-txt after:opacity-0 after:transition-opacity data-[state=active]:after:opacity-100\",\n },\n {\n variant: \"line\",\n orientation: \"vertical\",\n class:\n \"after:absolute after:inset-y-0 after:right-[-5px] after:w-0.5 after:bg-primary-txt after:opacity-0 after:transition-opacity data-[state=active]:after:opacity-100\",\n },\n ],\n defaultVariants: { variant: \"pill\", orientation: \"horizontal\", size: \"md\" },\n },\n);\n\n/** Clickable tab button; its `value` selects the matching `TabsContent` panel. */\nfunction TabsTrigger({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n const { variant, size, orientation } = React.useContext(TabsContext);\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(tabsTriggerVariants({ variant, size, orientation }), className)}\n {...props}\n />\n );\n}\n\n/** Panel shown when its `value` matches the active tab; styled as a glass panel for the `fancy` variant. */\nfunction TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>) {\n const { variant } = React.useContext(TabsContext);\n return (\n <TabsPrimitive.Content\n data-slot=\"tabs-content\"\n className={cn(\n \"flex-1 outline-none\",\n // Fancy: a glass panel the active tab merges into (flat top, matching tint).\n variant === \"fancy\" &&\n \"flex-none rounded-16 rounded-t-none bg-glass-40-bg p-5 backdrop-blur-glass\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Trailing count badge for a tab trigger; goes dark on the `fancy` variant to match its cards. */\nfunction TabsCounter({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"tabs-counter\"\n className={cn(\n \"ml-1 inline-flex h-4 min-w-4 items-center justify-center rounded-full bg-muted-bg px-1 text-xs font-medium text-muted-txt\",\n \"group-data-[variant=fancy]/tabs:h-5 group-data-[variant=fancy]/tabs:min-w-5 group-data-[variant=fancy]/tabs:bg-primary-invert-bg group-data-[variant=fancy]/tabs:px-2 group-data-[variant=fancy]/tabs:leading-4 group-data-[variant=fancy]/tabs:font-semibold group-data-[variant=fancy]/tabs:text-primary-invert-txt\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n TabsCounter,\n tabsListVariants,\n tabsTriggerVariants,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["React","TabsPrimitive","cn","Icon"],"sources":["../../../src/primitives/Tabs/Tabs.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport { Tabs as TabsPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils\";\nimport { Icon } from \"../Icon\";\n\n// Tabs — built on Radix Tabs (content panels + roving-focus keyboard nav + a11y).\n// One component, four visual `variant`s, each supporting horizontal/vertical\n// `orientation`:\n// - \"line\": underline under the active tab.\n// - \"pill\" (default): a muted track; the active tab is an elevated pill.\n// - \"segmented\": a muted track with a single sliding indicator that animates\n// between tabs.\n// - \"fancy\": translucent glass card tabs; the active tab merges into the glass\n// content panel below (login-style). `size` controls the fancy vertical padding.\n// `variant`/`size`/`orientation` are set on the root and shared via context.\n\ntype TabsVariant = \"line\" | \"pill\" | \"segmented\" | \"fancy\";\ntype TabsSize = \"sm\" | \"md\" | \"lg\";\ntype TabsOrientation = \"horizontal\" | \"vertical\";\n\nconst TabsContext = React.createContext<{\n variant: TabsVariant;\n size: TabsSize;\n orientation: TabsOrientation;\n}>({ variant: \"pill\", size: \"md\", orientation: \"horizontal\" });\n\n/**\n * Tabbed interface root: holds the active value and shares `variant`/`size`/\n * `orientation` with its `TabsList`/`TabsTrigger`/`TabsContent` via context.\n */\nfunction Tabs({\n className,\n variant = \"pill\",\n size = \"md\",\n orientation = \"horizontal\",\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root> & {\n /** Visual style of the tabs: underline, pill track, sliding segmented, or glass cards. */\n variant?: TabsVariant;\n /** Control density — drives padding and text size of the triggers. */\n size?: TabsSize;\n}) {\n const resolvedOrientation: TabsOrientation =\n orientation === \"vertical\" ? \"vertical\" : \"horizontal\";\n const ctx = React.useMemo(\n () => ({ variant, size, orientation: resolvedOrientation }),\n [variant, size, resolvedOrientation],\n );\n return (\n <TabsContext.Provider value={ctx}>\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-variant={variant}\n data-orientation={resolvedOrientation}\n orientation={resolvedOrientation}\n className={cn(\n \"group/tabs flex data-[orientation=horizontal]:flex-col\",\n variant === \"fancy\" ? \"gap-0\" : \"gap-2\",\n className,\n )}\n {...props}\n />\n </TabsContext.Provider>\n );\n}\n\nconst tabsListVariants = cva(\"relative inline-flex items-center text-muted-txt\", {\n variants: {\n variant: {\n line: \"gap-1 bg-transparent\",\n pill: \"justify-center rounded-10 bg-muted-bg p-0.75\",\n segmented: \"justify-center rounded-12 bg-muted-bg p-1\",\n fancy: \"items-stretch gap-1 bg-transparent\",\n },\n orientation: {\n horizontal: \"w-max min-w-full\",\n vertical: \"h-fit w-full flex-col\",\n },\n size: { sm: \"\", md: \"\", lg: \"\" },\n },\n compoundVariants: [\n // Track height for the horizontal pill/segmented variants.\n { variant: [\"pill\", \"segmented\"], orientation: \"horizontal\", size: \"sm\", class: \"h-6 p-0.5\" },\n { variant: [\"pill\", \"segmented\"], orientation: \"horizontal\", size: \"md\", class: \"h-8.75\" },\n { variant: [\"pill\", \"segmented\"], orientation: \"horizontal\", size: \"lg\", class: \"h-10 p-1\" },\n ],\n defaultVariants: { variant: \"pill\", orientation: \"horizontal\", size: \"md\" },\n});\n\n/** Row (or column) of tab triggers; renders the sliding indicator for the `segmented` variant. */\nfunction TabsList({\n className,\n children,\n tabPrefix,\n tabSuffix,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.List> & {\n tabPrefix?: React.ReactNode;\n tabSuffix?: React.ReactNode;\n}) {\n const { variant, size, orientation } = React.useContext(TabsContext);\n const isSegmented = variant === \"segmented\";\n const listRef = React.useRef<HTMLDivElement>(null);\n const scrollContainerRef = React.useRef<HTMLDivElement>(null);\n const [indicator, setIndicator] = React.useState<{\n left: number;\n top: number;\n width: number;\n height: number;\n } | null>(null);\n const [scrollAffordance, setScrollAffordance] = React.useState({\n hasOverflow: false,\n canScrollLeft: false,\n canScrollRight: false,\n });\n\n const revealTrigger = React.useCallback(\n (trigger: HTMLElement | null) => {\n if (!trigger || orientation !== \"horizontal\") return;\n trigger.scrollIntoView({ block: \"nearest\", inline: \"nearest\" });\n },\n [orientation],\n );\n\n React.useEffect(() => {\n if (orientation !== \"horizontal\") return;\n const list = listRef.current;\n if (!list) return;\n\n const revealActive = () => {\n const active = list.querySelector<HTMLElement>(\n '[data-slot=\"tabs-trigger\"][data-state=\"active\"]',\n );\n revealTrigger(active);\n };\n\n const onFocusIn = (event: FocusEvent) => {\n const target = event.target;\n if (!(target instanceof HTMLElement)) return;\n if (!target.matches('[data-slot=\"tabs-trigger\"]')) return;\n revealTrigger(target);\n };\n\n revealActive();\n list.addEventListener(\"focusin\", onFocusIn);\n\n const mutation = new MutationObserver(revealActive);\n mutation.observe(list, { attributes: true, attributeFilter: [\"data-state\"], subtree: true });\n\n return () => {\n list.removeEventListener(\"focusin\", onFocusIn);\n mutation.disconnect();\n };\n }, [orientation, revealTrigger]);\n\n // Layout effect (not a plain effect) so the very first paint already\n // reflects real overflow — a plain effect fires after paint, so the\n // arrows would mount hidden for one frame and then pop in, which is both\n // a visible flash and a race automated screenshot tools can catch mid-flight.\n React.useLayoutEffect(() => {\n if (orientation !== \"horizontal\") {\n setScrollAffordance({ hasOverflow: false, canScrollLeft: false, canScrollRight: false });\n return;\n }\n\n const container = scrollContainerRef.current;\n const list = listRef.current;\n if (!container || !list) return;\n\n const update = () => {\n const hasOverflow = container.scrollWidth - container.clientWidth > 1;\n // Measured from rendered position rather than `scrollLeft` — `scrollLeft`'s\n // zero point and sign flip in RTL, so a direct comparison would mislabel\n // which edge is scrollable. Comparing rects stays correct in both directions.\n const containerRect = container.getBoundingClientRect();\n const listRect = list.getBoundingClientRect();\n setScrollAffordance({\n hasOverflow,\n canScrollLeft: hasOverflow && listRect.left < containerRect.left - 1,\n canScrollRight: hasOverflow && listRect.right > containerRect.right + 1,\n });\n };\n\n update();\n // `list`'s size reacts to content changes (tabs added/removed, prefix/suffix\n // toggled), so observing it also covers those cases without depending on\n // `children`/`tabPrefix`/`tabSuffix` directly.\n const resize = new ResizeObserver(update);\n resize.observe(container);\n resize.observe(list);\n container.addEventListener(\"scroll\", update, { passive: true });\n\n // Web fonts can still be swapping in when this first `update()` runs, so\n // it may measure with fallback-font (narrower) text metrics and miss real\n // overflow. `list`'s width changes once the real font lands, which the\n // ResizeObserver above will also catch — this just makes the correction\n // immediate instead of waiting on that indirect signal.\n document.fonts?.ready.then(update);\n\n return () => {\n resize.disconnect();\n container.removeEventListener(\"scroll\", update);\n };\n }, [orientation]);\n\n React.useEffect(() => {\n if (!isSegmented) return;\n const list = listRef.current;\n if (!list) return;\n const update = () => {\n const active = list.querySelector<HTMLElement>(\n '[data-slot=\"tabs-trigger\"][data-state=\"active\"]',\n );\n if (!active) {\n setIndicator(null);\n return;\n }\n setIndicator({\n left: active.offsetLeft,\n top: active.offsetTop,\n width: active.offsetWidth,\n height: active.offsetHeight,\n });\n };\n update();\n const mutation = new MutationObserver(update);\n mutation.observe(list, { attributes: true, attributeFilter: [\"data-state\"], subtree: true });\n const resize = new ResizeObserver(update);\n resize.observe(list);\n return () => {\n mutation.disconnect();\n resize.disconnect();\n };\n }, [isSegmented]);\n\n const scrollLeft = React.useCallback(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n // Scroll by 80% of visible width for smooth navigation\n const scrollAmount = container.clientWidth * 0.8;\n container.scrollBy({ left: -scrollAmount, behavior: \"smooth\" });\n }, []);\n\n const scrollRight = React.useCallback(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n // Scroll by 80% of visible width for smooth navigation\n const scrollAmount = container.clientWidth * 0.8;\n container.scrollBy({ left: scrollAmount, behavior: \"smooth\" });\n }, []);\n\n // TabsList's own styling only ever needs the \"reduced\" (gap-only, no\n // bg/padding/rounding) look for horizontal orientation now — the track\n // background/padding lives on the always-mounted wrapper below instead, so\n // `tabPrefix`/`tabSuffix` (rendered as wrapper children, not list children)\n // sit on the same surface as the tabs whether or not there's overflow.\n // `h-full` fills the scroll container's height (itself stretched to the\n // wrapper's content box, see the wrapper below), giving TabsList a definite\n // height again — triggers size themselves via `h-[calc(100%-1px)]`, which\n // resolves to `auto` (collapsing to their own content height, shorter than\n // the track) against an indefinite parent height.\n const getListClassName = () => {\n if (orientation === \"horizontal\") {\n return cn(\n \"relative inline-flex h-full items-center text-muted-txt\",\n variant === \"line\" && \"gap-1 bg-transparent\",\n variant === \"pill\" && \"gap-0.5\",\n variant === \"segmented\" && \"gap-0.5\",\n variant === \"fancy\" && \"items-stretch gap-1 bg-transparent\",\n \"w-max min-w-full\",\n className,\n );\n }\n return cn(tabsListVariants({ variant, size, orientation }), className);\n };\n\n // `tabPrefix`/`tabSuffix` only render inline in the (non-scrolling)\n // vertical list; for horizontal they're rendered as fixed wrapper children\n // outside the scroll container below, so they never scroll with the tabs.\n const list = (\n <TabsPrimitive.List\n ref={listRef}\n data-slot=\"tabs-list\"\n className={getListClassName()}\n {...props}\n >\n {orientation !== \"horizontal\" && tabPrefix}\n {isSegmented && indicator && (\n <span\n data-slot=\"tabs-indicator\"\n aria-hidden\n className=\"absolute z-0 rounded-8 bg-primary-bg shadow-sm transition-all duration-200 ease-out motion-reduce:transition-none\"\n style={\n orientation === \"vertical\"\n ? { top: indicator.top, height: indicator.height, left: 4, right: 4 }\n : { left: indicator.left, width: indicator.width, top: 4, bottom: 4 }\n }\n />\n )}\n {children}\n {orientation !== \"horizontal\" && tabSuffix}\n </TabsPrimitive.List>\n );\n\n if (orientation === \"vertical\") {\n return list;\n }\n\n const { hasOverflow } = scrollAffordance;\n\n // Arrows and the scroll container are always mounted (never conditionally\n // swapped) so `scrollContainerRef`/`listRef` stay attached to the same DOM\n // nodes across overflow toggles — the ResizeObserver/MutationObserver\n // effects below only run once per `orientation` and would otherwise end up\n // watching detached elements after a remount. Arrows collapse to 0 width\n // instead of unmounting when there's no overflow. Track background/padding\n // is unconditional (not gated on `hasOverflow`) since it now lives here\n // rather than on TabsList, so `tabPrefix`/`tabSuffix` share the same\n // surface as the tabs regardless of overflow state.\n return (\n <div\n className={cn(\n \"flex w-full items-stretch\",\n variant === \"pill\" && \"rounded-10 bg-muted-bg p-0.75\",\n variant === \"segmented\" && \"rounded-12 bg-muted-bg p-1\",\n variant === \"pill\" && size === \"sm\" && \"h-6 p-0.5\",\n variant === \"pill\" && size === \"md\" && \"h-8.75\",\n variant === \"pill\" && size === \"lg\" && \"h-10 p-1\",\n variant === \"segmented\" && size === \"sm\" && \"h-6 p-0.5\",\n variant === \"segmented\" && size === \"md\" && \"h-8.75\",\n variant === \"segmented\" && size === \"lg\" && \"h-10 p-1\",\n )}\n data-slot=\"tabs-wrapper\"\n >\n {/* Fixed prefix — sits outside the scroll container, never scrolls */}\n {tabPrefix && (\n <div data-slot=\"tabs-prefix\" className=\"flex shrink-0 items-center px-1\">\n {tabPrefix}\n </div>\n )}\n\n {/* Left scroll arrow - collapses to 0 width when there's no overflow */}\n <button\n type=\"button\"\n onClick={scrollLeft}\n disabled={!scrollAffordance.canScrollLeft}\n aria-label=\"Scroll tabs left\"\n tabIndex={hasOverflow ? 0 : -1}\n className={cn(\n \"flex shrink-0 items-center justify-center overflow-hidden transition-all\",\n // Width\n hasOverflow ? \"w-8\" : \"w-0\",\n // Divider for pill/segmented variants\n hasOverflow &&\n (variant === \"pill\" || variant === \"segmented\") &&\n \"mr-0.5 border-r border-border/30\",\n // Disabled state\n \"disabled:cursor-not-allowed disabled:opacity-40\",\n // Hover state (only when enabled)\n \"enabled:hover:opacity-70 enabled:active:scale-95\",\n // Focus state\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-focus focus-visible:ring-inset\",\n )}\n >\n <Icon icon=\"chevron-left\" className=\"size-4 shrink-0 text-muted-txt\" />\n </button>\n\n {/* Scrollable container - flex-1 to fill space between arrows */}\n <div\n ref={scrollContainerRef}\n data-slot=\"tabs-scroll-container\"\n className={cn(\n \"min-w-0 flex-1 touch-pan-x overflow-x-auto overscroll-x-contain [-webkit-overflow-scrolling:touch]\",\n // Hide scrollbar\n \"[&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]\",\n variant === \"line\" && \"pb-1.5\",\n )}\n >\n {list}\n </div>\n\n {/* Right scroll arrow - collapses to 0 width when there's no overflow */}\n <button\n type=\"button\"\n onClick={scrollRight}\n disabled={!scrollAffordance.canScrollRight}\n aria-label=\"Scroll tabs right\"\n tabIndex={hasOverflow ? 0 : -1}\n className={cn(\n \"flex shrink-0 items-center justify-center overflow-hidden transition-all\",\n // Width\n hasOverflow ? \"w-8\" : \"w-0\",\n // Divider for pill/segmented variants\n hasOverflow &&\n (variant === \"pill\" || variant === \"segmented\") &&\n \"ml-0.5 border-l border-border/30\",\n // Disabled state\n \"disabled:cursor-not-allowed disabled:opacity-40\",\n // Hover state (only when enabled)\n \"enabled:hover:opacity-70 enabled:active:scale-95\",\n // Focus state\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-focus focus-visible:ring-inset\",\n )}\n >\n <Icon icon=\"chevron-right\" className=\"size-4 shrink-0 text-muted-txt\" />\n </button>\n\n {/* Fixed suffix — sits outside the scroll container, never scrolls */}\n {tabSuffix && (\n <div data-slot=\"tabs-suffix\" className=\"flex shrink-0 items-center px-1\">\n {tabSuffix}\n </div>\n )}\n </div>\n );\n}\n\nconst tabsTriggerVariants = cva(\n \"relative inline-flex items-center justify-center gap-1.5 font-medium whitespace-nowrap text-primary-txt outline-none transition-all focus-visible:ring-3 focus-visible:ring-focus disabled:pointer-events-none disabled:opacity-50 data-[state=active]:text-primary-txt [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n line: \"h-[calc(100%-1px)] flex-1 rounded-none\",\n pill: \"h-[calc(100%-1px)] flex-1 rounded-10 border border-transparent data-[state=active]:bg-primary-bg data-[state=active]:shadow-sm\",\n segmented: \"z-[1] h-[calc(100%-1px)] flex-1 rounded-8\",\n // Fancy (Figma Components file, node 1:6831): default = glass-60→glass-20\n // vertical gradient card; hover = solid glass-none; selected = 4px taller,\n // flat-bottomed, glass-none→glass-40 (72.6% stop), semibold, with concave\n // 16px corner curves where it meets the panel.\n fancy: cn(\n \"mb-1 flex-1 justify-between rounded-16 font-normal backdrop-blur-glass\",\n \"bg-gradient-to-b from-glass-60-bg from-[3.4%] to-glass-20-bg\",\n \"data-[state=inactive]:hover:bg-none data-[state=inactive]:hover:bg-glass-none-bg\",\n \"data-[state=active]:mb-0 data-[state=active]:rounded-b-none data-[state=active]:from-glass-none-bg data-[state=active]:to-glass-40-bg data-[state=active]:to-[72.6%] data-[state=active]:font-semibold\",\n \"data-[state=active]:before:absolute data-[state=active]:before:-left-4 data-[state=active]:before:bottom-0 data-[state=active]:before:size-4 data-[state=active]:before:bg-[radial-gradient(circle_at_top_left,transparent_15.5px,var(--glass-40-bg)_16px)]\",\n \"data-[state=active]:after:absolute data-[state=active]:after:-right-4 data-[state=active]:after:bottom-0 data-[state=active]:after:size-4 data-[state=active]:after:bg-[radial-gradient(circle_at_top_right,transparent_15.5px,var(--glass-40-bg)_16px)]\",\n // The curves flow into NEIGHBOURING tabs only — never past the group edge.\n \"first:before:hidden last:after:hidden\",\n ),\n },\n orientation: { horizontal: \"\", vertical: \"w-full justify-start\" },\n size: { sm: \"\", md: \"\", lg: \"\" },\n },\n compoundVariants: [\n // Padding + text size for the track variants.\n {\n variant: [\"line\", \"pill\", \"segmented\"],\n size: \"sm\",\n class: \"px-2 py-0.5 text-xs leading-4\",\n },\n { variant: [\"line\", \"pill\", \"segmented\"], size: \"md\", class: \"px-2 py-1 text-sm leading-5\" },\n {\n variant: [\"line\", \"pill\", \"segmented\"],\n size: \"lg\",\n class: \"px-2 py-1.5 text-sm leading-5\",\n },\n // Fancy footprint scales with size; the active tab adds bottom padding so it\n // merges into the panel while inactive tabs stay shorter (gap above content).\n { variant: \"fancy\", size: \"sm\", class: \"px-4 py-2 text-sm\" },\n { variant: \"fancy\", size: \"md\", class: \"px-6 py-3 text-sm\" },\n { variant: \"fancy\", size: \"lg\", class: \"px-6 py-4 text-base\" },\n // Underline position for the line variant (per orientation).\n {\n variant: \"line\",\n orientation: \"horizontal\",\n class:\n \"after:absolute after:inset-x-0 after:bottom-[-5px] after:h-0.5 after:bg-primary-txt after:opacity-0 after:transition-opacity data-[state=active]:after:opacity-100\",\n },\n {\n variant: \"line\",\n orientation: \"vertical\",\n class:\n \"after:absolute after:inset-y-0 after:right-[-5px] after:w-0.5 after:bg-primary-txt after:opacity-0 after:transition-opacity data-[state=active]:after:opacity-100\",\n },\n ],\n defaultVariants: { variant: \"pill\", orientation: \"horizontal\", size: \"md\" },\n },\n);\n\n/** Clickable tab button; its `value` selects the matching `TabsContent` panel. */\nfunction TabsTrigger({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n const { variant, size, orientation } = React.useContext(TabsContext);\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(tabsTriggerVariants({ variant, size, orientation }), className)}\n {...props}\n />\n );\n}\n\n/** Panel shown when its `value` matches the active tab; styled as a glass panel for the `fancy` variant. */\nfunction TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>) {\n const { variant } = React.useContext(TabsContext);\n return (\n <TabsPrimitive.Content\n data-slot=\"tabs-content\"\n className={cn(\n \"flex-1 outline-none\",\n // Fancy: a glass panel the active tab merges into (flat top, matching tint).\n variant === \"fancy\" &&\n \"flex-none rounded-16 rounded-t-none bg-glass-40-bg p-5 backdrop-blur-glass\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Trailing count badge for a tab trigger; goes dark on the `fancy` variant to match its cards. */\nfunction TabsCounter({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"tabs-counter\"\n className={cn(\n \"ml-1 inline-flex h-4 min-w-4 items-center justify-center rounded-full bg-muted-bg px-1 text-xs font-medium text-muted-txt\",\n \"group-data-[variant=fancy]/tabs:h-5 group-data-[variant=fancy]/tabs:min-w-5 group-data-[variant=fancy]/tabs:bg-primary-invert-bg group-data-[variant=fancy]/tabs:px-2 group-data-[variant=fancy]/tabs:leading-4 group-data-[variant=fancy]/tabs:font-semibold group-data-[variant=fancy]/tabs:text-primary-invert-txt\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n TabsCounter,\n tabsListVariants,\n tabsTriggerVariants,\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { a as TabsTrigger, i as TabsList, n as TabsContent, o as tabsListVariants, r as TabsCounter, s as tabsTriggerVariants, t as Tabs } from "../../index64.cjs";
1
+ import { a as TabsTrigger, i as TabsList, n as TabsContent, o as tabsListVariants, r as TabsCounter, s as tabsTriggerVariants, t as Tabs } from "../../index65.cjs";
2
2
  export { Tabs, TabsContent, TabsCounter, TabsList, TabsTrigger, tabsListVariants, tabsTriggerVariants };
@@ -1,2 +1,2 @@
1
- import { a as TabsTrigger, i as TabsList, n as TabsContent, o as tabsListVariants, r as TabsCounter, s as tabsTriggerVariants, t as Tabs } from "../../index64.js";
1
+ import { a as TabsTrigger, i as TabsList, n as TabsContent, o as tabsListVariants, r as TabsCounter, s as tabsTriggerVariants, t as Tabs } from "../../index65.js";
2
2
  export { Tabs, TabsContent, TabsCounter, TabsList, TabsTrigger, tabsListVariants, tabsTriggerVariants };
@@ -1,4 +1,5 @@
1
1
  import { t as cn } from "../../cn.js";
2
+ import { t as Icon } from "../../Icon.js";
2
3
  import { cva } from "class-variance-authority";
3
4
  import * as React from "react";
4
5
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -42,11 +43,11 @@ const tabsListVariants = cva("relative inline-flex items-center text-muted-txt",
42
43
  line: "gap-1 bg-transparent",
43
44
  pill: "justify-center rounded-10 bg-muted-bg p-0.75",
44
45
  segmented: "justify-center rounded-12 bg-muted-bg p-1",
45
- fancy: "w-full items-stretch gap-1 bg-transparent"
46
+ fancy: "items-stretch gap-1 bg-transparent"
46
47
  },
47
48
  orientation: {
48
- horizontal: "",
49
- vertical: "h-fit flex-col"
49
+ horizontal: "w-max min-w-full",
50
+ vertical: "h-fit w-full flex-col"
50
51
  },
51
52
  size: {
52
53
  sm: "",
@@ -85,7 +86,79 @@ function TabsList({ className, children, tabPrefix, tabSuffix, ...props }) {
85
86
  const { variant, size, orientation } = React.useContext(TabsContext);
86
87
  const isSegmented = variant === "segmented";
87
88
  const listRef = React.useRef(null);
89
+ const scrollContainerRef = React.useRef(null);
88
90
  const [indicator, setIndicator] = React.useState(null);
91
+ const [scrollAffordance, setScrollAffordance] = React.useState({
92
+ hasOverflow: false,
93
+ canScrollLeft: false,
94
+ canScrollRight: false
95
+ });
96
+ const revealTrigger = React.useCallback((trigger) => {
97
+ if (!trigger || orientation !== "horizontal") return;
98
+ trigger.scrollIntoView({
99
+ block: "nearest",
100
+ inline: "nearest"
101
+ });
102
+ }, [orientation]);
103
+ React.useEffect(() => {
104
+ if (orientation !== "horizontal") return;
105
+ const list = listRef.current;
106
+ if (!list) return;
107
+ const revealActive = () => {
108
+ revealTrigger(list.querySelector("[data-slot=\"tabs-trigger\"][data-state=\"active\"]"));
109
+ };
110
+ const onFocusIn = (event) => {
111
+ const target = event.target;
112
+ if (!(target instanceof HTMLElement)) return;
113
+ if (!target.matches("[data-slot=\"tabs-trigger\"]")) return;
114
+ revealTrigger(target);
115
+ };
116
+ revealActive();
117
+ list.addEventListener("focusin", onFocusIn);
118
+ const mutation = new MutationObserver(revealActive);
119
+ mutation.observe(list, {
120
+ attributes: true,
121
+ attributeFilter: ["data-state"],
122
+ subtree: true
123
+ });
124
+ return () => {
125
+ list.removeEventListener("focusin", onFocusIn);
126
+ mutation.disconnect();
127
+ };
128
+ }, [orientation, revealTrigger]);
129
+ React.useLayoutEffect(() => {
130
+ if (orientation !== "horizontal") {
131
+ setScrollAffordance({
132
+ hasOverflow: false,
133
+ canScrollLeft: false,
134
+ canScrollRight: false
135
+ });
136
+ return;
137
+ }
138
+ const container = scrollContainerRef.current;
139
+ const list = listRef.current;
140
+ if (!container || !list) return;
141
+ const update = () => {
142
+ const hasOverflow = container.scrollWidth - container.clientWidth > 1;
143
+ const containerRect = container.getBoundingClientRect();
144
+ const listRect = list.getBoundingClientRect();
145
+ setScrollAffordance({
146
+ hasOverflow,
147
+ canScrollLeft: hasOverflow && listRect.left < containerRect.left - 1,
148
+ canScrollRight: hasOverflow && listRect.right > containerRect.right + 1
149
+ });
150
+ };
151
+ update();
152
+ const resize = new ResizeObserver(update);
153
+ resize.observe(container);
154
+ resize.observe(list);
155
+ container.addEventListener("scroll", update, { passive: true });
156
+ document.fonts?.ready.then(update);
157
+ return () => {
158
+ resize.disconnect();
159
+ container.removeEventListener("scroll", update);
160
+ };
161
+ }, [orientation]);
89
162
  React.useEffect(() => {
90
163
  if (!isSegmented) return;
91
164
  const list = listRef.current;
@@ -117,17 +190,39 @@ function TabsList({ className, children, tabPrefix, tabSuffix, ...props }) {
117
190
  resize.disconnect();
118
191
  };
119
192
  }, [isSegmented]);
120
- return /* @__PURE__ */ jsxs(Tabs$1.List, {
121
- ref: listRef,
122
- "data-slot": "tabs-list",
123
- className: cn(tabsListVariants({
193
+ const scrollLeft = React.useCallback(() => {
194
+ const container = scrollContainerRef.current;
195
+ if (!container) return;
196
+ const scrollAmount = container.clientWidth * .8;
197
+ container.scrollBy({
198
+ left: -scrollAmount,
199
+ behavior: "smooth"
200
+ });
201
+ }, []);
202
+ const scrollRight = React.useCallback(() => {
203
+ const container = scrollContainerRef.current;
204
+ if (!container) return;
205
+ const scrollAmount = container.clientWidth * .8;
206
+ container.scrollBy({
207
+ left: scrollAmount,
208
+ behavior: "smooth"
209
+ });
210
+ }, []);
211
+ const getListClassName = () => {
212
+ if (orientation === "horizontal") return cn("relative inline-flex h-full items-center text-muted-txt", variant === "line" && "gap-1 bg-transparent", variant === "pill" && "gap-0.5", variant === "segmented" && "gap-0.5", variant === "fancy" && "items-stretch gap-1 bg-transparent", "w-max min-w-full", className);
213
+ return cn(tabsListVariants({
124
214
  variant,
125
215
  size,
126
216
  orientation
127
- }), className),
217
+ }), className);
218
+ };
219
+ const list = /* @__PURE__ */ jsxs(Tabs$1.List, {
220
+ ref: listRef,
221
+ "data-slot": "tabs-list",
222
+ className: getListClassName(),
128
223
  ...props,
129
224
  children: [
130
- tabPrefix,
225
+ orientation !== "horizontal" && tabPrefix,
131
226
  isSegmented && indicator && /* @__PURE__ */ jsx("span", {
132
227
  "data-slot": "tabs-indicator",
133
228
  "aria-hidden": true,
@@ -145,7 +240,55 @@ function TabsList({ className, children, tabPrefix, tabSuffix, ...props }) {
145
240
  }
146
241
  }),
147
242
  children,
148
- tabSuffix
243
+ orientation !== "horizontal" && tabSuffix
244
+ ]
245
+ });
246
+ if (orientation === "vertical") return list;
247
+ const { hasOverflow } = scrollAffordance;
248
+ return /* @__PURE__ */ jsxs("div", {
249
+ className: cn("flex w-full items-stretch", variant === "pill" && "rounded-10 bg-muted-bg p-0.75", variant === "segmented" && "rounded-12 bg-muted-bg p-1", variant === "pill" && size === "sm" && "h-6 p-0.5", variant === "pill" && size === "md" && "h-8.75", variant === "pill" && size === "lg" && "h-10 p-1", variant === "segmented" && size === "sm" && "h-6 p-0.5", variant === "segmented" && size === "md" && "h-8.75", variant === "segmented" && size === "lg" && "h-10 p-1"),
250
+ "data-slot": "tabs-wrapper",
251
+ children: [
252
+ tabPrefix && /* @__PURE__ */ jsx("div", {
253
+ "data-slot": "tabs-prefix",
254
+ className: "flex shrink-0 items-center px-1",
255
+ children: tabPrefix
256
+ }),
257
+ /* @__PURE__ */ jsx("button", {
258
+ type: "button",
259
+ onClick: scrollLeft,
260
+ disabled: !scrollAffordance.canScrollLeft,
261
+ "aria-label": "Scroll tabs left",
262
+ tabIndex: hasOverflow ? 0 : -1,
263
+ className: cn("flex shrink-0 items-center justify-center overflow-hidden transition-all", hasOverflow ? "w-8" : "w-0", hasOverflow && (variant === "pill" || variant === "segmented") && "mr-0.5 border-r border-border/30", "disabled:cursor-not-allowed disabled:opacity-40", "enabled:hover:opacity-70 enabled:active:scale-95", "focus:outline-none focus-visible:ring-2 focus-visible:ring-focus focus-visible:ring-inset"),
264
+ children: /* @__PURE__ */ jsx(Icon, {
265
+ icon: "chevron-left",
266
+ className: "size-4 shrink-0 text-muted-txt"
267
+ })
268
+ }),
269
+ /* @__PURE__ */ jsx("div", {
270
+ ref: scrollContainerRef,
271
+ "data-slot": "tabs-scroll-container",
272
+ className: cn("min-w-0 flex-1 touch-pan-x overflow-x-auto overscroll-x-contain [-webkit-overflow-scrolling:touch]", "[&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]", variant === "line" && "pb-1.5"),
273
+ children: list
274
+ }),
275
+ /* @__PURE__ */ jsx("button", {
276
+ type: "button",
277
+ onClick: scrollRight,
278
+ disabled: !scrollAffordance.canScrollRight,
279
+ "aria-label": "Scroll tabs right",
280
+ tabIndex: hasOverflow ? 0 : -1,
281
+ className: cn("flex shrink-0 items-center justify-center overflow-hidden transition-all", hasOverflow ? "w-8" : "w-0", hasOverflow && (variant === "pill" || variant === "segmented") && "ml-0.5 border-l border-border/30", "disabled:cursor-not-allowed disabled:opacity-40", "enabled:hover:opacity-70 enabled:active:scale-95", "focus:outline-none focus-visible:ring-2 focus-visible:ring-focus focus-visible:ring-inset"),
282
+ children: /* @__PURE__ */ jsx(Icon, {
283
+ icon: "chevron-right",
284
+ className: "size-4 shrink-0 text-muted-txt"
285
+ })
286
+ }),
287
+ tabSuffix && /* @__PURE__ */ jsx("div", {
288
+ "data-slot": "tabs-suffix",
289
+ className: "flex shrink-0 items-center px-1",
290
+ children: tabSuffix
291
+ })
149
292
  ]
150
293
  });
151
294
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["TabsPrimitive"],"sources":["../../../src/primitives/Tabs/Tabs.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport { Tabs as TabsPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\n// Tabs — built on Radix Tabs (content panels + roving-focus keyboard nav + a11y).\n// One component, four visual `variant`s, each supporting horizontal/vertical\n// `orientation`:\n// - \"line\": underline under the active tab.\n// - \"pill\" (default): a muted track; the active tab is an elevated pill.\n// - \"segmented\": a muted track with a single sliding indicator that animates\n// between tabs.\n// - \"fancy\": translucent glass card tabs; the active tab merges into the glass\n// content panel below (login-style). `size` controls the fancy vertical padding.\n// `variant`/`size`/`orientation` are set on the root and shared via context.\n\ntype TabsVariant = \"line\" | \"pill\" | \"segmented\" | \"fancy\";\ntype TabsSize = \"sm\" | \"md\" | \"lg\";\ntype TabsOrientation = \"horizontal\" | \"vertical\";\n\nconst TabsContext = React.createContext<{\n variant: TabsVariant;\n size: TabsSize;\n orientation: TabsOrientation;\n}>({ variant: \"pill\", size: \"md\", orientation: \"horizontal\" });\n\n/**\n * Tabbed interface root: holds the active value and shares `variant`/`size`/\n * `orientation` with its `TabsList`/`TabsTrigger`/`TabsContent` via context.\n */\nfunction Tabs({\n className,\n variant = \"pill\",\n size = \"md\",\n orientation = \"horizontal\",\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root> & {\n /** Visual style of the tabs: underline, pill track, sliding segmented, or glass cards. */\n variant?: TabsVariant;\n /** Control density — drives padding and text size of the triggers. */\n size?: TabsSize;\n}) {\n const resolvedOrientation: TabsOrientation =\n orientation === \"vertical\" ? \"vertical\" : \"horizontal\";\n const ctx = React.useMemo(\n () => ({ variant, size, orientation: resolvedOrientation }),\n [variant, size, resolvedOrientation],\n );\n return (\n <TabsContext.Provider value={ctx}>\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-variant={variant}\n data-orientation={resolvedOrientation}\n orientation={resolvedOrientation}\n className={cn(\n \"group/tabs flex data-[orientation=horizontal]:flex-col\",\n variant === \"fancy\" ? \"gap-0\" : \"gap-2\",\n className,\n )}\n {...props}\n />\n </TabsContext.Provider>\n );\n}\n\nconst tabsListVariants = cva(\"relative inline-flex items-center text-muted-txt\", {\n variants: {\n variant: {\n line: \"gap-1 bg-transparent\",\n pill: \"justify-center rounded-10 bg-muted-bg p-0.75\",\n segmented: \"justify-center rounded-12 bg-muted-bg p-1\",\n fancy: \"w-full items-stretch gap-1 bg-transparent\",\n },\n orientation: {\n horizontal: \"\",\n vertical: \"h-fit flex-col\",\n },\n size: { sm: \"\", md: \"\", lg: \"\" },\n },\n compoundVariants: [\n // Track height for the horizontal pill/segmented variants.\n { variant: [\"pill\", \"segmented\"], orientation: \"horizontal\", size: \"sm\", class: \"h-6 p-0.5\" },\n { variant: [\"pill\", \"segmented\"], orientation: \"horizontal\", size: \"md\", class: \"h-8.75\" },\n { variant: [\"pill\", \"segmented\"], orientation: \"horizontal\", size: \"lg\", class: \"h-10 p-1\" },\n ],\n defaultVariants: { variant: \"pill\", orientation: \"horizontal\", size: \"md\" },\n});\n\n/** Row (or column) of tab triggers; renders the sliding indicator for the `segmented` variant. */\nfunction TabsList({\n className,\n children,\n tabPrefix,\n tabSuffix,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.List> & {\n tabPrefix?: React.ReactNode;\n tabSuffix?: React.ReactNode;\n}) {\n const { variant, size, orientation } = React.useContext(TabsContext);\n const isSegmented = variant === \"segmented\";\n const listRef = React.useRef<HTMLDivElement>(null);\n const [indicator, setIndicator] = React.useState<{\n left: number;\n top: number;\n width: number;\n height: number;\n } | null>(null);\n\n React.useEffect(() => {\n if (!isSegmented) return;\n const list = listRef.current;\n if (!list) return;\n const update = () => {\n const active = list.querySelector<HTMLElement>(\n '[data-slot=\"tabs-trigger\"][data-state=\"active\"]',\n );\n if (!active) {\n setIndicator(null);\n return;\n }\n setIndicator({\n left: active.offsetLeft,\n top: active.offsetTop,\n width: active.offsetWidth,\n height: active.offsetHeight,\n });\n };\n update();\n const mutation = new MutationObserver(update);\n mutation.observe(list, { attributes: true, attributeFilter: [\"data-state\"], subtree: true });\n const resize = new ResizeObserver(update);\n resize.observe(list);\n return () => {\n mutation.disconnect();\n resize.disconnect();\n };\n }, [isSegmented]);\n\n return (\n <TabsPrimitive.List\n ref={listRef}\n data-slot=\"tabs-list\"\n className={cn(tabsListVariants({ variant, size, orientation }), className)}\n {...props}\n >\n {tabPrefix}\n {isSegmented && indicator && (\n <span\n data-slot=\"tabs-indicator\"\n aria-hidden\n className=\"absolute z-0 rounded-8 bg-primary-bg shadow-sm transition-all duration-200 ease-out motion-reduce:transition-none\"\n style={\n orientation === \"vertical\"\n ? { top: indicator.top, height: indicator.height, left: 4, right: 4 }\n : { left: indicator.left, width: indicator.width, top: 4, bottom: 4 }\n }\n />\n )}\n {children}\n {tabSuffix}\n </TabsPrimitive.List>\n );\n}\n\nconst tabsTriggerVariants = cva(\n \"relative inline-flex items-center justify-center gap-1.5 font-medium whitespace-nowrap text-primary-txt outline-none transition-all focus-visible:ring-3 focus-visible:ring-focus disabled:pointer-events-none disabled:opacity-50 data-[state=active]:text-primary-txt [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n line: \"h-[calc(100%-1px)] flex-1 rounded-none\",\n pill: \"h-[calc(100%-1px)] flex-1 rounded-10 border border-transparent data-[state=active]:bg-primary-bg data-[state=active]:shadow-sm\",\n segmented: \"z-[1] h-[calc(100%-1px)] flex-1 rounded-8\",\n // Fancy (Figma Components file, node 1:6831): default = glass-60→glass-20\n // vertical gradient card; hover = solid glass-none; selected = 4px taller,\n // flat-bottomed, glass-none→glass-40 (72.6% stop), semibold, with concave\n // 16px corner curves where it meets the panel.\n fancy: cn(\n \"mb-1 flex-1 justify-between rounded-16 font-normal backdrop-blur-glass\",\n \"bg-gradient-to-b from-glass-60-bg from-[3.4%] to-glass-20-bg\",\n \"data-[state=inactive]:hover:bg-none data-[state=inactive]:hover:bg-glass-none-bg\",\n \"data-[state=active]:mb-0 data-[state=active]:rounded-b-none data-[state=active]:from-glass-none-bg data-[state=active]:to-glass-40-bg data-[state=active]:to-[72.6%] data-[state=active]:font-semibold\",\n \"data-[state=active]:before:absolute data-[state=active]:before:-left-4 data-[state=active]:before:bottom-0 data-[state=active]:before:size-4 data-[state=active]:before:bg-[radial-gradient(circle_at_top_left,transparent_15.5px,var(--glass-40-bg)_16px)]\",\n \"data-[state=active]:after:absolute data-[state=active]:after:-right-4 data-[state=active]:after:bottom-0 data-[state=active]:after:size-4 data-[state=active]:after:bg-[radial-gradient(circle_at_top_right,transparent_15.5px,var(--glass-40-bg)_16px)]\",\n // The curves flow into NEIGHBOURING tabs only — never past the group edge.\n \"first:before:hidden last:after:hidden\",\n ),\n },\n orientation: { horizontal: \"\", vertical: \"w-full justify-start\" },\n size: { sm: \"\", md: \"\", lg: \"\" },\n },\n compoundVariants: [\n // Padding + text size for the track variants.\n {\n variant: [\"line\", \"pill\", \"segmented\"],\n size: \"sm\",\n class: \"px-2 py-0.5 text-xs leading-4\",\n },\n { variant: [\"line\", \"pill\", \"segmented\"], size: \"md\", class: \"px-2 py-1 text-sm leading-5\" },\n {\n variant: [\"line\", \"pill\", \"segmented\"],\n size: \"lg\",\n class: \"px-2 py-1.5 text-sm leading-5\",\n },\n // Fancy footprint scales with size; the active tab adds bottom padding so it\n // merges into the panel while inactive tabs stay shorter (gap above content).\n { variant: \"fancy\", size: \"sm\", class: \"px-4 py-2 text-sm\" },\n { variant: \"fancy\", size: \"md\", class: \"px-6 py-3 text-sm\" },\n { variant: \"fancy\", size: \"lg\", class: \"px-6 py-4 text-base\" },\n // Underline position for the line variant (per orientation).\n {\n variant: \"line\",\n orientation: \"horizontal\",\n class:\n \"after:absolute after:inset-x-0 after:bottom-[-5px] after:h-0.5 after:bg-primary-txt after:opacity-0 after:transition-opacity data-[state=active]:after:opacity-100\",\n },\n {\n variant: \"line\",\n orientation: \"vertical\",\n class:\n \"after:absolute after:inset-y-0 after:right-[-5px] after:w-0.5 after:bg-primary-txt after:opacity-0 after:transition-opacity data-[state=active]:after:opacity-100\",\n },\n ],\n defaultVariants: { variant: \"pill\", orientation: \"horizontal\", size: \"md\" },\n },\n);\n\n/** Clickable tab button; its `value` selects the matching `TabsContent` panel. */\nfunction TabsTrigger({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n const { variant, size, orientation } = React.useContext(TabsContext);\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(tabsTriggerVariants({ variant, size, orientation }), className)}\n {...props}\n />\n );\n}\n\n/** Panel shown when its `value` matches the active tab; styled as a glass panel for the `fancy` variant. */\nfunction TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>) {\n const { variant } = React.useContext(TabsContext);\n return (\n <TabsPrimitive.Content\n data-slot=\"tabs-content\"\n className={cn(\n \"flex-1 outline-none\",\n // Fancy: a glass panel the active tab merges into (flat top, matching tint).\n variant === \"fancy\" &&\n \"flex-none rounded-16 rounded-t-none bg-glass-40-bg p-5 backdrop-blur-glass\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Trailing count badge for a tab trigger; goes dark on the `fancy` variant to match its cards. */\nfunction TabsCounter({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"tabs-counter\"\n className={cn(\n \"ml-1 inline-flex h-4 min-w-4 items-center justify-center rounded-full bg-muted-bg px-1 text-xs font-medium text-muted-txt\",\n \"group-data-[variant=fancy]/tabs:h-5 group-data-[variant=fancy]/tabs:min-w-5 group-data-[variant=fancy]/tabs:bg-primary-invert-bg group-data-[variant=fancy]/tabs:px-2 group-data-[variant=fancy]/tabs:leading-4 group-data-[variant=fancy]/tabs:font-semibold group-data-[variant=fancy]/tabs:text-primary-invert-txt\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n TabsCounter,\n tabsListVariants,\n tabsTriggerVariants,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["TabsPrimitive"],"sources":["../../../src/primitives/Tabs/Tabs.tsx"],"sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport { Tabs as TabsPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils\";\nimport { Icon } from \"../Icon\";\n\n// Tabs — built on Radix Tabs (content panels + roving-focus keyboard nav + a11y).\n// One component, four visual `variant`s, each supporting horizontal/vertical\n// `orientation`:\n// - \"line\": underline under the active tab.\n// - \"pill\" (default): a muted track; the active tab is an elevated pill.\n// - \"segmented\": a muted track with a single sliding indicator that animates\n// between tabs.\n// - \"fancy\": translucent glass card tabs; the active tab merges into the glass\n// content panel below (login-style). `size` controls the fancy vertical padding.\n// `variant`/`size`/`orientation` are set on the root and shared via context.\n\ntype TabsVariant = \"line\" | \"pill\" | \"segmented\" | \"fancy\";\ntype TabsSize = \"sm\" | \"md\" | \"lg\";\ntype TabsOrientation = \"horizontal\" | \"vertical\";\n\nconst TabsContext = React.createContext<{\n variant: TabsVariant;\n size: TabsSize;\n orientation: TabsOrientation;\n}>({ variant: \"pill\", size: \"md\", orientation: \"horizontal\" });\n\n/**\n * Tabbed interface root: holds the active value and shares `variant`/`size`/\n * `orientation` with its `TabsList`/`TabsTrigger`/`TabsContent` via context.\n */\nfunction Tabs({\n className,\n variant = \"pill\",\n size = \"md\",\n orientation = \"horizontal\",\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root> & {\n /** Visual style of the tabs: underline, pill track, sliding segmented, or glass cards. */\n variant?: TabsVariant;\n /** Control density — drives padding and text size of the triggers. */\n size?: TabsSize;\n}) {\n const resolvedOrientation: TabsOrientation =\n orientation === \"vertical\" ? \"vertical\" : \"horizontal\";\n const ctx = React.useMemo(\n () => ({ variant, size, orientation: resolvedOrientation }),\n [variant, size, resolvedOrientation],\n );\n return (\n <TabsContext.Provider value={ctx}>\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-variant={variant}\n data-orientation={resolvedOrientation}\n orientation={resolvedOrientation}\n className={cn(\n \"group/tabs flex data-[orientation=horizontal]:flex-col\",\n variant === \"fancy\" ? \"gap-0\" : \"gap-2\",\n className,\n )}\n {...props}\n />\n </TabsContext.Provider>\n );\n}\n\nconst tabsListVariants = cva(\"relative inline-flex items-center text-muted-txt\", {\n variants: {\n variant: {\n line: \"gap-1 bg-transparent\",\n pill: \"justify-center rounded-10 bg-muted-bg p-0.75\",\n segmented: \"justify-center rounded-12 bg-muted-bg p-1\",\n fancy: \"items-stretch gap-1 bg-transparent\",\n },\n orientation: {\n horizontal: \"w-max min-w-full\",\n vertical: \"h-fit w-full flex-col\",\n },\n size: { sm: \"\", md: \"\", lg: \"\" },\n },\n compoundVariants: [\n // Track height for the horizontal pill/segmented variants.\n { variant: [\"pill\", \"segmented\"], orientation: \"horizontal\", size: \"sm\", class: \"h-6 p-0.5\" },\n { variant: [\"pill\", \"segmented\"], orientation: \"horizontal\", size: \"md\", class: \"h-8.75\" },\n { variant: [\"pill\", \"segmented\"], orientation: \"horizontal\", size: \"lg\", class: \"h-10 p-1\" },\n ],\n defaultVariants: { variant: \"pill\", orientation: \"horizontal\", size: \"md\" },\n});\n\n/** Row (or column) of tab triggers; renders the sliding indicator for the `segmented` variant. */\nfunction TabsList({\n className,\n children,\n tabPrefix,\n tabSuffix,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.List> & {\n tabPrefix?: React.ReactNode;\n tabSuffix?: React.ReactNode;\n}) {\n const { variant, size, orientation } = React.useContext(TabsContext);\n const isSegmented = variant === \"segmented\";\n const listRef = React.useRef<HTMLDivElement>(null);\n const scrollContainerRef = React.useRef<HTMLDivElement>(null);\n const [indicator, setIndicator] = React.useState<{\n left: number;\n top: number;\n width: number;\n height: number;\n } | null>(null);\n const [scrollAffordance, setScrollAffordance] = React.useState({\n hasOverflow: false,\n canScrollLeft: false,\n canScrollRight: false,\n });\n\n const revealTrigger = React.useCallback(\n (trigger: HTMLElement | null) => {\n if (!trigger || orientation !== \"horizontal\") return;\n trigger.scrollIntoView({ block: \"nearest\", inline: \"nearest\" });\n },\n [orientation],\n );\n\n React.useEffect(() => {\n if (orientation !== \"horizontal\") return;\n const list = listRef.current;\n if (!list) return;\n\n const revealActive = () => {\n const active = list.querySelector<HTMLElement>(\n '[data-slot=\"tabs-trigger\"][data-state=\"active\"]',\n );\n revealTrigger(active);\n };\n\n const onFocusIn = (event: FocusEvent) => {\n const target = event.target;\n if (!(target instanceof HTMLElement)) return;\n if (!target.matches('[data-slot=\"tabs-trigger\"]')) return;\n revealTrigger(target);\n };\n\n revealActive();\n list.addEventListener(\"focusin\", onFocusIn);\n\n const mutation = new MutationObserver(revealActive);\n mutation.observe(list, { attributes: true, attributeFilter: [\"data-state\"], subtree: true });\n\n return () => {\n list.removeEventListener(\"focusin\", onFocusIn);\n mutation.disconnect();\n };\n }, [orientation, revealTrigger]);\n\n // Layout effect (not a plain effect) so the very first paint already\n // reflects real overflow — a plain effect fires after paint, so the\n // arrows would mount hidden for one frame and then pop in, which is both\n // a visible flash and a race automated screenshot tools can catch mid-flight.\n React.useLayoutEffect(() => {\n if (orientation !== \"horizontal\") {\n setScrollAffordance({ hasOverflow: false, canScrollLeft: false, canScrollRight: false });\n return;\n }\n\n const container = scrollContainerRef.current;\n const list = listRef.current;\n if (!container || !list) return;\n\n const update = () => {\n const hasOverflow = container.scrollWidth - container.clientWidth > 1;\n // Measured from rendered position rather than `scrollLeft` — `scrollLeft`'s\n // zero point and sign flip in RTL, so a direct comparison would mislabel\n // which edge is scrollable. Comparing rects stays correct in both directions.\n const containerRect = container.getBoundingClientRect();\n const listRect = list.getBoundingClientRect();\n setScrollAffordance({\n hasOverflow,\n canScrollLeft: hasOverflow && listRect.left < containerRect.left - 1,\n canScrollRight: hasOverflow && listRect.right > containerRect.right + 1,\n });\n };\n\n update();\n // `list`'s size reacts to content changes (tabs added/removed, prefix/suffix\n // toggled), so observing it also covers those cases without depending on\n // `children`/`tabPrefix`/`tabSuffix` directly.\n const resize = new ResizeObserver(update);\n resize.observe(container);\n resize.observe(list);\n container.addEventListener(\"scroll\", update, { passive: true });\n\n // Web fonts can still be swapping in when this first `update()` runs, so\n // it may measure with fallback-font (narrower) text metrics and miss real\n // overflow. `list`'s width changes once the real font lands, which the\n // ResizeObserver above will also catch — this just makes the correction\n // immediate instead of waiting on that indirect signal.\n document.fonts?.ready.then(update);\n\n return () => {\n resize.disconnect();\n container.removeEventListener(\"scroll\", update);\n };\n }, [orientation]);\n\n React.useEffect(() => {\n if (!isSegmented) return;\n const list = listRef.current;\n if (!list) return;\n const update = () => {\n const active = list.querySelector<HTMLElement>(\n '[data-slot=\"tabs-trigger\"][data-state=\"active\"]',\n );\n if (!active) {\n setIndicator(null);\n return;\n }\n setIndicator({\n left: active.offsetLeft,\n top: active.offsetTop,\n width: active.offsetWidth,\n height: active.offsetHeight,\n });\n };\n update();\n const mutation = new MutationObserver(update);\n mutation.observe(list, { attributes: true, attributeFilter: [\"data-state\"], subtree: true });\n const resize = new ResizeObserver(update);\n resize.observe(list);\n return () => {\n mutation.disconnect();\n resize.disconnect();\n };\n }, [isSegmented]);\n\n const scrollLeft = React.useCallback(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n // Scroll by 80% of visible width for smooth navigation\n const scrollAmount = container.clientWidth * 0.8;\n container.scrollBy({ left: -scrollAmount, behavior: \"smooth\" });\n }, []);\n\n const scrollRight = React.useCallback(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n // Scroll by 80% of visible width for smooth navigation\n const scrollAmount = container.clientWidth * 0.8;\n container.scrollBy({ left: scrollAmount, behavior: \"smooth\" });\n }, []);\n\n // TabsList's own styling only ever needs the \"reduced\" (gap-only, no\n // bg/padding/rounding) look for horizontal orientation now — the track\n // background/padding lives on the always-mounted wrapper below instead, so\n // `tabPrefix`/`tabSuffix` (rendered as wrapper children, not list children)\n // sit on the same surface as the tabs whether or not there's overflow.\n // `h-full` fills the scroll container's height (itself stretched to the\n // wrapper's content box, see the wrapper below), giving TabsList a definite\n // height again — triggers size themselves via `h-[calc(100%-1px)]`, which\n // resolves to `auto` (collapsing to their own content height, shorter than\n // the track) against an indefinite parent height.\n const getListClassName = () => {\n if (orientation === \"horizontal\") {\n return cn(\n \"relative inline-flex h-full items-center text-muted-txt\",\n variant === \"line\" && \"gap-1 bg-transparent\",\n variant === \"pill\" && \"gap-0.5\",\n variant === \"segmented\" && \"gap-0.5\",\n variant === \"fancy\" && \"items-stretch gap-1 bg-transparent\",\n \"w-max min-w-full\",\n className,\n );\n }\n return cn(tabsListVariants({ variant, size, orientation }), className);\n };\n\n // `tabPrefix`/`tabSuffix` only render inline in the (non-scrolling)\n // vertical list; for horizontal they're rendered as fixed wrapper children\n // outside the scroll container below, so they never scroll with the tabs.\n const list = (\n <TabsPrimitive.List\n ref={listRef}\n data-slot=\"tabs-list\"\n className={getListClassName()}\n {...props}\n >\n {orientation !== \"horizontal\" && tabPrefix}\n {isSegmented && indicator && (\n <span\n data-slot=\"tabs-indicator\"\n aria-hidden\n className=\"absolute z-0 rounded-8 bg-primary-bg shadow-sm transition-all duration-200 ease-out motion-reduce:transition-none\"\n style={\n orientation === \"vertical\"\n ? { top: indicator.top, height: indicator.height, left: 4, right: 4 }\n : { left: indicator.left, width: indicator.width, top: 4, bottom: 4 }\n }\n />\n )}\n {children}\n {orientation !== \"horizontal\" && tabSuffix}\n </TabsPrimitive.List>\n );\n\n if (orientation === \"vertical\") {\n return list;\n }\n\n const { hasOverflow } = scrollAffordance;\n\n // Arrows and the scroll container are always mounted (never conditionally\n // swapped) so `scrollContainerRef`/`listRef` stay attached to the same DOM\n // nodes across overflow toggles — the ResizeObserver/MutationObserver\n // effects below only run once per `orientation` and would otherwise end up\n // watching detached elements after a remount. Arrows collapse to 0 width\n // instead of unmounting when there's no overflow. Track background/padding\n // is unconditional (not gated on `hasOverflow`) since it now lives here\n // rather than on TabsList, so `tabPrefix`/`tabSuffix` share the same\n // surface as the tabs regardless of overflow state.\n return (\n <div\n className={cn(\n \"flex w-full items-stretch\",\n variant === \"pill\" && \"rounded-10 bg-muted-bg p-0.75\",\n variant === \"segmented\" && \"rounded-12 bg-muted-bg p-1\",\n variant === \"pill\" && size === \"sm\" && \"h-6 p-0.5\",\n variant === \"pill\" && size === \"md\" && \"h-8.75\",\n variant === \"pill\" && size === \"lg\" && \"h-10 p-1\",\n variant === \"segmented\" && size === \"sm\" && \"h-6 p-0.5\",\n variant === \"segmented\" && size === \"md\" && \"h-8.75\",\n variant === \"segmented\" && size === \"lg\" && \"h-10 p-1\",\n )}\n data-slot=\"tabs-wrapper\"\n >\n {/* Fixed prefix — sits outside the scroll container, never scrolls */}\n {tabPrefix && (\n <div data-slot=\"tabs-prefix\" className=\"flex shrink-0 items-center px-1\">\n {tabPrefix}\n </div>\n )}\n\n {/* Left scroll arrow - collapses to 0 width when there's no overflow */}\n <button\n type=\"button\"\n onClick={scrollLeft}\n disabled={!scrollAffordance.canScrollLeft}\n aria-label=\"Scroll tabs left\"\n tabIndex={hasOverflow ? 0 : -1}\n className={cn(\n \"flex shrink-0 items-center justify-center overflow-hidden transition-all\",\n // Width\n hasOverflow ? \"w-8\" : \"w-0\",\n // Divider for pill/segmented variants\n hasOverflow &&\n (variant === \"pill\" || variant === \"segmented\") &&\n \"mr-0.5 border-r border-border/30\",\n // Disabled state\n \"disabled:cursor-not-allowed disabled:opacity-40\",\n // Hover state (only when enabled)\n \"enabled:hover:opacity-70 enabled:active:scale-95\",\n // Focus state\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-focus focus-visible:ring-inset\",\n )}\n >\n <Icon icon=\"chevron-left\" className=\"size-4 shrink-0 text-muted-txt\" />\n </button>\n\n {/* Scrollable container - flex-1 to fill space between arrows */}\n <div\n ref={scrollContainerRef}\n data-slot=\"tabs-scroll-container\"\n className={cn(\n \"min-w-0 flex-1 touch-pan-x overflow-x-auto overscroll-x-contain [-webkit-overflow-scrolling:touch]\",\n // Hide scrollbar\n \"[&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]\",\n variant === \"line\" && \"pb-1.5\",\n )}\n >\n {list}\n </div>\n\n {/* Right scroll arrow - collapses to 0 width when there's no overflow */}\n <button\n type=\"button\"\n onClick={scrollRight}\n disabled={!scrollAffordance.canScrollRight}\n aria-label=\"Scroll tabs right\"\n tabIndex={hasOverflow ? 0 : -1}\n className={cn(\n \"flex shrink-0 items-center justify-center overflow-hidden transition-all\",\n // Width\n hasOverflow ? \"w-8\" : \"w-0\",\n // Divider for pill/segmented variants\n hasOverflow &&\n (variant === \"pill\" || variant === \"segmented\") &&\n \"ml-0.5 border-l border-border/30\",\n // Disabled state\n \"disabled:cursor-not-allowed disabled:opacity-40\",\n // Hover state (only when enabled)\n \"enabled:hover:opacity-70 enabled:active:scale-95\",\n // Focus state\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-focus focus-visible:ring-inset\",\n )}\n >\n <Icon icon=\"chevron-right\" className=\"size-4 shrink-0 text-muted-txt\" />\n </button>\n\n {/* Fixed suffix — sits outside the scroll container, never scrolls */}\n {tabSuffix && (\n <div data-slot=\"tabs-suffix\" className=\"flex shrink-0 items-center px-1\">\n {tabSuffix}\n </div>\n )}\n </div>\n );\n}\n\nconst tabsTriggerVariants = cva(\n \"relative inline-flex items-center justify-center gap-1.5 font-medium whitespace-nowrap text-primary-txt outline-none transition-all focus-visible:ring-3 focus-visible:ring-focus disabled:pointer-events-none disabled:opacity-50 data-[state=active]:text-primary-txt [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n line: \"h-[calc(100%-1px)] flex-1 rounded-none\",\n pill: \"h-[calc(100%-1px)] flex-1 rounded-10 border border-transparent data-[state=active]:bg-primary-bg data-[state=active]:shadow-sm\",\n segmented: \"z-[1] h-[calc(100%-1px)] flex-1 rounded-8\",\n // Fancy (Figma Components file, node 1:6831): default = glass-60→glass-20\n // vertical gradient card; hover = solid glass-none; selected = 4px taller,\n // flat-bottomed, glass-none→glass-40 (72.6% stop), semibold, with concave\n // 16px corner curves where it meets the panel.\n fancy: cn(\n \"mb-1 flex-1 justify-between rounded-16 font-normal backdrop-blur-glass\",\n \"bg-gradient-to-b from-glass-60-bg from-[3.4%] to-glass-20-bg\",\n \"data-[state=inactive]:hover:bg-none data-[state=inactive]:hover:bg-glass-none-bg\",\n \"data-[state=active]:mb-0 data-[state=active]:rounded-b-none data-[state=active]:from-glass-none-bg data-[state=active]:to-glass-40-bg data-[state=active]:to-[72.6%] data-[state=active]:font-semibold\",\n \"data-[state=active]:before:absolute data-[state=active]:before:-left-4 data-[state=active]:before:bottom-0 data-[state=active]:before:size-4 data-[state=active]:before:bg-[radial-gradient(circle_at_top_left,transparent_15.5px,var(--glass-40-bg)_16px)]\",\n \"data-[state=active]:after:absolute data-[state=active]:after:-right-4 data-[state=active]:after:bottom-0 data-[state=active]:after:size-4 data-[state=active]:after:bg-[radial-gradient(circle_at_top_right,transparent_15.5px,var(--glass-40-bg)_16px)]\",\n // The curves flow into NEIGHBOURING tabs only — never past the group edge.\n \"first:before:hidden last:after:hidden\",\n ),\n },\n orientation: { horizontal: \"\", vertical: \"w-full justify-start\" },\n size: { sm: \"\", md: \"\", lg: \"\" },\n },\n compoundVariants: [\n // Padding + text size for the track variants.\n {\n variant: [\"line\", \"pill\", \"segmented\"],\n size: \"sm\",\n class: \"px-2 py-0.5 text-xs leading-4\",\n },\n { variant: [\"line\", \"pill\", \"segmented\"], size: \"md\", class: \"px-2 py-1 text-sm leading-5\" },\n {\n variant: [\"line\", \"pill\", \"segmented\"],\n size: \"lg\",\n class: \"px-2 py-1.5 text-sm leading-5\",\n },\n // Fancy footprint scales with size; the active tab adds bottom padding so it\n // merges into the panel while inactive tabs stay shorter (gap above content).\n { variant: \"fancy\", size: \"sm\", class: \"px-4 py-2 text-sm\" },\n { variant: \"fancy\", size: \"md\", class: \"px-6 py-3 text-sm\" },\n { variant: \"fancy\", size: \"lg\", class: \"px-6 py-4 text-base\" },\n // Underline position for the line variant (per orientation).\n {\n variant: \"line\",\n orientation: \"horizontal\",\n class:\n \"after:absolute after:inset-x-0 after:bottom-[-5px] after:h-0.5 after:bg-primary-txt after:opacity-0 after:transition-opacity data-[state=active]:after:opacity-100\",\n },\n {\n variant: \"line\",\n orientation: \"vertical\",\n class:\n \"after:absolute after:inset-y-0 after:right-[-5px] after:w-0.5 after:bg-primary-txt after:opacity-0 after:transition-opacity data-[state=active]:after:opacity-100\",\n },\n ],\n defaultVariants: { variant: \"pill\", orientation: \"horizontal\", size: \"md\" },\n },\n);\n\n/** Clickable tab button; its `value` selects the matching `TabsContent` panel. */\nfunction TabsTrigger({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n const { variant, size, orientation } = React.useContext(TabsContext);\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(tabsTriggerVariants({ variant, size, orientation }), className)}\n {...props}\n />\n );\n}\n\n/** Panel shown when its `value` matches the active tab; styled as a glass panel for the `fancy` variant. */\nfunction TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>) {\n const { variant } = React.useContext(TabsContext);\n return (\n <TabsPrimitive.Content\n data-slot=\"tabs-content\"\n className={cn(\n \"flex-1 outline-none\",\n // Fancy: a glass panel the active tab merges into (flat top, matching tint).\n variant === \"fancy\" &&\n \"flex-none rounded-16 rounded-t-none bg-glass-40-bg p-5 backdrop-blur-glass\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** Trailing count badge for a tab trigger; goes dark on the `fancy` variant to match its cards. */\nfunction TabsCounter({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"tabs-counter\"\n className={cn(\n \"ml-1 inline-flex h-4 min-w-4 items-center justify-center rounded-full bg-muted-bg px-1 text-xs font-medium text-muted-txt\",\n \"group-data-[variant=fancy]/tabs:h-5 group-data-[variant=fancy]/tabs:min-w-5 group-data-[variant=fancy]/tabs:bg-primary-invert-bg group-data-[variant=fancy]/tabs:px-2 group-data-[variant=fancy]/tabs:leading-4 group-data-[variant=fancy]/tabs:font-semibold group-data-[variant=fancy]/tabs:text-primary-invert-txt\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n TabsCounter,\n tabsListVariants,\n tabsTriggerVariants,\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { n as TextProps, r as textVariants, t as Text } from "../../index65.cjs";
1
+ import { n as TextProps, r as textVariants, t as Text } from "../../index66.cjs";
2
2
  export { Text, TextProps, textVariants };
@@ -1,2 +1,2 @@
1
- import { n as TextProps, r as textVariants, t as Text } from "../../index65.js";
1
+ import { n as TextProps, r as textVariants, t as Text } from "../../index66.js";
2
2
  export { Text, TextProps, textVariants };
@@ -1,2 +1,2 @@
1
- import { n as textareaVariants, t as Textarea } from "../../index66.cjs";
1
+ import { n as textareaVariants, t as Textarea } from "../../index67.cjs";
2
2
  export { Textarea, textareaVariants };
@@ -1,2 +1,2 @@
1
- import { n as textareaVariants, t as Textarea } from "../../index66.js";
1
+ import { n as textareaVariants, t as Textarea } from "../../index67.js";
2
2
  export { Textarea, textareaVariants };
@@ -1,2 +1,2 @@
1
- import { a as useTheme, i as ThemeProvider, n as ThemeMode, r as ThemeProduct, t as ThemeContext } from "../../index67.cjs";
1
+ import { a as useTheme, i as ThemeProvider, n as ThemeMode, r as ThemeProduct, t as ThemeContext } from "../../index68.cjs";
2
2
  export { ThemeContext, ThemeMode, ThemeProduct, ThemeProvider, useTheme };
@@ -1,2 +1,2 @@
1
- import { a as useTheme, i as ThemeProvider, n as ThemeMode, r as ThemeProduct, t as ThemeContext } from "../../index67.js";
1
+ import { a as useTheme, i as ThemeProvider, n as ThemeMode, r as ThemeProduct, t as ThemeContext } from "../../index68.js";
2
2
  export { ThemeContext, ThemeMode, ThemeProduct, ThemeProvider, useTheme };
@@ -1,2 +1,2 @@
1
- import { n as toggleVariants, t as Toggle } from "../../index68.cjs";
1
+ import { n as toggleVariants, t as Toggle } from "../../index69.cjs";
2
2
  export { Toggle, toggleVariants };
@@ -1,2 +1,2 @@
1
- import { n as toggleVariants, t as Toggle } from "../../index68.js";
1
+ import { n as toggleVariants, t as Toggle } from "../../index69.js";
2
2
  export { Toggle, toggleVariants };
@@ -1,2 +1,2 @@
1
- import { n as ToggleGroupItem, t as ToggleGroup } from "../../index69.cjs";
1
+ import { n as ToggleGroupItem, t as ToggleGroup } from "../../index70.cjs";
2
2
  export { ToggleGroup, ToggleGroupItem };
@@ -1,2 +1,2 @@
1
- import { n as ToggleGroupItem, t as ToggleGroup } from "../../index69.js";
1
+ import { n as ToggleGroupItem, t as ToggleGroup } from "../../index70.js";
2
2
  export { ToggleGroup, ToggleGroupItem };
@@ -1,2 +1,2 @@
1
- import { i as TooltipTrigger, n as TooltipContent, r as TooltipProvider, t as Tooltip } from "../../index56.cjs";
1
+ import { i as TooltipTrigger, n as TooltipContent, r as TooltipProvider, t as Tooltip } from "../../index57.cjs";
2
2
  export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
@@ -1,2 +1,2 @@
1
- import { i as TooltipTrigger, n as TooltipContent, r as TooltipProvider, t as Tooltip } from "../../index56.js";
1
+ import { i as TooltipTrigger, n as TooltipContent, r as TooltipProvider, t as Tooltip } from "../../index57.js";
2
2
  export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
@@ -22,6 +22,9 @@ const require_primitives_CheckboxTree_index = require("./CheckboxTree/index.cjs"
22
22
  const require_primitives_Collapsible_index = require("./Collapsible/index.cjs");
23
23
  const require_primitives_Dialog_index = require("./Dialog/index.cjs");
24
24
  const require_primitives_Command_index = require("./Command/index.cjs");
25
+ const require_primitives_Input_index = require("./Input/index.cjs");
26
+ const require_primitives_Popover_index = require("./Popover/index.cjs");
27
+ const require_primitives_Combobox_index = require("./Combobox/index.cjs");
25
28
  const require_primitives_ContextMenu_index = require("./ContextMenu/index.cjs");
26
29
  const require_primitives_Credits_index = require("./Credits/index.cjs");
27
30
  const require_primitives_Drawer_index = require("./Drawer/index.cjs");
@@ -35,7 +38,6 @@ const require_primitives_Form_index = require("./Form/index.cjs");
35
38
  const require_primitives_Heading_index = require("./Heading/index.cjs");
36
39
  const require_primitives_HoverCard_index = require("./HoverCard/index.cjs");
37
40
  const require_primitives_InfoBanner_index = require("./InfoBanner/index.cjs");
38
- const require_primitives_Input_index = require("./Input/index.cjs");
39
41
  const require_primitives_Textarea_index = require("./Textarea/index.cjs");
40
42
  const require_primitives_InputGroup_index = require("./InputGroup/index.cjs");
41
43
  const require_primitives_InputOtp_index = require("./InputOtp/index.cjs");
@@ -48,7 +50,6 @@ const require_primitives_Resizable_index = require("./Resizable/index.cjs");
48
50
  const require_Mosaic = require("../Mosaic.cjs");
49
51
  const require_primitives_NativeSelect_index = require("./NativeSelect/index.cjs");
50
52
  const require_primitives_NavigationMenu_index = require("./NavigationMenu/index.cjs");
51
- const require_primitives_Popover_index = require("./Popover/index.cjs");
52
53
  const require_primitives_Tooltip_index = require("./Tooltip/index.cjs");
53
54
  const require_patterns_NavRail_index = require("../patterns/NavRail/index.cjs");
54
55
  const require_primitives_NotchedCard_index = require("./NotchedCard/index.cjs");
@@ -133,6 +134,15 @@ exports.CircularProgress = require_primitives_CircularProgress_index.CircularPro
133
134
  exports.Collapsible = require_primitives_Collapsible_index.Collapsible;
134
135
  exports.CollapsibleContent = require_primitives_Collapsible_index.CollapsibleContent;
135
136
  exports.CollapsibleTrigger = require_primitives_Collapsible_index.CollapsibleTrigger;
137
+ exports.Combobox = require_primitives_Combobox_index.Combobox;
138
+ exports.ComboboxContent = require_primitives_Combobox_index.ComboboxContent;
139
+ exports.ComboboxEmpty = require_primitives_Combobox_index.ComboboxEmpty;
140
+ exports.ComboboxGroup = require_primitives_Combobox_index.ComboboxGroup;
141
+ exports.ComboboxInput = require_primitives_Combobox_index.ComboboxInput;
142
+ exports.ComboboxItem = require_primitives_Combobox_index.ComboboxItem;
143
+ exports.ComboboxList = require_primitives_Combobox_index.ComboboxList;
144
+ exports.ComboboxSeparator = require_primitives_Combobox_index.ComboboxSeparator;
145
+ exports.ComboboxTrigger = require_primitives_Combobox_index.ComboboxTrigger;
136
146
  exports.Command = require_primitives_Command_index.Command;
137
147
  exports.CommandDialog = require_primitives_Command_index.CommandDialog;
138
148
  exports.CommandEmpty = require_primitives_Command_index.CommandEmpty;