@psnext/design-system 2.2.0 → 2.4.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 (491) hide show
  1. package/DESIGN.md +466 -4
  2. package/README.md +3 -3
  3. package/SKILL.md +83 -5
  4. package/bin/install-agent-skill.mjs +39 -7
  5. package/dist/Header.cjs +214 -108
  6. package/dist/Header.cjs.map +1 -1
  7. package/dist/Header.js +214 -108
  8. package/dist/Header.js.map +1 -1
  9. package/dist/Icon.cjs +40 -8
  10. package/dist/Icon.cjs.map +1 -1
  11. package/dist/Icon.js +40 -8
  12. package/dist/Icon.js.map +1 -1
  13. package/dist/MultiColumn.cjs +354 -0
  14. package/dist/MultiColumn.cjs.map +1 -0
  15. package/dist/MultiColumn.js +335 -0
  16. package/dist/MultiColumn.js.map +1 -0
  17. package/dist/Sidebar.cjs +4 -3
  18. package/dist/Sidebar.cjs.map +1 -1
  19. package/dist/Sidebar.js +4 -3
  20. package/dist/Sidebar.js.map +1 -1
  21. package/dist/index.cjs +5 -1
  22. package/dist/index.d.cts +5 -5
  23. package/dist/index.d.cts.map +1 -1
  24. package/dist/index.d.ts +5 -5
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +3 -2
  27. package/dist/index10.d.cts +6 -6
  28. package/dist/index10.d.ts +7 -7
  29. package/dist/index10.d.ts.map +1 -1
  30. package/dist/index11.d.cts +3 -3
  31. package/dist/index11.d.cts.map +1 -1
  32. package/dist/index11.d.ts +3 -3
  33. package/dist/index11.d.ts.map +1 -1
  34. package/dist/index12.d.cts +11 -11
  35. package/dist/index12.d.ts +13 -13
  36. package/dist/index12.d.ts.map +1 -1
  37. package/dist/index13.d.cts +6 -6
  38. package/dist/index13.d.cts.map +1 -1
  39. package/dist/index13.d.ts +6 -6
  40. package/dist/index13.d.ts.map +1 -1
  41. package/dist/index14.d.cts +5 -5
  42. package/dist/index14.d.cts.map +1 -1
  43. package/dist/index14.d.ts +5 -5
  44. package/dist/index15.d.cts +3 -3
  45. package/dist/index15.d.cts.map +1 -1
  46. package/dist/index15.d.ts +3 -3
  47. package/dist/index15.d.ts.map +1 -1
  48. package/dist/index16.d.cts +2 -2
  49. package/dist/index16.d.cts.map +1 -1
  50. package/dist/index16.d.ts +2 -2
  51. package/dist/index16.d.ts.map +1 -1
  52. package/dist/index17.d.cts +4 -4
  53. package/dist/index17.d.cts.map +1 -1
  54. package/dist/index17.d.ts +4 -4
  55. package/dist/index18.d.cts +11 -11
  56. package/dist/index18.d.cts.map +1 -1
  57. package/dist/index18.d.ts +11 -11
  58. package/dist/index18.d.ts.map +1 -1
  59. package/dist/index19.d.cts +10 -10
  60. package/dist/index19.d.cts.map +1 -1
  61. package/dist/index19.d.ts +10 -10
  62. package/dist/index19.d.ts.map +1 -1
  63. package/dist/index2.d.cts +8 -8
  64. package/dist/index2.d.cts.map +1 -1
  65. package/dist/index2.d.ts +7 -7
  66. package/dist/index20.d.cts +16 -16
  67. package/dist/index20.d.cts.map +1 -1
  68. package/dist/index20.d.ts +16 -16
  69. package/dist/index20.d.ts.map +1 -1
  70. package/dist/index21.d.cts +4 -4
  71. package/dist/index21.d.cts.map +1 -1
  72. package/dist/index21.d.ts +4 -4
  73. package/dist/index21.d.ts.map +1 -1
  74. package/dist/index22.d.cts +11 -11
  75. package/dist/index22.d.ts +11 -11
  76. package/dist/index23.d.cts +16 -16
  77. package/dist/index23.d.cts.map +1 -1
  78. package/dist/index23.d.ts +16 -16
  79. package/dist/index23.d.ts.map +1 -1
  80. package/dist/index24.d.cts +10 -10
  81. package/dist/index24.d.cts.map +1 -1
  82. package/dist/index24.d.ts +11 -11
  83. package/dist/index24.d.ts.map +1 -1
  84. package/dist/index25.d.cts +2 -2
  85. package/dist/index25.d.cts.map +1 -1
  86. package/dist/index25.d.ts +2 -2
  87. package/dist/index25.d.ts.map +1 -1
  88. package/dist/index26.d.cts +13 -13
  89. package/dist/index26.d.cts.map +1 -1
  90. package/dist/index26.d.ts +15 -15
  91. package/dist/index26.d.ts.map +1 -1
  92. package/dist/index27.d.cts +7 -7
  93. package/dist/index27.d.cts.map +1 -1
  94. package/dist/index27.d.ts +7 -7
  95. package/dist/index27.d.ts.map +1 -1
  96. package/dist/index28.d.cts +4 -4
  97. package/dist/index28.d.ts +6 -6
  98. package/dist/index28.d.ts.map +1 -1
  99. package/dist/index29.d.cts +4 -4
  100. package/dist/index29.d.cts.map +1 -1
  101. package/dist/index29.d.ts +4 -4
  102. package/dist/index29.d.ts.map +1 -1
  103. package/dist/index3.d.cts +13 -13
  104. package/dist/index3.d.ts +13 -13
  105. package/dist/index30.d.cts +42 -13
  106. package/dist/index30.d.cts.map +1 -1
  107. package/dist/index30.d.ts +43 -14
  108. package/dist/index30.d.ts.map +1 -1
  109. package/dist/index31.d.cts +5 -5
  110. package/dist/index31.d.cts.map +1 -1
  111. package/dist/index31.d.ts +6 -6
  112. package/dist/index31.d.ts.map +1 -1
  113. package/dist/index32.d.cts +6 -6
  114. package/dist/index32.d.cts.map +1 -1
  115. package/dist/index32.d.ts +6 -6
  116. package/dist/index33.d.cts +11 -11
  117. package/dist/index33.d.cts.map +1 -1
  118. package/dist/index33.d.ts +12 -12
  119. package/dist/index33.d.ts.map +1 -1
  120. package/dist/index34.d.cts +5 -5
  121. package/dist/index34.d.cts.map +1 -1
  122. package/dist/index34.d.ts +5 -5
  123. package/dist/index34.d.ts.map +1 -1
  124. package/dist/index35.d.cts +15 -15
  125. package/dist/index35.d.cts.map +1 -1
  126. package/dist/index35.d.ts +16 -16
  127. package/dist/index35.d.ts.map +1 -1
  128. package/dist/index36.d.cts +3 -3
  129. package/dist/index36.d.ts +3 -3
  130. package/dist/index36.d.ts.map +1 -1
  131. package/dist/index37.d.cts +5 -5
  132. package/dist/index37.d.ts +6 -6
  133. package/dist/index38.d.cts +2 -2
  134. package/dist/index38.d.ts +2 -2
  135. package/dist/index39.d.cts +17 -17
  136. package/dist/index39.d.cts.map +1 -1
  137. package/dist/index39.d.ts +17 -17
  138. package/dist/index39.d.ts.map +1 -1
  139. package/dist/index4.d.cts +2 -2
  140. package/dist/index4.d.ts +2 -2
  141. package/dist/index40.d.cts +5 -5
  142. package/dist/index40.d.cts.map +1 -1
  143. package/dist/index40.d.ts +6 -6
  144. package/dist/index40.d.ts.map +1 -1
  145. package/dist/index41.d.cts +11 -11
  146. package/dist/index41.d.cts.map +1 -1
  147. package/dist/index41.d.ts +11 -11
  148. package/dist/index41.d.ts.map +1 -1
  149. package/dist/index42.d.cts +8 -8
  150. package/dist/index42.d.cts.map +1 -1
  151. package/dist/index42.d.ts +8 -8
  152. package/dist/index42.d.ts.map +1 -1
  153. package/dist/index43.d.cts +9 -9
  154. package/dist/index43.d.cts.map +1 -1
  155. package/dist/index43.d.ts +9 -9
  156. package/dist/index43.d.ts.map +1 -1
  157. package/dist/index45.d.cts +8 -8
  158. package/dist/index45.d.cts.map +1 -1
  159. package/dist/index45.d.ts +8 -8
  160. package/dist/index45.d.ts.map +1 -1
  161. package/dist/index46.d.cts +2 -2
  162. package/dist/index46.d.cts.map +1 -1
  163. package/dist/index46.d.ts +2 -2
  164. package/dist/index46.d.ts.map +1 -1
  165. package/dist/index47.d.cts +4 -4
  166. package/dist/index47.d.cts.map +1 -1
  167. package/dist/index47.d.ts +4 -4
  168. package/dist/index47.d.ts.map +1 -1
  169. package/dist/index48.d.cts +4 -4
  170. package/dist/index48.d.cts.map +1 -1
  171. package/dist/index48.d.ts +4 -4
  172. package/dist/index48.d.ts.map +1 -1
  173. package/dist/index49.d.cts +3 -3
  174. package/dist/index49.d.ts +3 -3
  175. package/dist/index5.d.cts +7 -7
  176. package/dist/index5.d.ts +7 -7
  177. package/dist/index5.d.ts.map +1 -1
  178. package/dist/index50.d.cts +11 -11
  179. package/dist/index50.d.cts.map +1 -1
  180. package/dist/index50.d.ts +11 -11
  181. package/dist/index50.d.ts.map +1 -1
  182. package/dist/index51.d.cts +9 -9
  183. package/dist/index51.d.cts.map +1 -1
  184. package/dist/index51.d.ts +9 -9
  185. package/dist/index51.d.ts.map +1 -1
  186. package/dist/index52.d.cts +5 -5
  187. package/dist/index52.d.ts +5 -5
  188. package/dist/index53.d.cts +26 -26
  189. package/dist/index53.d.cts.map +1 -1
  190. package/dist/index53.d.ts +27 -27
  191. package/dist/index53.d.ts.map +1 -1
  192. package/dist/index54.d.cts +5 -5
  193. package/dist/index54.d.ts +5 -5
  194. package/dist/index54.d.ts.map +1 -1
  195. package/dist/index55.d.cts +2 -2
  196. package/dist/index55.d.cts.map +1 -1
  197. package/dist/index55.d.ts +2 -2
  198. package/dist/index56.d.cts +2 -2
  199. package/dist/index56.d.cts.map +1 -1
  200. package/dist/index56.d.ts +2 -2
  201. package/dist/index56.d.ts.map +1 -1
  202. package/dist/index57.d.cts +2 -2
  203. package/dist/index57.d.cts.map +1 -1
  204. package/dist/index57.d.ts +2 -2
  205. package/dist/index57.d.ts.map +1 -1
  206. package/dist/index58.d.cts +4 -4
  207. package/dist/index58.d.ts +4 -4
  208. package/dist/index58.d.ts.map +1 -1
  209. package/dist/index59.d.cts +9 -9
  210. package/dist/index59.d.ts +9 -9
  211. package/dist/index6.d.cts +6 -6
  212. package/dist/index6.d.cts.map +1 -1
  213. package/dist/index6.d.ts +6 -6
  214. package/dist/index6.d.ts.map +1 -1
  215. package/dist/index60.d.cts +9 -9
  216. package/dist/index60.d.cts.map +1 -1
  217. package/dist/index60.d.ts +13 -13
  218. package/dist/index60.d.ts.map +1 -1
  219. package/dist/index61.d.cts +5 -5
  220. package/dist/index61.d.ts +6 -6
  221. package/dist/index62.d.cts +5 -5
  222. package/dist/index62.d.ts +5 -5
  223. package/dist/index62.d.ts.map +1 -1
  224. package/dist/index63.d.cts +2 -2
  225. package/dist/index63.d.cts.map +1 -1
  226. package/dist/index63.d.ts +2 -2
  227. package/dist/index63.d.ts.map +1 -1
  228. package/dist/index64.d.cts +6 -6
  229. package/dist/index64.d.cts.map +1 -1
  230. package/dist/index64.d.ts +7 -7
  231. package/dist/index65.d.cts +3 -3
  232. package/dist/index65.d.ts +4 -4
  233. package/dist/index65.d.ts.map +1 -1
  234. package/dist/index66.d.cts +4 -4
  235. package/dist/index66.d.cts.map +1 -1
  236. package/dist/index66.d.ts +6 -6
  237. package/dist/index66.d.ts.map +1 -1
  238. package/dist/index67.d.cts +83 -11
  239. package/dist/index67.d.cts.map +1 -1
  240. package/dist/index67.d.ts +83 -11
  241. package/dist/index67.d.ts.map +1 -1
  242. package/dist/index68.d.cts +12 -30
  243. package/dist/index68.d.cts.map +1 -1
  244. package/dist/index68.d.ts +12 -30
  245. package/dist/index68.d.ts.map +1 -1
  246. package/dist/index69.d.cts +28 -27
  247. package/dist/index69.d.cts.map +1 -1
  248. package/dist/index69.d.ts +29 -28
  249. package/dist/index69.d.ts.map +1 -1
  250. package/dist/index7.d.cts +8 -8
  251. package/dist/index7.d.cts.map +1 -1
  252. package/dist/index7.d.ts +8 -8
  253. package/dist/index7.d.ts.map +1 -1
  254. package/dist/index70.d.cts +33 -78
  255. package/dist/index70.d.cts.map +1 -1
  256. package/dist/index70.d.ts +33 -78
  257. package/dist/index70.d.ts.map +1 -1
  258. package/dist/index71.d.cts +77 -258
  259. package/dist/index71.d.cts.map +1 -1
  260. package/dist/index71.d.ts +77 -258
  261. package/dist/index71.d.ts.map +1 -1
  262. package/dist/index72.d.cts +278 -0
  263. package/dist/index72.d.cts.map +1 -0
  264. package/dist/index72.d.ts +278 -0
  265. package/dist/index72.d.ts.map +1 -0
  266. package/dist/index8.d.cts +5 -5
  267. package/dist/index8.d.ts +5 -5
  268. package/dist/index8.d.ts.map +1 -1
  269. package/dist/index9.d.cts +2 -2
  270. package/dist/index9.d.cts.map +1 -1
  271. package/dist/index9.d.ts +2 -2
  272. package/dist/layouts/Container/index.cjs +2 -1
  273. package/dist/layouts/Container/index.cjs.map +1 -1
  274. package/dist/layouts/Container/index.js +1 -1
  275. package/dist/layouts/MultiColumn/index.cjs +5 -0
  276. package/dist/layouts/MultiColumn/index.d.cts +2 -0
  277. package/dist/layouts/MultiColumn/index.d.ts +2 -0
  278. package/dist/layouts/MultiColumn/index.js +2 -0
  279. package/dist/layouts/PageBackground/index.d.cts +1 -1
  280. package/dist/layouts/PageBackground/index.d.ts +1 -1
  281. package/dist/layouts/Stack/index.cjs +2 -1
  282. package/dist/layouts/Stack/index.cjs.map +1 -1
  283. package/dist/layouts/Stack/index.d.cts +1 -1
  284. package/dist/layouts/Stack/index.d.ts +1 -1
  285. package/dist/layouts/Stack/index.js +1 -1
  286. package/dist/layouts/TwoColumn/index.cjs +2 -1
  287. package/dist/layouts/TwoColumn/index.cjs.map +1 -1
  288. package/dist/layouts/TwoColumn/index.d.cts +1 -1
  289. package/dist/layouts/TwoColumn/index.d.ts +1 -1
  290. package/dist/layouts/TwoColumn/index.js +1 -1
  291. package/dist/layouts/index.cjs +4 -0
  292. package/dist/layouts/index.d.cts +5 -4
  293. package/dist/layouts/index.d.ts +5 -4
  294. package/dist/layouts/index.js +2 -1
  295. package/dist/patterns/DataTable/index.cjs +6 -2
  296. package/dist/patterns/DataTable/index.cjs.map +1 -1
  297. package/dist/patterns/DataTable/index.d.cts +3 -3
  298. package/dist/patterns/DataTable/index.d.cts.map +1 -1
  299. package/dist/patterns/DataTable/index.d.ts +3 -3
  300. package/dist/patterns/DataTable/index.d.ts.map +1 -1
  301. package/dist/patterns/DataTable/index.js +6 -2
  302. package/dist/patterns/DataTable/index.js.map +1 -1
  303. package/dist/patterns/Footer/index.d.cts +7 -7
  304. package/dist/patterns/Footer/index.d.cts.map +1 -1
  305. package/dist/patterns/Footer/index.d.ts +7 -7
  306. package/dist/patterns/Header/index.d.cts +1 -1
  307. package/dist/patterns/Header/index.d.ts +1 -1
  308. package/dist/patterns/MediaObject/index.cjs +1 -1
  309. package/dist/patterns/MediaObject/index.d.cts +11 -11
  310. package/dist/patterns/MediaObject/index.d.ts +14 -14
  311. package/dist/patterns/MediaObject/index.js +1 -1
  312. package/dist/patterns/NavRail/index.cjs +4 -2
  313. package/dist/patterns/NavRail/index.cjs.map +1 -1
  314. package/dist/patterns/NavRail/index.js +4 -2
  315. package/dist/patterns/NavRail/index.js.map +1 -1
  316. package/dist/patterns/SectionCard/index.d.cts +2 -2
  317. package/dist/patterns/SectionCard/index.d.ts +2 -2
  318. package/dist/patterns/SectionCard/index.d.ts.map +1 -1
  319. package/dist/patterns/SectionHeading/index.d.cts +2 -2
  320. package/dist/patterns/SectionHeading/index.d.ts +2 -2
  321. package/dist/patterns/SectionHeading/index.d.ts.map +1 -1
  322. package/dist/patterns/index.d.cts +1 -1
  323. package/dist/patterns/index.d.ts +1 -1
  324. package/dist/primitives/Accordion/index.cjs +6 -2
  325. package/dist/primitives/Accordion/index.cjs.map +1 -1
  326. package/dist/primitives/Accordion/index.js +6 -2
  327. package/dist/primitives/Accordion/index.js.map +1 -1
  328. package/dist/primitives/Alert/index.cjs +2 -1
  329. package/dist/primitives/Alert/index.cjs.map +1 -1
  330. package/dist/primitives/Alert/index.js +1 -1
  331. package/dist/primitives/AlertDialog/index.cjs +1 -1
  332. package/dist/primitives/AlertDialog/index.js +1 -1
  333. package/dist/primitives/AspectRatio/index.cjs +1 -1
  334. package/dist/primitives/AspectRatio/index.js +1 -1
  335. package/dist/primitives/Avatar/index.cjs +1 -1
  336. package/dist/primitives/Avatar/index.js +1 -1
  337. package/dist/primitives/Badge/index.cjs +3 -2
  338. package/dist/primitives/Badge/index.cjs.map +1 -1
  339. package/dist/primitives/Badge/index.js +2 -2
  340. package/dist/primitives/Breadcrumb/index.cjs +7 -3
  341. package/dist/primitives/Breadcrumb/index.cjs.map +1 -1
  342. package/dist/primitives/Breadcrumb/index.js +7 -3
  343. package/dist/primitives/Breadcrumb/index.js.map +1 -1
  344. package/dist/primitives/Button/index.cjs +3 -2
  345. package/dist/primitives/Button/index.cjs.map +1 -1
  346. package/dist/primitives/Button/index.js +2 -2
  347. package/dist/primitives/ButtonGroup/index.cjs +3 -2
  348. package/dist/primitives/ButtonGroup/index.cjs.map +1 -1
  349. package/dist/primitives/ButtonGroup/index.js +2 -2
  350. package/dist/primitives/Calendar/index.cjs +12 -11
  351. package/dist/primitives/Calendar/index.cjs.map +1 -1
  352. package/dist/primitives/Calendar/index.js +12 -11
  353. package/dist/primitives/Calendar/index.js.map +1 -1
  354. package/dist/primitives/Card/index.cjs +2 -1
  355. package/dist/primitives/Card/index.cjs.map +1 -1
  356. package/dist/primitives/Card/index.js +1 -1
  357. package/dist/primitives/Carousel/index.cjs +4 -3
  358. package/dist/primitives/Carousel/index.cjs.map +1 -1
  359. package/dist/primitives/Carousel/index.js +4 -3
  360. package/dist/primitives/Carousel/index.js.map +1 -1
  361. package/dist/primitives/Checkbox/index.cjs +9 -2
  362. package/dist/primitives/Checkbox/index.cjs.map +1 -1
  363. package/dist/primitives/Checkbox/index.js +9 -2
  364. package/dist/primitives/Checkbox/index.js.map +1 -1
  365. package/dist/primitives/CheckboxTree/index.cjs +6 -2
  366. package/dist/primitives/CheckboxTree/index.cjs.map +1 -1
  367. package/dist/primitives/CheckboxTree/index.js +6 -2
  368. package/dist/primitives/CheckboxTree/index.js.map +1 -1
  369. package/dist/primitives/Collapsible/index.cjs +1 -1
  370. package/dist/primitives/Collapsible/index.js +1 -1
  371. package/dist/primitives/Command/index.cjs +6 -2
  372. package/dist/primitives/Command/index.cjs.map +1 -1
  373. package/dist/primitives/Command/index.js +6 -2
  374. package/dist/primitives/Command/index.js.map +1 -1
  375. package/dist/primitives/ContextMenu/index.cjs +14 -4
  376. package/dist/primitives/ContextMenu/index.cjs.map +1 -1
  377. package/dist/primitives/ContextMenu/index.js +14 -4
  378. package/dist/primitives/ContextMenu/index.js.map +1 -1
  379. package/dist/primitives/Credits/index.cjs +8 -3
  380. package/dist/primitives/Credits/index.cjs.map +1 -1
  381. package/dist/primitives/Credits/index.js +7 -3
  382. package/dist/primitives/Credits/index.js.map +1 -1
  383. package/dist/primitives/Dialog/index.cjs +3 -2
  384. package/dist/primitives/Dialog/index.cjs.map +1 -1
  385. package/dist/primitives/Dialog/index.js +3 -2
  386. package/dist/primitives/Dialog/index.js.map +1 -1
  387. package/dist/primitives/DropdownMenu/index.cjs +14 -4
  388. package/dist/primitives/DropdownMenu/index.cjs.map +1 -1
  389. package/dist/primitives/DropdownMenu/index.js +14 -4
  390. package/dist/primitives/DropdownMenu/index.js.map +1 -1
  391. package/dist/primitives/Empty/index.cjs +1 -1
  392. package/dist/primitives/Empty/index.js +1 -1
  393. package/dist/primitives/Field/index.cjs +1 -1
  394. package/dist/primitives/Field/index.js +1 -1
  395. package/dist/primitives/Form/index.cjs +1 -1
  396. package/dist/primitives/Form/index.js +1 -1
  397. package/dist/primitives/Heading/index.cjs +2 -1
  398. package/dist/primitives/Heading/index.cjs.map +1 -1
  399. package/dist/primitives/Heading/index.js +1 -1
  400. package/dist/primitives/HoverCard/index.cjs +1 -1
  401. package/dist/primitives/HoverCard/index.js +1 -1
  402. package/dist/primitives/InfoBanner/index.cjs +6 -3
  403. package/dist/primitives/InfoBanner/index.cjs.map +1 -1
  404. package/dist/primitives/InfoBanner/index.js +5 -3
  405. package/dist/primitives/InfoBanner/index.js.map +1 -1
  406. package/dist/primitives/Input/index.cjs +2 -1
  407. package/dist/primitives/Input/index.cjs.map +1 -1
  408. package/dist/primitives/Input/index.js +1 -1
  409. package/dist/primitives/InputGroup/index.cjs +1 -1
  410. package/dist/primitives/InputGroup/index.js +1 -1
  411. package/dist/primitives/InputOtp/index.cjs +3 -2
  412. package/dist/primitives/InputOtp/index.cjs.map +1 -1
  413. package/dist/primitives/InputOtp/index.js +3 -2
  414. package/dist/primitives/InputOtp/index.js.map +1 -1
  415. package/dist/primitives/Item/index.cjs +2 -2
  416. package/dist/primitives/Item/index.js +2 -2
  417. package/dist/primitives/Label/index.cjs +1 -1
  418. package/dist/primitives/Label/index.js +1 -1
  419. package/dist/primitives/Link/index.cjs +3 -2
  420. package/dist/primitives/Link/index.cjs.map +1 -1
  421. package/dist/primitives/Link/index.js +2 -2
  422. package/dist/primitives/Menubar/index.cjs +14 -4
  423. package/dist/primitives/Menubar/index.cjs.map +1 -1
  424. package/dist/primitives/Menubar/index.js +14 -4
  425. package/dist/primitives/Menubar/index.js.map +1 -1
  426. package/dist/primitives/NativeSelect/index.cjs +6 -3
  427. package/dist/primitives/NativeSelect/index.cjs.map +1 -1
  428. package/dist/primitives/NativeSelect/index.js +5 -3
  429. package/dist/primitives/NativeSelect/index.js.map +1 -1
  430. package/dist/primitives/NavigationMenu/index.cjs +5 -3
  431. package/dist/primitives/NavigationMenu/index.cjs.map +1 -1
  432. package/dist/primitives/NavigationMenu/index.js +5 -3
  433. package/dist/primitives/NavigationMenu/index.js.map +1 -1
  434. package/dist/primitives/Pagination/index.cjs +6 -2
  435. package/dist/primitives/Pagination/index.cjs.map +1 -1
  436. package/dist/primitives/Pagination/index.js +6 -2
  437. package/dist/primitives/Pagination/index.js.map +1 -1
  438. package/dist/primitives/Popover/index.cjs +1 -1
  439. package/dist/primitives/Popover/index.js +1 -1
  440. package/dist/primitives/Progress/index.cjs +1 -1
  441. package/dist/primitives/Progress/index.js +1 -1
  442. package/dist/primitives/RadioGroup/index.cjs +6 -2
  443. package/dist/primitives/RadioGroup/index.cjs.map +1 -1
  444. package/dist/primitives/RadioGroup/index.js +6 -2
  445. package/dist/primitives/RadioGroup/index.js.map +1 -1
  446. package/dist/primitives/Resizable/index.cjs +6 -2
  447. package/dist/primitives/Resizable/index.cjs.map +1 -1
  448. package/dist/primitives/Resizable/index.js +6 -2
  449. package/dist/primitives/Resizable/index.js.map +1 -1
  450. package/dist/primitives/ScrollArea/index.cjs +1 -1
  451. package/dist/primitives/ScrollArea/index.js +1 -1
  452. package/dist/primitives/Select/index.cjs +18 -5
  453. package/dist/primitives/Select/index.cjs.map +1 -1
  454. package/dist/primitives/Select/index.js +18 -5
  455. package/dist/primitives/Select/index.js.map +1 -1
  456. package/dist/primitives/Separator/index.cjs +1 -1
  457. package/dist/primitives/Separator/index.js +1 -1
  458. package/dist/primitives/Sheet/index.cjs +6 -2
  459. package/dist/primitives/Sheet/index.cjs.map +1 -1
  460. package/dist/primitives/Sheet/index.js +6 -2
  461. package/dist/primitives/Sheet/index.js.map +1 -1
  462. package/dist/primitives/Slider/index.cjs +1 -1
  463. package/dist/primitives/Slider/index.js +1 -1
  464. package/dist/primitives/Sonner/index.cjs +22 -6
  465. package/dist/primitives/Sonner/index.cjs.map +1 -1
  466. package/dist/primitives/Sonner/index.js +22 -6
  467. package/dist/primitives/Sonner/index.js.map +1 -1
  468. package/dist/primitives/Spinner/index.cjs +4 -2
  469. package/dist/primitives/Spinner/index.cjs.map +1 -1
  470. package/dist/primitives/Spinner/index.js +4 -2
  471. package/dist/primitives/Spinner/index.js.map +1 -1
  472. package/dist/primitives/Switch/index.cjs +1 -1
  473. package/dist/primitives/Switch/index.js +1 -1
  474. package/dist/primitives/Tabs/index.cjs +2 -2
  475. package/dist/primitives/Tabs/index.js +2 -2
  476. package/dist/primitives/Text/index.cjs +2 -1
  477. package/dist/primitives/Text/index.cjs.map +1 -1
  478. package/dist/primitives/Text/index.js +1 -1
  479. package/dist/primitives/Textarea/index.cjs +2 -1
  480. package/dist/primitives/Textarea/index.cjs.map +1 -1
  481. package/dist/primitives/Textarea/index.js +1 -1
  482. package/dist/primitives/Toggle/index.cjs +3 -2
  483. package/dist/primitives/Toggle/index.cjs.map +1 -1
  484. package/dist/primitives/Toggle/index.js +2 -2
  485. package/dist/primitives/ToggleGroup/index.cjs +1 -1
  486. package/dist/primitives/ToggleGroup/index.js +1 -1
  487. package/dist/primitives/Tooltip/index.cjs +1 -1
  488. package/dist/primitives/Tooltip/index.js +1 -1
  489. package/dist/primitives/index.cjs +1 -1
  490. package/dist/primitives/index.js +1 -1
  491. package/package.json +2 -1
