shadcn-glass-ui 2.2.1 → 2.2.4

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 (368) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/dist/cli/commands/info.d.ts +15 -0
  3. package/dist/cli/commands/info.d.ts.map +1 -0
  4. package/dist/cli/commands/list.d.ts +23 -0
  5. package/dist/cli/commands/list.d.ts.map +1 -0
  6. package/dist/cli/index.cjs +1 -1
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/{index.js → index.mjs} +1 -1
  9. package/dist/cli/index.mjs.map +1 -0
  10. package/dist/cli/utils/format.d.ts +76 -0
  11. package/dist/cli/utils/format.d.ts.map +1 -0
  12. package/dist/cli/utils/fuzzy-search.d.ts +73 -0
  13. package/dist/cli/utils/fuzzy-search.d.ts.map +1 -0
  14. package/dist/cli/utils/load-exports.d.ts +141 -0
  15. package/dist/cli/utils/load-exports.d.ts.map +1 -0
  16. package/dist/components/blocks/avatar-gallery/index.d.ts +2 -0
  17. package/dist/components/blocks/avatar-gallery/index.d.ts.map +1 -0
  18. package/dist/components/blocks/avatar-gallery/page.d.ts +7 -0
  19. package/dist/components/blocks/avatar-gallery/page.d.ts.map +1 -0
  20. package/dist/components/blocks/badges/index.d.ts +2 -0
  21. package/dist/components/blocks/badges/index.d.ts.map +1 -0
  22. package/dist/components/blocks/badges/page.d.ts +7 -0
  23. package/dist/components/blocks/badges/page.d.ts.map +1 -0
  24. package/dist/components/blocks/buttons/index.d.ts +2 -0
  25. package/dist/components/blocks/buttons/index.d.ts.map +1 -0
  26. package/dist/components/blocks/buttons/page.d.ts +7 -0
  27. package/dist/components/blocks/buttons/page.d.ts.map +1 -0
  28. package/dist/components/blocks/form-elements/index.d.ts +2 -0
  29. package/dist/components/blocks/form-elements/index.d.ts.map +1 -0
  30. package/dist/components/blocks/form-elements/page.d.ts +7 -0
  31. package/dist/components/blocks/form-elements/page.d.ts.map +1 -0
  32. package/dist/components/blocks/index.d.ts +14 -0
  33. package/dist/components/blocks/index.d.ts.map +1 -0
  34. package/dist/components/blocks/notifications/index.d.ts +2 -0
  35. package/dist/components/blocks/notifications/index.d.ts.map +1 -0
  36. package/dist/components/blocks/notifications/page.d.ts +7 -0
  37. package/dist/components/blocks/notifications/page.d.ts.map +1 -0
  38. package/dist/components/blocks/progress/index.d.ts +2 -0
  39. package/dist/components/blocks/progress/index.d.ts.map +1 -0
  40. package/dist/components/blocks/progress/page.d.ts +7 -0
  41. package/dist/components/blocks/progress/page.d.ts.map +1 -0
  42. package/dist/components/blocks/registry.d.ts +16 -0
  43. package/dist/components/blocks/registry.d.ts.map +1 -0
  44. package/dist/components/demos/AnimatedBackground.d.ts +5 -0
  45. package/dist/components/demos/AnimatedBackground.d.ts.map +1 -0
  46. package/dist/components/demos/ComponentShowcase.d.ts +6 -0
  47. package/dist/components/demos/ComponentShowcase.d.ts.map +1 -0
  48. package/dist/components/demos/DesktopShowcase.d.ts +3 -0
  49. package/dist/components/demos/DesktopShowcase.d.ts.map +1 -0
  50. package/dist/components/demos/GlassFixesDemo.d.ts +6 -0
  51. package/dist/components/demos/GlassFixesDemo.d.ts.map +1 -0
  52. package/dist/components/demos/MobileShowcase.d.ts +3 -0
  53. package/dist/components/demos/MobileShowcase.d.ts.map +1 -0
  54. package/dist/components/glass/atomic/expandable-header-glass.d.ts +16 -0
  55. package/dist/components/glass/atomic/expandable-header-glass.d.ts.map +1 -0
  56. package/dist/components/glass/atomic/icon-button-glass.d.ts +18 -0
  57. package/dist/components/glass/atomic/icon-button-glass.d.ts.map +1 -0
  58. package/dist/components/glass/atomic/index.d.ts +14 -0
  59. package/dist/components/glass/atomic/index.d.ts.map +1 -0
  60. package/dist/components/glass/atomic/insight-card-glass.d.ts +22 -0
  61. package/dist/components/glass/atomic/insight-card-glass.d.ts.map +1 -0
  62. package/dist/components/glass/atomic/search-box-glass.d.ts +17 -0
  63. package/dist/components/glass/atomic/search-box-glass.d.ts.map +1 -0
  64. package/dist/components/glass/atomic/sort-dropdown-glass.d.ts +38 -0
  65. package/dist/components/glass/atomic/sort-dropdown-glass.d.ts.map +1 -0
  66. package/dist/components/glass/atomic/stat-item-glass.d.ts +22 -0
  67. package/dist/components/glass/atomic/stat-item-glass.d.ts.map +1 -0
  68. package/dist/components/glass/atomic/theme-toggle-glass.d.ts +11 -0
  69. package/dist/components/glass/atomic/theme-toggle-glass.d.ts.map +1 -0
  70. package/dist/components/glass/composite/ai-card-glass.d.ts +7 -0
  71. package/dist/components/glass/composite/ai-card-glass.d.ts.map +1 -0
  72. package/dist/components/glass/composite/career-stats-header-glass.d.ts +15 -0
  73. package/dist/components/glass/composite/career-stats-header-glass.d.ts.map +1 -0
  74. package/dist/components/glass/composite/circular-metric-glass.d.ts +24 -0
  75. package/dist/components/glass/composite/circular-metric-glass.d.ts.map +1 -0
  76. package/dist/components/glass/composite/contribution-metrics-glass.d.ts +15 -0
  77. package/dist/components/glass/composite/contribution-metrics-glass.d.ts.map +1 -0
  78. package/dist/components/glass/composite/index.d.ts +22 -0
  79. package/dist/components/glass/composite/index.d.ts.map +1 -0
  80. package/dist/components/glass/composite/metric-card-glass.d.ts +96 -0
  81. package/dist/components/glass/composite/metric-card-glass.d.ts.map +1 -0
  82. package/dist/components/glass/composite/metrics-grid-glass.d.ts +17 -0
  83. package/dist/components/glass/composite/metrics-grid-glass.d.ts.map +1 -0
  84. package/dist/components/glass/composite/repository-card-glass.d.ts +16 -0
  85. package/dist/components/glass/composite/repository-card-glass.d.ts.map +1 -0
  86. package/dist/components/glass/composite/repository-header-glass.d.ts +16 -0
  87. package/dist/components/glass/composite/repository-header-glass.d.ts.map +1 -0
  88. package/dist/components/glass/composite/repository-metadata-glass.d.ts +13 -0
  89. package/dist/components/glass/composite/repository-metadata-glass.d.ts.map +1 -0
  90. package/dist/components/glass/composite/split-layout-glass/index.d.ts +16 -0
  91. package/dist/components/glass/composite/split-layout-glass/index.d.ts.map +1 -0
  92. package/dist/components/glass/composite/split-layout-glass/split-layout-accordion.d.ts +66 -0
  93. package/dist/components/glass/composite/split-layout-glass/split-layout-accordion.d.ts.map +1 -0
  94. package/dist/components/glass/composite/split-layout-glass/split-layout-context.d.ts +122 -0
  95. package/dist/components/glass/composite/split-layout-glass/split-layout-context.d.ts.map +1 -0
  96. package/dist/components/glass/composite/split-layout-glass/split-layout-glass.d.ts +177 -0
  97. package/dist/components/glass/composite/split-layout-glass/split-layout-glass.d.ts.map +1 -0
  98. package/dist/components/glass/composite/trust-score-display-glass.d.ts +15 -0
  99. package/dist/components/glass/composite/trust-score-display-glass.d.ts.map +1 -0
  100. package/dist/components/glass/composite/user-info-glass.d.ts +15 -0
  101. package/dist/components/glass/composite/user-info-glass.d.ts.map +1 -0
  102. package/dist/components/glass/composite/user-stats-line-glass.d.ts +15 -0
  103. package/dist/components/glass/composite/user-stats-line-glass.d.ts.map +1 -0
  104. package/dist/components/glass/composite/year-card-glass.d.ts +53 -0
  105. package/dist/components/glass/composite/year-card-glass.d.ts.map +1 -0
  106. package/dist/components/glass/index.d.ts +16 -0
  107. package/dist/components/glass/index.d.ts.map +1 -0
  108. package/dist/components/glass/primitives/form-field-wrapper.d.ts +69 -0
  109. package/dist/components/glass/primitives/form-field-wrapper.d.ts.map +1 -0
  110. package/dist/components/glass/primitives/index.d.ts +12 -0
  111. package/dist/components/glass/primitives/index.d.ts.map +1 -0
  112. package/dist/components/glass/primitives/interactive-card.d.ts +91 -0
  113. package/dist/components/glass/primitives/interactive-card.d.ts.map +1 -0
  114. package/dist/components/glass/primitives/style-utils.d.ts +147 -0
  115. package/dist/components/glass/primitives/style-utils.d.ts.map +1 -0
  116. package/dist/components/glass/primitives/touch-target.d.ts +46 -0
  117. package/dist/components/glass/primitives/touch-target.d.ts.map +1 -0
  118. package/dist/components/glass/sections/career-stats-glass.d.ts +17 -0
  119. package/dist/components/glass/sections/career-stats-glass.d.ts.map +1 -0
  120. package/dist/components/glass/sections/flags-section-glass.d.ts +13 -0
  121. package/dist/components/glass/sections/flags-section-glass.d.ts.map +1 -0
  122. package/dist/components/glass/sections/header-branding-glass.d.ts +16 -0
  123. package/dist/components/glass/sections/header-branding-glass.d.ts.map +1 -0
  124. package/dist/components/glass/sections/header-nav-glass.d.ts +7 -0
  125. package/dist/components/glass/sections/header-nav-glass.d.ts.map +1 -0
  126. package/dist/components/glass/sections/index.d.ts +13 -0
  127. package/dist/components/glass/sections/index.d.ts.map +1 -0
  128. package/dist/components/glass/sections/profile-header-glass.d.ts +16 -0
  129. package/dist/components/glass/sections/profile-header-glass.d.ts.map +1 -0
  130. package/dist/components/glass/sections/projects-list-glass.d.ts +42 -0
  131. package/dist/components/glass/sections/projects-list-glass.d.ts.map +1 -0
  132. package/dist/components/glass/sections/trust-score-card-glass.d.ts +12 -0
  133. package/dist/components/glass/sections/trust-score-card-glass.d.ts.map +1 -0
  134. package/dist/components/glass/specialized/base-progress-glass.d.ts +8 -0
  135. package/dist/components/glass/specialized/base-progress-glass.d.ts.map +1 -0
  136. package/dist/components/glass/specialized/flag-alert-glass.d.ts +8 -0
  137. package/dist/components/glass/specialized/flag-alert-glass.d.ts.map +1 -0
  138. package/dist/components/glass/specialized/index.d.ts +21 -0
  139. package/dist/components/glass/specialized/index.d.ts.map +1 -0
  140. package/dist/components/glass/specialized/language-bar-glass.d.ts +24 -0
  141. package/dist/components/glass/specialized/language-bar-glass.d.ts.map +1 -0
  142. package/dist/components/glass/specialized/profile-avatar-glass.d.ts +26 -0
  143. package/dist/components/glass/specialized/profile-avatar-glass.d.ts.map +1 -0
  144. package/dist/components/glass/specialized/progress-glass.d.ts +9 -0
  145. package/dist/components/glass/specialized/progress-glass.d.ts.map +1 -0
  146. package/dist/components/glass/specialized/rainbow-progress-glass.d.ts +8 -0
  147. package/dist/components/glass/specialized/rainbow-progress-glass.d.ts.map +1 -0
  148. package/dist/components/glass/specialized/segmented-control-glass.d.ts +11 -0
  149. package/dist/components/glass/specialized/segmented-control-glass.d.ts.map +1 -0
  150. package/dist/components/glass/specialized/sparkline-glass.d.ts +34 -0
  151. package/dist/components/glass/specialized/sparkline-glass.d.ts.map +1 -0
  152. package/dist/components/glass/specialized/status-indicator-glass.d.ts +8 -0
  153. package/dist/components/glass/specialized/status-indicator-glass.d.ts.map +1 -0
  154. package/dist/components/glass/ui/alert-glass.d.ts +13 -0
  155. package/dist/components/glass/ui/alert-glass.d.ts.map +1 -0
  156. package/dist/components/glass/ui/avatar-glass.d.ts +58 -0
  157. package/dist/components/glass/ui/avatar-glass.d.ts.map +1 -0
  158. package/dist/components/glass/ui/badge-glass.d.ts +74 -0
  159. package/dist/components/glass/ui/badge-glass.d.ts.map +1 -0
  160. package/dist/components/glass/ui/button-glass.d.ts +110 -0
  161. package/dist/components/glass/ui/button-glass.d.ts.map +1 -0
  162. package/dist/components/glass/ui/card-glass.d.ts +115 -0
  163. package/dist/components/glass/ui/card-glass.d.ts.map +1 -0
  164. package/dist/components/glass/ui/checkbox-glass.d.ts +80 -0
  165. package/dist/components/glass/ui/checkbox-glass.d.ts.map +1 -0
  166. package/dist/components/glass/ui/circular-progress-glass.d.ts +36 -0
  167. package/dist/components/glass/ui/circular-progress-glass.d.ts.map +1 -0
  168. package/dist/components/glass/ui/combobox-glass.d.ts +61 -0
  169. package/dist/components/glass/ui/combobox-glass.d.ts.map +1 -0
  170. package/dist/components/glass/ui/dropdown-glass.d.ts +83 -0
  171. package/dist/components/glass/ui/dropdown-glass.d.ts.map +1 -0
  172. package/dist/components/glass/ui/dropdown-menu-glass.d.ts +77 -0
  173. package/dist/components/glass/ui/dropdown-menu-glass.d.ts.map +1 -0
  174. package/dist/components/glass/ui/glass-card.d.ts +78 -0
  175. package/dist/components/glass/ui/glass-card.d.ts.map +1 -0
  176. package/dist/components/glass/ui/index.d.ts +44 -0
  177. package/dist/components/glass/ui/index.d.ts.map +1 -0
  178. package/dist/components/glass/ui/input-glass.d.ts +98 -0
  179. package/dist/components/glass/ui/input-glass.d.ts.map +1 -0
  180. package/dist/components/glass/ui/modal-glass.d.ts +180 -0
  181. package/dist/components/glass/ui/modal-glass.d.ts.map +1 -0
  182. package/dist/components/glass/ui/notification-glass.d.ts +13 -0
  183. package/dist/components/glass/ui/notification-glass.d.ts.map +1 -0
  184. package/dist/components/glass/ui/popover-glass.d.ts +71 -0
  185. package/dist/components/glass/ui/popover-glass.d.ts.map +1 -0
  186. package/dist/components/glass/ui/sidebar-glass/index.d.ts +100 -0
  187. package/dist/components/glass/ui/sidebar-glass/index.d.ts.map +1 -0
  188. package/dist/components/glass/ui/sidebar-glass/sidebar-context.d.ts +96 -0
  189. package/dist/components/glass/ui/sidebar-glass/sidebar-context.d.ts.map +1 -0
  190. package/dist/components/glass/ui/sidebar-glass/sidebar-glass.d.ts +88 -0
  191. package/dist/components/glass/ui/sidebar-glass/sidebar-glass.d.ts.map +1 -0
  192. package/dist/components/glass/ui/sidebar-glass/sidebar-menu.d.ts +121 -0
  193. package/dist/components/glass/ui/sidebar-glass/sidebar-menu.d.ts.map +1 -0
  194. package/dist/components/glass/ui/skeleton-glass.d.ts +8 -0
  195. package/dist/components/glass/ui/skeleton-glass.d.ts.map +1 -0
  196. package/dist/components/glass/ui/slider-glass.d.ts +38 -0
  197. package/dist/components/glass/ui/slider-glass.d.ts.map +1 -0
  198. package/dist/components/glass/ui/stepper-glass.d.ts +63 -0
  199. package/dist/components/glass/ui/stepper-glass.d.ts.map +1 -0
  200. package/dist/components/glass/ui/tabs-glass.d.ts +149 -0
  201. package/dist/components/glass/ui/tabs-glass.d.ts.map +1 -0
  202. package/dist/components/glass/ui/toggle-glass.d.ts +27 -0
  203. package/dist/components/glass/ui/toggle-glass.d.ts.map +1 -0
  204. package/dist/components/glass/ui/tooltip-glass.d.ts +65 -0
  205. package/dist/components/glass/ui/tooltip-glass.d.ts.map +1 -0
  206. package/dist/components/ui/alert.d.ts +8 -0
  207. package/dist/components/ui/alert.d.ts.map +1 -0
  208. package/dist/components/ui/avatar.d.ts +7 -0
  209. package/dist/components/ui/avatar.d.ts.map +1 -0
  210. package/dist/components/ui/badge.d.ts +8 -0
  211. package/dist/components/ui/badge.d.ts.map +1 -0
  212. package/dist/components/ui/button.d.ts +8 -0
  213. package/dist/components/ui/button.d.ts.map +1 -0
  214. package/dist/components/ui/card.d.ts +10 -0
  215. package/dist/components/ui/card.d.ts.map +1 -0
  216. package/dist/components/ui/chart.d.ts +69 -0
  217. package/dist/components/ui/chart.d.ts.map +1 -0
  218. package/dist/components/ui/checkbox.d.ts +5 -0
  219. package/dist/components/ui/checkbox.d.ts.map +1 -0
  220. package/dist/components/ui/collapsible.d.ts +6 -0
  221. package/dist/components/ui/collapsible.d.ts.map +1 -0
  222. package/dist/components/ui/command.d.ts +19 -0
  223. package/dist/components/ui/command.d.ts.map +1 -0
  224. package/dist/components/ui/dialog.d.ts +16 -0
  225. package/dist/components/ui/dialog.d.ts.map +1 -0
  226. package/dist/components/ui/dropdown-menu.d.ts +26 -0
  227. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  228. package/dist/components/ui/input.d.ts +4 -0
  229. package/dist/components/ui/input.d.ts.map +1 -0
  230. package/dist/components/ui/popover.d.ts +8 -0
  231. package/dist/components/ui/popover.d.ts.map +1 -0
  232. package/dist/components/ui/progress.d.ts +5 -0
  233. package/dist/components/ui/progress.d.ts.map +1 -0
  234. package/dist/components/ui/scroll-area.d.ts +6 -0
  235. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  236. package/dist/components/ui/separator.d.ts +5 -0
  237. package/dist/components/ui/separator.d.ts.map +1 -0
  238. package/dist/components/ui/skeleton.d.ts +3 -0
  239. package/dist/components/ui/skeleton.d.ts.map +1 -0
  240. package/dist/components/ui/slider.d.ts +5 -0
  241. package/dist/components/ui/slider.d.ts.map +1 -0
  242. package/dist/components/ui/sonner.d.ts +4 -0
  243. package/dist/components/ui/sonner.d.ts.map +1 -0
  244. package/dist/components/ui/switch.d.ts +5 -0
  245. package/dist/components/ui/switch.d.ts.map +1 -0
  246. package/dist/components/ui/tabs.d.ts +8 -0
  247. package/dist/components/ui/tabs.d.ts.map +1 -0
  248. package/dist/components/ui/tooltip.d.ts +8 -0
  249. package/dist/components/ui/tooltip.d.ts.map +1 -0
  250. package/dist/components.cjs +4 -4
  251. package/dist/components.d.ts +56 -1932
  252. package/dist/components.d.ts.map +1 -0
  253. package/dist/components.mjs +5 -0
  254. package/dist/hooks.cjs +2 -2
  255. package/dist/hooks.d.ts +5 -225
  256. package/dist/hooks.d.ts.map +1 -0
  257. package/dist/{hooks.js → hooks.mjs} +2 -2
  258. package/dist/index.cjs +138 -1109
  259. package/dist/index.cjs.map +1 -1
  260. package/dist/index.d.ts +81 -1
  261. package/dist/index.d.ts.map +1 -0
  262. package/dist/{index.js → index.mjs} +116 -1115
  263. package/dist/index.mjs.map +1 -0
  264. package/dist/lib/config.d.ts +28 -0
  265. package/dist/lib/config.d.ts.map +1 -0
  266. package/dist/lib/hooks/index.d.ts +11 -0
  267. package/dist/lib/hooks/index.d.ts.map +1 -0
  268. package/dist/lib/hooks/use-focus.d.ts +61 -0
  269. package/dist/lib/hooks/use-focus.d.ts.map +1 -0
  270. package/dist/lib/hooks/use-hover.d.ts +54 -0
  271. package/dist/lib/hooks/use-hover.d.ts.map +1 -0
  272. package/dist/lib/hooks/use-responsive.d.ts +44 -0
  273. package/dist/lib/hooks/use-responsive.d.ts.map +1 -0
  274. package/dist/lib/hooks/use-wallpaper-tint.d.ts +57 -0
  275. package/dist/lib/hooks/use-wallpaper-tint.d.ts.map +1 -0
  276. package/dist/lib/hooks.d.ts +92 -0
  277. package/dist/lib/hooks.d.ts.map +1 -0
  278. package/dist/lib/theme/tokens.d.ts +441 -0
  279. package/dist/lib/theme/tokens.d.ts.map +1 -0
  280. package/dist/lib/theme-context.d.ts +115 -0
  281. package/dist/lib/theme-context.d.ts.map +1 -0
  282. package/dist/lib/types.d.ts +24 -0
  283. package/dist/lib/types.d.ts.map +1 -0
  284. package/dist/lib/utils.d.ts +8 -0
  285. package/dist/lib/utils.d.ts.map +1 -0
  286. package/dist/lib/variants/alert-glass-variants.d.ts +10 -0
  287. package/dist/lib/variants/alert-glass-variants.d.ts.map +1 -0
  288. package/dist/lib/variants/alert-variants.d.ts +8 -0
  289. package/dist/lib/variants/alert-variants.d.ts.map +1 -0
  290. package/dist/lib/variants/avatar-glass-variants.d.ts +12 -0
  291. package/dist/lib/variants/avatar-glass-variants.d.ts.map +1 -0
  292. package/dist/lib/variants/badge-glass-variants.d.ts +10 -0
  293. package/dist/lib/variants/badge-glass-variants.d.ts.map +1 -0
  294. package/dist/lib/variants/badge-variants.d.ts +8 -0
  295. package/dist/lib/variants/badge-variants.d.ts.map +1 -0
  296. package/dist/lib/variants/button-glass-variants.d.ts +29 -0
  297. package/dist/lib/variants/button-glass-variants.d.ts.map +1 -0
  298. package/dist/lib/variants/button-variants.d.ts +9 -0
  299. package/dist/lib/variants/button-variants.d.ts.map +1 -0
  300. package/dist/lib/variants/dropdown-content-styles.d.ts +102 -0
  301. package/dist/lib/variants/dropdown-content-styles.d.ts.map +1 -0
  302. package/dist/lib/variants/dropdown-glass-variants.d.ts +9 -0
  303. package/dist/lib/variants/dropdown-glass-variants.d.ts.map +1 -0
  304. package/dist/lib/variants/glass-card-variants.d.ts +13 -0
  305. package/dist/lib/variants/glass-card-variants.d.ts.map +1 -0
  306. package/dist/lib/variants/index.d.ts +26 -0
  307. package/dist/lib/variants/index.d.ts.map +1 -0
  308. package/dist/lib/variants/input-glass-variants.d.ts +9 -0
  309. package/dist/lib/variants/input-glass-variants.d.ts.map +1 -0
  310. package/dist/lib/variants/insight-card-glass-variants.d.ts +11 -0
  311. package/dist/lib/variants/insight-card-glass-variants.d.ts.map +1 -0
  312. package/dist/lib/variants/modal-glass-variants.d.ts +9 -0
  313. package/dist/lib/variants/modal-glass-variants.d.ts.map +1 -0
  314. package/dist/lib/variants/notification-glass-variants.d.ts +9 -0
  315. package/dist/lib/variants/notification-glass-variants.d.ts.map +1 -0
  316. package/dist/lib/variants/progress-glass-variants.d.ts +10 -0
  317. package/dist/lib/variants/progress-glass-variants.d.ts.map +1 -0
  318. package/dist/lib/variants/skeleton-glass-variants.d.ts +9 -0
  319. package/dist/lib/variants/skeleton-glass-variants.d.ts.map +1 -0
  320. package/dist/lib/variants/sparkline-glass-variants.d.ts +10 -0
  321. package/dist/lib/variants/sparkline-glass-variants.d.ts.map +1 -0
  322. package/dist/lib/variants/stepper-glass-variants.d.ts +40 -0
  323. package/dist/lib/variants/stepper-glass-variants.d.ts.map +1 -0
  324. package/dist/lib/variants/toggle-glass-variants.d.ts +26 -0
  325. package/dist/lib/variants/toggle-glass-variants.d.ts.map +1 -0
  326. package/dist/lib/variants/tooltip-glass-variants.d.ts +9 -0
  327. package/dist/lib/variants/tooltip-glass-variants.d.ts.map +1 -0
  328. package/dist/{theme-context-BEA8K_rq.cjs → theme-context-DBAPfMto.cjs} +2 -2
  329. package/dist/{theme-context-BEA8K_rq.cjs.map → theme-context-DBAPfMto.cjs.map} +1 -1
  330. package/dist/{theme-context-_T5r1KG4.js → theme-context-DLS2uAgJ.mjs} +1 -1
  331. package/dist/theme-context-DLS2uAgJ.mjs.map +1 -0
  332. package/dist/themes.cjs +1 -1
  333. package/dist/themes.d.ts +2 -124
  334. package/dist/themes.d.ts.map +1 -0
  335. package/dist/{themes.js → themes.mjs} +1 -1
  336. package/dist/trust-score-card-glass-BUt9MIF0.mjs +4197 -0
  337. package/dist/trust-score-card-glass-BUt9MIF0.mjs.map +1 -0
  338. package/dist/trust-score-card-glass-_v9hGnCW.cjs +4834 -0
  339. package/dist/trust-score-card-glass-_v9hGnCW.cjs.map +1 -0
  340. package/dist/{use-focus-CX0TJJIj.js → use-focus-C5kPAKr_.mjs} +1 -1
  341. package/dist/use-focus-C5kPAKr_.mjs.map +1 -0
  342. package/dist/{use-focus-CdoUzFQ8.cjs → use-focus-DBs46Dxv.cjs} +2 -2
  343. package/dist/{use-focus-CdoUzFQ8.cjs.map → use-focus-DBs46Dxv.cjs.map} +1 -1
  344. package/dist/{use-wallpaper-tint-DUgmytlY.js → use-wallpaper-tint-C0kYXNiN.mjs} +1 -1
  345. package/dist/use-wallpaper-tint-C0kYXNiN.mjs.map +1 -0
  346. package/dist/{use-wallpaper-tint-Rq5UgY9L.cjs → use-wallpaper-tint-DNdTbD1y.cjs} +2 -2
  347. package/dist/{use-wallpaper-tint-Rq5UgY9L.cjs.map → use-wallpaper-tint-DNdTbD1y.cjs.map} +1 -1
  348. package/dist/{utils-CcyeqpKQ.js → utils-B792GPM_.mjs} +1 -1
  349. package/dist/utils-B792GPM_.mjs.map +1 -0
  350. package/dist/{utils-NLnOCttr.cjs → utils-D5ef293O.cjs} +2 -2
  351. package/dist/{utils-NLnOCttr.cjs.map → utils-D5ef293O.cjs.map} +1 -1
  352. package/dist/utils.cjs +1 -1
  353. package/dist/utils.d.ts +2 -10
  354. package/dist/utils.d.ts.map +1 -0
  355. package/dist/utils.mjs +2 -0
  356. package/package.json +9 -9
  357. package/dist/cli/index.js.map +0 -1
  358. package/dist/components.js +0 -5
  359. package/dist/index.js.map +0 -1
  360. package/dist/theme-context-_T5r1KG4.js.map +0 -1
  361. package/dist/trust-score-card-glass-DTS1RdIt.cjs +0 -28660
  362. package/dist/trust-score-card-glass-DTS1RdIt.cjs.map +0 -1
  363. package/dist/trust-score-card-glass-Dg4_b_g_.js +0 -27660
  364. package/dist/trust-score-card-glass-Dg4_b_g_.js.map +0 -1
  365. package/dist/use-focus-CX0TJJIj.js.map +0 -1
  366. package/dist/use-wallpaper-tint-DUgmytlY.js.map +0 -1
  367. package/dist/utils-CcyeqpKQ.js.map +0 -1
  368. package/dist/utils.js +0 -2