package/dist/Header.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { t as cn } from "./cn.js";
2
+ import { t as Icon } from "./Icon.js";
2
3
  import { Button } from "./primitives/Button/index.js";
3
4
  import { Avatar, AvatarFallback } from "./primitives/Avatar/index.js";
4
5
  import { Credits } from "./primitives/Credits/index.js";
@@ -9,8 +10,8 @@ import { Popover, PopoverContent, PopoverTrigger } from "./primitives/Popover/in
9
10
  import { Skeleton } from "./primitives/Skeleton/index.js";
10
11
  import { useTheme } from "./primitives/ThemeProvider/index.js";
11
12
  import * as React from "react";
12
- import { Check, ChevronDown, ChevronRight, FolderOpen, LogOut, MessageSquareShare, Moon, Search, Sun, X } from "lucide-react";
13
13
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
14
+ import { Check, ChevronDown, ChevronRight, LogOut, MessageSquareShare, Moon, Search, Sun } from "lucide-react";
14
15
  import { QueryClient, QueryClientProvider, useQuery } from "@tanstack/react-query";
15
16
  //#region src/patterns/Header/project-tree.ts
16
17
  /** True when a node with the given id exists anywhere in the tree. */
@@ -25,6 +26,14 @@ function findProjectName(tree, id) {
25
26
  if (found) return found;
26
27
  }
27
28
  }
29
+ /** First selectable node in the tree (depth-first, skipping context-only ancestors). */
30
+ function firstSelectableProject(tree) {
31
+ for (const node of tree) {
32
+ if (!node.isContextOnly) return node;
33
+ const found = firstSelectableProject(node.children);
34
+ if (found) return found;
35
+ }
36
+ }
28
37
  /** Filter the tree to nodes matching `term`, preserving ancestors of matches. */
29
38
  function filterTree(nodes, term) {
30
39
  if (!term) return nodes;
@@ -66,7 +75,10 @@ function ProjectPicker({ projectsTree, selectedProjectId, selectedProjectName, o
66
75
  children: [projectLabel, ":"]
67
76
  }),
68
77
  /* @__PURE__ */ jsx(Skeleton, { className: "h-3 flex-1" }),
69
- /* @__PURE__ */ jsx(ChevronDown, { className: "size-4 shrink-0 text-muted-txt opacity-40" })
78
+ /* @__PURE__ */ jsx(Icon, {
79
+ as: ChevronDown,
80
+ className: "size-4 shrink-0 text-muted-txt opacity-40"
81
+ })
70
82
  ]
71
83
  });
72
84
  return /* @__PURE__ */ jsxs(Popover, {
@@ -87,7 +99,10 @@ function ProjectPicker({ projectsTree, selectedProjectId, selectedProjectName, o
87
99
  className: cn("max-w-36 truncate", selectedName ? "font-medium" : "text-muted-txt"),
88
100
  children: selectedName ?? projectPlaceholder
89
101
  }),
90
- /* @__PURE__ */ jsx(ChevronDown, { className: "ml-1 size-4 shrink-0 text-muted-txt" })
102
+ /* @__PURE__ */ jsx(Icon, {
103
+ as: ChevronDown,
104
+ className: "ml-1 size-4 shrink-0 text-muted-txt"
105
+ })
91
106
  ]
92
107
  }), /* @__PURE__ */ jsxs(PopoverContent, {
93
108
  align: "start",
@@ -98,7 +113,10 @@ function ProjectPicker({ projectsTree, selectedProjectId, selectedProjectName, o
98
113
  className: "border-b p-2",
99
114
  children: /* @__PURE__ */ jsxs("div", {
100
115
  className: "relative",
101
- children: [/* @__PURE__ */ jsx(Search, { className: "absolute top-1/2 left-2.5 size-3.5 -translate-y-1/2 text-muted-txt" }), /* @__PURE__ */ jsx(Input, {
116
+ children: [/* @__PURE__ */ jsx(Icon, {
117
+ as: Search,
118
+ className: "absolute top-1/2 left-2.5 size-3.5 -translate-y-1/2 text-muted-txt"
119
+ }), /* @__PURE__ */ jsx(Input, {
102
120
  size: "sm",
103
121
  className: "pl-8",
104
122
  placeholder: searchPlaceholder,
@@ -140,7 +158,13 @@ function TreeNode({ node, depth, selectedId, onSelect, collapsedIds, onToggleCol
140
158
  "aria-label": isCollapsed ? `Expand ${node.name}` : `Collapse ${node.name}`,
141
159
  onClick: () => onToggleCollapse(node.id),
142
160
  className: "shrink-0 text-muted-txt hover:text-primary-txt",
143
- children: isCollapsed ? /* @__PURE__ */ jsx(ChevronRight, { className: "size-3.5" }) : /* @__PURE__ */ jsx(ChevronDown, { className: "size-3.5" })
161
+ children: isCollapsed ? /* @__PURE__ */ jsx(Icon, {
162
+ as: ChevronRight,
163
+ className: "size-3.5"
164
+ }) : /* @__PURE__ */ jsx(Icon, {
165
+ as: ChevronDown,
166
+ className: "size-3.5"
167
+ })
144
168
  }) : /* @__PURE__ */ jsx("span", { className: "inline-block w-3.5 shrink-0" }),
145
169
  node.isContextOnly ? /* @__PURE__ */ jsx("span", {
146
170
  className: "flex-1 text-left",
@@ -151,7 +175,10 @@ function TreeNode({ node, depth, selectedId, onSelect, collapsedIds, onToggleCol
151
175
  className: "flex-1 text-left",
152
176
  children: node.name
153
177
  }),
154
- isSelected && /* @__PURE__ */ jsx(Check, { className: "ml-auto size-3.5 shrink-0 text-primary" })
178
+ isSelected && /* @__PURE__ */ jsx(Icon, {
179
+ as: Check,
180
+ className: "ml-auto size-3.5 shrink-0 text-primary"
181
+ })
155
182
  ]
156
183
  }), !isCollapsed && hasChildren && /* @__PURE__ */ jsx("div", {
157
184
  role: "group",
@@ -176,16 +203,14 @@ const DEFAULT_LABELS = {
176
203
  searchPlaceholder: "Search project",
177
204
  emptyStateText: "No projects found",
178
205
  profileMenuLabel: "Profile menu",
179
- logoutLabel: "Logout",
180
- overlayTitle: "Select a Project",
181
- overlayDescription: "Choose a project to get started. You can change it anytime from the header."
206
+ logoutLabel: "Logout"
182
207
  };
183
- //#endregion
184
- //#region src/patterns/Header/api.ts
208
+ /** Hard cap on project pages fetched — guards against a runaway loop. */
209
+ const PROJECTS_MAX_PAGES = 40;
185
210
  const PATHS = {
186
211
  token: "/api/v1/studio-auth/sessions/token",
187
212
  logout: "/api/v1/studio-auth/sessions/logout",
188
- projects: (clientId) => `/api/v1/onboarding/organization/${clientId}/projects`,
213
+ projects: (clientId) => `/api/v1/client-projects/getAllProjects?limit=50&page=1&sort=name&sortOrder=ASC&clientId=${encodeURIComponent(clientId)}&metaData=true`,
189
214
  credits: "/save/api/v1/users"
190
215
  };
191
216
  /** Join a base URL and path without doubling slashes. */
@@ -206,16 +231,77 @@ async function fetchToken(endpoints, fetcher) {
206
231
  const { accessToken } = await res.json();
207
232
  return accessToken;
208
233
  }
234
+ /**
235
+ * Return `url` with the `page` query param set to the given page (and `limit`
236
+ * backfilled when absent). Pagination stays owned by the header: host-provided
237
+ * endpoint URLs don't need — and can't break — the paging params. Handles
238
+ * absolute and relative URLs.
239
+ */
240
+ function withPageParam(url, page) {
241
+ const isAbsolute = /^[a-z][a-z0-9+.-]*:\/\//i.test(url);
242
+ try {
243
+ const u = new URL(url, isAbsolute ? void 0 : "http://relative.invalid");
244
+ u.searchParams.set("page", String(page));
245
+ if (!u.searchParams.has("limit")) u.searchParams.set("limit", String(50));
246
+ return isAbsolute ? u.toString() : `${u.pathname}${u.search}${u.hash}`;
247
+ } catch {
248
+ return url;
249
+ }
250
+ }
251
+ /** The `limit` query param already on a URL, else the default page size. */
252
+ function readLimitParam(url) {
253
+ try {
254
+ const limit = Number(new URL(url, "http://relative.invalid").searchParams.get("limit"));
255
+ return Number.isInteger(limit) && limit > 0 ? limit : 50;
256
+ } catch {
257
+ return 50;
258
+ }
259
+ }
260
+ /** Total node count in a tree page (roots + descendants). */
261
+ function countNodes(tree) {
262
+ return tree.reduce((sum, node) => sum + 1 + countNodes(node.children ?? []), 0);
263
+ }
264
+ /**
265
+ * Merge a page's tree into the accumulated tree. Nodes repeated across pages
266
+ * (e.g. a context-only ancestor whose children span a page boundary) are
267
+ * merged by id instead of duplicated.
268
+ */
269
+ function mergeTrees(into, page) {
270
+ for (const node of page) {
271
+ const existing = into.find((n) => n.id === node.id);
272
+ if (existing) mergeTrees(existing.children, node.children ?? []);
273
+ else into.push({
274
+ ...node,
275
+ children: [...node.children ?? []]
276
+ });
277
+ }
278
+ }
279
+ /**
280
+ * Fetch ALL pages of the paginated projects endpoint and merge them into a
281
+ * single tree, so users with more projects than one page still see everything.
282
+ * The response carries no pagination metadata, so the first page that comes
283
+ * back with fewer than `limit` nodes is treated as the last one.
284
+ */
209
285
  async function fetchProjects(endpoints, clientId, accessToken, fetcher) {
210
- const res = await fetcher(endpoints.projects(clientId), {
211
- credentials: "include",
212
- headers: { Authorization: `Bearer ${accessToken}` }
213
- });
214
- if (!res.ok) throw new Error(`projects request failed: ${res.status}`);
215
- const data = await res.json();
286
+ const projectsTree = [];
287
+ let organizationName;
288
+ const baseUrl = endpoints.projects(clientId);
289
+ const pageLimit = readLimitParam(baseUrl);
290
+ for (let page = 1; page <= PROJECTS_MAX_PAGES; page++) {
291
+ const res = await fetcher(withPageParam(baseUrl, page), {
292
+ credentials: "include",
293
+ headers: { Authorization: `Bearer ${accessToken}` }
294
+ });
295
+ if (!res.ok) throw new Error(`projects request failed: ${res.status}`);
296
+ const body = await res.json();
297
+ const pageTree = body.response?.data?.projectsTree ?? [];
298
+ mergeTrees(projectsTree, pageTree);
299
+ organizationName ??= body.response?.data?.organization?.name;
300
+ if (countNodes(pageTree) < pageLimit) break;
301
+ }
216
302
  return {
217
- projectsTree: data.response?.data?.projectsTree ?? [],
218
- organizationName: data.response?.data?.organization?.name
303
+ projectsTree,
304
+ organizationName
219
305
  };
220
306
  }
221
307
  async function fetchCredits(endpoints, accessToken, fetcher) {
@@ -239,6 +325,8 @@ async function callLogout(endpoints, fetcher) {
239
325
  //#endregion
240
326
  //#region src/patterns/Header/storage.ts
241
327
  const PROJECT_KEY = "ds-header-project";
328
+ const LAST_PROJECT_KEY = "lastSelectedProject";
329
+ const PROJECTS_CACHE_KEY = "ds-header-projects-cache";
242
330
  function getStoredProject() {
243
331
  try {
244
332
  const raw = sessionStorage.getItem(PROJECT_KEY);
@@ -257,6 +345,52 @@ function clearStoredProject() {
257
345
  sessionStorage.removeItem(PROJECT_KEY);
258
346
  } catch {}
259
347
  }
348
+ /** The project the user last explicitly selected, in any tab (localStorage). */
349
+ function getLastSelectedProject() {
350
+ try {
351
+ const raw = localStorage.getItem(LAST_PROJECT_KEY);
352
+ return raw ? JSON.parse(raw) : null;
353
+ } catch {
354
+ return null;
355
+ }
356
+ }
357
+ function setLastSelectedProject(project) {
358
+ try {
359
+ localStorage.setItem(LAST_PROJECT_KEY, JSON.stringify(project));
360
+ } catch {}
361
+ }
362
+ function projectsCacheKey(clientId, userId) {
363
+ return `${PROJECTS_CACHE_KEY}:${clientId}:${userId}`;
364
+ }
365
+ /** The session-cached projects result for this client + user, or null on miss. */
366
+ function getCachedProjects(clientId, userId) {
367
+ try {
368
+ const raw = sessionStorage.getItem(projectsCacheKey(clientId, userId));
369
+ if (!raw) return null;
370
+ const cached = JSON.parse(raw);
371
+ if (!Array.isArray(cached.projectsTree)) return null;
372
+ return {
373
+ projectsTree: cached.projectsTree,
374
+ organizationName: cached.organizationName
375
+ };
376
+ } catch {
377
+ return null;
378
+ }
379
+ }
380
+ function setCachedProjects(clientId, userId, data) {
381
+ try {
382
+ sessionStorage.setItem(projectsCacheKey(clientId, userId), JSON.stringify(data));
383
+ } catch {}
384
+ }
385
+ /** Drop every cached projects entry (all clients/users) — used on logout. */
386
+ function clearCachedProjects() {
387
+ try {
388
+ for (let i = sessionStorage.length - 1; i >= 0; i--) {
389
+ const key = sessionStorage.key(i);
390
+ if (key?.startsWith(PROJECTS_CACHE_KEY)) sessionStorage.removeItem(key);
391
+ }
392
+ } catch {}
393
+ }
260
394
  //#endregion
261
395
  //#region src/patterns/Header/header-store.ts
262
396
  function initialState() {
@@ -292,14 +426,22 @@ const headerStore = {
292
426
  getServerSnapshot() {
293
427
  return SERVER_SNAPSHOT;
294
428
  },
295
- /** Set the selected project. `name` is best-effort; the Header backfills it from the tree. */
296
- setProject(id, name = "", clientId) {
297
- if (id) setStoredProject({
298
- id,
299
- name,
300
- clientId: clientId ?? state.clientId
301
- });
302
- else clearStoredProject();
429
+ /**
430
+ * Set the selected project. `name` is best-effort; the Header backfills it from
431
+ * the tree. Explicit selections are also remembered in localStorage as the
432
+ * cross-tab default; pass `remember: false` for internal backfill/auto-select
433
+ * writes so they don't overwrite the user's last explicit choice.
434
+ */
435
+ setProject(id, name = "", clientId, { remember = true } = {}) {
436
+ if (id) {
437
+ const project = {
438
+ id,
439
+ name,
440
+ clientId: clientId ?? state.clientId
441
+ };
442
+ setStoredProject(project);
443
+ if (remember) setLastSelectedProject(project);
444
+ } else clearStoredProject();
303
445
  state = {
304
446
  ...state,
305
447
  selectedProjectId: id,
@@ -432,7 +574,7 @@ function isSessionValid(environmentId) {
432
574
  const TOGGLE_PROJECT_DROPDOWN_EVENT = "toggle-project-dropdown";
433
575
  const DEFAULT_STALE_TIME = 5 * 6e4;
434
576
  const DEFAULT_GC_TIME = 10 * 6e4;
435
- function useGlobalHeader({ apiBaseUrl, environmentId, clientId, _dangerouslyInjectAccessToken: injectedToken, showProjectDropdown = false, showProfile = false, showOrg = false, showCredits = false, endpoints: endpointOverrides, fetcher: fetcherProp, staleTime = DEFAULT_STALE_TIME, gcTime = DEFAULT_GC_TIME, onProjectChange }) {
577
+ function useGlobalHeader({ apiBaseUrl, environmentId, clientId, defaultProjectId, _dangerouslyInjectAccessToken: injectedToken, showProjectDropdown = false, showProfile = false, showOrg = false, showCredits = false, endpoints: endpointOverrides, fetcher: fetcherProp, staleTime = DEFAULT_STALE_TIME, gcTime = DEFAULT_GC_TIME, onProjectChange }) {
436
578
  const fetcher = React.useMemo(() => fetcherProp ?? ((input, init) => fetch(input, init)), [fetcherProp]);
437
579
  const endpoints = React.useMemo(() => buildEndpoints(apiBaseUrl, endpointOverrides), [apiBaseUrl, endpointOverrides]);
438
580
  const isAuthenticated = isSessionValid(environmentId);
@@ -450,15 +592,25 @@ function useGlobalHeader({ apiBaseUrl, environmentId, clientId, _dangerouslyInje
450
592
  });
451
593
  const token = injectedToken ?? tokenQuery.data;
452
594
  const effectiveClientId = clientId ?? claims?.clientId;
595
+ const wantsProjects = showProjectDropdown || showOrg;
596
+ const userId = claims?.userId ?? "";
453
597
  const projectsQuery = useQuery({
454
598
  queryKey: [
455
599
  "ds-header",
456
600
  "projects",
457
601
  effectiveClientId,
602
+ userId,
458
603
  token
459
604
  ],
460
- queryFn: () => fetchProjects(endpoints, effectiveClientId, token, fetcher),
461
- enabled: isAuthenticated && !!token && !!effectiveClientId && (showProjectDropdown || showOrg),
605
+ queryFn: async () => {
606
+ const id = effectiveClientId;
607
+ const cached = getCachedProjects(id, userId);
608
+ if (cached) return cached;
609
+ const fresh = await fetchProjects(endpoints, id, token, fetcher);
610
+ setCachedProjects(id, userId, fresh);
611
+ return fresh;
612
+ },
613
+ enabled: isAuthenticated && !!token && !!effectiveClientId && wantsProjects,
462
614
  staleTime,
463
615
  gcTime
464
616
  });
@@ -484,6 +636,10 @@ function useGlobalHeader({ apiBaseUrl, environmentId, clientId, _dangerouslyInje
484
636
  }
485
637
  }, [apiBaseUrl]);
486
638
  const selection = useHeaderStore();
639
+ const onProjectChangeRef = React.useRef(onProjectChange);
640
+ React.useEffect(() => {
641
+ onProjectChangeRef.current = onProjectChange;
642
+ });
487
643
  React.useEffect(() => {
488
644
  if (effectiveClientId) headerStore.reconcileClient(effectiveClientId);
489
645
  }, [effectiveClientId]);
@@ -491,13 +647,29 @@ function useGlobalHeader({ apiBaseUrl, environmentId, clientId, _dangerouslyInje
491
647
  if (!projectsQuery.data) return;
492
648
  const tree = projectsQuery.data.projectsTree;
493
649
  const id = headerStore.getSnapshot().selectedProjectId;
494
- if (id && !nodeExistsInTree(tree, id)) headerStore.clearProject();
495
- else if (id) {
650
+ if (id && nodeExistsInTree(tree, id)) {
496
651
  const name = findProjectName(tree, id);
497
- if (name && name !== headerStore.getSnapshot().selectedProjectName) headerStore.setProject(id, name, effectiveClientId);
652
+ if (name && name !== headerStore.getSnapshot().selectedProjectName) headerStore.setProject(id, name, effectiveClientId, { remember: false });
653
+ } else {
654
+ const last = getLastSelectedProject();
655
+ const fallback = last && nodeExistsInTree(tree, last.id) ? {
656
+ id: last.id,
657
+ name: findProjectName(tree, last.id) ?? last.name
658
+ } : defaultProjectId && nodeExistsInTree(tree, defaultProjectId) ? {
659
+ id: defaultProjectId,
660
+ name: findProjectName(tree, defaultProjectId) ?? ""
661
+ } : firstSelectableProject(tree);
662
+ if (fallback) {
663
+ headerStore.setProject(fallback.id, fallback.name, effectiveClientId, { remember: false });
664
+ onProjectChangeRef.current?.(fallback.id);
665
+ } else if (id) headerStore.clearProject();
498
666
  }
499
667
  headerStore.setOrganization(projectsQuery.data.organizationName, effectiveClientId);
500
- }, [projectsQuery.data, effectiveClientId]);
668
+ }, [
669
+ projectsQuery.data,
670
+ effectiveClientId,
671
+ defaultProjectId
672
+ ]);
501
673
  React.useEffect(() => {
502
674
  if (creditsQuery.data !== void 0) headerStore.setCredits(creditsQuery.data);
503
675
  }, [creditsQuery.data]);
@@ -508,6 +680,7 @@ function useGlobalHeader({ apiBaseUrl, environmentId, clientId, _dangerouslyInje
508
680
  };
509
681
  const logout = () => {
510
682
  headerStore.clearProject();
683
+ clearCachedProjects();
511
684
  callLogout(endpoints, fetcher);
512
685
  };
513
686
  const [projectDropdownVisible, setProjectDropdownVisible] = React.useState(showProjectDropdown);
@@ -532,7 +705,6 @@ function useGlobalHeader({ apiBaseUrl, environmentId, clientId, _dangerouslyInje
532
705
  credits: selection.credits,
533
706
  creditsHref,
534
707
  projectDropdownVisible,
535
- showOverlay: isAuthenticated && projectDropdownVisible && !selection.selectedProjectId,
536
708
  selectProject,
537
709
  logout
538
710
  };
@@ -644,7 +816,7 @@ function Header(props) {
644
816
  children: /* @__PURE__ */ jsx(HeaderInner, { ...props })
645
817
  });
646
818
  }
647
- function HeaderInner({ logoType, logoHref, showOrg = false, showProjectDropdown = false, showProfile = false, showThemeSwitcher = false, showCredits = false, pageTitle, feedbackUrl, logoAddon, className, onCloseProjectOverlay, ...rest }) {
819
+ function HeaderInner({ logoType, logoHref, showOrg = false, showProjectDropdown = false, showProfile = false, showThemeSwitcher = false, showCredits = false, pageTitle, feedbackUrl, logoAddon, actionsStart, actionsEnd, className, ...rest }) {
648
820
  const { product } = useTheme();
649
821
  const brand = logoType ?? product;
650
822
  const state = useGlobalHeader({
@@ -658,8 +830,8 @@ function HeaderInner({ logoType, logoHref, showOrg = false, showProjectDropdown
658
830
  const showOrgUi = showOrg && state.isAuthenticated;
659
831
  const showProfileUi = showProfile && state.isAuthenticated;
660
832
  const showCreditsUi = showCredits && state.isAuthenticated && state.credits !== void 0;
661
- const showActions = showThemeSwitcher || showProfileUi || showCreditsUi || !!feedbackUrl;
662
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs(HeaderBar, {
833
+ const showActions = showThemeSwitcher || showProfileUi || showCreditsUi || !!feedbackUrl || !!actionsStart || !!actionsEnd;
834
+ return /* @__PURE__ */ jsxs(HeaderBar, {
663
835
  className,
664
836
  children: [
665
837
  /* @__PURE__ */ jsx(HeaderLogo, {
@@ -693,6 +865,7 @@ function HeaderInner({ logoType, logoHref, showOrg = false, showProjectDropdown
693
865
  showActions && /* @__PURE__ */ jsxs("div", {
694
866
  className: "ml-auto flex items-center gap-2",
695
867
  children: [
868
+ actionsStart,
696
869
  feedbackUrl && /* @__PURE__ */ jsx(Button, {
697
870
  variant: "ghost",
698
871
  size: "icon",
@@ -715,78 +888,11 @@ function HeaderInner({ logoType, logoHref, showOrg = false, showProjectDropdown
715
888
  showProfileUi && /* @__PURE__ */ jsx(ProfileMenu, {
716
889
  email: state.userEmail,
717
890
  onLogout: state.logout
718
- })
891
+ }),
892
+ actionsEnd
719
893
  ]
720
894
  })
721
895
  ]
722
- }), showProjectUi && state.showOverlay && /* @__PURE__ */ jsx(ProjectOverlay, {
723
- organizationName: state.organizationName,
724
- projectsTree: state.projectsTree,
725
- selectedProjectId: state.selectedProjectId,
726
- onSelect: state.selectProject,
727
- isLoading: state.isProjectsLoading,
728
- onClose: onCloseProjectOverlay
729
- })] });
730
- }
731
- function ProjectOverlay({ organizationName, projectsTree, selectedProjectId, onSelect, isLoading, onClose }) {
732
- return /* @__PURE__ */ jsx("div", {
733
- role: "dialog",
734
- "aria-modal": "true",
735
- "aria-label": DEFAULT_LABELS.overlayTitle,
736
- className: "fixed inset-0 z-50 flex items-center justify-center bg-primary-bg/80 backdrop-blur-sm",
737
- children: /* @__PURE__ */ jsxs("div", {
738
- className: "relative mx-1 flex w-full max-w-md flex-col items-center gap-6 rounded-16 border bg-glass-none-bg p-2 text-primary-txt shadow-xl",
739
- children: [
740
- /* @__PURE__ */ jsx(Button, {
741
- variant: "ghost",
742
- size: "icon",
743
- onClick: onClose ?? (() => window.history.back()),
744
- className: "absolute top-4 right-4",
745
- "aria-label": "Close",
746
- children: /* @__PURE__ */ jsx(X, { className: "size-5" })
747
- }),
748
- /* @__PURE__ */ jsxs("div", {
749
- className: "flex flex-col items-center gap-3 text-center",
750
- children: [
751
- /* @__PURE__ */ jsx("div", {
752
- className: "rounded-full bg-primary/10 p-4",
753
- children: /* @__PURE__ */ jsx(FolderOpen, { className: "size-8 text-primary" })
754
- }),
755
- /* @__PURE__ */ jsx("h2", {
756
- className: "font-semibold text-primary-txt text-xl",
757
- children: DEFAULT_LABELS.overlayTitle
758
- }),
759
- /* @__PURE__ */ jsx("p", {
760
- className: "text-muted-txt text-sm",
761
- children: DEFAULT_LABELS.overlayDescription
762
- })
763
- ]
764
- }),
765
- /* @__PURE__ */ jsxs("div", {
766
- className: "flex w-full justify-center gap-2",
767
- children: [organizationName && /* @__PURE__ */ jsxs("div", {
768
- className: cn(PILL, "select-none"),
769
- title: organizationName,
770
- children: [/* @__PURE__ */ jsxs("span", {
771
- className: "shrink-0 text-muted-txt",
772
- children: [DEFAULT_LABELS.orgLabel, ":"]
773
- }), /* @__PURE__ */ jsx("span", {
774
- className: "max-w-52 truncate font-medium",
775
- children: organizationName
776
- })]
777
- }), /* @__PURE__ */ jsx(ProjectPicker, {
778
- projectsTree,
779
- selectedProjectId,
780
- onSelect,
781
- projectLabel: DEFAULT_LABELS.projectLabel,
782
- projectPlaceholder: DEFAULT_LABELS.projectPlaceholder,
783
- searchPlaceholder: DEFAULT_LABELS.searchPlaceholder,
784
- emptyStateText: DEFAULT_LABELS.emptyStateText,
785
- isLoading
786
- })]
787
- })
788
- ]
789
- })
790
896
  });
791
897
  }
792
898
  //#endregion