@@ -0,0 +1,4197 @@
1
+ import { t as cn } from "./utils-B792GPM_.mjs";
2
+ import { n as useHover, t as useFocus } from "./use-focus-C5kPAKr_.mjs";
3
+ import { o as useTheme } from "./theme-context-DLS2uAgJ.mjs";
4
+ import * as React from "react";
5
+ import { createContext, forwardRef, useCallback, useContext, useEffect, useId, useMemo, useRef, useState } from "react";
6
+ import { AlertCircle, AlertTriangle, ArrowDown, ArrowUp, Calendar, Check, CheckCircle, CheckIcon, ChevronDown, ChevronRight, ChevronRightIcon, ChevronUp, ChevronsUpDownIcon, CircleIcon, Clock, Code, ExternalLink, FolderGit2, GitPullRequest, Github, Info, Minus, Moon, Palette, RefreshCw, Search, SearchIcon, Sparkles, Star, Sun, Target, TrendingDown, TrendingUp, User, Users, X, Zap } from "lucide-react";
7
+ import { cva } from "class-variance-authority";
8
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
+ import * as AvatarPrimitive from "@radix-ui/react-avatar";
10
+ import { Slot } from "@radix-ui/react-slot";
11
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
12
+ import { Command } from "cmdk";
13
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
14
+ import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
15
+ import * as SliderPrimitive from "@radix-ui/react-slider";
16
+ import * as TooltipPrimitive from "@radix-ui/react-tooltip";
17
+ import { Bar, BarChart, Cell, ResponsiveContainer, Tooltip } from "recharts";
18
+ const alertVariants = cva("flex items-start gap-2 md:gap-3 p-3 md:p-4 rounded-xl transition-all duration-300 backdrop-blur-sm min-w-96 max-w-2xl", {
19
+ variants: { variant: {
20
+ default: "",
21
+ destructive: "",
22
+ success: "",
23
+ warning: "",
24
+ info: "",
25
+ error: ""
26
+ } },
27
+ defaultVariants: { variant: "default" }
28
+ });
29
+ const ICON_SIZES = {
30
+ xs: "w-2.5 h-2.5 md:w-3 md:h-3",
31
+ sm: "w-3 h-3 md:w-3.5 md:h-3.5",
32
+ md: "w-3.5 h-3.5 md:w-4 md:h-4",
33
+ lg: "w-4 h-4 md:w-5 md:h-5",
34
+ xl: "w-5 h-5 md:w-6 md:h-6"
35
+ };
36
+ const TouchTarget = forwardRef(({ children, minSize = 44, center = true, className, ...props }, ref) => {
37
+ return /* @__PURE__ */ jsx("div", {
38
+ ref,
39
+ className: cn(minSize === 44 ? "min-h-11 min-w-11" : "min-h-12 min-w-12", center && "flex items-center justify-center", className),
40
+ ...props,
41
+ children
42
+ });
43
+ });
44
+ TouchTarget.displayName = "TouchTarget";
45
+ const FormFieldWrapper = forwardRef(({ label, error, success, htmlFor, required, className, children, ...props }, ref) => {
46
+ return /* @__PURE__ */ jsxs("div", {
47
+ ref,
48
+ className: cn("flex flex-col gap-1 md:gap-1.5", className),
49
+ ...props,
50
+ children: [
51
+ label && /* @__PURE__ */ jsxs("label", {
52
+ htmlFor,
53
+ className: "text-xs md:text-sm font-medium",
54
+ style: { color: "var(--text-secondary)" },
55
+ children: [label, required && /* @__PURE__ */ jsx("span", {
56
+ className: "text-[var(--alert-danger-text)] ml-1",
57
+ "aria-label": "required",
58
+ children: "*"
59
+ })]
60
+ }),
61
+ children,
62
+ error && /* @__PURE__ */ jsx("p", {
63
+ className: "text-xs",
64
+ style: { color: "var(--alert-danger-text)" },
65
+ role: "alert",
66
+ "aria-live": "polite",
67
+ children: error
68
+ }),
69
+ success && !error && /* @__PURE__ */ jsx("p", {
70
+ className: "text-xs",
71
+ style: { color: "var(--alert-success-text)" },
72
+ "aria-live": "polite",
73
+ children: success
74
+ })
75
+ ]
76
+ });
77
+ });
78
+ FormFieldWrapper.displayName = "FormFieldWrapper";
79
+ const InteractiveCard = forwardRef(({ hoverLift = true, hoverGlow, hoverBg, baseBg = "var(--card-bg)", borderColor = "var(--card-border)", hoverBorderColor, blur = "sm", disabled = false, rounded = "rounded-2xl", transition = "var(--transition-slow)", className, style, children, ...props }, ref) => {
80
+ const { isHovered, hoverProps } = useHover({ includeFocus: !disabled });
81
+ const cardStyles = {
82
+ background: isHovered && hoverBg ? hoverBg : baseBg,
83
+ border: `1px solid ${isHovered && hoverBorderColor ? hoverBorderColor : borderColor}`,
84
+ backdropFilter: `blur(var(--blur-${blur}))`,
85
+ WebkitBackdropFilter: `blur(var(--blur-${blur}))`,
86
+ transform: hoverLift && isHovered && !disabled ? "translateY(-2px)" : "translateY(0)",
87
+ boxShadow: isHovered && hoverGlow && !disabled ? hoverGlow : "none",
88
+ transition: `all ${transition}`,
89
+ ...style
90
+ };
91
+ return /* @__PURE__ */ jsx("div", {
92
+ ref,
93
+ className: cn(rounded, className),
94
+ style: cardStyles,
95
+ ...disabled ? {} : hoverProps,
96
+ ...props,
97
+ children
98
+ });
99
+ });
100
+ InteractiveCard.displayName = "InteractiveCard";
101
+ var iconMap = {
102
+ default: Info,
103
+ destructive: AlertCircle,
104
+ success: CheckCircle,
105
+ warning: AlertTriangle,
106
+ info: Info,
107
+ error: AlertCircle
108
+ };
109
+ var variantStyles$2 = {
110
+ default: {
111
+ bg: "var(--alert-default-bg)",
112
+ border: "var(--alert-default-border)",
113
+ text: "var(--alert-default-text)"
114
+ },
115
+ destructive: {
116
+ bg: "var(--alert-destructive-bg)",
117
+ border: "var(--alert-destructive-border)",
118
+ text: "var(--alert-destructive-text)"
119
+ },
120
+ success: {
121
+ bg: "var(--alert-success-bg)",
122
+ border: "var(--alert-success-border)",
123
+ text: "var(--alert-success-text)"
124
+ },
125
+ warning: {
126
+ bg: "var(--alert-warning-bg)",
127
+ border: "var(--alert-warning-border)",
128
+ text: "var(--alert-warning-text)"
129
+ },
130
+ info: {
131
+ bg: "var(--alert-default-bg)",
132
+ border: "var(--alert-default-border)",
133
+ text: "var(--alert-default-text)"
134
+ },
135
+ error: {
136
+ bg: "var(--alert-destructive-bg)",
137
+ border: "var(--alert-destructive-border)",
138
+ text: "var(--alert-destructive-text)"
139
+ }
140
+ };
141
+ var getAlertStyles = (variant) => {
142
+ const config = variantStyles$2[variant];
143
+ return {
144
+ background: config.bg,
145
+ border: `1px solid ${config.border}`,
146
+ color: config.text
147
+ };
148
+ };
149
+ var AlertGlassRoot = forwardRef(({ className, variant = "default", dismissible, onDismiss, children, ...props }, ref) => {
150
+ const effectiveVariant = variant ?? "default";
151
+ const Icon = iconMap[effectiveVariant];
152
+ const config = variantStyles$2[effectiveVariant];
153
+ return /* @__PURE__ */ jsxs("div", {
154
+ ref,
155
+ "data-slot": "alert",
156
+ className: cn(alertVariants({ variant: effectiveVariant }), className),
157
+ style: getAlertStyles(effectiveVariant),
158
+ role: "alert",
159
+ ...props,
160
+ children: [
161
+ /* @__PURE__ */ jsx(Icon, {
162
+ className: "w-4 h-4 md:w-5 md:h-5 shrink-0 mt-0.5",
163
+ style: { color: config.text },
164
+ "aria-hidden": "true"
165
+ }),
166
+ /* @__PURE__ */ jsx("div", {
167
+ className: "flex-1",
168
+ children
169
+ }),
170
+ dismissible && /* @__PURE__ */ jsx("button", {
171
+ onClick: onDismiss,
172
+ className: "p-0.5 md:p-1 rounded transition-colors duration-200 hover:bg-black/5 shrink-0",
173
+ "aria-label": "Dismiss alert",
174
+ children: /* @__PURE__ */ jsx(X, {
175
+ className: ICON_SIZES.md,
176
+ style: { color: config.text }
177
+ })
178
+ })
179
+ ]
180
+ });
181
+ });
182
+ AlertGlassRoot.displayName = "AlertGlass";
183
+ var AlertGlassTitle = forwardRef(({ className, style, ...props }, ref) => {
184
+ return /* @__PURE__ */ jsx("div", {
185
+ ref,
186
+ "data-slot": "alert-title",
187
+ className: cn("font-medium text-xs md:text-sm mb-0.5 md:mb-1", className),
188
+ style: {
189
+ color: "inherit",
190
+ ...style
191
+ },
192
+ ...props
193
+ });
194
+ });
195
+ AlertGlassTitle.displayName = "AlertGlassTitle";
196
+ var AlertGlassDescription = forwardRef(({ className, style, ...props }, ref) => {
197
+ return /* @__PURE__ */ jsx("div", {
198
+ ref,
199
+ "data-slot": "alert-description",
200
+ className: cn("text-xs md:text-sm opacity-80", className),
201
+ style: {
202
+ color: "inherit",
203
+ ...style
204
+ },
205
+ ...props
206
+ });
207
+ });
208
+ AlertGlassDescription.displayName = "AlertGlassDescription";
209
+ const AlertGlass = AlertGlassRoot;
210
+ const avatarSizes = cva("rounded-full flex items-center justify-center font-semibold transition-all duration-300", {
211
+ variants: { size: {
212
+ sm: "w-7 h-7 md:w-8 md:h-8 text-[10px] md:text-xs",
213
+ md: "w-9 h-9 md:w-10 md:h-10 text-xs md:text-sm",
214
+ lg: "w-10 h-10 md:w-12 md:h-12 text-sm md:text-base",
215
+ xl: "w-14 h-14 md:w-16 md:h-16 text-base md:text-lg"
216
+ } },
217
+ defaultVariants: { size: "md" }
218
+ });
219
+ const statusSizes = cva("absolute -bottom-0.5 -right-0.5 rounded-full", {
220
+ variants: { size: {
221
+ sm: "w-2 h-2 md:w-2.5 md:h-2.5",
222
+ md: "w-2.5 h-2.5 md:w-3 md:h-3",
223
+ lg: "w-3 h-3 md:w-3.5 md:h-3.5",
224
+ xl: "w-3.5 h-3.5 md:w-4 md:h-4"
225
+ } },
226
+ defaultVariants: { size: "md" }
227
+ });
228
+ var getStatusVars$1 = (statusType) => {
229
+ return {
230
+ online: {
231
+ bg: "var(--status-online)",
232
+ glow: "var(--status-online-glow)"
233
+ },
234
+ offline: {
235
+ bg: "var(--status-offline)",
236
+ glow: "none"
237
+ },
238
+ busy: {
239
+ bg: "var(--status-busy)",
240
+ glow: "var(--status-busy-glow)"
241
+ },
242
+ away: {
243
+ bg: "var(--status-away)",
244
+ glow: "var(--status-away-glow)"
245
+ }
246
+ }[statusType];
247
+ };
248
+ var AvatarGlassContext = React.createContext({ size: "md" });
249
+ var AvatarGlassRoot = React.forwardRef(({ className, size = "md", status, glowing = false, children, ...props }, ref) => {
250
+ const { isHovered, hoverProps } = useHover();
251
+ const avatarStyles = {
252
+ background: "var(--avatar-bg)",
253
+ border: "3px solid var(--avatar-border)",
254
+ boxShadow: isHovered ? "var(--avatar-hover-glow)" : "var(--avatar-shadow)",
255
+ color: "var(--text-inverse)"
256
+ };
257
+ return /* @__PURE__ */ jsx(AvatarGlassContext.Provider, {
258
+ value: {
259
+ size,
260
+ status,
261
+ glowing
262
+ },
263
+ children: /* @__PURE__ */ jsxs("div", {
264
+ className: cn("relative inline-flex", className),
265
+ onMouseEnter: hoverProps.onMouseEnter,
266
+ onMouseLeave: hoverProps.onMouseLeave,
267
+ children: [/* @__PURE__ */ jsx(AvatarPrimitive.Root, {
268
+ ref,
269
+ className: cn(avatarSizes({ size }), glowing && "animate-[glow-pulse_2s_ease-in-out_infinite]"),
270
+ style: avatarStyles,
271
+ ...props,
272
+ children
273
+ }), status && /* @__PURE__ */ jsx("span", {
274
+ className: cn(statusSizes({ size })),
275
+ style: {
276
+ background: getStatusVars$1(status).bg,
277
+ boxShadow: getStatusVars$1(status).glow
278
+ },
279
+ role: "status",
280
+ "aria-label": `Status: ${status}`
281
+ })]
282
+ })
283
+ });
284
+ });
285
+ AvatarGlassRoot.displayName = "AvatarGlass";
286
+ var AvatarGlassImage = React.forwardRef(({ className, ...props }, ref) => {
287
+ return /* @__PURE__ */ jsx(AvatarPrimitive.Image, {
288
+ ref,
289
+ className: cn("aspect-square h-full w-full object-cover", className),
290
+ ...props
291
+ });
292
+ });
293
+ AvatarGlassImage.displayName = "AvatarGlassImage";
294
+ var AvatarGlassFallback = React.forwardRef(({ className, ...props }, ref) => {
295
+ return /* @__PURE__ */ jsx(AvatarPrimitive.Fallback, {
296
+ ref,
297
+ className: cn("flex h-full w-full items-center justify-center font-semibold uppercase", className),
298
+ ...props
299
+ });
300
+ });
301
+ AvatarGlassFallback.displayName = "AvatarGlassFallback";
302
+ var getInitials = (name) => {
303
+ if (!name || name.trim().length === 0) return "?";
304
+ return name.split(" ").map((part) => part[0]).join("").toUpperCase().slice(0, 2);
305
+ };
306
+ var AvatarGlassSimple = ({ name, size = "md", status, glowing, className }) => {
307
+ return /* @__PURE__ */ jsx(AvatarGlassRoot, {
308
+ size,
309
+ status,
310
+ glowing,
311
+ className,
312
+ children: /* @__PURE__ */ jsx(AvatarGlassFallback, { children: getInitials(name) })
313
+ });
314
+ };
315
+ const AvatarGlass = AvatarGlassRoot;
316
+ const badgeVariants = cva("inline-flex items-center gap-1 md:gap-1.5 rounded-full font-medium", {
317
+ variants: { size: {
318
+ sm: "px-1 py-0.5 md:px-1.5 text-[9px] md:text-[10px]",
319
+ md: "px-2 py-0.5 md:px-2.5 text-[10px] md:text-xs",
320
+ lg: "px-2.5 py-0.5 md:px-3 md:py-1 text-xs md:text-sm"
321
+ } },
322
+ defaultVariants: { size: "md" }
323
+ });
324
+ var variantStyles$1 = {
325
+ default: {
326
+ bg: "var(--badge-default-bg)",
327
+ text: "var(--badge-default-text)",
328
+ border: "var(--badge-default-border)"
329
+ },
330
+ secondary: {
331
+ bg: "var(--badge-secondary-bg)",
332
+ text: "var(--badge-secondary-text)",
333
+ border: "var(--badge-secondary-border)"
334
+ },
335
+ destructive: {
336
+ bg: "var(--badge-destructive-bg)",
337
+ text: "var(--badge-destructive-text)",
338
+ border: "var(--badge-destructive-border)"
339
+ },
340
+ outline: {
341
+ bg: "var(--badge-outline-bg)",
342
+ text: "var(--badge-outline-text)",
343
+ border: "var(--badge-outline-border)"
344
+ },
345
+ success: {
346
+ bg: "var(--badge-success-bg)",
347
+ text: "var(--badge-success-text)",
348
+ border: "var(--badge-success-border)"
349
+ },
350
+ warning: {
351
+ bg: "var(--badge-warning-bg)",
352
+ text: "var(--badge-warning-text)",
353
+ border: "var(--badge-warning-border)"
354
+ },
355
+ info: {
356
+ bg: "var(--badge-info-bg)",
357
+ text: "var(--badge-info-text)",
358
+ border: "var(--badge-info-border)"
359
+ }
360
+ };
361
+ var getBadgeStyles = (variant) => {
362
+ const v = variantStyles$1[variant] || variantStyles$1.default;
363
+ return {
364
+ background: v.bg,
365
+ color: v.text,
366
+ border: `1px solid ${v.border}`
367
+ };
368
+ };
369
+ const BadgeGlass = forwardRef(({ children, className, variant = "default", size = "md", dot, ...props }, ref) => {
370
+ const v = variantStyles$1[variant];
371
+ return /* @__PURE__ */ jsxs("span", {
372
+ ref,
373
+ "data-slot": "badge",
374
+ className: cn(badgeVariants({ size }), className),
375
+ style: getBadgeStyles(variant),
376
+ ...props,
377
+ children: [dot && /* @__PURE__ */ jsx("span", {
378
+ className: "w-1 h-1 md:w-1.5 md:h-1.5 rounded-full animate-pulse",
379
+ style: { background: v.text }
380
+ }), children]
381
+ });
382
+ });
383
+ BadgeGlass.displayName = "BadgeGlass";
384
+ const buttonGlassVariants = cva("relative overflow-hidden font-medium inline-flex items-center justify-center transition-all duration-300 ease-out cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed", {
385
+ variants: {
386
+ variant: {
387
+ default: "",
388
+ secondary: "",
389
+ ghost: "",
390
+ destructive: "",
391
+ outline: "",
392
+ success: "",
393
+ link: ""
394
+ },
395
+ size: {
396
+ sm: "px-3 py-1.5 text-sm gap-1.5 min-h-[44px] rounded-xl",
397
+ default: "px-4 py-2.5 text-sm gap-2 min-h-[44px] rounded-xl",
398
+ lg: "px-6 py-3 text-base gap-2.5 min-h-[48px] rounded-xl",
399
+ xl: "px-8 py-4 text-lg gap-3 min-h-[56px] rounded-xl",
400
+ icon: "p-2.5 min-h-[44px] min-w-[44px] rounded-xl"
401
+ }
402
+ },
403
+ defaultVariants: {
404
+ variant: "default",
405
+ size: "default"
406
+ }
407
+ });
408
+ var getVariantStyles = (variant, isHovered, isFocusVisible) => {
409
+ return {
410
+ default: {
411
+ background: isHovered ? "var(--btn-primary-hover-bg)" : "var(--btn-primary-bg)",
412
+ color: "var(--btn-primary-text)",
413
+ border: "none",
414
+ boxShadow: isFocusVisible ? "var(--focus-glow)" : isHovered ? "var(--btn-primary-glow)" : "var(--btn-primary-shadow)"
415
+ },
416
+ secondary: {
417
+ background: isHovered ? "var(--btn-secondary-hover-bg)" : "var(--btn-secondary-bg)",
418
+ color: "var(--btn-secondary-text)",
419
+ border: "1px solid var(--btn-secondary-border)",
420
+ boxShadow: isFocusVisible ? "var(--focus-glow)" : isHovered ? "var(--btn-secondary-glow)" : "none"
421
+ },
422
+ ghost: {
423
+ background: isHovered ? "var(--btn-ghost-hover-bg)" : "var(--btn-ghost-bg)",
424
+ color: "var(--btn-ghost-text)",
425
+ border: "none",
426
+ boxShadow: isFocusVisible ? "var(--focus-glow)" : "none"
427
+ },
428
+ destructive: {
429
+ background: "var(--btn-destructive-bg)",
430
+ color: "var(--btn-destructive-text)",
431
+ border: "none",
432
+ boxShadow: isFocusVisible ? "var(--focus-glow)" : isHovered ? "var(--btn-destructive-glow)" : "var(--btn-destructive-shadow)"
433
+ },
434
+ outline: {
435
+ background: isHovered ? "var(--btn-outline-hover-bg)" : "transparent",
436
+ color: "var(--btn-outline-text)",
437
+ border: "1px solid var(--btn-outline-border)",
438
+ boxShadow: isFocusVisible ? "var(--focus-glow)" : isHovered ? "var(--btn-outline-glow)" : "none"
439
+ },
440
+ success: {
441
+ background: "var(--btn-success-bg)",
442
+ color: "var(--btn-success-text)",
443
+ border: "none",
444
+ boxShadow: isFocusVisible ? "var(--focus-glow)" : isHovered ? "var(--btn-success-glow)" : "var(--btn-success-shadow)"
445
+ },
446
+ link: {
447
+ background: "transparent",
448
+ color: "var(--btn-link-text)",
449
+ border: "none",
450
+ boxShadow: isFocusVisible ? "var(--focus-glow)" : "none",
451
+ textDecoration: isHovered ? "underline" : "none"
452
+ }
453
+ }[variant];
454
+ };
455
+ const ButtonGlass = forwardRef(({ asChild = false, className, variant = "default", size = "default", children, loading = false, disabled, icon: Icon, iconPosition = "left", onClick, ...props }, ref) => {
456
+ const { isHovered, hoverProps } = useHover();
457
+ const { isFocusVisible, focusProps } = useFocus({ focusVisible: true });
458
+ const [ripple, setRipple] = useState(null);
459
+ const isDisabled = disabled || loading;
460
+ const rippleTimeoutRef = useRef(null);
461
+ useEffect(() => {
462
+ return () => {
463
+ if (rippleTimeoutRef.current) clearTimeout(rippleTimeoutRef.current);
464
+ };
465
+ }, []);
466
+ const handleClick = useCallback((e) => {
467
+ if (isDisabled) return;
468
+ const rect = e.currentTarget.getBoundingClientRect();
469
+ setRipple({
470
+ x: e.clientX - rect.left,
471
+ y: e.clientY - rect.top
472
+ });
473
+ if (rippleTimeoutRef.current) clearTimeout(rippleTimeoutRef.current);
474
+ rippleTimeoutRef.current = setTimeout(() => {
475
+ setRipple(null);
476
+ rippleTimeoutRef.current = null;
477
+ }, 600);
478
+ onClick?.(e);
479
+ }, [isDisabled, onClick]);
480
+ return /* @__PURE__ */ jsx(asChild ? Slot : "button", {
481
+ ref,
482
+ "data-slot": "button",
483
+ className: cn(buttonGlassVariants({
484
+ variant,
485
+ size
486
+ }), isHovered && !isDisabled && "scale-[1.02]", className),
487
+ style: {
488
+ ...getVariantStyles(variant, isHovered && !isDisabled, isFocusVisible && !isDisabled),
489
+ outline: "none"
490
+ },
491
+ type: asChild ? void 0 : "button",
492
+ disabled: isDisabled,
493
+ onClick: handleClick,
494
+ onMouseEnter: hoverProps.onMouseEnter,
495
+ onMouseLeave: hoverProps.onMouseLeave,
496
+ onFocus: focusProps.onFocus,
497
+ onBlur: focusProps.onBlur,
498
+ ...props,
499
+ children: asChild ? children : /* @__PURE__ */ jsxs(Fragment, { children: [
500
+ isHovered && variant === "default" && !isDisabled && /* @__PURE__ */ jsx("div", {
501
+ className: "absolute inset-0 overflow-hidden pointer-events-none",
502
+ style: { borderRadius: "inherit" },
503
+ children: /* @__PURE__ */ jsx("div", {
504
+ className: "absolute top-0 h-full w-1/3 bg-linear-to-r from-transparent via-white/20 to-transparent",
505
+ style: { animation: "btn-shine 1.5s ease-in-out infinite" }
506
+ })
507
+ }),
508
+ ripple && /* @__PURE__ */ jsx("span", {
509
+ className: "absolute rounded-full bg-white/30 pointer-events-none",
510
+ style: {
511
+ left: ripple.x,
512
+ top: ripple.y,
513
+ width: 10,
514
+ height: 10,
515
+ transform: "translate(-50%, -50%)",
516
+ animation: "ripple 0.6s ease-out"
517
+ }
518
+ }),
519
+ isHovered && variant === "default" && !isDisabled && /* @__PURE__ */ jsx("div", {
520
+ className: "absolute inset-0 rounded-xl animate-glow-pulse pointer-events-none",
521
+ style: { background: "var(--btn-glow-radial)" }
522
+ }),
523
+ loading && /* @__PURE__ */ jsx(RefreshCw, { className: cn(ICON_SIZES.md, "animate-spin") }),
524
+ !loading && Icon && iconPosition === "left" && /* @__PURE__ */ jsx(Icon, { className: ICON_SIZES.md }),
525
+ !loading && children,
526
+ !loading && Icon && iconPosition === "right" && /* @__PURE__ */ jsx(Icon, { className: ICON_SIZES.md })
527
+ ] })
528
+ });
529
+ });
530
+ ButtonGlass.displayName = "ButtonGlass";
531
+ const CheckboxGlass = forwardRef(({ className, checked, onChange, label, disabled, ...props }, ref) => {
532
+ const { isHovered, hoverProps } = useHover();
533
+ const { isFocusVisible, focusProps } = useFocus({ focusVisible: true });
534
+ const checkboxStyles = {
535
+ background: checked ? "var(--checkbox-checked-bg)" : "var(--checkbox-bg)",
536
+ border: `2px solid ${checked ? "var(--checkbox-checked-bg)" : "var(--checkbox-border)"}`,
537
+ boxShadow: isFocusVisible && !disabled ? "var(--focus-glow)" : isHovered && !disabled ? "var(--checkbox-glow)" : "none"
538
+ };
539
+ return /* @__PURE__ */ jsxs("label", {
540
+ className: cn("inline-flex items-center gap-2 md:gap-2.5", disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer", className),
541
+ onMouseEnter: hoverProps.onMouseEnter,
542
+ onMouseLeave: hoverProps.onMouseLeave,
543
+ children: [
544
+ /* @__PURE__ */ jsx("input", {
545
+ ref,
546
+ type: "checkbox",
547
+ checked,
548
+ onChange: (e) => !disabled && onChange?.(e.target.checked),
549
+ disabled,
550
+ className: "sr-only",
551
+ ...props
552
+ }),
553
+ /* @__PURE__ */ jsx("span", {
554
+ className: "inline-flex items-center justify-center min-w-11 min-h-11",
555
+ children: /* @__PURE__ */ jsx("div", {
556
+ onClick: () => !disabled && onChange?.(!checked),
557
+ onFocus: focusProps.onFocus,
558
+ onBlur: focusProps.onBlur,
559
+ className: "relative w-6 h-6 md:w-5 md:h-5 rounded-md flex items-center justify-center transition-all duration-300",
560
+ style: checkboxStyles,
561
+ role: "checkbox",
562
+ "aria-checked": checked,
563
+ "aria-label": label || "Checkbox",
564
+ tabIndex: disabled ? -1 : 0,
565
+ onKeyDown: (e) => {
566
+ if (!disabled && (e.key === "Enter" || e.key === " ")) {
567
+ e.preventDefault();
568
+ onChange?.(!checked);
569
+ }
570
+ },
571
+ children: checked && /* @__PURE__ */ jsx(Check, {
572
+ className: "w-3.5 h-3.5 md:w-3 md:h-3",
573
+ style: { color: "var(--text-inverse)" }
574
+ })
575
+ })
576
+ }),
577
+ label && /* @__PURE__ */ jsx("span", {
578
+ className: "text-xs md:text-sm",
579
+ style: { color: "var(--text-secondary)" },
580
+ children: label
581
+ })
582
+ ]
583
+ });
584
+ });
585
+ CheckboxGlass.displayName = "CheckboxGlass";
586
+ var circularProgressVariants = cva("relative inline-flex items-center justify-center p-4", {
587
+ variants: { size: {
588
+ sm: "w-20 h-20",
589
+ md: "w-28 h-28",
590
+ lg: "w-36 h-36",
591
+ xl: "w-44 h-44"
592
+ } },
593
+ defaultVariants: { size: "md" }
594
+ });
595
+ var getGradientColors = (gradient) => {
596
+ return {
597
+ violet: {
598
+ from: "#8b5cf6",
599
+ to: "#a855f7",
600
+ glowVar: "--progress-glow-violet"
601
+ },
602
+ blue: {
603
+ from: "#3b82f6",
604
+ to: "#60a5fa",
605
+ glowVar: "--progress-glow-blue"
606
+ },
607
+ cyan: {
608
+ from: "#06b6d4",
609
+ to: "#22d3ee",
610
+ glowVar: "--progress-glow-cyan"
611
+ },
612
+ amber: {
613
+ from: "#f59e0b",
614
+ to: "#fbbf24",
615
+ glowVar: "--progress-glow-amber"
616
+ },
617
+ emerald: {
618
+ from: "#10b981",
619
+ to: "#34d399",
620
+ glowVar: "--progress-glow-emerald"
621
+ },
622
+ rose: {
623
+ from: "#f43f5e",
624
+ to: "#fb7185",
625
+ glowVar: "--progress-glow-rose"
626
+ }
627
+ }[gradient];
628
+ };
629
+ var getGlowStdDeviation = (intensity) => {
630
+ return {
631
+ low: 2,
632
+ medium: 4,
633
+ high: 6
634
+ }[intensity];
635
+ };
636
+ const CircularProgressGlass = forwardRef(({ className, size = "md", value = 0, variant = "determinate", thickness = 8, trackWidth = 8, color = "violet", trackColor = "oklch(100% 0 0 / 0.1)", showLabel = true, label, labelColor, showGlow = true, glowIntensity = "medium", strokeLinecap = "round", animationDuration = 1, ...props }, ref) => {
637
+ const clampedValue = Math.min(100, Math.max(0, value));
638
+ const gradientColors = getGradientColors(color);
639
+ const svgSize = {
640
+ sm: 64,
641
+ md: 96,
642
+ lg: 128,
643
+ xl: 160
644
+ }[size || "md"];
645
+ const radius = (svgSize - Math.max(thickness, trackWidth)) / 2;
646
+ const circumference = 2 * Math.PI * radius;
647
+ const center = svgSize / 2;
648
+ const dashOffset = useMemo(() => {
649
+ if (variant === "indeterminate") return circumference * .75;
650
+ return circumference * ((100 - clampedValue) / 100);
651
+ }, [
652
+ variant,
653
+ clampedValue,
654
+ circumference
655
+ ]);
656
+ const uniqueId = useId();
657
+ const gradientId = `circular-gradient-${uniqueId}`;
658
+ const glowId = `circular-glow-${uniqueId}`;
659
+ return /* @__PURE__ */ jsxs("div", {
660
+ ref,
661
+ className: cn(circularProgressVariants({ size }), className),
662
+ ...props,
663
+ children: [
664
+ /* @__PURE__ */ jsxs("svg", {
665
+ width: svgSize,
666
+ height: svgSize,
667
+ className: "transform -rotate-90 overflow-visible",
668
+ "aria-hidden": "true",
669
+ style: { overflow: "visible" },
670
+ children: [
671
+ /* @__PURE__ */ jsxs("defs", { children: [/* @__PURE__ */ jsxs("linearGradient", {
672
+ id: gradientId,
673
+ x1: "0%",
674
+ y1: "0%",
675
+ x2: "100%",
676
+ y2: "100%",
677
+ children: [/* @__PURE__ */ jsx("stop", {
678
+ offset: "0%",
679
+ stopColor: gradientColors.from
680
+ }), /* @__PURE__ */ jsx("stop", {
681
+ offset: "100%",
682
+ stopColor: gradientColors.to
683
+ })]
684
+ }), showGlow && /* @__PURE__ */ jsxs("filter", {
685
+ id: glowId,
686
+ children: [/* @__PURE__ */ jsx("feGaussianBlur", {
687
+ stdDeviation: getGlowStdDeviation(glowIntensity),
688
+ result: "coloredBlur"
689
+ }), /* @__PURE__ */ jsxs("feMerge", { children: [/* @__PURE__ */ jsx("feMergeNode", { in: "coloredBlur" }), /* @__PURE__ */ jsx("feMergeNode", { in: "SourceGraphic" })] })]
690
+ })] }),
691
+ /* @__PURE__ */ jsx("circle", {
692
+ cx: center,
693
+ cy: center,
694
+ r: radius,
695
+ fill: "none",
696
+ stroke: trackColor,
697
+ strokeWidth: trackWidth
698
+ }),
699
+ /* @__PURE__ */ jsx("circle", {
700
+ cx: center,
701
+ cy: center,
702
+ r: radius,
703
+ fill: "none",
704
+ stroke: `url(#${gradientId})`,
705
+ strokeWidth: thickness,
706
+ strokeLinecap,
707
+ strokeDasharray: circumference,
708
+ strokeDashoffset: dashOffset,
709
+ filter: showGlow ? `url(#${glowId})` : void 0,
710
+ className: cn("transition-all", variant === "indeterminate" && "animate-circular-progress-spin"),
711
+ style: {
712
+ transitionDuration: `${animationDuration}s`,
713
+ transitionTimingFunction: "cubic-bezier(0.4, 0, 0.2, 1)"
714
+ }
715
+ })
716
+ ]
717
+ }),
718
+ showLabel && /* @__PURE__ */ jsx("div", {
719
+ className: "absolute inset-0 flex items-center justify-center",
720
+ children: /* @__PURE__ */ jsx("span", {
721
+ className: "text-sm font-semibold tabular-nums",
722
+ style: { color: labelColor || gradientColors.to },
723
+ children: label || (variant === "determinate" ? `${clampedValue}%` : "")
724
+ })
725
+ }),
726
+ /* @__PURE__ */ jsx("div", {
727
+ role: "progressbar",
728
+ "aria-valuenow": variant === "determinate" ? clampedValue : void 0,
729
+ "aria-valuemin": 0,
730
+ "aria-valuemax": 100,
731
+ "aria-label": label || (variant === "determinate" ? `Progress: ${clampedValue}%` : "Loading progress"),
732
+ "aria-valuetext": label || (variant === "determinate" ? `${clampedValue}%` : "Loading..."),
733
+ className: "sr-only",
734
+ children: label || (variant === "determinate" ? `${clampedValue}%` : "Loading...")
735
+ })
736
+ ]
737
+ });
738
+ });
739
+ CircularProgressGlass.displayName = "CircularProgressGlass";
740
+ function Popover({ ...props }) {
741
+ return /* @__PURE__ */ jsx(PopoverPrimitive.Root, {
742
+ "data-slot": "popover",
743
+ ...props
744
+ });
745
+ }
746
+ function PopoverTrigger({ ...props }) {
747
+ return /* @__PURE__ */ jsx(PopoverPrimitive.Trigger, {
748
+ "data-slot": "popover-trigger",
749
+ ...props
750
+ });
751
+ }
752
+ function PopoverContent({ className, align = "center", sideOffset = 4, ...props }) {
753
+ return /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(PopoverPrimitive.Content, {
754
+ "data-slot": "popover-content",
755
+ align,
756
+ sideOffset,
757
+ className: cn("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden", className),
758
+ ...props
759
+ }) });
760
+ }
761
+ function Command$1({ className, ...props }) {
762
+ return /* @__PURE__ */ jsx(Command, {
763
+ "data-slot": "command",
764
+ className: cn("bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md", className),
765
+ ...props
766
+ });
767
+ }
768
+ function CommandInput({ className, ...props }) {
769
+ return /* @__PURE__ */ jsxs("div", {
770
+ "data-slot": "command-input-wrapper",
771
+ className: "flex h-9 items-center gap-2 border-b border-border px-3",
772
+ children: [/* @__PURE__ */ jsx(SearchIcon, { className: "size-4 shrink-0 opacity-60 text-muted-foreground" }), /* @__PURE__ */ jsx(Command.Input, {
773
+ "data-slot": "command-input",
774
+ className: cn("placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm font-medium outline-hidden disabled:cursor-not-allowed disabled:opacity-50", className),
775
+ ...props
776
+ })]
777
+ });
778
+ }
779
+ function CommandList({ className, ...props }) {
780
+ return /* @__PURE__ */ jsx(Command.List, {
781
+ "data-slot": "command-list",
782
+ className: cn("max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto", className),
783
+ ...props
784
+ });
785
+ }
786
+ function CommandEmpty({ ...props }) {
787
+ return /* @__PURE__ */ jsx(Command.Empty, {
788
+ "data-slot": "command-empty",
789
+ className: "py-6 text-center text-sm",
790
+ ...props
791
+ });
792
+ }
793
+ function CommandGroup({ className, ...props }) {
794
+ return /* @__PURE__ */ jsx(Command.Group, {
795
+ "data-slot": "command-group",
796
+ className: cn("text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium", className),
797
+ ...props
798
+ });
799
+ }
800
+ function CommandItem({ className, ...props }) {
801
+ return /* @__PURE__ */ jsx(Command.Item, {
802
+ "data-slot": "command-item",
803
+ className: cn("data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
804
+ ...props
805
+ });
806
+ }
807
+ const inputVariants = cva("w-full transition-all duration-300 outline-none backdrop-blur-sm disabled:opacity-50 disabled:cursor-not-allowed", {
808
+ variants: { size: {
809
+ sm: "px-3 py-2 text-base rounded-md min-h-[44px]",
810
+ md: "px-4 py-2.5 text-base rounded-md min-h-[44px]",
811
+ lg: "px-5 py-3 text-base md:text-lg rounded-md min-h-[48px]"
812
+ } },
813
+ defaultVariants: { size: "md" }
814
+ });
815
+ function getDropdownContentStyles() {
816
+ return {
817
+ background: "var(--dropdown-bg)",
818
+ border: "1px solid var(--dropdown-border)",
819
+ boxShadow: "var(--dropdown-glow)",
820
+ backdropFilter: "blur(var(--blur-md))",
821
+ WebkitBackdropFilter: "blur(var(--blur-md))"
822
+ };
823
+ }
824
+ const dropdownContentClasses = cn("min-w-40 md:min-w-[200px]", "rounded-2xl overflow-hidden", "z-[50002]", "animate-in fade-in-0 zoom-in-95", "data-[side=bottom]:slide-in-from-top-2", "data-[side=top]:slide-in-from-bottom-2");
825
+ function getDropdownItemClasses(options) {
826
+ const { danger, selected, highlighted } = options ?? {};
827
+ return cn("w-full px-3 py-2.5", "text-sm text-left", "flex items-center gap-2", "rounded-lg", "outline-none cursor-pointer select-none", "transition-colors duration-150", highlighted && "bg-(--dropdown-item-hover)", "data-[highlighted]:bg-(--dropdown-item-hover)", "data-[selected=true]:bg-(--dropdown-item-hover)", selected && "bg-(--select-item-selected-bg) text-(--select-item-selected-text)", danger ? "text-(--alert-danger-text) data-[highlighted]:text-(--alert-danger-text)" : "text-(--dropdown-item-text)");
828
+ }
829
+ const dropdownSeparatorClasses = cn("h-px my-1", "bg-[var(--dropdown-border)]");
830
+ const dropdownLabelClasses = cn("px-3 py-1.5 md:px-4 md:py-2", "text-xs font-medium", "text-[var(--text-muted)]");
831
+ function ComboBoxGlassInner({ options, value, onValueChange, placeholder = "Select option...", emptyText = "No results found.", searchPlaceholder = "Search...", glassVariant = "glass", disabled = false, className, popoverClassName, clearable = false, side = "bottom", align = "start", label, error, success, required = false, size = "md", searchable = true, icon: TriggerIcon }, ref) {
832
+ const [open, setOpen] = useState(false);
833
+ const [search, setSearch] = useState("");
834
+ const fieldId = useId();
835
+ const selectedOption = useMemo(() => options.find((opt) => opt.value === value), [options, value]);
836
+ const filteredOptions = useMemo(() => {
837
+ if (!search) return options;
838
+ const searchLower = search.toLowerCase();
839
+ return options.filter((opt) => opt.label.toLowerCase().includes(searchLower));
840
+ }, [options, search]);
841
+ const handleSelect = useCallback((optionValue) => {
842
+ if (clearable && value === optionValue) onValueChange?.(void 0);
843
+ else onValueChange?.(optionValue);
844
+ setOpen(false);
845
+ setSearch("");
846
+ }, [
847
+ value,
848
+ onValueChange,
849
+ clearable
850
+ ]);
851
+ const getGlassClass = () => {
852
+ return {
853
+ glass: "glass",
854
+ frosted: "frosted",
855
+ fluted: "fluted",
856
+ crystal: "crystal"
857
+ }[glassVariant];
858
+ };
859
+ const comboboxContent = /* @__PURE__ */ jsxs(Popover, {
860
+ open,
861
+ onOpenChange: setOpen,
862
+ children: [/* @__PURE__ */ jsx(PopoverTrigger, {
863
+ asChild: true,
864
+ children: /* @__PURE__ */ jsxs(ButtonGlass, {
865
+ ref,
866
+ variant: "secondary",
867
+ role: "combobox",
868
+ "aria-expanded": open,
869
+ "aria-haspopup": "listbox",
870
+ "aria-label": selectedOption?.label || placeholder,
871
+ "aria-describedby": error ? `${fieldId}-error` : success ? `${fieldId}-success` : void 0,
872
+ disabled,
873
+ className: cn("w-full justify-between", inputVariants({ size }), !selectedOption && "text-muted-foreground", className),
874
+ children: [/* @__PURE__ */ jsxs("span", {
875
+ className: "flex items-center gap-2 truncate",
876
+ children: [TriggerIcon && /* @__PURE__ */ jsx(TriggerIcon, { className: ICON_SIZES.md }), selectedOption ? selectedOption.label : placeholder]
877
+ }), /* @__PURE__ */ jsx(ChevronsUpDownIcon, { className: cn(ICON_SIZES.md, "shrink-0 opacity-50") })]
878
+ })
879
+ }), /* @__PURE__ */ jsx(PopoverContent, {
880
+ side,
881
+ align,
882
+ className: cn(dropdownContentClasses, "w-[--radix-popover-trigger-width] p-0 border-0", getGlassClass(), popoverClassName),
883
+ style: getDropdownContentStyles(),
884
+ children: /* @__PURE__ */ jsxs(Command$1, {
885
+ shouldFilter: false,
886
+ className: cn("bg-transparent", "[&_[data-slot=command-input-wrapper]]:border-b-0", "[&_[data-slot=command-input-wrapper]_svg]:text-[var(--text-muted)]", "[&_[data-slot=command-input-wrapper]_svg]:opacity-80"),
887
+ children: [searchable && /* @__PURE__ */ jsx(CommandInput, {
888
+ placeholder: searchPlaceholder,
889
+ value: search,
890
+ onValueChange: setSearch,
891
+ className: "text-[var(--text-primary)] placeholder:text-[var(--text-muted)] h-10 font-medium"
892
+ }), /* @__PURE__ */ jsxs(CommandList, {
893
+ className: "p-1.5 scrollbar-hide",
894
+ children: [/* @__PURE__ */ jsx(CommandEmpty, {
895
+ className: "text-[var(--text-muted)] py-4",
896
+ children: emptyText
897
+ }), /* @__PURE__ */ jsx(CommandGroup, {
898
+ className: "text-[var(--text-primary)] p-0",
899
+ children: filteredOptions.map((option) => {
900
+ const OptionIcon = option.icon;
901
+ const isSelected = value === option.value;
902
+ return /* @__PURE__ */ jsxs(CommandItem, {
903
+ value: String(option.value),
904
+ disabled: option.disabled,
905
+ onSelect: () => handleSelect(option.value),
906
+ className: cn(getDropdownItemClasses({ selected: isSelected }), option.disabled && "cursor-not-allowed opacity-50"),
907
+ children: [
908
+ /* @__PURE__ */ jsx(CheckIcon, { className: cn(ICON_SIZES.md, "shrink-0", isSelected ? "opacity-100 text-[var(--text-accent)]" : "opacity-0") }),
909
+ OptionIcon && /* @__PURE__ */ jsx(OptionIcon, { className: cn(ICON_SIZES.md, "shrink-0 text-[var(--dropdown-icon)]") }),
910
+ /* @__PURE__ */ jsx("span", {
911
+ className: "truncate",
912
+ children: option.label
913
+ })
914
+ ]
915
+ }, String(option.value));
916
+ })
917
+ })]
918
+ })]
919
+ })
920
+ })]
921
+ });
922
+ if (label || error || success) return /* @__PURE__ */ jsx(FormFieldWrapper, {
923
+ label,
924
+ error,
925
+ success,
926
+ required,
927
+ htmlFor: fieldId,
928
+ children: comboboxContent
929
+ });
930
+ return comboboxContent;
931
+ }
932
+ const ComboBoxGlass = forwardRef(ComboBoxGlassInner);
933
+ ComboBoxGlassInner.displayName = "ComboBoxGlass";
934
+ var DropdownMenuGlass = DropdownMenuPrimitive.Root;
935
+ var DropdownMenuGlassTrigger = DropdownMenuPrimitive.Trigger;
936
+ var DropdownMenuGlassGroup = DropdownMenuPrimitive.Group;
937
+ var DropdownMenuGlassPortal = DropdownMenuPrimitive.Portal;
938
+ var DropdownMenuGlassSub = DropdownMenuPrimitive.Sub;
939
+ var DropdownMenuGlassRadioGroup = DropdownMenuPrimitive.RadioGroup;
940
+ var DropdownMenuGlassSubTrigger = React.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs(DropdownMenuPrimitive.SubTrigger, {
941
+ ref,
942
+ className: cn(getDropdownItemClasses(), "data-[state=open]:bg-[var(--dropdown-item-hover)]", inset && "pl-8", className),
943
+ ...props,
944
+ children: [children, /* @__PURE__ */ jsx(ChevronRightIcon, { className: "ml-auto h-4 w-4" })]
945
+ }));
946
+ DropdownMenuGlassSubTrigger.displayName = "DropdownMenuGlassSubTrigger";
947
+ var DropdownMenuGlassSubContent = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.SubContent, {
948
+ ref,
949
+ className: cn(dropdownContentClasses, "p-1.5", className),
950
+ style: getDropdownContentStyles(),
951
+ ...props
952
+ }));
953
+ DropdownMenuGlassSubContent.displayName = "DropdownMenuGlassSubContent";
954
+ var DropdownMenuGlassContent = React.forwardRef(({ className, sideOffset = 8, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.Content, {
955
+ ref,
956
+ sideOffset,
957
+ className: cn(dropdownContentClasses, "p-1.5", className),
958
+ style: getDropdownContentStyles(),
959
+ ...props
960
+ }) }));
961
+ DropdownMenuGlassContent.displayName = "DropdownMenuGlassContent";
962
+ var DropdownMenuGlassItem = React.forwardRef(({ className, inset, variant = "default", ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.Item, {
963
+ ref,
964
+ className: cn(getDropdownItemClasses({ danger: variant === "destructive" }), inset && "pl-8", className),
965
+ ...props
966
+ }));
967
+ DropdownMenuGlassItem.displayName = "DropdownMenuGlassItem";
968
+ var DropdownMenuGlassCheckboxItem = React.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs(DropdownMenuPrimitive.CheckboxItem, {
969
+ ref,
970
+ className: cn(getDropdownItemClasses(), "pl-8 pr-2", className),
971
+ checked,
972
+ ...props,
973
+ children: [/* @__PURE__ */ jsx("span", {
974
+ className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center",
975
+ children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, { className: "h-4 w-4" }) })
976
+ }), children]
977
+ }));
978
+ DropdownMenuGlassCheckboxItem.displayName = "DropdownMenuGlassCheckboxItem";
979
+ var DropdownMenuGlassRadioItem = React.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(DropdownMenuPrimitive.RadioItem, {
980
+ ref,
981
+ className: cn(getDropdownItemClasses(), "pl-8 pr-2", className),
982
+ ...props,
983
+ children: [/* @__PURE__ */ jsx("span", {
984
+ className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center",
985
+ children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CircleIcon, { className: "h-2 w-2 fill-current" }) })
986
+ }), children]
987
+ }));
988
+ DropdownMenuGlassRadioItem.displayName = "DropdownMenuGlassRadioItem";
989
+ var DropdownMenuGlassLabel = React.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.Label, {
990
+ ref,
991
+ className: cn(dropdownLabelClasses, inset && "pl-8", className),
992
+ ...props
993
+ }));
994
+ DropdownMenuGlassLabel.displayName = "DropdownMenuGlassLabel";
995
+ var DropdownMenuGlassSeparator = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.Separator, {
996
+ ref,
997
+ className: cn(dropdownSeparatorClasses, "-mx-1 my-1", className),
998
+ ...props
999
+ }));
1000
+ DropdownMenuGlassSeparator.displayName = "DropdownMenuGlassSeparator";
1001
+ var DropdownMenuGlassShortcut = ({ className, ...props }) => {
1002
+ return /* @__PURE__ */ jsx("span", {
1003
+ className: cn("ml-auto text-xs tracking-widest text-(--text-muted)", className),
1004
+ ...props
1005
+ });
1006
+ };
1007
+ DropdownMenuGlassShortcut.displayName = "DropdownMenuGlassShortcut";
1008
+ const DropdownGlass = React.forwardRef(({ trigger, items, align = "left", className }, ref) => {
1009
+ return /* @__PURE__ */ jsx("div", {
1010
+ ref,
1011
+ className: cn("relative inline-block", className),
1012
+ children: /* @__PURE__ */ jsxs(DropdownMenuGlass, { children: [/* @__PURE__ */ jsx(DropdownMenuGlassTrigger, {
1013
+ asChild: true,
1014
+ children: trigger
1015
+ }), /* @__PURE__ */ jsx(DropdownMenuGlassContent, {
1016
+ align: align === "left" ? "start" : "end",
1017
+ children: items.map((item, idx) => item.divider ? /* @__PURE__ */ jsx(DropdownMenuGlassSeparator, {}, `divider-${idx}`) : /* @__PURE__ */ jsxs(DropdownMenuGlassItem, {
1018
+ variant: item.danger ? "destructive" : "default",
1019
+ onSelect: item.onClick,
1020
+ children: [item.icon && /* @__PURE__ */ jsx(item.icon, { className: cn(ICON_SIZES.md, "shrink-0", item.danger ? "text-(--alert-danger-text)" : "text-(--dropdown-icon) group-data-highlighted:text-(--dropdown-icon-hover)") }), /* @__PURE__ */ jsx("span", {
1021
+ className: "font-medium",
1022
+ children: item.label
1023
+ })]
1024
+ }, `item-${idx}`))
1025
+ })] })
1026
+ });
1027
+ });
1028
+ DropdownGlass.displayName = "DropdownGlass";
1029
+ const cardIntensity = cva("border transition-all duration-300 text-[var(--text-primary)]", {
1030
+ variants: {
1031
+ intensity: {
1032
+ subtle: "",
1033
+ medium: "",
1034
+ strong: ""
1035
+ },
1036
+ hover: {
1037
+ true: "hover-glow cursor-pointer",
1038
+ false: ""
1039
+ },
1040
+ padding: {
1041
+ none: "",
1042
+ compact: "p-4 md:p-5 rounded-lg",
1043
+ default: "p-6 rounded-xl",
1044
+ featured: "p-8 rounded-[20px]"
1045
+ }
1046
+ },
1047
+ defaultVariants: {
1048
+ intensity: "medium",
1049
+ hover: true,
1050
+ padding: "default"
1051
+ }
1052
+ });
1053
+ var blurMap = {
1054
+ subtle: "var(--blur-sm)",
1055
+ medium: "var(--blur-md)",
1056
+ strong: "var(--blur-lg)"
1057
+ };
1058
+ var bgVarMap = {
1059
+ subtle: "var(--card-subtle-bg)",
1060
+ medium: "var(--card-medium-bg)",
1061
+ strong: "var(--card-strong-bg)"
1062
+ };
1063
+ var borderVarMap = {
1064
+ subtle: "var(--card-subtle-border)",
1065
+ medium: "var(--card-medium-border)",
1066
+ strong: "var(--card-strong-border)"
1067
+ };
1068
+ var glowVarMap = {
1069
+ blue: "var(--glow-blue)",
1070
+ violet: "var(--glow-violet)",
1071
+ purple: "var(--glow-violet)",
1072
+ cyan: "var(--glow-cyan)"
1073
+ };
1074
+ const GlassCard = forwardRef(({ asChild = false, children, className, intensity = "medium", glow = null, hover = true, padding = "default", ...props }, ref) => {
1075
+ const { isHovered, hoverProps } = useHover();
1076
+ const intensityVal = intensity ?? "medium";
1077
+ const cardStyles = {
1078
+ background: isHovered && hover ? "var(--card-hover-bg)" : bgVarMap[intensityVal],
1079
+ borderColor: isHovered && hover ? "var(--card-hover-border)" : borderVarMap[intensityVal],
1080
+ backdropFilter: `blur(${blurMap[intensityVal]})`,
1081
+ WebkitBackdropFilter: `blur(${blurMap[intensityVal]})`,
1082
+ boxShadow: glow ? glowVarMap[glow] : isHovered && hover ? "var(--card-hover-glow)" : "var(--glow-neutral)"
1083
+ };
1084
+ return /* @__PURE__ */ jsx(asChild ? Slot : "div", {
1085
+ ref,
1086
+ className: cn(cardIntensity({
1087
+ intensity,
1088
+ hover,
1089
+ padding
1090
+ }), className),
1091
+ style: cardStyles,
1092
+ onMouseEnter: hoverProps.onMouseEnter,
1093
+ onMouseLeave: hoverProps.onMouseLeave,
1094
+ ...props,
1095
+ children
1096
+ });
1097
+ });
1098
+ GlassCard.displayName = "GlassCard";
1099
+ var getInputStyles = (isFocused, error, success) => {
1100
+ let borderColor = "var(--input-border)";
1101
+ if (error) borderColor = "var(--alert-danger-text)";
1102
+ else if (success) borderColor = "var(--alert-success-text)";
1103
+ else if (isFocused) borderColor = "var(--input-focus-border)";
1104
+ return {
1105
+ background: "var(--input-bg)",
1106
+ border: `1px solid ${borderColor}`,
1107
+ color: "var(--input-text)",
1108
+ boxShadow: isFocused ? "var(--focus-glow)" : "none"
1109
+ };
1110
+ };
1111
+ const InputGlass = forwardRef(({ className, size, inputSize, label, error, success, icon: Icon, iconPosition = "left", disabled, onFocus, onBlur, ...props }, ref) => {
1112
+ const sizeValue = size ?? inputSize ?? "md";
1113
+ if (process.env.NODE_ENV !== "production" && inputSize !== void 0) console.warn("[InputGlass] The `inputSize` prop is deprecated and will be removed in v4.0. Use `size` instead.");
1114
+ const { isFocused, focusProps } = useFocus();
1115
+ const handleFocus = useCallback((e) => {
1116
+ focusProps.onFocus(e);
1117
+ onFocus?.(e);
1118
+ }, [focusProps, onFocus]);
1119
+ const handleBlur = useCallback((e) => {
1120
+ focusProps.onBlur(e);
1121
+ onBlur?.(e);
1122
+ }, [focusProps, onBlur]);
1123
+ const hasIcon = Boolean(Icon);
1124
+ const paddingLeft = hasIcon && iconPosition === "left" ? "pl-10" : "";
1125
+ const paddingRight = hasIcon && iconPosition === "right" ? "pr-10" : "";
1126
+ return /* @__PURE__ */ jsx(FormFieldWrapper, {
1127
+ label,
1128
+ error,
1129
+ success,
1130
+ htmlFor: props.id,
1131
+ className,
1132
+ children: /* @__PURE__ */ jsxs("div", {
1133
+ className: "relative",
1134
+ children: [
1135
+ Icon && iconPosition === "left" && /* @__PURE__ */ jsx(Icon, {
1136
+ className: cn("absolute left-2.5 md:left-3 top-1/2 -translate-y-1/2 transition-colors duration-300 z-10", ICON_SIZES.md),
1137
+ style: { color: isFocused ? "var(--text-accent)" : "var(--text-muted)" }
1138
+ }),
1139
+ /* @__PURE__ */ jsx("input", {
1140
+ ref,
1141
+ "data-slot": "input",
1142
+ className: cn(inputVariants({ size: sizeValue }), paddingLeft, paddingRight),
1143
+ style: getInputStyles(isFocused, error, success),
1144
+ disabled,
1145
+ onFocus: handleFocus,
1146
+ onBlur: handleBlur,
1147
+ ...props
1148
+ }),
1149
+ Icon && iconPosition === "right" && /* @__PURE__ */ jsx(Icon, {
1150
+ className: cn("absolute right-2.5 md:right-3 top-1/2 -translate-y-1/2 transition-colors duration-300 z-10", ICON_SIZES.md),
1151
+ style: { color: isFocused ? "var(--text-accent)" : "var(--text-muted)" }
1152
+ })
1153
+ ]
1154
+ })
1155
+ });
1156
+ });
1157
+ InputGlass.displayName = "InputGlass";
1158
+ const modalSizes = cva("relative w-full max-w-[calc(100%-2rem)] rounded-2xl p-6 transition-all duration-300", {
1159
+ variants: { size: {
1160
+ sm: "sm:max-w-[480px]",
1161
+ md: "sm:max-w-[640px]",
1162
+ lg: "sm:max-w-[800px]",
1163
+ xl: "sm:max-w-xl",
1164
+ full: "sm:max-w-4xl"
1165
+ } },
1166
+ defaultVariants: { size: "sm" }
1167
+ });
1168
+ var ModalContext = React.createContext({ size: "sm" });
1169
+ var useModalContext = () => React.useContext(ModalContext);
1170
+ function ModalRoot({ size = "sm", children, ...props }) {
1171
+ return /* @__PURE__ */ jsx(ModalContext.Provider, {
1172
+ value: { size },
1173
+ children: /* @__PURE__ */ jsx(DialogPrimitive.Root, {
1174
+ "data-slot": "dialog",
1175
+ ...props,
1176
+ children
1177
+ })
1178
+ });
1179
+ }
1180
+ function ModalTrigger({ ...props }) {
1181
+ return /* @__PURE__ */ jsx(DialogPrimitive.Trigger, {
1182
+ "data-slot": "dialog-trigger",
1183
+ ...props
1184
+ });
1185
+ }
1186
+ function ModalPortal({ ...props }) {
1187
+ return /* @__PURE__ */ jsx(DialogPrimitive.Portal, {
1188
+ "data-slot": "dialog-portal",
1189
+ ...props
1190
+ });
1191
+ }
1192
+ var ModalOverlay = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Overlay, {
1193
+ ref,
1194
+ "data-slot": "dialog-overlay",
1195
+ className: cn("fixed inset-0 z-50", "data-[state=open]:animate-in data-[state=closed]:animate-out", "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", className),
1196
+ style: {
1197
+ background: "var(--modal-overlay)",
1198
+ backdropFilter: "blur(var(--blur-sm))",
1199
+ WebkitBackdropFilter: "blur(var(--blur-sm))"
1200
+ },
1201
+ ...props
1202
+ }));
1203
+ ModalOverlay.displayName = "ModalOverlay";
1204
+ var ModalContent = React.forwardRef(({ className, children, showCloseButton = true, size: sizeProp, ...props }, ref) => {
1205
+ const { size: contextSize } = useModalContext();
1206
+ const size = sizeProp ?? contextSize;
1207
+ return /* @__PURE__ */ jsxs(ModalPortal, { children: [/* @__PURE__ */ jsx(ModalOverlay, {}), /* @__PURE__ */ jsxs(DialogPrimitive.Content, {
1208
+ ref,
1209
+ "data-slot": "dialog-content",
1210
+ className: cn(modalSizes({ size }), "fixed top-[50%] left-[50%] z-50", "translate-x-[-50%] translate-y-[-50%]", "data-[state=open]:animate-in data-[state=closed]:animate-out", "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95", "data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%]", "data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]", "duration-200", className),
1211
+ style: {
1212
+ background: "var(--modal-bg)",
1213
+ border: "1px solid var(--modal-border)",
1214
+ boxShadow: "var(--modal-glow)",
1215
+ backdropFilter: "blur(var(--blur-lg))",
1216
+ WebkitBackdropFilter: "blur(var(--blur-lg))"
1217
+ },
1218
+ ...props,
1219
+ children: [
1220
+ /* @__PURE__ */ jsx("div", {
1221
+ className: "absolute inset-0 rounded-3xl pointer-events-none",
1222
+ style: { background: "var(--modal-glow-effect)" },
1223
+ "aria-hidden": "true"
1224
+ }),
1225
+ /* @__PURE__ */ jsx("div", {
1226
+ className: "relative",
1227
+ children
1228
+ }),
1229
+ showCloseButton && /* @__PURE__ */ jsxs(DialogPrimitive.Close, {
1230
+ "data-slot": "dialog-close",
1231
+ className: cn("absolute top-4 right-4", "p-1.5 md:p-2 rounded-xl", "transition-all duration-300", "ring-offset-background", "focus:outline-none focus:ring-2 focus:ring-(--semantic-primary) focus:ring-offset-2", "hover:opacity-100 opacity-70", "disabled:pointer-events-none"),
1232
+ style: {
1233
+ background: "var(--modal-close-btn-bg)",
1234
+ border: "var(--modal-close-btn-border)",
1235
+ color: "var(--text-muted)"
1236
+ },
1237
+ children: [/* @__PURE__ */ jsx(X, { className: ICON_SIZES.md }), /* @__PURE__ */ jsx("span", {
1238
+ className: "sr-only",
1239
+ children: "Close"
1240
+ })]
1241
+ })
1242
+ ]
1243
+ })] });
1244
+ });
1245
+ ModalContent.displayName = "ModalContent";
1246
+ function ModalHeader({ className, ...props }) {
1247
+ return /* @__PURE__ */ jsx("div", {
1248
+ "data-slot": "dialog-header",
1249
+ className: cn("flex flex-col gap-2 text-center sm:text-left mb-4", className),
1250
+ ...props
1251
+ });
1252
+ }
1253
+ function ModalBody({ className, ...props }) {
1254
+ return /* @__PURE__ */ jsx("div", {
1255
+ "data-slot": "dialog-body",
1256
+ className: cn("relative", className),
1257
+ style: { color: "var(--text-secondary)" },
1258
+ ...props
1259
+ });
1260
+ }
1261
+ function ModalFooter({ className, ...props }) {
1262
+ return /* @__PURE__ */ jsx("div", {
1263
+ "data-slot": "dialog-footer",
1264
+ className: cn("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end mt-4", className),
1265
+ ...props
1266
+ });
1267
+ }
1268
+ var ModalTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Title, {
1269
+ ref,
1270
+ "data-slot": "dialog-title",
1271
+ className: cn("text-lg md:text-xl font-semibold leading-none tracking-tight", className),
1272
+ style: { color: "var(--text-primary)" },
1273
+ ...props
1274
+ }));
1275
+ ModalTitle.displayName = "ModalTitle";
1276
+ var ModalDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Description, {
1277
+ ref,
1278
+ "data-slot": "dialog-description",
1279
+ className: cn("text-sm", className),
1280
+ style: { color: "var(--text-muted)" },
1281
+ ...props
1282
+ }));
1283
+ ModalDescription.displayName = "ModalDescription";
1284
+ function ModalClose({ ...props }) {
1285
+ return /* @__PURE__ */ jsx(DialogPrimitive.Close, {
1286
+ "data-slot": "dialog-close",
1287
+ ...props
1288
+ });
1289
+ }
1290
+ const ModalGlass = {
1291
+ Root: ModalRoot,
1292
+ Trigger: ModalTrigger,
1293
+ Portal: ModalPortal,
1294
+ Overlay: ModalOverlay,
1295
+ Content: ModalContent,
1296
+ Header: ModalHeader,
1297
+ Body: ModalBody,
1298
+ Footer: ModalFooter,
1299
+ Title: ModalTitle,
1300
+ Description: ModalDescription,
1301
+ Close: ModalClose
1302
+ };
1303
+ const notificationVariants = cva("flex items-start gap-3 md:gap-4 p-4 md:p-5 rounded-2xl min-w-[280px] md:min-w-[320px] max-w-[360px] md:max-w-[420px] transition-all duration-300", {
1304
+ variants: { type: {
1305
+ info: "",
1306
+ success: "",
1307
+ warning: "",
1308
+ error: ""
1309
+ } },
1310
+ defaultVariants: { type: "info" }
1311
+ });
1312
+ var NOTIFICATION_ICONS = {
1313
+ info: Info,
1314
+ success: CheckCircle,
1315
+ warning: AlertTriangle,
1316
+ error: AlertCircle
1317
+ };
1318
+ var getTypeVars = (notifType) => {
1319
+ return {
1320
+ info: {
1321
+ color: "var(--notification-info-color)",
1322
+ glow: "var(--notification-info-glow)",
1323
+ iconBg: "var(--notification-info-icon-bg)"
1324
+ },
1325
+ success: {
1326
+ color: "var(--notification-success-color)",
1327
+ glow: "var(--notification-success-glow)",
1328
+ iconBg: "var(--notification-success-icon-bg)"
1329
+ },
1330
+ warning: {
1331
+ color: "var(--notification-warning-color)",
1332
+ glow: "var(--notification-warning-glow)",
1333
+ iconBg: "var(--notification-warning-icon-bg)"
1334
+ },
1335
+ error: {
1336
+ color: "var(--notification-error-color)",
1337
+ glow: "var(--notification-error-glow)",
1338
+ iconBg: "var(--notification-error-icon-bg)"
1339
+ }
1340
+ }[notifType];
1341
+ };
1342
+ const NotificationGlass = forwardRef(({ variant: variantProp, type: typeProp, title, message, onClose, className, ...props }, ref) => {
1343
+ const variant = variantProp ?? typeProp ?? "default";
1344
+ if (process.env.NODE_ENV === "development" && typeProp) console.warn("NotificationGlass: The \"type\" prop is deprecated. Use \"variant\" instead. Example: <NotificationGlass variant=\"destructive\" />");
1345
+ const effectiveType = {
1346
+ default: "info",
1347
+ destructive: "error",
1348
+ success: "success",
1349
+ warning: "warning",
1350
+ info: "info",
1351
+ error: "error"
1352
+ }[variant] || "info";
1353
+ const { isHovered, hoverProps } = useHover();
1354
+ const Icon = NOTIFICATION_ICONS[effectiveType];
1355
+ const config = getTypeVars(effectiveType);
1356
+ const containerStyles = {
1357
+ background: "var(--notification-bg)",
1358
+ border: "1px solid var(--notification-border)",
1359
+ boxShadow: isHovered ? config.glow : "var(--notification-shadow)",
1360
+ transform: isHovered ? "translateY(-2px)" : "translateY(0)"
1361
+ };
1362
+ const iconContainerStyles = {
1363
+ background: config.iconBg,
1364
+ boxShadow: isHovered ? config.glow : "none"
1365
+ };
1366
+ return /* @__PURE__ */ jsxs("div", {
1367
+ ref,
1368
+ className: cn(notificationVariants({ type: effectiveType }), className),
1369
+ style: containerStyles,
1370
+ role: "alert",
1371
+ "aria-live": "polite",
1372
+ onMouseEnter: hoverProps.onMouseEnter,
1373
+ onMouseLeave: hoverProps.onMouseLeave,
1374
+ ...props,
1375
+ children: [
1376
+ /* @__PURE__ */ jsx("div", {
1377
+ className: "w-8 h-8 md:w-10 md:h-10 rounded-xl flex items-center justify-center shrink-0",
1378
+ style: iconContainerStyles,
1379
+ children: /* @__PURE__ */ jsx(Icon, {
1380
+ className: "w-4 h-4 md:w-5 md:h-5",
1381
+ style: { color: config.color }
1382
+ })
1383
+ }),
1384
+ /* @__PURE__ */ jsxs("div", {
1385
+ className: "flex-1 min-w-0",
1386
+ children: [/* @__PURE__ */ jsx("p", {
1387
+ className: "font-semibold text-xs md:text-sm mb-0.5 md:mb-1",
1388
+ style: { color: "var(--text-primary)" },
1389
+ children: title
1390
+ }), /* @__PURE__ */ jsx("p", {
1391
+ className: "text-xs md:text-sm",
1392
+ style: { color: "var(--text-secondary)" },
1393
+ children: message
1394
+ })]
1395
+ }),
1396
+ /* @__PURE__ */ jsx("button", {
1397
+ onClick: onClose,
1398
+ className: "p-1 md:p-1.5 rounded-lg shrink-0",
1399
+ style: { color: "var(--text-muted)" },
1400
+ type: "button",
1401
+ "aria-label": "Close notification",
1402
+ children: /* @__PURE__ */ jsx(X, { className: ICON_SIZES.md })
1403
+ })
1404
+ ]
1405
+ });
1406
+ });
1407
+ NotificationGlass.displayName = "NotificationGlass";
1408
+ var PopoverGlassRoot = PopoverPrimitive.Root;
1409
+ var PopoverGlassTrigger = PopoverPrimitive.Trigger;
1410
+ var PopoverGlassAnchor = PopoverPrimitive.Anchor;
1411
+ var PopoverGlassContent = React.forwardRef(({ className, align = "center", sideOffset = 8, showArrow = true, children, ...props }, ref) => {
1412
+ const popoverStyles = {
1413
+ background: "var(--popover-bg)",
1414
+ border: "1px solid var(--popover-border)",
1415
+ boxShadow: "var(--popover-shadow)",
1416
+ backdropFilter: "blur(var(--blur-md))",
1417
+ WebkitBackdropFilter: "blur(var(--blur-md))"
1418
+ };
1419
+ const arrowStyles = { fill: "var(--popover-arrow-bg)" };
1420
+ return /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsxs(PopoverPrimitive.Content, {
1421
+ ref,
1422
+ align,
1423
+ sideOffset,
1424
+ className: cn("z-50003 rounded-2xl", "animate-in fade-in-0 zoom-in-95 duration-200", "data-[side=bottom]:slide-in-from-top-2", "data-[side=top]:slide-in-from-bottom-2", "data-[side=right]:slide-in-from-left-2", "data-[side=left]:slide-in-from-right-2", "outline-none", className),
1425
+ style: popoverStyles,
1426
+ ...props,
1427
+ children: [children, showArrow && /* @__PURE__ */ jsx(PopoverPrimitive.Arrow, {
1428
+ className: "fill-current",
1429
+ style: arrowStyles,
1430
+ width: 16,
1431
+ height: 8
1432
+ })]
1433
+ }) });
1434
+ });
1435
+ PopoverGlassContent.displayName = "PopoverGlassContent";
1436
+ var PopoverGlassLegacy = React.forwardRef(({ trigger, children, side = "bottom", align = "center", sideOffset = 8, open, onOpenChange, showArrow = true, className }, ref) => {
1437
+ return /* @__PURE__ */ jsxs(PopoverGlassRoot, {
1438
+ open,
1439
+ onOpenChange,
1440
+ children: [/* @__PURE__ */ jsx(PopoverGlassTrigger, {
1441
+ asChild: true,
1442
+ children: trigger
1443
+ }), /* @__PURE__ */ jsx(PopoverGlassContent, {
1444
+ ref,
1445
+ side,
1446
+ align,
1447
+ sideOffset,
1448
+ showArrow,
1449
+ className,
1450
+ children
1451
+ })]
1452
+ });
1453
+ });
1454
+ PopoverGlassLegacy.displayName = "PopoverGlassLegacy";
1455
+ const PopoverGlass = PopoverGlassRoot;
1456
+ const skeletonVariants = cva("overflow-hidden", {
1457
+ variants: { variant: {
1458
+ text: "h-3 md:h-4 rounded",
1459
+ title: "h-5 md:h-6 rounded",
1460
+ avatar: "w-10 h-10 md:w-12 md:h-12 rounded-full",
1461
+ thumbnail: "w-full h-24 md:h-32 rounded-xl",
1462
+ card: "w-full h-36 md:h-48 rounded-2xl"
1463
+ } },
1464
+ defaultVariants: { variant: "text" }
1465
+ });
1466
+ const SkeletonGlass = forwardRef(({ className, variant = "text", width, height, style, ...props }, ref) => {
1467
+ const skeletonStyles = {
1468
+ width,
1469
+ height,
1470
+ background: "linear-gradient(90deg, var(--skeleton-bg) 25%, var(--skeleton-shine) 50%, var(--skeleton-bg) 75%)",
1471
+ backgroundSize: "200% 100%",
1472
+ animation: "skeleton-loading 1.5s infinite",
1473
+ ...style
1474
+ };
1475
+ return /* @__PURE__ */ jsx("div", {
1476
+ ref,
1477
+ className: cn(skeletonVariants({ variant }), className),
1478
+ style: skeletonStyles,
1479
+ "aria-hidden": "true",
1480
+ ...props
1481
+ });
1482
+ });
1483
+ SkeletonGlass.displayName = "SkeletonGlass";
1484
+ const SliderGlass = forwardRef(({ className, value, defaultValue, onValueChange, onValueCommit, min = 0, max = 100, step = 1, showValue, label, error, success, disabled, orientation = "horizontal", ...props }, ref) => {
1485
+ const currentValue = value ?? defaultValue ?? [min];
1486
+ const formatValueDisplay = (values) => {
1487
+ if (values.length === 1) return `${values[0]}`;
1488
+ return `${values[0]} - ${values[values.length - 1]}`;
1489
+ };
1490
+ const trackStyles = { background: "var(--slider-track)" };
1491
+ const rangeStyles = { background: "var(--slider-fill)" };
1492
+ const thumbStyles = {
1493
+ background: "var(--slider-thumb)",
1494
+ border: "2px solid var(--slider-thumb-border)"
1495
+ };
1496
+ const customLabel = label && showValue || !label && showValue ? /* @__PURE__ */ jsxs("div", {
1497
+ className: "flex justify-between mb-1.5 md:mb-2",
1498
+ children: [label && /* @__PURE__ */ jsx("label", {
1499
+ className: "text-xs md:text-sm font-medium",
1500
+ style: { color: "var(--text-secondary)" },
1501
+ children: label
1502
+ }), /* @__PURE__ */ jsx("span", {
1503
+ className: "text-xs md:text-sm font-medium tabular-nums",
1504
+ style: { color: "var(--text-secondary)" },
1505
+ children: formatValueDisplay(currentValue)
1506
+ })]
1507
+ }) : void 0;
1508
+ return /* @__PURE__ */ jsxs(FormFieldWrapper, {
1509
+ label: showValue ? void 0 : label,
1510
+ error,
1511
+ success,
1512
+ className: cn("w-full", className),
1513
+ children: [customLabel, /* @__PURE__ */ jsxs(SliderPrimitive.Root, {
1514
+ ref,
1515
+ value,
1516
+ defaultValue,
1517
+ onValueChange,
1518
+ onValueCommit,
1519
+ min,
1520
+ max,
1521
+ step,
1522
+ disabled,
1523
+ orientation,
1524
+ className: cn("relative flex touch-none select-none", orientation === "horizontal" ? "w-full h-8 md:h-6 items-center" : "flex-col h-full w-8 md:w-6 justify-center", disabled && "opacity-50 cursor-not-allowed", "group"),
1525
+ ...props,
1526
+ children: [/* @__PURE__ */ jsx(SliderPrimitive.Track, {
1527
+ className: cn("relative grow rounded-full", orientation === "horizontal" ? "h-2.5 md:h-2 w-full" : "w-2.5 md:w-2 h-full"),
1528
+ style: trackStyles,
1529
+ children: /* @__PURE__ */ jsx(SliderPrimitive.Range, {
1530
+ className: cn("absolute rounded-full transition-shadow duration-150", orientation === "horizontal" ? "h-full" : "w-full", "group-hover:shadow-(--slider-fill-glow)", "group-active:shadow-(--slider-fill-glow)"),
1531
+ style: rangeStyles
1532
+ })
1533
+ }), currentValue.map((_, index) => /* @__PURE__ */ jsx(SliderPrimitive.Thumb, {
1534
+ className: cn("block rounded-full shadow-md transition-all duration-150", "w-6 h-6 md:w-5 md:h-5", "hover:scale-105", "focus-visible:outline-none focus-visible:shadow-(--focus-glow)", "active:scale-110", disabled && "pointer-events-none"),
1535
+ style: thumbStyles,
1536
+ "aria-label": label ? currentValue.length > 1 ? `${label} thumb ${index + 1}` : label : `Slider thumb ${index + 1}`
1537
+ }, index))]
1538
+ })]
1539
+ });
1540
+ });
1541
+ SliderGlass.displayName = "SliderGlass";
1542
+ var TabsContext = createContext(null);
1543
+ var useTabsContext = () => {
1544
+ const context = useContext(TabsContext);
1545
+ if (!context) throw new Error("Tabs compound components must be used within TabsGlass.Root");
1546
+ return context;
1547
+ };
1548
+ var TabsRoot = ({ value, onValueChange, children, className }) => {
1549
+ return /* @__PURE__ */ jsx(TabsContext.Provider, {
1550
+ value: {
1551
+ value,
1552
+ onValueChange
1553
+ },
1554
+ children: /* @__PURE__ */ jsx("div", {
1555
+ className: cn("tabs-glass-root", className),
1556
+ children
1557
+ })
1558
+ });
1559
+ };
1560
+ var TabsList = forwardRef(({ children, className, ...props }, ref) => {
1561
+ return /* @__PURE__ */ jsx("div", {
1562
+ ref,
1563
+ className: cn("inline-flex gap-0.5 md:gap-1 p-0.5 md:p-1 rounded-xl", className),
1564
+ style: {
1565
+ background: "var(--tab-container-bg)",
1566
+ border: "1px solid var(--tab-container-border)"
1567
+ },
1568
+ role: "tablist",
1569
+ ...props,
1570
+ children
1571
+ });
1572
+ });
1573
+ TabsList.displayName = "TabsList";
1574
+ var TabsTrigger = forwardRef(({ value, children, className, disabled }, ref) => {
1575
+ const { value: activeValue, onValueChange } = useTabsContext();
1576
+ const { isFocusVisible, focusProps } = useFocus({ focusVisible: true });
1577
+ const isActive = activeValue === value;
1578
+ const tabStyles = {
1579
+ background: isActive ? "var(--tab-active-bg)" : "var(--tab-bg)",
1580
+ color: isActive ? "var(--tab-active-text)" : "var(--text-secondary)",
1581
+ boxShadow: isFocusVisible && !disabled ? "var(--focus-glow)" : "none"
1582
+ };
1583
+ const handleKeyDown = (e) => {
1584
+ if (disabled) return;
1585
+ const tablist = e.currentTarget.closest("[role=\"tablist\"]");
1586
+ if (!tablist) return;
1587
+ const tabs = Array.from(tablist.querySelectorAll("[role=\"tab\"]:not([disabled])"));
1588
+ const currentIndex = tabs.indexOf(e.currentTarget);
1589
+ let nextIndex = currentIndex;
1590
+ switch (e.key) {
1591
+ case "ArrowRight":
1592
+ e.preventDefault();
1593
+ nextIndex = currentIndex + 1 >= tabs.length ? 0 : currentIndex + 1;
1594
+ break;
1595
+ case "ArrowLeft":
1596
+ e.preventDefault();
1597
+ nextIndex = currentIndex - 1 < 0 ? tabs.length - 1 : currentIndex - 1;
1598
+ break;
1599
+ case "Home":
1600
+ e.preventDefault();
1601
+ nextIndex = 0;
1602
+ break;
1603
+ case "End":
1604
+ e.preventDefault();
1605
+ nextIndex = tabs.length - 1;
1606
+ break;
1607
+ default: return;
1608
+ }
1609
+ const nextTab = tabs[nextIndex];
1610
+ if (nextTab) {
1611
+ nextTab.focus();
1612
+ const nextValue = nextTab.getAttribute("data-value");
1613
+ if (nextValue && onValueChange) onValueChange(nextValue);
1614
+ }
1615
+ };
1616
+ return /* @__PURE__ */ jsxs("button", {
1617
+ ref,
1618
+ type: "button",
1619
+ role: "tab",
1620
+ "aria-selected": isActive,
1621
+ disabled,
1622
+ "data-value": value,
1623
+ className: cn("relative px-2.5 py-1.5 md:px-4 md:py-2 rounded-lg text-xs md:text-sm font-medium transition-[background-color,color,opacity] duration-300", disabled && "opacity-50 cursor-not-allowed", className),
1624
+ style: tabStyles,
1625
+ onClick: () => !disabled && onValueChange?.(value),
1626
+ onKeyDown: handleKeyDown,
1627
+ onFocus: focusProps.onFocus,
1628
+ onBlur: focusProps.onBlur,
1629
+ children: [children, isActive && /* @__PURE__ */ jsx("div", {
1630
+ className: "absolute bottom-0 left-1/2 -translate-x-1/2 w-6 md:w-8 h-0.5 rounded-full",
1631
+ style: { background: "var(--tab-indicator)" }
1632
+ })]
1633
+ });
1634
+ });
1635
+ TabsTrigger.displayName = "TabsTrigger";
1636
+ var TabsContent = ({ value, children, className }) => {
1637
+ const { value: activeValue } = useTabsContext();
1638
+ const isActive = activeValue === value;
1639
+ if (!isActive) return null;
1640
+ return /* @__PURE__ */ jsx("div", {
1641
+ role: "tabpanel",
1642
+ "aria-hidden": !isActive,
1643
+ className: cn("animate-in fade-in-0 duration-200", className),
1644
+ children
1645
+ });
1646
+ };
1647
+ const TabsGlass = {
1648
+ Root: TabsRoot,
1649
+ List: TabsList,
1650
+ Trigger: TabsTrigger,
1651
+ Content: TabsContent
1652
+ };
1653
+ const toggleSizes = cva("relative rounded-full transition-all duration-300", {
1654
+ variants: {
1655
+ size: {
1656
+ sm: "w-8 h-4",
1657
+ default: "w-11 h-6",
1658
+ lg: "w-14 h-7"
1659
+ },
1660
+ variant: {
1661
+ default: "",
1662
+ outline: "border-2"
1663
+ }
1664
+ },
1665
+ defaultVariants: {
1666
+ size: "default",
1667
+ variant: "default"
1668
+ }
1669
+ });
1670
+ var sizesConfig = {
1671
+ sm: {
1672
+ track: "w-8 h-4",
1673
+ knob: "w-3 h-3",
1674
+ translate: "translate-x-4"
1675
+ },
1676
+ default: {
1677
+ track: "w-11 h-6",
1678
+ knob: "w-5 h-5",
1679
+ translate: "translate-x-5"
1680
+ },
1681
+ lg: {
1682
+ track: "w-14 h-7",
1683
+ knob: "w-6 h-6",
1684
+ translate: "translate-x-7"
1685
+ }
1686
+ };
1687
+ const ToggleGlass = forwardRef(({ className, size = "default", variant = "default", pressed: controlledPressed, defaultPressed = false, onPressedChange, disabled, label, ...props }, ref) => {
1688
+ const [uncontrolledPressed, setUncontrolledPressed] = useState(defaultPressed);
1689
+ const isControlled = controlledPressed !== void 0;
1690
+ const isPressed = isControlled ? controlledPressed : uncontrolledPressed;
1691
+ const { isFocusVisible, focusProps } = useFocus({ focusVisible: true });
1692
+ const s = sizesConfig[size ?? "default"];
1693
+ const handleToggle = () => {
1694
+ if (disabled) return;
1695
+ const newValue = !isPressed;
1696
+ if (!isControlled) setUncontrolledPressed(newValue);
1697
+ onPressedChange?.(newValue);
1698
+ };
1699
+ const getTrackStyles = () => {
1700
+ if (variant === "outline") return {
1701
+ background: isPressed ? "var(--toggle-outline-active-bg)" : "transparent",
1702
+ borderColor: isPressed ? "var(--toggle-outline-active-border)" : "var(--toggle-outline-border)",
1703
+ boxShadow: isFocusVisible && !disabled ? "var(--focus-glow)" : "none"
1704
+ };
1705
+ return {
1706
+ background: isPressed ? "var(--toggle-active-bg)" : "var(--toggle-bg)",
1707
+ boxShadow: isFocusVisible && !disabled ? "var(--focus-glow)" : isPressed ? "var(--toggle-glow)" : "none"
1708
+ };
1709
+ };
1710
+ const knobStyles = { background: "var(--toggle-knob)" };
1711
+ const toggle = /* @__PURE__ */ jsx("span", {
1712
+ className: "inline-flex items-center justify-center min-h-11",
1713
+ children: /* @__PURE__ */ jsx("button", {
1714
+ ref,
1715
+ type: "button",
1716
+ role: "switch",
1717
+ "aria-pressed": isPressed,
1718
+ "aria-label": label || "Toggle switch",
1719
+ disabled,
1720
+ className: cn(toggleSizes({
1721
+ size,
1722
+ variant
1723
+ }), disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer", !label && className),
1724
+ style: getTrackStyles(),
1725
+ onClick: handleToggle,
1726
+ onFocus: focusProps.onFocus,
1727
+ onBlur: focusProps.onBlur,
1728
+ ...props,
1729
+ children: /* @__PURE__ */ jsx("div", {
1730
+ className: cn("absolute top-0.5 left-0.5 rounded-full shadow-md transition-all duration-300", s.knob, isPressed && s.translate),
1731
+ style: knobStyles
1732
+ })
1733
+ })
1734
+ });
1735
+ if (label) return /* @__PURE__ */ jsxs("label", {
1736
+ className: cn("inline-flex items-center gap-2 md:gap-2.5", disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer", className),
1737
+ children: [toggle, /* @__PURE__ */ jsx("span", {
1738
+ className: "text-xs md:text-sm",
1739
+ style: { color: "var(--text-secondary)" },
1740
+ children: label
1741
+ })]
1742
+ });
1743
+ return toggle;
1744
+ });
1745
+ ToggleGlass.displayName = "ToggleGlass";
1746
+ var TooltipGlassProvider = ({ delayDuration = 0, ...props }) => {
1747
+ return /* @__PURE__ */ jsx(TooltipPrimitive.Provider, {
1748
+ "data-slot": "tooltip-provider",
1749
+ delayDuration,
1750
+ ...props
1751
+ });
1752
+ };
1753
+ TooltipGlassProvider.displayName = "TooltipGlassProvider";
1754
+ function TooltipGlassRoot({ ...props }) {
1755
+ return /* @__PURE__ */ jsx(TooltipGlassProvider, { children: /* @__PURE__ */ jsx(TooltipPrimitive.Root, {
1756
+ "data-slot": "tooltip",
1757
+ ...props
1758
+ }) });
1759
+ }
1760
+ var TooltipGlassTrigger = React.forwardRef(({ ...props }, ref) => /* @__PURE__ */ jsx(TooltipPrimitive.Trigger, {
1761
+ ref,
1762
+ "data-slot": "tooltip-trigger",
1763
+ ...props
1764
+ }));
1765
+ TooltipGlassTrigger.displayName = "TooltipGlassTrigger";
1766
+ var TooltipGlassContent = React.forwardRef(({ className, sideOffset = 0, children, ...props }, ref) => {
1767
+ const tooltipStyles = {
1768
+ background: "var(--tooltip-bg)",
1769
+ color: "var(--tooltip-text)",
1770
+ border: "1px solid var(--tooltip-border)",
1771
+ boxShadow: "var(--tooltip-shadow)",
1772
+ backdropFilter: "blur(var(--blur-xl))",
1773
+ WebkitBackdropFilter: "blur(var(--blur-xl))"
1774
+ };
1775
+ return /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsxs(TooltipPrimitive.Content, {
1776
+ ref,
1777
+ sideOffset,
1778
+ "data-slot": "tooltip-content",
1779
+ className: cn("z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance", "animate-in fade-in-0 zoom-in-95", "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95", "data-[side=bottom]:slide-in-from-top-2", "data-[side=left]:slide-in-from-right-2", "data-[side=right]:slide-in-from-left-2", "data-[side=top]:slide-in-from-bottom-2", className),
1780
+ style: tooltipStyles,
1781
+ ...props,
1782
+ children: [children, /* @__PURE__ */ jsx(TooltipPrimitive.Arrow, {
1783
+ className: "z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-xs",
1784
+ style: {
1785
+ fill: "var(--tooltip-bg)",
1786
+ background: "var(--tooltip-bg)"
1787
+ }
1788
+ })]
1789
+ }) });
1790
+ });
1791
+ TooltipGlassContent.displayName = "TooltipGlassContent";
1792
+ var TooltipGlassSimple = ({ content, children, side = "top", className }) => {
1793
+ return /* @__PURE__ */ jsxs(TooltipGlassRoot, { children: [/* @__PURE__ */ jsx(TooltipGlassTrigger, {
1794
+ asChild: true,
1795
+ children
1796
+ }), /* @__PURE__ */ jsx(TooltipGlassContent, {
1797
+ side,
1798
+ className,
1799
+ children: content
1800
+ })] });
1801
+ };
1802
+ const TooltipGlass = TooltipGlassRoot;
1803
+ const ExpandableHeaderGlass = forwardRef(({ title, icon: Icon, iconColor = "var(--text-accent)", expanded, onToggle, className, ...props }, ref) => {
1804
+ const textStyles = { color: "var(--text-primary)" };
1805
+ const chevronStyles = { color: "var(--text-muted)" };
1806
+ const iconStyles = { color: iconColor };
1807
+ return /* @__PURE__ */ jsxs("button", {
1808
+ ref,
1809
+ type: "button",
1810
+ onClick: onToggle,
1811
+ "aria-expanded": expanded,
1812
+ className: cn("w-full p-4 flex items-center justify-between rounded-2xl transition-colors hover:bg-white/5", className),
1813
+ style: textStyles,
1814
+ ...props,
1815
+ children: [/* @__PURE__ */ jsxs("div", {
1816
+ className: "flex items-center gap-2",
1817
+ children: [Icon && /* @__PURE__ */ jsx(Icon, {
1818
+ className: "w-5 h-5",
1819
+ style: iconStyles
1820
+ }), /* @__PURE__ */ jsx("span", {
1821
+ className: "font-medium",
1822
+ children: title
1823
+ })]
1824
+ }), expanded ? /* @__PURE__ */ jsx(ChevronUp, {
1825
+ className: "w-5 h-5",
1826
+ style: chevronStyles
1827
+ }) : /* @__PURE__ */ jsx(ChevronDown, {
1828
+ className: "w-5 h-5",
1829
+ style: chevronStyles
1830
+ })]
1831
+ });
1832
+ });
1833
+ ExpandableHeaderGlass.displayName = "ExpandableHeaderGlass";
1834
+ var iconButtonVariants = cva("rounded-xl flex items-center justify-center transition-all duration-300 hover:scale-105 focus:outline-none focus:ring-2 focus:ring-offset-2", {
1835
+ variants: {
1836
+ size: {
1837
+ sm: "w-8 h-8",
1838
+ md: "w-10 h-10",
1839
+ lg: "w-12 h-12",
1840
+ touch: "w-11 h-11 md:w-10 md:h-10"
1841
+ },
1842
+ variant: {
1843
+ gradient: "",
1844
+ subtle: "",
1845
+ ghost: "bg-transparent hover:bg-white/10"
1846
+ }
1847
+ },
1848
+ defaultVariants: {
1849
+ size: "md",
1850
+ variant: "gradient"
1851
+ }
1852
+ });
1853
+ const IconButtonGlass = forwardRef(({ icon: Icon, iconSize = 20, size, variant, className, "aria-label": ariaLabel, ...props }, ref) => {
1854
+ const gradientStyles = variant === "gradient" ? {
1855
+ background: "linear-gradient(135deg, var(--icon-btn-from), var(--icon-btn-to))",
1856
+ boxShadow: "var(--icon-btn-shadow)"
1857
+ } : void 0;
1858
+ const subtleStyles = variant === "subtle" ? {
1859
+ background: "var(--card-subtle-bg)",
1860
+ border: "1px solid var(--card-subtle-border)"
1861
+ } : void 0;
1862
+ const iconStyles = { color: "var(--icon-btn-text)" };
1863
+ return /* @__PURE__ */ jsx("button", {
1864
+ ref,
1865
+ type: "button",
1866
+ "aria-label": ariaLabel,
1867
+ className: cn(iconButtonVariants({
1868
+ size,
1869
+ variant
1870
+ }), className),
1871
+ style: gradientStyles ?? subtleStyles,
1872
+ ...props,
1873
+ children: /* @__PURE__ */ jsx(Icon, {
1874
+ size: iconSize,
1875
+ style: iconStyles
1876
+ })
1877
+ });
1878
+ });
1879
+ IconButtonGlass.displayName = "IconButtonGlass";
1880
+ const insightVariantConfig = {
1881
+ default: {
1882
+ defaultEmoji: "💡",
1883
+ glowVar: "--glow-primary",
1884
+ borderVar: "--glass-border"
1885
+ },
1886
+ tip: {
1887
+ defaultEmoji: "💡",
1888
+ glowVar: "--glow-secondary",
1889
+ borderVar: "--alert-default-border"
1890
+ },
1891
+ highlight: {
1892
+ defaultEmoji: "✨",
1893
+ glowVar: "--glow-success",
1894
+ borderVar: "--alert-success-border"
1895
+ },
1896
+ warning: {
1897
+ defaultEmoji: "⚠️",
1898
+ glowVar: "--glow-warning",
1899
+ borderVar: "--alert-warning-border"
1900
+ },
1901
+ stat: {
1902
+ defaultEmoji: "📊",
1903
+ glowVar: null,
1904
+ borderVar: "--glass-border"
1905
+ },
1906
+ growth: {
1907
+ defaultEmoji: "📈",
1908
+ glowVar: "--glow-success",
1909
+ borderVar: "--alert-success-border"
1910
+ },
1911
+ decline: {
1912
+ defaultEmoji: "📉",
1913
+ glowVar: "--glow-error",
1914
+ borderVar: "--alert-destructive-border"
1915
+ }
1916
+ };
1917
+ const insightCardVariants = cva("relative rounded-lg transition-all duration-200", {
1918
+ variants: {
1919
+ inline: {
1920
+ true: "inline-flex items-center gap-1.5",
1921
+ false: "p-3 bg-[var(--glass-bg-subtle)] border"
1922
+ },
1923
+ clickable: {
1924
+ true: "cursor-pointer hover:bg-[var(--glass-bg)]",
1925
+ false: ""
1926
+ }
1927
+ },
1928
+ defaultVariants: {
1929
+ inline: false,
1930
+ clickable: false
1931
+ }
1932
+ });
1933
+ const InsightCardGlass = forwardRef(({ emoji, text, detail, variant = "default", inline = false, onClick, showArrow = false, animated = false, className, ...props }, ref) => {
1934
+ const config = insightVariantConfig[variant];
1935
+ const displayEmoji = emoji ?? config.defaultEmoji;
1936
+ const isClickable = !!onClick;
1937
+ const handleClick = () => onClick?.();
1938
+ const handleKeyDown = (e) => {
1939
+ if (isClickable && (e.key === "Enter" || e.key === " ")) {
1940
+ e.preventDefault();
1941
+ onClick?.();
1942
+ }
1943
+ };
1944
+ const borderStyle = !inline ? { borderColor: `var(${config.borderVar})` } : {};
1945
+ const glowStyle = isClickable && config.glowVar ? { "--hover-glow": `var(${config.glowVar})` } : {};
1946
+ if (inline) return /* @__PURE__ */ jsxs("span", {
1947
+ ref,
1948
+ className: cn("inline-flex items-center gap-1.5 text-sm text-[var(--text-secondary)]", className),
1949
+ ...props,
1950
+ children: [
1951
+ /* @__PURE__ */ jsx("span", {
1952
+ "aria-hidden": "true",
1953
+ children: displayEmoji
1954
+ }),
1955
+ /* @__PURE__ */ jsx("span", { children: text }),
1956
+ detail && /* @__PURE__ */ jsxs("span", {
1957
+ className: "text-[var(--text-muted)]",
1958
+ children: [
1959
+ "(",
1960
+ detail,
1961
+ ")"
1962
+ ]
1963
+ })
1964
+ ]
1965
+ });
1966
+ return /* @__PURE__ */ jsx("div", {
1967
+ ref,
1968
+ role: isClickable ? "button" : void 0,
1969
+ tabIndex: isClickable ? 0 : void 0,
1970
+ onClick: isClickable ? handleClick : void 0,
1971
+ onKeyDown: isClickable ? handleKeyDown : void 0,
1972
+ className: cn(insightCardVariants({
1973
+ inline,
1974
+ clickable: isClickable
1975
+ }), isClickable && config.glowVar && "hover:shadow-[0_0_12px_var(--hover-glow)]", animated && "animate-insight-fade-in", className),
1976
+ style: {
1977
+ ...borderStyle,
1978
+ ...glowStyle
1979
+ },
1980
+ ...props,
1981
+ children: /* @__PURE__ */ jsxs("div", {
1982
+ className: "flex items-start gap-2",
1983
+ children: [
1984
+ /* @__PURE__ */ jsx("span", {
1985
+ className: "text-lg flex-shrink-0",
1986
+ "aria-hidden": "true",
1987
+ children: displayEmoji
1988
+ }),
1989
+ /* @__PURE__ */ jsxs("div", {
1990
+ className: "flex-1 min-w-0",
1991
+ children: [/* @__PURE__ */ jsx("p", {
1992
+ className: "text-sm text-[var(--text-primary)]",
1993
+ children: text
1994
+ }), detail && /* @__PURE__ */ jsx("p", {
1995
+ className: "text-xs text-[var(--text-muted)] mt-0.5",
1996
+ children: detail
1997
+ })]
1998
+ }),
1999
+ showArrow && /* @__PURE__ */ jsx(ChevronRight, {
2000
+ className: "w-4 h-4 text-[var(--text-muted)] flex-shrink-0",
2001
+ "aria-hidden": "true"
2002
+ })
2003
+ ]
2004
+ })
2005
+ });
2006
+ });
2007
+ InsightCardGlass.displayName = "InsightCardGlass";
2008
+ const SearchBoxGlass = forwardRef(({ onSubmit, defaultValue = "", value: controlledValue, onChange: controlledOnChange, variant = "default", inputWidth = "w-32 sm:w-40 md:w-48", placeholder = "Search username...", className, ...props }, ref) => {
2009
+ const [internalValue, setInternalValue] = useState(defaultValue);
2010
+ const [isFocused, setIsFocused] = useState(false);
2011
+ const isControlled = controlledValue !== void 0;
2012
+ const value = isControlled ? controlledValue : internalValue;
2013
+ const handleChange = (e) => {
2014
+ const newValue = e.target.value;
2015
+ if (isControlled) controlledOnChange?.(newValue);
2016
+ else setInternalValue(newValue);
2017
+ };
2018
+ const handleSubmit = () => {
2019
+ onSubmit?.(value);
2020
+ };
2021
+ const handleKeyDown = (e) => {
2022
+ if (e.key === "Enter") handleSubmit();
2023
+ };
2024
+ const containerStyles = { boxShadow: isFocused ? "var(--focus-glow)" : "none" };
2025
+ const inputStyles = {
2026
+ background: "var(--search-bg)",
2027
+ color: "var(--text-primary)",
2028
+ border: "1px solid var(--search-border)",
2029
+ borderRight: "none",
2030
+ borderTopLeftRadius: "0.75rem",
2031
+ borderBottomLeftRadius: "0.75rem"
2032
+ };
2033
+ const buttonStyles = {
2034
+ background: "var(--search-btn-bg)",
2035
+ color: "var(--search-btn-text)",
2036
+ borderTopRightRadius: "0.75rem",
2037
+ borderBottomRightRadius: "0.75rem"
2038
+ };
2039
+ return /* @__PURE__ */ jsxs("div", {
2040
+ className: cn("flex w-fit rounded-xl overflow-hidden", className),
2041
+ style: containerStyles,
2042
+ children: [/* @__PURE__ */ jsx("input", {
2043
+ ref,
2044
+ type: "text",
2045
+ value,
2046
+ onChange: handleChange,
2047
+ onFocus: () => setIsFocused(true),
2048
+ onBlur: () => setIsFocused(false),
2049
+ onKeyDown: handleKeyDown,
2050
+ placeholder,
2051
+ "aria-label": placeholder,
2052
+ className: cn("px-4 py-2 text-sm outline-none transition-all", inputWidth),
2053
+ style: inputStyles,
2054
+ ...props
2055
+ }), /* @__PURE__ */ jsxs("button", {
2056
+ onClick: handleSubmit,
2057
+ type: "button",
2058
+ className: cn("px-5 py-2 text-sm font-medium flex items-center gap-2 hover:scale-[1.02] transition-transform", variant === "compact" && "px-3"),
2059
+ style: buttonStyles,
2060
+ "aria-label": "Search",
2061
+ children: [/* @__PURE__ */ jsx(Search, { className: "w-4 h-4" }), variant === "default" && /* @__PURE__ */ jsx("span", {
2062
+ className: "hidden sm:inline",
2063
+ children: "Search"
2064
+ })]
2065
+ })]
2066
+ });
2067
+ });
2068
+ SearchBoxGlass.displayName = "SearchBoxGlass";
2069
+ var fieldLabels = {
2070
+ commits: "Commits",
2071
+ stars: "Stars",
2072
+ name: "Name",
2073
+ contribution: "Contribution"
2074
+ };
2075
+ const SortDropdownGlass = React.forwardRef(({ sortBy, sortOrder, onSortChange, options = [
2076
+ "commits",
2077
+ "stars",
2078
+ "name",
2079
+ "contribution"
2080
+ ], compact = false, className, ...props }, ref) => {
2081
+ const handleFieldSelect = React.useCallback((field) => {
2082
+ if (field === sortBy) onSortChange(field, sortOrder === "asc" ? "desc" : "asc");
2083
+ else onSortChange(field, "desc");
2084
+ }, [
2085
+ sortBy,
2086
+ sortOrder,
2087
+ onSortChange
2088
+ ]);
2089
+ const SortIcon = sortOrder === "asc" ? ArrowUp : ArrowDown;
2090
+ return /* @__PURE__ */ jsx("div", {
2091
+ ref,
2092
+ className: cn("relative inline-block", className),
2093
+ ...props,
2094
+ children: /* @__PURE__ */ jsxs(DropdownMenuGlass, { children: [/* @__PURE__ */ jsx(DropdownMenuGlassTrigger, {
2095
+ asChild: true,
2096
+ children: /* @__PURE__ */ jsx("button", {
2097
+ type: "button",
2098
+ className: cn("flex items-center gap-1.5 px-3 py-1.5 rounded-xl text-xs font-medium", "sm:gap-2 sm:px-4 sm:py-2 sm:text-sm", "bg-(--dropdown-bg) border border-(--dropdown-border)", "backdrop-blur-md", "transition-all duration-200", "hover:opacity-90 hover:shadow-(--dropdown-glow)", "focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2", "focus-visible:ring-(--text-accent)", "text-(--dropdown-item-text)"),
2099
+ "aria-haspopup": "menu",
2100
+ children: compact ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", { children: "Sort" }), /* @__PURE__ */ jsx(SortIcon, { className: cn(ICON_SIZES.sm, "text-(--text-accent)") })] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
2101
+ /* @__PURE__ */ jsx("span", {
2102
+ className: "hidden sm:inline text-(--text-muted)",
2103
+ children: "Sort:"
2104
+ }),
2105
+ /* @__PURE__ */ jsx("span", { children: fieldLabels[sortBy] }),
2106
+ /* @__PURE__ */ jsx(SortIcon, { className: cn(ICON_SIZES.sm, "text-(--text-accent)") }),
2107
+ /* @__PURE__ */ jsx(ChevronDown, { className: cn(ICON_SIZES.sm, "text-(--text-muted)", "transition-transform duration-200", "group-data-[state=open]:rotate-180") })
2108
+ ] })
2109
+ })
2110
+ }), /* @__PURE__ */ jsx(DropdownMenuGlassContent, {
2111
+ align: "start",
2112
+ "aria-label": "Sort options",
2113
+ children: options.map((field) => {
2114
+ const isSelected = field === sortBy;
2115
+ return /* @__PURE__ */ jsxs(DropdownMenuGlassItem, {
2116
+ onSelect: () => handleFieldSelect(field),
2117
+ className: cn("justify-between", isSelected && "bg-(--select-item-selected-bg)"),
2118
+ children: [/* @__PURE__ */ jsx("span", {
2119
+ className: "font-medium",
2120
+ children: fieldLabels[field]
2121
+ }), isSelected && /* @__PURE__ */ jsxs("div", {
2122
+ className: "flex items-center gap-1 text-(--text-accent)",
2123
+ children: [sortOrder === "asc" ? /* @__PURE__ */ jsx(ArrowUp, { className: ICON_SIZES.sm }) : /* @__PURE__ */ jsx(ArrowDown, { className: ICON_SIZES.sm }), /* @__PURE__ */ jsx(Check, { className: ICON_SIZES.sm })]
2124
+ })]
2125
+ }, field);
2126
+ })
2127
+ })] })
2128
+ });
2129
+ });
2130
+ SortDropdownGlass.displayName = "SortDropdownGlass";
2131
+ var statItemVariants = cva("flex items-center gap-1", {
2132
+ variants: {
2133
+ size: {
2134
+ sm: "text-xs",
2135
+ md: "text-sm",
2136
+ lg: "text-base"
2137
+ },
2138
+ layout: {
2139
+ horizontal: "flex-row",
2140
+ vertical: "flex-col items-start gap-0.5"
2141
+ }
2142
+ },
2143
+ defaultVariants: {
2144
+ size: "md",
2145
+ layout: "horizontal"
2146
+ }
2147
+ });
2148
+ const StatItemGlass = forwardRef(({ icon: Icon, value, label, iconSize = 16, abbreviated = false, size, layout, className, ...props }, ref) => {
2149
+ const textStyles = { color: "var(--text-secondary)" };
2150
+ const iconStyles = { color: "var(--text-accent)" };
2151
+ const formatValue = (val) => {
2152
+ if (!abbreviated || typeof val !== "number") return String(val);
2153
+ if (val >= 1e6) return `${(val / 1e6).toFixed(1)}M`;
2154
+ if (val >= 1e3) return `${(val / 1e3).toFixed(1)}k`;
2155
+ return String(val);
2156
+ };
2157
+ return /* @__PURE__ */ jsxs("span", {
2158
+ ref,
2159
+ className: cn(statItemVariants({
2160
+ size,
2161
+ layout
2162
+ }), className),
2163
+ style: textStyles,
2164
+ ...props,
2165
+ children: [/* @__PURE__ */ jsx(Icon, {
2166
+ size: iconSize,
2167
+ style: iconStyles
2168
+ }), /* @__PURE__ */ jsxs("span", {
2169
+ className: "font-medium",
2170
+ children: [
2171
+ formatValue(value),
2172
+ " ",
2173
+ label
2174
+ ]
2175
+ })]
2176
+ });
2177
+ });
2178
+ StatItemGlass.displayName = "StatItemGlass";
2179
+ var themes$1 = [
2180
+ "light",
2181
+ "aurora",
2182
+ "glass"
2183
+ ];
2184
+ var themeConfig$1 = {
2185
+ light: {
2186
+ label: "Light",
2187
+ icon: Sun
2188
+ },
2189
+ aurora: {
2190
+ label: "Aurora",
2191
+ icon: Moon
2192
+ },
2193
+ glass: {
2194
+ label: "Glass",
2195
+ icon: Palette
2196
+ }
2197
+ };
2198
+ const ThemeToggleGlass = forwardRef(({ onToggle, iconSize = 20, iconOnly = false, className, ...props }, ref) => {
2199
+ const { theme, cycleTheme } = useTheme();
2200
+ const nextTheme = themes$1[(themes$1.indexOf(theme) + 1) % themes$1.length];
2201
+ const NextIcon = themeConfig$1[nextTheme].icon;
2202
+ const nextLabel = themeConfig$1[nextTheme].label;
2203
+ const buttonStyles = {
2204
+ background: "var(--card-subtle-bg)",
2205
+ border: "1px solid var(--card-subtle-border)"
2206
+ };
2207
+ const iconStyles = { color: "var(--text-secondary)" };
2208
+ return /* @__PURE__ */ jsx("button", {
2209
+ ref,
2210
+ type: "button",
2211
+ onClick: onToggle ?? cycleTheme,
2212
+ "aria-label": `Switch to ${nextLabel} theme`,
2213
+ className: cn("p-2.5 rounded-xl transition-all duration-300 hover:scale-105 focus:outline-none focus:ring-2 focus:ring-offset-2", iconOnly && "md:px-4 md:gap-2", className),
2214
+ style: buttonStyles,
2215
+ ...props,
2216
+ children: /* @__PURE__ */ jsxs("div", {
2217
+ className: "flex items-center gap-2",
2218
+ children: [/* @__PURE__ */ jsx(NextIcon, {
2219
+ size: iconSize,
2220
+ style: iconStyles
2221
+ }), !iconOnly && /* @__PURE__ */ jsx("span", {
2222
+ className: "hidden md:inline text-sm font-medium",
2223
+ style: iconStyles,
2224
+ children: nextLabel
2225
+ })]
2226
+ })
2227
+ });
2228
+ });
2229
+ ThemeToggleGlass.displayName = "ThemeToggleGlass";
2230
+ const BaseProgressGlass = forwardRef(({ value = 0, max = 100, className, children, ...props }, ref) => {
2231
+ const percentage = Math.min(100, Math.max(0, value / max * 100));
2232
+ return /* @__PURE__ */ jsx("div", {
2233
+ ref,
2234
+ className: cn("relative h-2 w-full overflow-hidden rounded-full", "bg-white/5 backdrop-blur-sm", className),
2235
+ role: "progressbar",
2236
+ "aria-valuenow": value,
2237
+ "aria-valuemin": 0,
2238
+ "aria-valuemax": max,
2239
+ "aria-valuetext": `${Math.round(percentage)}%`,
2240
+ ...props,
2241
+ children: typeof children === "function" ? children(percentage) : children || /* @__PURE__ */ jsx("div", {
2242
+ className: "h-full transition-all duration-300 ease-out",
2243
+ style: {
2244
+ width: `${percentage}%`,
2245
+ background: "var(--progress-bar-bg, linear-gradient(90deg, #a855f7, #ec4899))"
2246
+ }
2247
+ })
2248
+ });
2249
+ });
2250
+ BaseProgressGlass.displayName = "BaseProgressGlass";
2251
+ var sizeClasses$1 = {
2252
+ normal: "w-2 h-2 md:w-2.5 md:h-2.5",
2253
+ large: "w-3.5 h-3.5 md:w-4 md:h-4"
2254
+ };
2255
+ var statusSymbols = {
2256
+ green: "✓",
2257
+ yellow: "!",
2258
+ red: "✕"
2259
+ };
2260
+ var statusVarMap = {
2261
+ green: {
2262
+ bg: "var(--status-online)",
2263
+ glow: "var(--status-online-glow)"
2264
+ },
2265
+ yellow: {
2266
+ bg: "var(--status-away)",
2267
+ glow: "var(--status-away-glow)"
2268
+ },
2269
+ red: {
2270
+ bg: "var(--status-busy)",
2271
+ glow: "var(--status-busy-glow)"
2272
+ }
2273
+ };
2274
+ const StatusIndicatorGlass = forwardRef(({ type = "green", size = "normal", className, ...props }, ref) => {
2275
+ const colors = statusVarMap[type];
2276
+ const indicatorStyles = {
2277
+ backgroundColor: colors.bg,
2278
+ boxShadow: colors.glow
2279
+ };
2280
+ return /* @__PURE__ */ jsx("div", {
2281
+ ref,
2282
+ className: cn("rounded-full flex items-center justify-center", sizeClasses$1[size], className),
2283
+ style: indicatorStyles,
2284
+ role: "status",
2285
+ "aria-label": `Status: ${type}`,
2286
+ ...props,
2287
+ children: size === "large" && /* @__PURE__ */ jsx("span", {
2288
+ className: "text-white text-[8px] md:text-[10px] font-bold",
2289
+ children: statusSymbols[type]
2290
+ })
2291
+ });
2292
+ });
2293
+ StatusIndicatorGlass.displayName = "StatusIndicatorGlass";
2294
+ var flagVarMap = {
2295
+ danger: {
2296
+ bg: "var(--alert-danger-bg)",
2297
+ border: "var(--alert-danger-border)",
2298
+ text: "var(--alert-danger-text)",
2299
+ statusType: "red"
2300
+ },
2301
+ warning: {
2302
+ bg: "var(--alert-warning-bg)",
2303
+ border: "var(--alert-warning-border)",
2304
+ text: "var(--alert-warning-text)",
2305
+ statusType: "yellow"
2306
+ }
2307
+ };
2308
+ const FlagAlertGlass = forwardRef(({ type = "warning", title, description, className, ...props }, ref) => {
2309
+ const [isHovered, setIsHovered] = useState(false);
2310
+ const config = flagVarMap[type];
2311
+ const alertStyles = {
2312
+ background: config.bg,
2313
+ borderColor: config.border,
2314
+ transform: isHovered ? "translateX(4px)" : "translateX(0)"
2315
+ };
2316
+ return /* @__PURE__ */ jsxs("div", {
2317
+ ref,
2318
+ className: cn("p-2.5 md:p-3 rounded-xl border transition-all duration-300", className),
2319
+ style: alertStyles,
2320
+ onMouseEnter: () => setIsHovered(true),
2321
+ onMouseLeave: () => setIsHovered(false),
2322
+ role: "alert",
2323
+ ...props,
2324
+ children: [/* @__PURE__ */ jsxs("div", {
2325
+ className: "flex items-center gap-1.5 md:gap-2 font-medium text-xs md:text-sm",
2326
+ style: { color: config.text },
2327
+ children: [/* @__PURE__ */ jsx(StatusIndicatorGlass, { type: config.statusType }), title]
2328
+ }), description && /* @__PURE__ */ jsx("p", {
2329
+ className: "text-(length:--font-size-2xs) md:text-xs mt-0.5 md:mt-1 ml-4 md:ml-5 text-(--text-muted)",
2330
+ children: description
2331
+ })]
2332
+ });
2333
+ });
2334
+ FlagAlertGlass.displayName = "FlagAlertGlass";
2335
+ var defaultLangColors = {
2336
+ TypeScript: "var(--language-typescript)",
2337
+ JavaScript: "var(--language-javascript)",
2338
+ Python: "var(--language-python)",
2339
+ HTML: "var(--language-html)",
2340
+ CSS: "var(--language-css)",
2341
+ Java: "var(--language-java)",
2342
+ Go: "var(--language-go)",
2343
+ Rust: "var(--language-rust)",
2344
+ Ruby: "var(--language-ruby)",
2345
+ PHP: "var(--language-php)"
2346
+ };
2347
+ const LanguageBarGlass = forwardRef(({ languages = [], showLegend = true, className, ...props }, ref) => {
2348
+ const [hoveredLang, setHoveredLang] = useState(null);
2349
+ const barStyles = { boxShadow: "var(--rainbow-glow)" };
2350
+ if (!languages || languages.length === 0) return null;
2351
+ return /* @__PURE__ */ jsxs("div", {
2352
+ ref,
2353
+ className: cn("w-full", className),
2354
+ ...props,
2355
+ children: [/* @__PURE__ */ jsx("div", {
2356
+ className: "flex h-2 md:h-2.5 rounded-full overflow-hidden",
2357
+ style: barStyles,
2358
+ role: "group",
2359
+ "aria-label": "Language distribution",
2360
+ children: languages.map((lang, i) => {
2361
+ const bgColor = lang.color ?? defaultLangColors[lang.name] ?? "var(--oklch-slate-400)";
2362
+ return /* @__PURE__ */ jsx("div", {
2363
+ style: {
2364
+ width: `${lang.percent}%`,
2365
+ backgroundColor: bgColor,
2366
+ opacity: hoveredLang !== null && hoveredLang !== i ? .5 : 1,
2367
+ transition: "all 0.3s"
2368
+ },
2369
+ role: "progressbar",
2370
+ "aria-label": `${lang.name}: ${lang.percent}%`,
2371
+ "aria-valuenow": lang.percent,
2372
+ "aria-valuemin": 0,
2373
+ "aria-valuemax": 100,
2374
+ onMouseEnter: () => setHoveredLang(i),
2375
+ onMouseLeave: () => setHoveredLang(null)
2376
+ }, `bar-${lang.name}-${i}`);
2377
+ })
2378
+ }), showLegend && /* @__PURE__ */ jsx("div", {
2379
+ className: "flex items-center gap-3 md:gap-4 mt-1.5 md:mt-2 text-(length:--font-size-2xs) md:text-xs flex-wrap text-(--text-secondary)",
2380
+ children: languages.map((lang, i) => {
2381
+ return /* @__PURE__ */ jsxs("span", {
2382
+ className: "flex items-center gap-1 md:gap-1.5 cursor-pointer",
2383
+ onMouseEnter: () => setHoveredLang(i),
2384
+ onMouseLeave: () => setHoveredLang(null),
2385
+ children: [
2386
+ /* @__PURE__ */ jsx("span", {
2387
+ className: "w-2 h-2 md:w-2.5 md:h-2.5 rounded-full",
2388
+ style: { backgroundColor: lang.color ?? defaultLangColors[lang.name] ?? "var(--oklch-slate-400)" }
2389
+ }),
2390
+ lang.name,
2391
+ " ",
2392
+ lang.percent,
2393
+ "%"
2394
+ ]
2395
+ }, `legend-${lang.name}-${i}`);
2396
+ })
2397
+ })]
2398
+ });
2399
+ });
2400
+ LanguageBarGlass.displayName = "LanguageBarGlass";
2401
+ var profileSizeClasses = {
2402
+ sm: "w-9 h-9 md:w-10 md:h-10 text-xs md:text-sm",
2403
+ md: "w-12 h-12 md:w-14 md:h-14 text-base md:text-lg",
2404
+ lg: "w-14 h-14 md:w-16 md:h-16 text-lg md:text-xl",
2405
+ xl: "w-18 h-18 md:w-20 md:h-20 text-xl md:text-2xl"
2406
+ };
2407
+ var getStatusVars = (statusType) => {
2408
+ return {
2409
+ online: {
2410
+ bg: "var(--status-online)",
2411
+ glow: "var(--status-online-glow)"
2412
+ },
2413
+ offline: {
2414
+ bg: "var(--status-offline)",
2415
+ glow: "none"
2416
+ },
2417
+ busy: {
2418
+ bg: "var(--status-busy)",
2419
+ glow: "var(--status-busy-glow)"
2420
+ },
2421
+ away: {
2422
+ bg: "var(--status-away)",
2423
+ glow: "var(--status-away-glow)"
2424
+ }
2425
+ }[statusType];
2426
+ };
2427
+ const ProfileAvatarGlass = forwardRef(({ initials, size = "lg", status, glowing = true, className, ...props }, ref) => {
2428
+ const { isHovered, hoverProps } = useHover();
2429
+ const avatarStyles = {
2430
+ background: "var(--avatar-bg)",
2431
+ border: "3px solid var(--avatar-border)",
2432
+ boxShadow: isHovered ? "var(--avatar-hover-glow)" : "var(--avatar-shadow)",
2433
+ color: "var(--text-inverse)"
2434
+ };
2435
+ return /* @__PURE__ */ jsxs("div", {
2436
+ ref,
2437
+ className: cn("relative inline-flex", className),
2438
+ onMouseEnter: hoverProps.onMouseEnter,
2439
+ onMouseLeave: hoverProps.onMouseLeave,
2440
+ ...props,
2441
+ children: [/* @__PURE__ */ jsx("div", {
2442
+ className: cn("rounded-full flex items-center justify-center font-bold transition-all duration-300", profileSizeClasses[size], glowing && "animate-[glow-pulse_2s_ease-in-out_infinite]"),
2443
+ style: avatarStyles,
2444
+ role: "img",
2445
+ "aria-label": `Profile avatar with initials ${initials}`,
2446
+ children: initials
2447
+ }), status && /* @__PURE__ */ jsx("span", {
2448
+ className: cn(statusSizes({ size }), "absolute -bottom-0.5 -right-0.5"),
2449
+ style: {
2450
+ background: getStatusVars(status).bg,
2451
+ boxShadow: getStatusVars(status).glow
2452
+ },
2453
+ role: "status",
2454
+ "aria-label": `Status: ${status}`
2455
+ })]
2456
+ });
2457
+ });
2458
+ ProfileAvatarGlass.displayName = "ProfileAvatarGlass";
2459
+ const progressSizes = cva("rounded-full overflow-hidden", {
2460
+ variants: { size: {
2461
+ sm: "h-1.5 md:h-1",
2462
+ md: "h-2.5 md:h-2",
2463
+ lg: "h-3.5 md:h-3",
2464
+ xl: "h-5 md:h-4"
2465
+ } },
2466
+ defaultVariants: { size: "md" }
2467
+ });
2468
+ var getGradientColor = (gradient = "violet") => {
2469
+ const gradients = {
2470
+ violet: {
2471
+ colorVar: "--metric-default-text",
2472
+ glowVar: "--progress-glow-violet"
2473
+ },
2474
+ blue: {
2475
+ colorVar: "--metric-default-text",
2476
+ glowVar: "--progress-glow-blue"
2477
+ },
2478
+ cyan: {
2479
+ colorVar: "--metric-secondary-text",
2480
+ glowVar: "--progress-glow-cyan"
2481
+ },
2482
+ amber: {
2483
+ colorVar: "--metric-warning-text",
2484
+ glowVar: "--progress-glow-amber"
2485
+ },
2486
+ emerald: {
2487
+ colorVar: "--metric-success-text",
2488
+ glowVar: "--progress-glow-emerald"
2489
+ },
2490
+ rose: {
2491
+ colorVar: "--metric-destructive-text",
2492
+ glowVar: "--progress-glow-rose"
2493
+ }
2494
+ };
2495
+ return gradients[gradient] || gradients.violet;
2496
+ };
2497
+ const ProgressGlass = forwardRef(({ className, size = "md", value = 0, gradient = "violet", showLabel, ...props }, ref) => {
2498
+ const clampedValue = Math.min(100, Math.max(0, value));
2499
+ const { colorVar, glowVar } = getGradientColor(gradient);
2500
+ const trackStyles = { background: "var(--progress-bg)" };
2501
+ const fillStyles = {
2502
+ width: `${clampedValue}%`,
2503
+ background: `var(${colorVar})`,
2504
+ boxShadow: `var(${glowVar})`
2505
+ };
2506
+ return /* @__PURE__ */ jsxs("div", {
2507
+ ref,
2508
+ className: cn("w-full", className),
2509
+ ...props,
2510
+ children: [showLabel && /* @__PURE__ */ jsxs("div", {
2511
+ className: "flex justify-between mb-1 md:mb-1.5",
2512
+ children: [/* @__PURE__ */ jsx("span", {
2513
+ className: "text-(length:--font-size-2xs) md:text-xs text-(--text-muted)",
2514
+ children: "Progress"
2515
+ }), /* @__PURE__ */ jsxs("span", {
2516
+ className: "text-(length:--font-size-2xs) md:text-xs font-medium text-(--text-secondary)",
2517
+ children: [clampedValue, "%"]
2518
+ })]
2519
+ }), /* @__PURE__ */ jsx("div", {
2520
+ className: cn(progressSizes({ size })),
2521
+ style: trackStyles,
2522
+ children: /* @__PURE__ */ jsx("div", {
2523
+ className: "h-full rounded-full transition-all duration-700 ease-out",
2524
+ style: fillStyles,
2525
+ role: "progressbar",
2526
+ "aria-valuenow": clampedValue,
2527
+ "aria-valuemin": 0,
2528
+ "aria-valuemax": 100,
2529
+ "aria-label": `Progress: ${clampedValue}%`
2530
+ })
2531
+ })]
2532
+ });
2533
+ });
2534
+ ProgressGlass.displayName = "ProgressGlass";
2535
+ var sizeClasses = {
2536
+ sm: "h-2.5 md:h-2",
2537
+ md: "h-3.5 md:h-3",
2538
+ lg: "h-[1.125rem] md:h-4",
2539
+ xl: "h-6 md:h-5"
2540
+ };
2541
+ const RainbowProgressGlass = forwardRef(({ value, size = "lg", showGlow = true, className, ...props }, ref) => {
2542
+ const clampedValue = Math.min(100, Math.max(0, value));
2543
+ const trackStyles = { background: "var(--progress-bg)" };
2544
+ const fillStyles = {
2545
+ width: `${clampedValue}%`,
2546
+ background: "var(--rainbow-gradient)",
2547
+ boxShadow: showGlow ? "var(--rainbow-glow)" : "none",
2548
+ animation: showGlow ? "var(--rainbow-animation)" : "none"
2549
+ };
2550
+ return /* @__PURE__ */ jsx("div", {
2551
+ ref,
2552
+ className: cn("rounded-full overflow-hidden", sizeClasses[size], className),
2553
+ style: trackStyles,
2554
+ role: "progressbar",
2555
+ "aria-valuenow": clampedValue,
2556
+ "aria-valuemin": 0,
2557
+ "aria-valuemax": 100,
2558
+ "aria-label": `Rainbow progress: ${clampedValue}%`,
2559
+ ...props,
2560
+ children: /* @__PURE__ */ jsx("div", {
2561
+ className: "h-full rounded-full transition-all duration-1000",
2562
+ style: fillStyles
2563
+ })
2564
+ });
2565
+ });
2566
+ RainbowProgressGlass.displayName = "RainbowProgressGlass";
2567
+ const SegmentedControlGlass = forwardRef(({ options = [], value, onChange, className, ...props }, ref) => {
2568
+ const containerStyles = {
2569
+ border: "1px solid var(--segmented-container-border)",
2570
+ background: "var(--segmented-container-bg)"
2571
+ };
2572
+ if (!options || options.length === 0) return null;
2573
+ return /* @__PURE__ */ jsx("div", {
2574
+ ref,
2575
+ className: cn("inline-flex rounded-xl overflow-hidden", className),
2576
+ style: containerStyles,
2577
+ role: "tablist",
2578
+ ...props,
2579
+ children: options.map((opt) => {
2580
+ const isActive = value === opt.value;
2581
+ return /* @__PURE__ */ jsx("button", {
2582
+ onClick: () => onChange?.(opt.value),
2583
+ className: "px-3 py-1.5 md:px-4 md:py-2 text-xs md:text-sm font-medium transition-all duration-300",
2584
+ style: {
2585
+ background: isActive ? "var(--segmented-active-bg)" : "transparent",
2586
+ color: isActive ? "var(--segmented-active-text)" : "var(--segmented-inactive-text)"
2587
+ },
2588
+ type: "button",
2589
+ role: "tab",
2590
+ "aria-selected": isActive,
2591
+ children: opt.label
2592
+ }, opt.value);
2593
+ })
2594
+ });
2595
+ });
2596
+ SegmentedControlGlass.displayName = "SegmentedControlGlass";
2597
+ const sparklineContainerVariants = cva("flex items-end", {
2598
+ variants: {
2599
+ height: {
2600
+ sm: "h-4",
2601
+ md: "h-6",
2602
+ lg: "h-8"
2603
+ },
2604
+ gap: {
2605
+ none: "gap-0",
2606
+ sm: "gap-px",
2607
+ md: "gap-0.5"
2608
+ }
2609
+ },
2610
+ defaultVariants: {
2611
+ height: "md",
2612
+ gap: "sm"
2613
+ }
2614
+ });
2615
+ const sparklineBarVariants = cva("flex-1 rounded-sm transition-all duration-300", {
2616
+ variants: { animated: {
2617
+ true: "animate-sparkline-grow",
2618
+ false: ""
2619
+ } },
2620
+ defaultVariants: { animated: false }
2621
+ });
2622
+ var defaultSparklineConfig = {
2623
+ value: {
2624
+ label: "Value",
2625
+ color: "var(--sparkline-bar-fill, hsl(var(--chart-1-base)))"
2626
+ },
2627
+ max: {
2628
+ label: "Maximum",
2629
+ color: "var(--sparkline-bar-max, var(--alert-success-text))"
2630
+ }
2631
+ };
2632
+ var heightMap = {
2633
+ sm: 16,
2634
+ md: 24,
2635
+ lg: 32
2636
+ };
2637
+ var SparklineTooltip = ({ active, payload, valueFormatter }) => {
2638
+ if (!active || !payload?.length) return null;
2639
+ const data = payload[0];
2640
+ const value = data.value;
2641
+ const index = data.payload.index;
2642
+ const label = data.payload.label;
2643
+ const displayValue = valueFormatter ? valueFormatter(value, index) : value.toLocaleString();
2644
+ return /* @__PURE__ */ jsxs("div", {
2645
+ className: "rounded-md border border-[var(--glass-border)] bg-[var(--glass-bg)] px-2 py-1 text-xs shadow-lg backdrop-blur-md",
2646
+ children: [label && /* @__PURE__ */ jsx("div", {
2647
+ className: "font-medium text-[var(--text-primary)]",
2648
+ children: label
2649
+ }), /* @__PURE__ */ jsx("div", {
2650
+ className: "text-[var(--text-secondary)]",
2651
+ children: displayValue
2652
+ })]
2653
+ });
2654
+ };
2655
+ const SparklineGlass = forwardRef(({ data, labels, showLabels = false, highlightMax = false, barColor, maxBarColor, tooltips, height = "md", gap = "sm", animated = false, minBarHeightPercent = 4, config = defaultSparklineConfig, valueFormatter, onBarClick, showTooltip = true, className, ...props }, ref) => {
2656
+ const chartData = useMemo(() => {
2657
+ const maxValue$1 = Math.max(...data, 0);
2658
+ const maxIndex$1 = data.indexOf(maxValue$1);
2659
+ return data.map((value, index) => ({
2660
+ index,
2661
+ value,
2662
+ label: labels?.[index] || tooltips?.[index],
2663
+ isMax: highlightMax && index === maxIndex$1 && value > 0,
2664
+ displayValue: maxValue$1 > 0 ? Math.max(value, maxValue$1 * (minBarHeightPercent / 100)) : minBarHeightPercent
2665
+ }));
2666
+ }, [
2667
+ data,
2668
+ labels,
2669
+ tooltips,
2670
+ highlightMax,
2671
+ minBarHeightPercent
2672
+ ]);
2673
+ const { maxValue, maxIndex } = useMemo(() => {
2674
+ const max = Math.max(...data, 0);
2675
+ return {
2676
+ maxValue: max,
2677
+ maxIndex: data.indexOf(max)
2678
+ };
2679
+ }, [data]);
2680
+ const ariaLabel = useMemo(() => {
2681
+ if (data.length === 0) return "Empty sparkline chart";
2682
+ return `Sparkline chart with ${data.length} data points, maximum value ${maxValue}${labels ? ` at ${labels[maxIndex] || `position ${maxIndex + 1}`}` : ""}`;
2683
+ }, [
2684
+ data.length,
2685
+ maxValue,
2686
+ maxIndex,
2687
+ labels
2688
+ ]);
2689
+ const resolvedBarColor = barColor || config.value?.color || "var(--sparkline-bar-fill)";
2690
+ const resolvedMaxColor = maxBarColor || config.max?.color || "var(--sparkline-bar-max)";
2691
+ const barGap = {
2692
+ none: 0,
2693
+ sm: 1,
2694
+ md: 2
2695
+ }[gap || "sm"];
2696
+ const chartHeight = heightMap[height || "md"];
2697
+ const handleClick = (dataPoint) => {
2698
+ if (onBarClick) onBarClick(dataPoint.value, dataPoint.index);
2699
+ };
2700
+ return /* @__PURE__ */ jsxs("div", {
2701
+ ref,
2702
+ role: "img",
2703
+ "aria-label": ariaLabel,
2704
+ className: cn("flex flex-col", className),
2705
+ ...props,
2706
+ children: [/* @__PURE__ */ jsx("div", {
2707
+ className: cn(sparklineContainerVariants({
2708
+ height,
2709
+ gap
2710
+ })),
2711
+ "data-chart": "sparkline",
2712
+ style: {
2713
+ "--color-value": resolvedBarColor,
2714
+ "--color-max": resolvedMaxColor
2715
+ },
2716
+ children: /* @__PURE__ */ jsx(ResponsiveContainer, {
2717
+ width: "100%",
2718
+ height: chartHeight,
2719
+ children: /* @__PURE__ */ jsxs(BarChart, {
2720
+ data: chartData,
2721
+ margin: {
2722
+ top: 0,
2723
+ right: 0,
2724
+ bottom: 0,
2725
+ left: 0
2726
+ },
2727
+ barGap,
2728
+ children: [showTooltip && /* @__PURE__ */ jsx(Tooltip, {
2729
+ content: /* @__PURE__ */ jsx(SparklineTooltip, { valueFormatter }),
2730
+ cursor: false,
2731
+ isAnimationActive: false
2732
+ }), /* @__PURE__ */ jsx(Bar, {
2733
+ dataKey: "displayValue",
2734
+ radius: [
2735
+ 2,
2736
+ 2,
2737
+ 0,
2738
+ 0
2739
+ ],
2740
+ isAnimationActive: animated,
2741
+ animationDuration: 500,
2742
+ animationEasing: "ease-out",
2743
+ onClick: (_, index) => handleClick(chartData[index]),
2744
+ style: { cursor: onBarClick ? "pointer" : "default" },
2745
+ children: chartData.map((entry, index) => /* @__PURE__ */ jsx(Cell, {
2746
+ fill: entry.isMax ? resolvedMaxColor : resolvedBarColor,
2747
+ className: "transition-colors duration-200 hover:opacity-80"
2748
+ }, `cell-${index}`))
2749
+ })]
2750
+ })
2751
+ })
2752
+ }), showLabels && labels && labels.length > 0 && /* @__PURE__ */ jsx("div", {
2753
+ className: "flex mt-1",
2754
+ "aria-hidden": "true",
2755
+ children: labels.map((label, index) => /* @__PURE__ */ jsx("span", {
2756
+ className: cn("flex-1 text-center leading-none truncate text-xs", "text-(--text-muted)"),
2757
+ children: label
2758
+ }, index))
2759
+ })]
2760
+ });
2761
+ });
2762
+ SparklineGlass.displayName = "SparklineGlass";
2763
+ var defaultFeatures = [
2764
+ "Code quality assessment",
2765
+ "Architecture patterns",
2766
+ "Best practices"
2767
+ ];
2768
+ const AICardGlass = forwardRef(({ onGenerate, features = defaultFeatures, estimatedTime = "~30 seconds", className, ...props }, ref) => {
2769
+ return /* @__PURE__ */ jsxs(InteractiveCard, {
2770
+ ref,
2771
+ baseBg: "var(--ai-card-bg)",
2772
+ borderColor: "var(--ai-card-border)",
2773
+ hoverGlow: "var(--ai-card-hover-glow)",
2774
+ hoverLift: true,
2775
+ blur: "sm",
2776
+ rounded: "rounded-xl",
2777
+ className: cn("w-full sm:w-56 md:w-64 p-3 md:p-4", className),
2778
+ ...props,
2779
+ children: [
2780
+ /* @__PURE__ */ jsxs("div", {
2781
+ className: "flex items-center gap-1.5 md:gap-2 font-semibold text-xs md:text-sm mb-1.5 md:mb-2",
2782
+ style: { color: "var(--text-accent)" },
2783
+ children: [/* @__PURE__ */ jsx(Sparkles, { className: "w-3.5 h-3.5 md:w-4 md:h-4" }), "AI Summary"]
2784
+ }),
2785
+ /* @__PURE__ */ jsx("p", {
2786
+ className: "text-(length:--font-size-2xs) md:text-xs mb-1.5 md:mb-2 text-(--text-secondary)",
2787
+ children: "Get comprehensive analysis:"
2788
+ }),
2789
+ /* @__PURE__ */ jsx("ul", {
2790
+ className: "text-(length:--font-size-2xs) md:text-xs space-y-0.5 md:space-y-1 mb-2 md:mb-3",
2791
+ children: features.map((feature, i) => /* @__PURE__ */ jsxs("li", {
2792
+ className: "flex items-center gap-1",
2793
+ style: { color: "var(--text-muted)" },
2794
+ children: [/* @__PURE__ */ jsx(Check, {
2795
+ className: "w-2.5 h-2.5 md:w-3 md:h-3",
2796
+ style: { color: "var(--status-online)" }
2797
+ }), feature]
2798
+ }, `feature-${i}`))
2799
+ }),
2800
+ /* @__PURE__ */ jsx(ButtonGlass, {
2801
+ variant: "default",
2802
+ size: "sm",
2803
+ icon: Zap,
2804
+ onClick: onGenerate,
2805
+ className: "w-full",
2806
+ children: "Generate Report"
2807
+ }),
2808
+ /* @__PURE__ */ jsxs("p", {
2809
+ className: "text-(length:--font-size-2xs) md:text-xs mt-1.5 md:mt-2 text-center flex items-center justify-center gap-1 text-(--text-muted)",
2810
+ children: [/* @__PURE__ */ jsx(Clock, { className: "w-2.5 h-2.5 md:w-3 md:h-3" }), estimatedTime]
2811
+ })
2812
+ ]
2813
+ });
2814
+ });
2815
+ AICardGlass.displayName = "AICardGlass";
2816
+ const CareerStatsHeaderGlass = forwardRef(({ totalCommits, totalPRs, totalRepos, title = "Career Stats", wrapStats = true, className, ...props }, ref) => {
2817
+ const titleStyles = { color: "var(--text-primary)" };
2818
+ const accentStyles = { color: "var(--text-accent)" };
2819
+ const statsStyles = { color: "var(--text-secondary)" };
2820
+ return /* @__PURE__ */ jsxs("div", {
2821
+ ref,
2822
+ className: cn("mb-4", className),
2823
+ ...props,
2824
+ children: [/* @__PURE__ */ jsxs("h3", {
2825
+ className: "font-semibold flex items-center gap-2 mb-1",
2826
+ style: titleStyles,
2827
+ children: [/* @__PURE__ */ jsx(TrendingUp, {
2828
+ className: "w-5 h-5",
2829
+ style: accentStyles
2830
+ }), title]
2831
+ }), /* @__PURE__ */ jsxs("p", {
2832
+ className: cn("text-sm flex items-center gap-2", wrapStats && "flex-wrap"),
2833
+ style: statsStyles,
2834
+ children: [
2835
+ /* @__PURE__ */ jsxs("span", {
2836
+ className: "flex items-center gap-1",
2837
+ children: [
2838
+ /* @__PURE__ */ jsx(Code, { className: "w-4 h-4" }),
2839
+ totalCommits.toLocaleString(),
2840
+ " commits"
2841
+ ]
2842
+ }),
2843
+ /* @__PURE__ */ jsx("span", { children: "·" }),
2844
+ /* @__PURE__ */ jsxs("span", {
2845
+ className: "flex items-center gap-1",
2846
+ children: [
2847
+ /* @__PURE__ */ jsx(GitPullRequest, { className: "w-4 h-4" }),
2848
+ totalPRs,
2849
+ " PRs"
2850
+ ]
2851
+ }),
2852
+ /* @__PURE__ */ jsx("span", { children: "·" }),
2853
+ /* @__PURE__ */ jsxs("span", {
2854
+ className: "flex items-center gap-1",
2855
+ children: [
2856
+ /* @__PURE__ */ jsx(FolderGit2, { className: "w-4 h-4" }),
2857
+ totalRepos,
2858
+ " repos"
2859
+ ]
2860
+ })
2861
+ ]
2862
+ })]
2863
+ });
2864
+ });
2865
+ CareerStatsHeaderGlass.displayName = "CareerStatsHeaderGlass";
2866
+ var colorMap = {
2867
+ emerald: {
2868
+ gradient: "emerald",
2869
+ textVar: "var(--metric-success-text)"
2870
+ },
2871
+ amber: {
2872
+ gradient: "amber",
2873
+ textVar: "var(--metric-warning-text)"
2874
+ },
2875
+ blue: {
2876
+ gradient: "blue",
2877
+ textVar: "var(--metric-default-text)"
2878
+ },
2879
+ red: {
2880
+ gradient: "rose",
2881
+ textVar: "var(--metric-destructive-text)"
2882
+ }
2883
+ };
2884
+ const CircularMetricGlass = forwardRef(({ label, value, color = "blue", size = "sm", className, ...props }, ref) => {
2885
+ const { gradient, textVar } = colorMap[color];
2886
+ return /* @__PURE__ */ jsxs("div", {
2887
+ ref,
2888
+ className: cn("flex flex-col items-center gap-1", className),
2889
+ ...props,
2890
+ children: [/* @__PURE__ */ jsx(CircularProgressGlass, {
2891
+ value,
2892
+ size,
2893
+ color: gradient,
2894
+ labelColor: textVar,
2895
+ thickness: size === "sm" ? 6 : 8,
2896
+ showGlow: true,
2897
+ glowIntensity: "medium"
2898
+ }), /* @__PURE__ */ jsx("span", {
2899
+ className: "text-xs font-medium",
2900
+ style: { color: textVar },
2901
+ children: label
2902
+ })]
2903
+ });
2904
+ });
2905
+ CircularMetricGlass.displayName = "CircularMetricGlass";
2906
+ const ContributionMetricsGlass = forwardRef(({ userCommits, userContribution, totalProjectCommits: providedTotal, estimatedLines: providedLines, columns = 2, className, ...props }, ref) => {
2907
+ const totalProjectCommits = providedTotal ?? (userContribution > 0 ? Math.round(userCommits / (userContribution / 100)) : userCommits);
2908
+ const estimatedLines = providedLines ?? Math.round(userCommits * 12);
2909
+ const cardStyles = {
2910
+ background: "var(--card-bg)",
2911
+ borderColor: "var(--card-border)"
2912
+ };
2913
+ const mutedStyles = { color: "var(--text-muted)" };
2914
+ const primaryStyles = { color: "var(--text-primary)" };
2915
+ return /* @__PURE__ */ jsxs("div", {
2916
+ ref,
2917
+ className: cn("grid gap-2", {
2918
+ 1: "grid-cols-1",
2919
+ 2: "grid-cols-1 sm:grid-cols-2"
2920
+ }[columns], className),
2921
+ ...props,
2922
+ children: [/* @__PURE__ */ jsxs("div", {
2923
+ className: "p-2.5 rounded-lg border",
2924
+ style: cardStyles,
2925
+ children: [
2926
+ /* @__PURE__ */ jsx("div", {
2927
+ className: "text-xs",
2928
+ style: mutedStyles,
2929
+ children: "Your Contribution"
2930
+ }),
2931
+ /* @__PURE__ */ jsxs("div", {
2932
+ className: "font-semibold",
2933
+ style: primaryStyles,
2934
+ children: [userCommits.toLocaleString(), " commits"]
2935
+ }),
2936
+ /* @__PURE__ */ jsxs("div", {
2937
+ className: "text-xs",
2938
+ style: mutedStyles,
2939
+ children: [userContribution, "%"]
2940
+ })
2941
+ ]
2942
+ }), /* @__PURE__ */ jsxs("div", {
2943
+ className: "p-2.5 rounded-lg border",
2944
+ style: cardStyles,
2945
+ children: [
2946
+ /* @__PURE__ */ jsx("div", {
2947
+ className: "text-xs",
2948
+ style: mutedStyles,
2949
+ children: "Full Project"
2950
+ }),
2951
+ /* @__PURE__ */ jsxs("div", {
2952
+ className: "font-semibold",
2953
+ style: primaryStyles,
2954
+ children: [totalProjectCommits.toLocaleString(), " commits"]
2955
+ }),
2956
+ /* @__PURE__ */ jsxs("div", {
2957
+ className: "text-xs",
2958
+ style: mutedStyles,
2959
+ children: [
2960
+ "~",
2961
+ estimatedLines.toLocaleString(),
2962
+ " lines"
2963
+ ]
2964
+ })
2965
+ ]
2966
+ })]
2967
+ });
2968
+ });
2969
+ ContributionMetricsGlass.displayName = "ContributionMetricsGlass";
2970
+ var variantStyles = {
2971
+ default: {
2972
+ bg: "var(--metric-default-bg)",
2973
+ text: "var(--metric-default-text)",
2974
+ border: "var(--metric-default-border)",
2975
+ glow: "var(--metric-default-glow)"
2976
+ },
2977
+ secondary: {
2978
+ bg: "var(--metric-secondary-bg)",
2979
+ text: "var(--metric-secondary-text)",
2980
+ border: "var(--metric-secondary-border)",
2981
+ glow: "var(--metric-secondary-glow)"
2982
+ },
2983
+ success: {
2984
+ bg: "var(--metric-success-bg)",
2985
+ text: "var(--metric-success-text)",
2986
+ border: "var(--metric-success-border)",
2987
+ glow: "var(--metric-success-glow)"
2988
+ },
2989
+ warning: {
2990
+ bg: "var(--metric-warning-bg)",
2991
+ text: "var(--metric-warning-text)",
2992
+ border: "var(--metric-warning-border)",
2993
+ glow: "var(--metric-warning-glow)"
2994
+ },
2995
+ destructive: {
2996
+ bg: "var(--metric-destructive-bg)",
2997
+ text: "var(--metric-destructive-text)",
2998
+ border: "var(--metric-destructive-border)",
2999
+ glow: "var(--metric-destructive-glow)"
3000
+ }
3001
+ };
3002
+ var variantToGradient = {
3003
+ default: "blue",
3004
+ secondary: "cyan",
3005
+ success: "emerald",
3006
+ warning: "amber",
3007
+ destructive: "rose"
3008
+ };
3009
+ var colorToVariant = {
3010
+ emerald: "success",
3011
+ amber: "warning",
3012
+ blue: "default",
3013
+ red: "destructive"
3014
+ };
3015
+ var trendColors = {
3016
+ up: "text-[var(--alert-success-text)]",
3017
+ down: "text-[var(--alert-destructive-text)]",
3018
+ neutral: "text-[var(--text-muted)]"
3019
+ };
3020
+ var TrendIcons = {
3021
+ up: TrendingUp,
3022
+ down: TrendingDown,
3023
+ neutral: Minus
3024
+ };
3025
+ const MetricCardGlass = forwardRef(({ title, value, description, change, variant, progress, label, color, valueFormatter, valueSuffix, trend, icon, sparklineData, showSparkline = true, showProgress = true, className, ...props }, ref) => {
3026
+ const actualTitle = title || label;
3027
+ if (!actualTitle) console.warn("[MetricCardGlass] Missing required prop: `title` (or deprecated `label`)");
3028
+ if (label && !title) console.warn("[MetricCardGlass] Deprecated prop `label` used. Please use `title` instead. Will be removed in v2.0");
3029
+ const actualVariant = variant || (color ? colorToVariant[color] : "default");
3030
+ if (color && !variant) console.warn(`[MetricCardGlass] Deprecated prop \`color="${color}"\` used. Please use \`variant="${colorToVariant[color]}"\` instead. Will be removed in v2.0`);
3031
+ const actualDescription = description || valueSuffix;
3032
+ if (valueSuffix && !description) console.warn("[MetricCardGlass] Deprecated prop `valueSuffix` used. Please use `description` instead. Will be removed in v2.0");
3033
+ const actualChange = change || (trend ? {
3034
+ value: trend.value,
3035
+ direction: trend.direction,
3036
+ period: trend.label
3037
+ } : void 0);
3038
+ if (trend && !change) console.warn("[MetricCardGlass] Deprecated prop `trend` used. Please use `change` instead. Will be removed in v2.0");
3039
+ const displayValue = typeof value === "number" && valueFormatter ? valueFormatter(value) : String(value);
3040
+ if (valueFormatter) console.warn("[MetricCardGlass] Deprecated prop `valueFormatter` used. Please format value before passing. Will be removed in v2.0");
3041
+ const actualProgress = progress ?? (typeof value === "number" && value >= 0 && value <= 100 ? value : void 0);
3042
+ const variantVars = variantStyles[actualVariant];
3043
+ const hasSparkline = showSparkline && sparklineData && sparklineData.length > 0;
3044
+ const valueStyles = {
3045
+ color: variantVars.text,
3046
+ textShadow: variantVars.glow
3047
+ };
3048
+ const renderChange = () => {
3049
+ if (!actualChange) return null;
3050
+ if (typeof actualChange === "string" || typeof actualChange === "number") {
3051
+ const changeStr = String(actualChange);
3052
+ const isPositive = changeStr.startsWith("+") || !changeStr.startsWith("-") && parseFloat(changeStr) > 0;
3053
+ const isNegative = changeStr.startsWith("-") || parseFloat(changeStr) < 0;
3054
+ const direction$1 = isPositive ? "up" : isNegative ? "down" : "neutral";
3055
+ const TrendIcon$1 = TrendIcons[direction$1];
3056
+ return /* @__PURE__ */ jsxs("div", {
3057
+ className: cn("flex items-center gap-1 text-xs", trendColors[direction$1]),
3058
+ children: [/* @__PURE__ */ jsx(TrendIcon$1, {
3059
+ className: "w-3 h-3",
3060
+ "aria-hidden": "true"
3061
+ }), /* @__PURE__ */ jsx("span", {
3062
+ className: "font-medium",
3063
+ children: changeStr
3064
+ })]
3065
+ });
3066
+ }
3067
+ const changeValue = actualChange.value;
3068
+ const direction = actualChange.direction || (changeValue > 0 ? "up" : changeValue < 0 ? "down" : "neutral");
3069
+ const TrendIcon = TrendIcons[direction];
3070
+ const displayChange = direction === "down" ? `-${Math.abs(changeValue)}` : `+${changeValue}`;
3071
+ return /* @__PURE__ */ jsxs("div", {
3072
+ className: cn("flex items-center gap-1 text-xs", trendColors[direction]),
3073
+ children: [
3074
+ /* @__PURE__ */ jsx(TrendIcon, {
3075
+ className: "w-3 h-3",
3076
+ "aria-hidden": "true"
3077
+ }),
3078
+ /* @__PURE__ */ jsxs("span", {
3079
+ className: "font-medium",
3080
+ children: [displayChange, "%"]
3081
+ }),
3082
+ actualChange.period && /* @__PURE__ */ jsx("span", {
3083
+ className: "text-[var(--text-muted)] ml-0.5",
3084
+ children: actualChange.period
3085
+ })
3086
+ ]
3087
+ });
3088
+ };
3089
+ return /* @__PURE__ */ jsxs(InteractiveCard, {
3090
+ ref,
3091
+ baseBg: variantVars.bg,
3092
+ borderColor: variantVars.border,
3093
+ hoverGlow: variantVars.glow,
3094
+ hoverLift: true,
3095
+ blur: "sm",
3096
+ rounded: "rounded-xl",
3097
+ className: cn("p-3 md:p-4", className),
3098
+ ...props,
3099
+ children: [
3100
+ /* @__PURE__ */ jsxs("div", {
3101
+ className: "flex items-start justify-between mb-2",
3102
+ children: [/* @__PURE__ */ jsxs("div", {
3103
+ className: "flex items-center gap-2",
3104
+ children: [icon && /* @__PURE__ */ jsx("div", {
3105
+ className: "text-(--text-muted)",
3106
+ "aria-hidden": "true",
3107
+ children: icon
3108
+ }), /* @__PURE__ */ jsx("span", {
3109
+ className: "text-(length:--font-size-2xs) sm:text-xs md:text-sm font-medium truncate text-(--text-secondary)",
3110
+ children: actualTitle
3111
+ })]
3112
+ }), renderChange()]
3113
+ }),
3114
+ /* @__PURE__ */ jsxs("div", {
3115
+ className: "flex flex-col items-center mb-2 md:mb-3 gap-1",
3116
+ children: [/* @__PURE__ */ jsx("span", {
3117
+ className: "font-bold text-lg sm:text-xl md:text-2xl whitespace-nowrap",
3118
+ style: valueStyles,
3119
+ children: displayValue
3120
+ }), actualDescription && /* @__PURE__ */ jsx("span", {
3121
+ className: "text-(length:--font-size-2xs) text-(--text-muted)",
3122
+ children: actualDescription
3123
+ })]
3124
+ }),
3125
+ hasSparkline ? /* @__PURE__ */ jsxs("div", {
3126
+ className: "space-y-2",
3127
+ children: [showProgress && actualProgress !== void 0 && /* @__PURE__ */ jsx(ProgressGlass, {
3128
+ value: actualProgress,
3129
+ gradient: variantToGradient[actualVariant],
3130
+ size: "sm"
3131
+ }), /* @__PURE__ */ jsx(SparklineGlass, {
3132
+ data: sparklineData,
3133
+ height: "sm",
3134
+ gap: "sm",
3135
+ className: "w-full",
3136
+ barColor: variantVars.text,
3137
+ highlightMax: true,
3138
+ "aria-label": `${actualTitle} trend`
3139
+ })]
3140
+ }) : showProgress && actualProgress !== void 0 ? /* @__PURE__ */ jsx(ProgressGlass, {
3141
+ value: actualProgress,
3142
+ gradient: variantToGradient[actualVariant],
3143
+ size: "sm"
3144
+ }) : null
3145
+ ]
3146
+ });
3147
+ });
3148
+ MetricCardGlass.displayName = "MetricCardGlass";
3149
+ const MetricsGridGlass = forwardRef(({ metrics, columns = 4, gap = "md", className, ...props }, ref) => {
3150
+ const gapClasses = {
3151
+ sm: "gap-2",
3152
+ md: "gap-4",
3153
+ lg: "gap-6"
3154
+ };
3155
+ const columnClasses = {
3156
+ 1: "grid-cols-1",
3157
+ 2: "grid-cols-1 sm:grid-cols-2",
3158
+ 3: "grid-cols-1 sm:grid-cols-2 md:grid-cols-3",
3159
+ 4: "grid-cols-2 sm:grid-cols-3 md:grid-cols-4",
3160
+ 5: "grid-cols-2 sm:grid-cols-3 md:grid-cols-5",
3161
+ 6: "grid-cols-2 sm:grid-cols-3 md:grid-cols-6"
3162
+ };
3163
+ if (metrics.length === 0) return null;
3164
+ return /* @__PURE__ */ jsx("div", {
3165
+ ref,
3166
+ className: cn("grid", columnClasses[columns], gapClasses[gap], className),
3167
+ ...props,
3168
+ children: metrics.map((metric) => /* @__PURE__ */ jsx(MetricCardGlass, {
3169
+ title: metric.title,
3170
+ value: metric.value,
3171
+ variant: metric.variant
3172
+ }, metric.title))
3173
+ });
3174
+ });
3175
+ MetricsGridGlass.displayName = "MetricsGridGlass";
3176
+ const RepositoryCardGlass = forwardRef(({ name, languages, commits, contribution, stars = 0, flagType = "green", issues = [], expanded = false, onToggle, onGitHubClick, onAIAnalysisClick, className, ...props }, ref) => {
3177
+ const totalProjectCommits = contribution > 0 ? Math.round(commits / (contribution / 100)) : commits;
3178
+ const estimatedLines = Math.round(commits * 12);
3179
+ const expandedStyles = {
3180
+ background: "var(--expanded-bg)",
3181
+ borderColor: "var(--card-border)"
3182
+ };
3183
+ const metricCardStyles = {
3184
+ background: "var(--card-bg)",
3185
+ borderColor: "var(--card-border)"
3186
+ };
3187
+ return /* @__PURE__ */ jsxs(InteractiveCard, {
3188
+ ref,
3189
+ baseBg: "var(--card-bg)",
3190
+ hoverBg: "var(--card-hover-bg)",
3191
+ borderColor: "var(--card-border)",
3192
+ hoverLift: false,
3193
+ blur: "sm",
3194
+ rounded: "rounded-xl",
3195
+ className: cn("overflow-hidden", className),
3196
+ ...props,
3197
+ children: [/* @__PURE__ */ jsxs("div", {
3198
+ className: "p-3 md:p-3.5 cursor-pointer",
3199
+ onClick: onToggle,
3200
+ role: "button",
3201
+ tabIndex: 0,
3202
+ onKeyDown: (e) => {
3203
+ if (e.key === "Enter" || e.key === " ") {
3204
+ e.preventDefault();
3205
+ onToggle?.();
3206
+ }
3207
+ },
3208
+ "aria-expanded": expanded,
3209
+ children: [
3210
+ /* @__PURE__ */ jsxs("div", {
3211
+ className: "flex items-center justify-between",
3212
+ children: [/* @__PURE__ */ jsxs("div", {
3213
+ className: "flex items-center gap-2.5",
3214
+ children: [/* @__PURE__ */ jsx("span", {
3215
+ className: "font-medium text-sm",
3216
+ style: { color: "var(--text-primary)" },
3217
+ children: name
3218
+ }), /* @__PURE__ */ jsx(StatusIndicatorGlass, { type: flagType })]
3219
+ }), /* @__PURE__ */ jsxs("div", {
3220
+ className: "flex items-center gap-2",
3221
+ children: [stars > 0 && /* @__PURE__ */ jsxs("span", {
3222
+ className: "flex items-center gap-1 text-xs",
3223
+ style: { color: "var(--status-away)" },
3224
+ children: [/* @__PURE__ */ jsx(Star, { className: "w-3 h-3" }), stars]
3225
+ }), expanded ? /* @__PURE__ */ jsx(ChevronUp, {
3226
+ className: "w-4 h-4",
3227
+ style: { color: "var(--text-muted)" }
3228
+ }) : /* @__PURE__ */ jsx(ChevronDown, {
3229
+ className: "w-4 h-4",
3230
+ style: { color: "var(--text-muted)" }
3231
+ })]
3232
+ })]
3233
+ }),
3234
+ /* @__PURE__ */ jsx("div", {
3235
+ className: "text-xs mt-1.5",
3236
+ style: { color: "var(--text-muted)" },
3237
+ children: languages
3238
+ }),
3239
+ /* @__PURE__ */ jsxs("div", {
3240
+ className: "text-xs mt-0.5",
3241
+ style: { color: "var(--text-secondary)" },
3242
+ children: [
3243
+ commits,
3244
+ " commits · ",
3245
+ contribution,
3246
+ "%"
3247
+ ]
3248
+ })
3249
+ ]
3250
+ }), expanded && /* @__PURE__ */ jsxs("div", {
3251
+ className: "border-t p-3.5 space-y-3",
3252
+ style: expandedStyles,
3253
+ children: [
3254
+ issues.length > 0 && /* @__PURE__ */ jsxs("div", {
3255
+ className: "p-3 rounded-xl border",
3256
+ style: {
3257
+ background: "var(--alert-danger-bg)",
3258
+ borderColor: "var(--alert-danger-border)"
3259
+ },
3260
+ children: [/* @__PURE__ */ jsxs("div", {
3261
+ className: "text-xs font-semibold flex items-center gap-1.5 mb-1.5",
3262
+ style: { color: "var(--alert-danger-text)" },
3263
+ children: [/* @__PURE__ */ jsx(AlertTriangle, { className: "w-3.5 h-3.5" }), "Issues"]
3264
+ }), issues.map((issue, index) => /* @__PURE__ */ jsxs("div", {
3265
+ className: "text-xs opacity-70",
3266
+ style: { color: "var(--alert-danger-text)" },
3267
+ children: ["• ", issue]
3268
+ }, index))]
3269
+ }),
3270
+ /* @__PURE__ */ jsxs("div", {
3271
+ className: "grid grid-cols-2 gap-2",
3272
+ children: [/* @__PURE__ */ jsxs("div", {
3273
+ className: "p-2.5 rounded-lg border",
3274
+ style: metricCardStyles,
3275
+ children: [
3276
+ /* @__PURE__ */ jsx("div", {
3277
+ className: "text-xs",
3278
+ style: { color: "var(--text-muted)" },
3279
+ children: "Your Contribution"
3280
+ }),
3281
+ /* @__PURE__ */ jsxs("div", {
3282
+ className: "font-semibold",
3283
+ style: { color: "var(--text-primary)" },
3284
+ children: [commits, " commits"]
3285
+ }),
3286
+ /* @__PURE__ */ jsxs("div", {
3287
+ className: "text-xs",
3288
+ style: { color: "var(--text-muted)" },
3289
+ children: [contribution, "%"]
3290
+ })
3291
+ ]
3292
+ }), /* @__PURE__ */ jsxs("div", {
3293
+ className: "p-2.5 rounded-lg border",
3294
+ style: metricCardStyles,
3295
+ children: [
3296
+ /* @__PURE__ */ jsx("div", {
3297
+ className: "text-xs",
3298
+ style: { color: "var(--text-muted)" },
3299
+ children: "Full Project"
3300
+ }),
3301
+ /* @__PURE__ */ jsxs("div", {
3302
+ className: "font-semibold",
3303
+ style: { color: "var(--text-primary)" },
3304
+ children: [totalProjectCommits, " commits"]
3305
+ }),
3306
+ /* @__PURE__ */ jsxs("div", {
3307
+ className: "text-xs",
3308
+ style: { color: "var(--text-muted)" },
3309
+ children: [
3310
+ "~",
3311
+ estimatedLines,
3312
+ " lines"
3313
+ ]
3314
+ })
3315
+ ]
3316
+ })]
3317
+ }),
3318
+ /* @__PURE__ */ jsxs("div", {
3319
+ className: "flex flex-col sm:flex-row gap-2",
3320
+ children: [/* @__PURE__ */ jsx(ButtonGlass, {
3321
+ variant: "secondary",
3322
+ size: "sm",
3323
+ icon: ExternalLink,
3324
+ onClick: (e) => {
3325
+ e.stopPropagation();
3326
+ onGitHubClick?.();
3327
+ },
3328
+ className: "flex-1",
3329
+ children: "GitHub"
3330
+ }), /* @__PURE__ */ jsx(ButtonGlass, {
3331
+ variant: "default",
3332
+ size: "sm",
3333
+ icon: Sparkles,
3334
+ onClick: (e) => {
3335
+ e.stopPropagation();
3336
+ onAIAnalysisClick?.();
3337
+ },
3338
+ className: "flex-1",
3339
+ children: "AI Analysis"
3340
+ })]
3341
+ })
3342
+ ]
3343
+ })]
3344
+ });
3345
+ });
3346
+ RepositoryCardGlass.displayName = "RepositoryCardGlass";
3347
+ const RepositoryHeaderGlass = forwardRef(({ name, flagType = "green", stars = 0, expanded = false, abbreviatedStars = false, className, ...props }, ref) => {
3348
+ const titleStyles = { color: "var(--text-primary)" };
3349
+ const starStyles = { color: "var(--status-away)" };
3350
+ const mutedStyles = { color: "var(--text-muted)" };
3351
+ const formatStars = (count) => {
3352
+ if (!abbreviatedStars) return String(count);
3353
+ if (count >= 1e6) return `${(count / 1e6).toFixed(1)}M`;
3354
+ if (count >= 1e3) return `${(count / 1e3).toFixed(1)}k`;
3355
+ return String(count);
3356
+ };
3357
+ return /* @__PURE__ */ jsxs("div", {
3358
+ ref,
3359
+ className: cn("flex items-center justify-between", className),
3360
+ ...props,
3361
+ children: [/* @__PURE__ */ jsxs("div", {
3362
+ className: "flex items-center gap-2.5",
3363
+ children: [/* @__PURE__ */ jsx("span", {
3364
+ className: "font-medium text-sm",
3365
+ style: titleStyles,
3366
+ children: name
3367
+ }), /* @__PURE__ */ jsx(StatusIndicatorGlass, { type: flagType })]
3368
+ }), /* @__PURE__ */ jsxs("div", {
3369
+ className: "flex items-center gap-2",
3370
+ children: [stars > 0 && /* @__PURE__ */ jsxs("span", {
3371
+ className: "flex items-center gap-1 text-xs",
3372
+ style: starStyles,
3373
+ children: [/* @__PURE__ */ jsx(Star, { className: "w-3 h-3" }), formatStars(stars)]
3374
+ }), expanded ? /* @__PURE__ */ jsx(ChevronUp, {
3375
+ className: "w-4 h-4",
3376
+ style: mutedStyles
3377
+ }) : /* @__PURE__ */ jsx(ChevronDown, {
3378
+ className: "w-4 h-4",
3379
+ style: mutedStyles
3380
+ })]
3381
+ })]
3382
+ });
3383
+ });
3384
+ RepositoryHeaderGlass.displayName = "RepositoryHeaderGlass";
3385
+ const RepositoryMetadataGlass = forwardRef(({ languages, commits, contribution, stacked = false, className, ...props }, ref) => {
3386
+ const mutedStyles = { color: "var(--text-muted)" };
3387
+ const secondaryStyles = { color: "var(--text-secondary)" };
3388
+ return /* @__PURE__ */ jsxs("div", {
3389
+ ref,
3390
+ className: cn(stacked ? "space-y-0.5" : "space-y-1", className),
3391
+ ...props,
3392
+ children: [/* @__PURE__ */ jsx("div", {
3393
+ className: "text-xs",
3394
+ style: mutedStyles,
3395
+ children: languages
3396
+ }), /* @__PURE__ */ jsxs("div", {
3397
+ className: "text-xs",
3398
+ style: secondaryStyles,
3399
+ children: [
3400
+ commits.toLocaleString(),
3401
+ " commits · ",
3402
+ contribution,
3403
+ "%"
3404
+ ]
3405
+ })]
3406
+ });
3407
+ });
3408
+ RepositoryMetadataGlass.displayName = "RepositoryMetadataGlass";
3409
+ const TrustScoreDisplayGlass = forwardRef(({ score, maxScore = 100, title = "Overall Trust Score", showIcon = true, size = "md", className, ...props }, ref) => {
3410
+ const titleStyles = { color: "var(--text-primary)" };
3411
+ const accentStyles = { color: "var(--text-accent)" };
3412
+ const mutedStyles = { color: "var(--text-muted)" };
3413
+ const sizes = {
3414
+ sm: {
3415
+ title: "text-base",
3416
+ score: "text-2xl",
3417
+ max: "text-lg",
3418
+ icon: "w-4 h-4"
3419
+ },
3420
+ md: {
3421
+ title: "text-lg",
3422
+ score: "text-4xl",
3423
+ max: "text-xl",
3424
+ icon: "w-5 h-5"
3425
+ },
3426
+ lg: {
3427
+ title: "text-xl",
3428
+ score: "text-5xl",
3429
+ max: "text-2xl",
3430
+ icon: "w-6 h-6"
3431
+ }
3432
+ }[size];
3433
+ return /* @__PURE__ */ jsxs("div", {
3434
+ ref,
3435
+ className: cn("flex items-center justify-between", className),
3436
+ ...props,
3437
+ children: [/* @__PURE__ */ jsxs("h2", {
3438
+ className: cn("font-semibold flex items-center gap-2", sizes.title),
3439
+ style: titleStyles,
3440
+ children: [showIcon && /* @__PURE__ */ jsx(Target, {
3441
+ className: sizes.icon,
3442
+ style: accentStyles
3443
+ }), title]
3444
+ }), /* @__PURE__ */ jsxs("div", {
3445
+ className: "flex items-center gap-2 animate-[score-pulse_2s_ease-in-out_infinite]",
3446
+ children: [/* @__PURE__ */ jsx("span", {
3447
+ className: cn(sizes.score, "font-bold bg-clip-text text-transparent"),
3448
+ style: { backgroundImage: "var(--score-gradient)" },
3449
+ children: score
3450
+ }), /* @__PURE__ */ jsxs("span", {
3451
+ className: sizes.max,
3452
+ style: mutedStyles,
3453
+ children: ["/ ", maxScore]
3454
+ })]
3455
+ })]
3456
+ });
3457
+ });
3458
+ TrustScoreDisplayGlass.displayName = "TrustScoreDisplayGlass";
3459
+ const UserInfoGlass = forwardRef(({ name, username, joinDate, profileUrl = "#", layout = "vertical", className, ...props }, ref) => {
3460
+ const titleStyles = { color: "var(--text-primary)" };
3461
+ const metaStyles = { color: "var(--text-secondary)" };
3462
+ const linkStyles = { color: "var(--text-accent)" };
3463
+ return /* @__PURE__ */ jsxs("div", {
3464
+ ref,
3465
+ className: cn(layout === "vertical" ? "space-y-1" : "flex items-center gap-4", className),
3466
+ ...props,
3467
+ children: [/* @__PURE__ */ jsx("h1", {
3468
+ className: cn("font-bold", layout === "vertical" ? "text-lg md:text-xl" : "text-xl"),
3469
+ style: titleStyles,
3470
+ children: name
3471
+ }), /* @__PURE__ */ jsxs("div", {
3472
+ className: cn("flex items-center gap-2 text-sm flex-wrap", layout === "vertical" && "mt-0.5"),
3473
+ style: metaStyles,
3474
+ children: [
3475
+ /* @__PURE__ */ jsxs("a", {
3476
+ href: profileUrl,
3477
+ className: "flex items-center gap-1 hover:underline",
3478
+ style: linkStyles,
3479
+ "aria-label": `View ${username}'s profile`,
3480
+ children: [
3481
+ "@",
3482
+ username,
3483
+ " ",
3484
+ /* @__PURE__ */ jsx(ExternalLink, { className: "w-3 h-3" })
3485
+ ]
3486
+ }),
3487
+ /* @__PURE__ */ jsx("span", { children: "·" }),
3488
+ /* @__PURE__ */ jsxs("span", {
3489
+ className: "flex items-center gap-1",
3490
+ children: [
3491
+ /* @__PURE__ */ jsx(Calendar, { className: "w-3 h-3" }),
3492
+ " Joined ",
3493
+ joinDate
3494
+ ]
3495
+ })
3496
+ ]
3497
+ })]
3498
+ });
3499
+ });
3500
+ UserInfoGlass.displayName = "UserInfoGlass";
3501
+ const UserStatsLineGlass = forwardRef(({ repos, followers, following, wrap = true, abbreviated = false, className, ...props }, ref) => {
3502
+ return /* @__PURE__ */ jsxs("div", {
3503
+ ref,
3504
+ className: cn("flex items-center gap-4 text-sm", wrap && "flex-wrap", className),
3505
+ ...props,
3506
+ children: [
3507
+ /* @__PURE__ */ jsx(StatItemGlass, {
3508
+ icon: FolderGit2,
3509
+ value: repos,
3510
+ label: "repos",
3511
+ abbreviated
3512
+ }),
3513
+ /* @__PURE__ */ jsx(StatItemGlass, {
3514
+ icon: Users,
3515
+ value: followers,
3516
+ label: "followers",
3517
+ abbreviated
3518
+ }),
3519
+ /* @__PURE__ */ jsx(StatItemGlass, {
3520
+ icon: User,
3521
+ value: following,
3522
+ label: "following",
3523
+ abbreviated
3524
+ })
3525
+ ]
3526
+ });
3527
+ });
3528
+ UserStatsLineGlass.displayName = "UserStatsLineGlass";
3529
+ const YearCardGlass = forwardRef(({ year, emoji, label, commits, progress, isExpanded = false, gradient = "blue", prs = 0, repos = 0, onShowYear, sparklineData, sparklineLabels, insights, stats, actionLabel, showSparklineCollapsed = true, valueFormatter, children, className, onClick, ...props }, ref) => {
3530
+ const expandedStyles = {
3531
+ background: "var(--expanded-bg)",
3532
+ borderColor: "var(--expanded-border)"
3533
+ };
3534
+ const metricCardStyles = {
3535
+ background: "var(--card-bg)",
3536
+ borderColor: "var(--card-border)"
3537
+ };
3538
+ const displayCommits = valueFormatter ? valueFormatter(commits) : commits;
3539
+ const displayStats = stats || [
3540
+ {
3541
+ label: "Commits",
3542
+ value: commits
3543
+ },
3544
+ {
3545
+ label: "PRs",
3546
+ value: prs
3547
+ },
3548
+ {
3549
+ label: "Repos",
3550
+ value: repos
3551
+ }
3552
+ ];
3553
+ const buttonLabel = actionLabel || `Show repos from ${year}`;
3554
+ return /* @__PURE__ */ jsxs(InteractiveCard, {
3555
+ ref,
3556
+ baseBg: "var(--year-card-bg)",
3557
+ hoverBg: "var(--card-hover-bg)",
3558
+ borderColor: "var(--year-card-border)",
3559
+ hoverGlow: "var(--year-card-hover-glow)",
3560
+ hoverLift: true,
3561
+ rounded: "rounded-xl",
3562
+ className: cn("w-full max-w-2xl p-2.5 md:p-3 cursor-pointer", className),
3563
+ onClick,
3564
+ role: "button",
3565
+ tabIndex: 0,
3566
+ onKeyDown: (e) => {
3567
+ if (e.key === "Enter" || e.key === " ") {
3568
+ e.preventDefault();
3569
+ onClick?.(e);
3570
+ }
3571
+ },
3572
+ "aria-expanded": isExpanded,
3573
+ "aria-label": `${year} year: ${label}, ${commits} commits. ${isExpanded ? "Collapse" : "Expand"} details`,
3574
+ ...props,
3575
+ children: [
3576
+ /* @__PURE__ */ jsxs("div", {
3577
+ className: "flex items-center justify-between mb-1.5 md:mb-2",
3578
+ children: [/* @__PURE__ */ jsxs("div", {
3579
+ className: "flex items-center gap-1.5 md:gap-2",
3580
+ children: [/* @__PURE__ */ jsx("span", {
3581
+ className: "font-semibold text-sm md:text-base",
3582
+ style: { color: "var(--text-primary)" },
3583
+ children: year
3584
+ }), /* @__PURE__ */ jsxs(BadgeGlass, { children: [
3585
+ emoji,
3586
+ " ",
3587
+ label
3588
+ ] })]
3589
+ }), /* @__PURE__ */ jsxs("span", {
3590
+ className: "text-xs md:text-sm flex items-center gap-0.5 md:gap-1",
3591
+ style: { color: "var(--text-secondary)" },
3592
+ children: [displayCommits, isExpanded ? /* @__PURE__ */ jsx(ChevronUp, {
3593
+ className: "w-3.5 h-3.5 md:w-4 md:h-4",
3594
+ "aria-hidden": "true"
3595
+ }) : /* @__PURE__ */ jsx(ChevronDown, {
3596
+ className: "w-3.5 h-3.5 md:w-4 md:h-4",
3597
+ "aria-hidden": "true"
3598
+ })]
3599
+ })]
3600
+ }),
3601
+ /* @__PURE__ */ jsxs("div", {
3602
+ className: "flex items-center gap-2",
3603
+ children: [/* @__PURE__ */ jsx("div", {
3604
+ className: "flex-1",
3605
+ children: /* @__PURE__ */ jsx(ProgressGlass, {
3606
+ value: progress,
3607
+ gradient,
3608
+ size: "sm"
3609
+ })
3610
+ }), showSparklineCollapsed && sparklineData && sparklineData.length > 0 && /* @__PURE__ */ jsx(SparklineGlass, {
3611
+ data: sparklineData,
3612
+ labels: sparklineLabels,
3613
+ height: "sm",
3614
+ gap: "sm",
3615
+ className: "w-16 md:w-20",
3616
+ "aria-label": `Activity trend for ${year}`
3617
+ })]
3618
+ }),
3619
+ isExpanded && /* @__PURE__ */ jsxs("div", {
3620
+ className: "mt-3 pt-3 border-t space-y-3",
3621
+ style: expandedStyles,
3622
+ children: [
3623
+ /* @__PURE__ */ jsx("div", {
3624
+ className: "grid gap-2 md:gap-3",
3625
+ style: { gridTemplateColumns: `repeat(${Math.min(displayStats.length, 4)}, 1fr)` },
3626
+ children: displayStats.map((stat, index) => /* @__PURE__ */ jsxs("div", {
3627
+ className: "p-2 md:p-2.5 rounded-lg border text-center",
3628
+ style: metricCardStyles,
3629
+ children: [
3630
+ stat.icon && /* @__PURE__ */ jsx("div", {
3631
+ className: "mb-1 flex justify-center text-[var(--text-muted)]",
3632
+ children: stat.icon
3633
+ }),
3634
+ /* @__PURE__ */ jsx("div", {
3635
+ className: "text-base md:text-xl font-bold",
3636
+ style: { color: "var(--text-primary)" },
3637
+ children: stat.value
3638
+ }),
3639
+ /* @__PURE__ */ jsx("div", {
3640
+ className: "text-(length:--font-size-2xs) md:text-xs text-(--text-muted)",
3641
+ children: stat.label
3642
+ })
3643
+ ]
3644
+ }, index))
3645
+ }),
3646
+ !showSparklineCollapsed && sparklineData && sparklineData.length > 0 && /* @__PURE__ */ jsx(SparklineGlass, {
3647
+ data: sparklineData,
3648
+ labels: sparklineLabels,
3649
+ showLabels: !!sparklineLabels,
3650
+ height: "md",
3651
+ gap: "sm",
3652
+ highlightMax: true,
3653
+ className: "w-full",
3654
+ "aria-label": `Monthly activity for ${year}`
3655
+ }),
3656
+ insights && insights.length > 0 && /* @__PURE__ */ jsx("div", {
3657
+ className: "space-y-2",
3658
+ children: insights.map((insight, index) => /* @__PURE__ */ jsx(InsightCardGlass, {
3659
+ variant: insight.variant,
3660
+ emoji: insight.emoji,
3661
+ text: insight.text,
3662
+ detail: insight.detail,
3663
+ inline: false
3664
+ }, index))
3665
+ }),
3666
+ children,
3667
+ onShowYear && /* @__PURE__ */ jsx(ButtonGlass, {
3668
+ variant: "default",
3669
+ size: "sm",
3670
+ onClick: (e) => {
3671
+ e.stopPropagation();
3672
+ onShowYear();
3673
+ },
3674
+ className: "w-full",
3675
+ children: buttonLabel
3676
+ })
3677
+ ]
3678
+ })
3679
+ ]
3680
+ });
3681
+ });
3682
+ YearCardGlass.displayName = "YearCardGlass";
3683
+ const CareerStatsGlass = forwardRef(({ totalCommits = 2242, totalPRs = 47, totalRepos = 11, years = [], className, ...props }, ref) => {
3684
+ const [expandedYear, setExpandedYear] = useState(null);
3685
+ const handleYearClick = (year) => {
3686
+ setExpandedYear(expandedYear === year ? null : year);
3687
+ };
3688
+ return /* @__PURE__ */ jsxs(GlassCard, {
3689
+ ref,
3690
+ className: cn("p-4 md:p-5 lg:p-6", className),
3691
+ intensity: "medium",
3692
+ hover: false,
3693
+ ...props,
3694
+ children: [
3695
+ /* @__PURE__ */ jsxs("h3", {
3696
+ className: "font-semibold flex items-center gap-2 md:gap-2.5 lg:gap-3 mb-1 text-base md:text-lg lg:text-xl",
3697
+ style: { color: "var(--text-primary)" },
3698
+ children: [/* @__PURE__ */ jsx(TrendingUp, {
3699
+ className: "w-4 h-4 md:w-5 md:h-5 lg:w-6 lg:h-6",
3700
+ style: { color: "var(--text-accent)" }
3701
+ }), "Career Stats"]
3702
+ }),
3703
+ /* @__PURE__ */ jsxs("p", {
3704
+ className: "text-xs md:text-sm lg:text-base mb-3 md:mb-4 flex items-center gap-2 md:gap-2.5 lg:gap-3 flex-wrap",
3705
+ style: { color: "var(--text-secondary)" },
3706
+ children: [
3707
+ /* @__PURE__ */ jsxs("span", {
3708
+ className: "flex items-center gap-1 md:gap-1.5",
3709
+ children: [
3710
+ /* @__PURE__ */ jsx(Code, { className: "w-3.5 h-3.5 md:w-4 md:h-4 lg:w-5 lg:h-5" }),
3711
+ totalCommits.toLocaleString(),
3712
+ " commits"
3713
+ ]
3714
+ }),
3715
+ /* @__PURE__ */ jsx("span", { children: "·" }),
3716
+ /* @__PURE__ */ jsxs("span", {
3717
+ className: "flex items-center gap-1 md:gap-1.5",
3718
+ children: [
3719
+ /* @__PURE__ */ jsx(GitPullRequest, { className: "w-3.5 h-3.5 md:w-4 md:h-4 lg:w-5 lg:h-5" }),
3720
+ totalPRs,
3721
+ " PRs"
3722
+ ]
3723
+ }),
3724
+ /* @__PURE__ */ jsx("span", { children: "·" }),
3725
+ /* @__PURE__ */ jsxs("span", {
3726
+ className: "flex items-center gap-1 md:gap-1.5",
3727
+ children: [
3728
+ /* @__PURE__ */ jsx(FolderGit2, { className: "w-3.5 h-3.5 md:w-4 md:h-4 lg:w-5 lg:h-5" }),
3729
+ totalRepos,
3730
+ " repos"
3731
+ ]
3732
+ })
3733
+ ]
3734
+ }),
3735
+ /* @__PURE__ */ jsx("div", {
3736
+ className: "space-y-2 md:space-y-2.5 lg:space-y-3",
3737
+ children: years.map((y) => /* @__PURE__ */ jsx(YearCardGlass, {
3738
+ year: y.year,
3739
+ emoji: y.emoji,
3740
+ label: y.label,
3741
+ commits: y.commits,
3742
+ progress: y.progress,
3743
+ prs: y.prs,
3744
+ repos: y.repos,
3745
+ isExpanded: expandedYear === y.year,
3746
+ onClick: () => handleYearClick(y.year),
3747
+ onShowYear: () => {}
3748
+ }, y.year))
3749
+ })
3750
+ ]
3751
+ });
3752
+ });
3753
+ CareerStatsGlass.displayName = "CareerStatsGlass";
3754
+ const FlagsSectionGlass = forwardRef(({ flags = [], expanded = false, onToggle, className, ...props }, ref) => {
3755
+ return /* @__PURE__ */ jsxs(GlassCard, {
3756
+ ref,
3757
+ className: cn("w-full max-w-2xl", className),
3758
+ intensity: "medium",
3759
+ hover: false,
3760
+ ...props,
3761
+ children: [/* @__PURE__ */ jsxs("button", {
3762
+ onClick: onToggle,
3763
+ className: "w-full p-3 md:p-4 flex items-center justify-between rounded-2xl",
3764
+ style: { color: "var(--text-primary)" },
3765
+ type: "button",
3766
+ "aria-expanded": expanded,
3767
+ children: [/* @__PURE__ */ jsxs("div", {
3768
+ className: "flex items-center gap-1.5 md:gap-2",
3769
+ children: [/* @__PURE__ */ jsx(AlertTriangle, {
3770
+ className: "w-4 h-4 md:w-5 md:h-5",
3771
+ style: { color: "var(--status-away)" }
3772
+ }), /* @__PURE__ */ jsxs("span", {
3773
+ className: "font-medium text-sm md:text-base",
3774
+ children: [flags.length, " flags detected"]
3775
+ })]
3776
+ }), expanded ? /* @__PURE__ */ jsx(ChevronUp, {
3777
+ className: "w-4 h-4 md:w-5 md:h-5",
3778
+ style: { color: "var(--text-muted)" }
3779
+ }) : /* @__PURE__ */ jsx(ChevronDown, {
3780
+ className: "w-4 h-4 md:w-5 md:h-5",
3781
+ style: { color: "var(--text-muted)" }
3782
+ })]
3783
+ }), expanded && /* @__PURE__ */ jsx("div", {
3784
+ className: "px-3 pb-3 md:px-4 md:pb-4 space-y-1.5 md:space-y-2",
3785
+ children: flags.map((flag, i) => /* @__PURE__ */ jsx(FlagAlertGlass, {
3786
+ type: flag.type,
3787
+ title: flag.title,
3788
+ description: flag.description
3789
+ }, `flag-${i}`))
3790
+ })]
3791
+ });
3792
+ });
3793
+ FlagsSectionGlass.displayName = "FlagsSectionGlass";
3794
+ const HeaderBrandingGlass = forwardRef(({ logoIcon, title, subtitle, onLogoClick, logoAriaLabel = "Home", className, ...props }, ref) => {
3795
+ const titleStyles = { color: "var(--text-primary)" };
3796
+ return /* @__PURE__ */ jsxs("div", {
3797
+ ref,
3798
+ className: cn("flex items-center gap-4", className),
3799
+ ...props,
3800
+ children: [/* @__PURE__ */ jsx(IconButtonGlass, {
3801
+ icon: logoIcon,
3802
+ "aria-label": logoAriaLabel,
3803
+ onClick: onLogoClick,
3804
+ variant: "gradient",
3805
+ size: "md"
3806
+ }), /* @__PURE__ */ jsxs("div", {
3807
+ className: "flex flex-col sm:flex-row sm:items-center sm:gap-2",
3808
+ children: [/* @__PURE__ */ jsx("span", {
3809
+ className: "font-semibold text-base md:text-lg",
3810
+ style: titleStyles,
3811
+ children: title
3812
+ }), subtitle && /* @__PURE__ */ jsxs("span", {
3813
+ className: "hidden md:inline text-sm",
3814
+ style: { color: "var(--text-secondary)" },
3815
+ children: ["· ", subtitle]
3816
+ })]
3817
+ })]
3818
+ });
3819
+ });
3820
+ HeaderBrandingGlass.displayName = "HeaderBrandingGlass";
3821
+ var themes = [
3822
+ "light",
3823
+ "aurora",
3824
+ "glass"
3825
+ ];
3826
+ var themeConfig = {
3827
+ light: {
3828
+ label: "Light",
3829
+ icon: Sun
3830
+ },
3831
+ aurora: {
3832
+ label: "Aurora",
3833
+ icon: Moon
3834
+ },
3835
+ glass: {
3836
+ label: "Glass",
3837
+ icon: Palette
3838
+ }
3839
+ };
3840
+ const HeaderNavGlass = forwardRef(({ username = "Yhooi2", onSearch, onThemeToggle, className, ...props }, ref) => {
3841
+ const { theme, cycleTheme } = useTheme();
3842
+ const nextTheme = themes[(themes.indexOf(theme) + 1) % themes.length];
3843
+ const NextIcon = themeConfig[nextTheme].icon;
3844
+ const headerStyles = {
3845
+ background: "var(--header-bg)",
3846
+ borderColor: "var(--header-border)",
3847
+ backdropFilter: "blur(var(--blur-md))",
3848
+ WebkitBackdropFilter: "blur(var(--blur-md))"
3849
+ };
3850
+ const iconBtnStyles = {
3851
+ background: "linear-gradient(135deg, var(--icon-btn-from), var(--icon-btn-to))",
3852
+ boxShadow: "var(--icon-btn-shadow)"
3853
+ };
3854
+ const themeBtnStyles = {
3855
+ background: "var(--card-subtle-bg)",
3856
+ border: "1px solid var(--card-subtle-border)"
3857
+ };
3858
+ return /* @__PURE__ */ jsx("header", {
3859
+ ref,
3860
+ className: cn("border rounded-xl py-2 px-3 md:py-3 md:px-4 transition-all duration-300", className),
3861
+ style: headerStyles,
3862
+ ...props,
3863
+ children: /* @__PURE__ */ jsxs("div", {
3864
+ className: "flex items-center justify-between",
3865
+ children: [/* @__PURE__ */ jsxs("div", {
3866
+ className: "flex items-center gap-2 md:gap-4",
3867
+ children: [
3868
+ /* @__PURE__ */ jsx("button", {
3869
+ className: "w-8 h-8 md:w-10 md:h-10 rounded-xl flex items-center justify-center transition-all duration-300 hover:scale-105",
3870
+ style: iconBtnStyles,
3871
+ type: "button",
3872
+ "aria-label": "GitHub",
3873
+ children: /* @__PURE__ */ jsx(Github, {
3874
+ className: "w-4 h-4 md:w-5 md:h-5",
3875
+ style: { color: "var(--icon-btn-text)" }
3876
+ })
3877
+ }),
3878
+ /* @__PURE__ */ jsx("span", {
3879
+ className: "font-semibold text-base md:text-lg",
3880
+ style: { color: "var(--text-primary)" },
3881
+ children: "User Analytics"
3882
+ }),
3883
+ /* @__PURE__ */ jsx(SearchBoxGlass, {
3884
+ className: "ml-2 md:ml-4",
3885
+ defaultValue: username,
3886
+ onSubmit: onSearch,
3887
+ inputWidth: "w-28 sm:w-36 md:w-48",
3888
+ placeholder: "Search username..."
3889
+ })
3890
+ ]
3891
+ }), /* @__PURE__ */ jsxs("div", {
3892
+ className: "flex items-center gap-2 md:gap-3",
3893
+ children: [/* @__PURE__ */ jsx("button", {
3894
+ onClick: onThemeToggle ?? cycleTheme,
3895
+ className: "p-2 md:p-2.5 rounded-xl transition-all duration-300 hover:scale-105",
3896
+ style: themeBtnStyles,
3897
+ type: "button",
3898
+ "aria-label": `Switch to ${themeConfig[nextTheme].label} theme`,
3899
+ children: /* @__PURE__ */ jsx(NextIcon, {
3900
+ className: "w-4 h-4 md:w-5 md:h-5",
3901
+ style: { color: "var(--text-secondary)" }
3902
+ })
3903
+ }), /* @__PURE__ */ jsx(ButtonGlass, {
3904
+ variant: "secondary",
3905
+ icon: Github,
3906
+ className: "hidden md:inline-flex",
3907
+ children: "Sign in with GitHub"
3908
+ })]
3909
+ })]
3910
+ })
3911
+ });
3912
+ });
3913
+ HeaderNavGlass.displayName = "HeaderNavGlass";
3914
+ const ProfileHeaderGlass = forwardRef(({ name = "Artem Safronov", username = "Yhooi2", joinDate = "Jan 2023", stats = {}, languages = [], onAIGenerate, className, ...props }, ref) => {
3915
+ const s = {
3916
+ repos: 11,
3917
+ followers: 1,
3918
+ following: 5,
3919
+ ...stats
3920
+ };
3921
+ const getInitials$1 = (fullName) => {
3922
+ return fullName.split(" ").map((n) => n[0]).join("").toUpperCase().slice(0, 2);
3923
+ };
3924
+ return /* @__PURE__ */ jsx(GlassCard, {
3925
+ ref,
3926
+ className: cn("p-5", className),
3927
+ intensity: "strong",
3928
+ glow: "violet",
3929
+ hover: false,
3930
+ ...props,
3931
+ children: /* @__PURE__ */ jsxs("div", {
3932
+ className: "flex flex-col md:flex-row gap-3 md:gap-6",
3933
+ children: [/* @__PURE__ */ jsxs("div", {
3934
+ className: "flex-1",
3935
+ children: [/* @__PURE__ */ jsxs("div", {
3936
+ className: "flex gap-4",
3937
+ children: [/* @__PURE__ */ jsx(ProfileAvatarGlass, {
3938
+ initials: getInitials$1(name),
3939
+ size: "lg",
3940
+ status: "online"
3941
+ }), /* @__PURE__ */ jsxs("div", { children: [
3942
+ /* @__PURE__ */ jsx("h1", {
3943
+ className: "text-lg md:text-xl font-bold",
3944
+ style: { color: "var(--text-primary)" },
3945
+ children: name
3946
+ }),
3947
+ /* @__PURE__ */ jsxs("div", {
3948
+ className: "flex items-center gap-2 text-sm mt-0.5",
3949
+ style: { color: "var(--text-secondary)" },
3950
+ children: [
3951
+ /* @__PURE__ */ jsxs("a", {
3952
+ href: "#",
3953
+ className: "flex items-center gap-1 hover:underline",
3954
+ style: { color: "var(--text-accent)" },
3955
+ children: [
3956
+ "@",
3957
+ username,
3958
+ " ",
3959
+ /* @__PURE__ */ jsx(ExternalLink, { className: "w-3 h-3" })
3960
+ ]
3961
+ }),
3962
+ /* @__PURE__ */ jsx("span", { children: "·" }),
3963
+ /* @__PURE__ */ jsxs("span", {
3964
+ className: "flex items-center gap-1",
3965
+ children: [
3966
+ /* @__PURE__ */ jsx(Calendar, { className: "w-3 h-3" }),
3967
+ " Joined ",
3968
+ joinDate
3969
+ ]
3970
+ })
3971
+ ]
3972
+ }),
3973
+ /* @__PURE__ */ jsxs("div", {
3974
+ className: "flex items-center gap-3 md:gap-4 mt-2 text-sm flex-wrap",
3975
+ style: { color: "var(--text-secondary)" },
3976
+ children: [
3977
+ /* @__PURE__ */ jsxs("span", {
3978
+ className: "flex items-center gap-1",
3979
+ children: [
3980
+ /* @__PURE__ */ jsx(FolderGit2, {
3981
+ className: "w-4 h-4",
3982
+ style: { color: "var(--text-accent)" }
3983
+ }),
3984
+ s.repos,
3985
+ " repos"
3986
+ ]
3987
+ }),
3988
+ /* @__PURE__ */ jsxs("span", {
3989
+ className: "flex items-center gap-1",
3990
+ children: [
3991
+ /* @__PURE__ */ jsx(Users, {
3992
+ className: "w-4 h-4",
3993
+ style: { color: "var(--text-accent)" }
3994
+ }),
3995
+ s.followers,
3996
+ " followers"
3997
+ ]
3998
+ }),
3999
+ /* @__PURE__ */ jsxs("span", {
4000
+ className: "flex items-center gap-1",
4001
+ children: [
4002
+ /* @__PURE__ */ jsx(User, {
4003
+ className: "w-4 h-4",
4004
+ style: { color: "var(--text-accent)" }
4005
+ }),
4006
+ s.following,
4007
+ " following"
4008
+ ]
4009
+ })
4010
+ ]
4011
+ })
4012
+ ] })]
4013
+ }), languages.length > 0 && /* @__PURE__ */ jsx("div", {
4014
+ className: "mt-4",
4015
+ children: /* @__PURE__ */ jsx(LanguageBarGlass, { languages })
4016
+ })]
4017
+ }), /* @__PURE__ */ jsx(AICardGlass, { onGenerate: onAIGenerate })]
4018
+ })
4019
+ });
4020
+ });
4021
+ ProfileHeaderGlass.displayName = "ProfileHeaderGlass";
4022
+ var ownershipOptions = [{
4023
+ value: "your",
4024
+ label: "Your"
4025
+ }, {
4026
+ value: "contrib",
4027
+ label: "Contrib"
4028
+ }];
4029
+ const ProjectsListGlass = forwardRef(({ repositories, showFlaggedOnly = false, selectedYear = null, onClearFilters, title, ownershipFilter, onOwnershipChange, sortBy = "commits", sortOrder = "desc", onSortChange, showControls, className, ...props }, ref) => {
4030
+ const [expandedIndex, setExpandedIndex] = useState(null);
4031
+ const shouldShowControls = showControls ?? (onOwnershipChange !== void 0 || onSortChange !== void 0);
4032
+ const filteredRepos = useMemo(() => {
4033
+ return repositories.filter((repo) => {
4034
+ if (showFlaggedOnly && repo.flagType === "green") return false;
4035
+ if (selectedYear && repo.createdYear !== selectedYear) return false;
4036
+ if (ownershipFilter && ownershipFilter !== "all" && repo.ownership !== ownershipFilter) return false;
4037
+ return true;
4038
+ });
4039
+ }, [
4040
+ repositories,
4041
+ showFlaggedOnly,
4042
+ selectedYear,
4043
+ ownershipFilter
4044
+ ]);
4045
+ const sortedRepos = useMemo(() => {
4046
+ if (!onSortChange) return filteredRepos;
4047
+ return [...filteredRepos].sort((a, b) => {
4048
+ const multiplier = sortOrder === "asc" ? 1 : -1;
4049
+ switch (sortBy) {
4050
+ case "commits": return (a.commits - b.commits) * multiplier;
4051
+ case "stars": return ((a.stars ?? 0) - (b.stars ?? 0)) * multiplier;
4052
+ case "name": return a.name.localeCompare(b.name) * multiplier;
4053
+ case "contribution": return (a.contribution - b.contribution) * multiplier;
4054
+ default: return 0;
4055
+ }
4056
+ });
4057
+ }, [
4058
+ filteredRepos,
4059
+ sortBy,
4060
+ sortOrder,
4061
+ onSortChange
4062
+ ]);
4063
+ const displayTitle = title ?? (showFlaggedOnly ? "Flagged" : selectedYear ? `${selectedYear}` : "All") + " Projects";
4064
+ const emptyContainerStyles = { background: "var(--card-bg)" };
4065
+ const handleOwnershipChange = (value) => {
4066
+ if (onOwnershipChange && (value === "your" || value === "contrib")) onOwnershipChange(value);
4067
+ };
4068
+ return /* @__PURE__ */ jsxs(GlassCard, {
4069
+ ref,
4070
+ intensity: "medium",
4071
+ className: cn("p-3 sm:p-4", className),
4072
+ ...props,
4073
+ children: [/* @__PURE__ */ jsxs("div", {
4074
+ className: "flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 mb-4",
4075
+ children: [/* @__PURE__ */ jsxs("div", {
4076
+ className: "flex items-center gap-2",
4077
+ children: [
4078
+ showFlaggedOnly ? /* @__PURE__ */ jsx(AlertTriangle, {
4079
+ className: "w-4 h-4",
4080
+ style: { color: "var(--status-away)" }
4081
+ }) : /* @__PURE__ */ jsx(FolderGit2, {
4082
+ className: "w-4 h-4",
4083
+ style: { color: "var(--text-accent)" }
4084
+ }),
4085
+ /* @__PURE__ */ jsx("h3", {
4086
+ className: "font-semibold text-sm sm:text-base",
4087
+ style: { color: "var(--text-primary)" },
4088
+ children: displayTitle
4089
+ }),
4090
+ /* @__PURE__ */ jsxs(BadgeGlass, {
4091
+ variant: "info",
4092
+ children: [sortedRepos.length, " repos"]
4093
+ })
4094
+ ]
4095
+ }), shouldShowControls && /* @__PURE__ */ jsxs("div", {
4096
+ className: "flex items-center gap-2 flex-wrap",
4097
+ children: [onSortChange && /* @__PURE__ */ jsx(SortDropdownGlass, {
4098
+ sortBy,
4099
+ sortOrder,
4100
+ onSortChange
4101
+ }), onOwnershipChange && ownershipFilter && /* @__PURE__ */ jsx(SegmentedControlGlass, {
4102
+ options: ownershipOptions,
4103
+ value: ownershipFilter,
4104
+ onChange: handleOwnershipChange
4105
+ })]
4106
+ })]
4107
+ }), sortedRepos.length === 0 ? /* @__PURE__ */ jsxs("div", {
4108
+ className: "text-center py-10",
4109
+ children: [
4110
+ /* @__PURE__ */ jsx("div", {
4111
+ className: "w-16 h-16 mx-auto mb-3 rounded-2xl flex items-center justify-center",
4112
+ style: emptyContainerStyles,
4113
+ children: /* @__PURE__ */ jsx(FolderGit2, {
4114
+ className: "w-8 h-8",
4115
+ style: { color: "var(--text-muted)" }
4116
+ })
4117
+ }),
4118
+ /* @__PURE__ */ jsx("p", {
4119
+ className: "text-sm",
4120
+ style: { color: "var(--text-muted)" },
4121
+ children: "No repositories found"
4122
+ }),
4123
+ onClearFilters && /* @__PURE__ */ jsx("button", {
4124
+ onClick: onClearFilters,
4125
+ className: "mt-2 text-sm underline transition-colors hover:opacity-80",
4126
+ style: { color: "var(--text-accent)" },
4127
+ children: "Clear filters"
4128
+ })
4129
+ ]
4130
+ }) : /* @__PURE__ */ jsx("div", {
4131
+ className: "space-y-2",
4132
+ children: sortedRepos.map((repo, index) => /* @__PURE__ */ jsx(RepositoryCardGlass, {
4133
+ name: repo.name,
4134
+ languages: repo.languages,
4135
+ commits: repo.commits,
4136
+ contribution: repo.contribution,
4137
+ stars: repo.stars,
4138
+ flagType: repo.flagType,
4139
+ issues: repo.issues,
4140
+ expanded: expandedIndex === index,
4141
+ onToggle: () => setExpandedIndex(expandedIndex === index ? null : index)
4142
+ }, repo.name))
4143
+ })]
4144
+ });
4145
+ });
4146
+ ProjectsListGlass.displayName = "ProjectsListGlass";
4147
+ const TrustScoreCardGlass = forwardRef(({ score = 72, metrics = [], className, ...props }, ref) => {
4148
+ return /* @__PURE__ */ jsxs(GlassCard, {
4149
+ ref,
4150
+ className: cn("p-4 md:p-5", className),
4151
+ intensity: "strong",
4152
+ glow: "cyan",
4153
+ hover: false,
4154
+ ...props,
4155
+ children: [
4156
+ /* @__PURE__ */ jsxs("div", {
4157
+ className: "flex items-center justify-between mb-3 md:mb-4",
4158
+ children: [/* @__PURE__ */ jsxs("h2", {
4159
+ className: "font-semibold flex items-center gap-1.5 md:gap-2 text-base md:text-lg",
4160
+ style: { color: "var(--text-primary)" },
4161
+ children: [/* @__PURE__ */ jsx(Target, {
4162
+ className: "w-4 h-4 md:w-5 md:h-5",
4163
+ style: { color: "var(--text-accent)" }
4164
+ }), "Overall Trust Score"]
4165
+ }), /* @__PURE__ */ jsxs("div", {
4166
+ className: "flex items-center gap-1.5 md:gap-2 animate-[score-pulse_2s_ease-in-out_infinite]",
4167
+ children: [/* @__PURE__ */ jsx("span", {
4168
+ className: "text-3xl md:text-4xl font-bold bg-clip-text text-transparent",
4169
+ style: { backgroundImage: "var(--score-gradient)" },
4170
+ children: score
4171
+ }), /* @__PURE__ */ jsx("span", {
4172
+ className: "text-lg md:text-xl",
4173
+ style: { color: "var(--text-muted)" },
4174
+ children: "/ 100"
4175
+ })]
4176
+ })]
4177
+ }),
4178
+ /* @__PURE__ */ jsx(RainbowProgressGlass, {
4179
+ value: score,
4180
+ size: "lg",
4181
+ showGlow: true
4182
+ }),
4183
+ metrics.length > 0 && /* @__PURE__ */ jsx("div", {
4184
+ className: "grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-3 md:gap-4 mt-4 md:mt-5",
4185
+ children: metrics.map((m) => /* @__PURE__ */ jsx(MetricCardGlass, {
4186
+ title: m.title,
4187
+ value: m.value,
4188
+ variant: m.variant
4189
+ }, m.title))
4190
+ })
4191
+ ]
4192
+ });
4193
+ });
4194
+ TrustScoreCardGlass.displayName = "TrustScoreCardGlass";
4195
+ export { PopoverGlass as $, FlagAlertGlass as A, CheckboxGlass as At, IconButtonGlass as B, statusSizes as Bt, sparklineContainerVariants as C, DropdownMenuGlassSub as Ct, progressSizes as D, ComboBoxGlass as Dt, ProgressGlass as E, DropdownMenuGlassTrigger as Et, SortDropdownGlass as F, AvatarGlass as Ft, TooltipGlassSimple as G, FormFieldWrapper as Gt, TooltipGlass as H, AlertGlassDescription as Ht, SearchBoxGlass as I, AvatarGlassFallback as It, toggleSizes as J, TooltipGlassTrigger as K, TouchTarget as Kt, InsightCardGlass as L, AvatarGlassImage as Lt, BaseProgressGlass as M, buttonGlassVariants as Mt, ThemeToggleGlass as N, BadgeGlass as Nt, ProfileAvatarGlass as O, inputVariants as Ot, StatItemGlass as P, badgeVariants as Pt, skeletonVariants as Q, insightCardVariants as R, AvatarGlassSimple as Rt, sparklineBarVariants as S, DropdownMenuGlassShortcut as St, RainbowProgressGlass as T, DropdownMenuGlassSubTrigger as Tt, TooltipGlassContent as U, AlertGlassTitle as Ut, ExpandableHeaderGlass as V, AlertGlass as Vt, TooltipGlassProvider as W, InteractiveCard as Wt, SliderGlass as X, TabsGlass as Y, SkeletonGlass as Z, ContributionMetricsGlass as _, DropdownMenuGlassLabel as _t, HeaderBrandingGlass as a, notificationVariants as at, AICardGlass as b, DropdownMenuGlassRadioItem as bt, YearCardGlass as c, InputGlass as ct, TrustScoreDisplayGlass as d, DropdownGlass as dt, PopoverGlassAnchor as et, RepositoryMetadataGlass as f, DropdownMenuGlass as ft, MetricCardGlass as g, DropdownMenuGlassItem as gt, MetricsGridGlass as h, DropdownMenuGlassGroup as ht, HeaderNavGlass as i, NotificationGlass as it, StatusIndicatorGlass as j, ButtonGlass as jt, LanguageBarGlass as k, CircularProgressGlass as kt, UserStatsLineGlass as l, GlassCard as lt, RepositoryCardGlass as m, DropdownMenuGlassContent as mt, ProjectsListGlass as n, PopoverGlassLegacy as nt, FlagsSectionGlass as o, ModalGlass as ot, RepositoryHeaderGlass as p, DropdownMenuGlassCheckboxItem as pt, ToggleGlass as q, alertVariants as qt, ProfileHeaderGlass as r, PopoverGlassTrigger as rt, CareerStatsGlass as s, modalSizes as st, TrustScoreCardGlass as t, PopoverGlassContent as tt, UserInfoGlass as u, cardIntensity as ut, CircularMetricGlass as v, DropdownMenuGlassPortal as vt, SegmentedControlGlass as w, DropdownMenuGlassSubContent as wt, SparklineGlass as x, DropdownMenuGlassSeparator as xt, CareerStatsHeaderGlass as y, DropdownMenuGlassRadioGroup as yt, insightVariantConfig as z, avatarSizes as zt };
4196
+
4197
+ //# sourceMappingURL=trust-score-card-glass-BUt9MIF0.mjs.map