shadcn-glass-ui 2.3.0 → 2.3.2

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 (490) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/cli/index.cjs +1 -1
  3. package/dist/components.cjs +4 -4
  4. package/dist/components.mjs +1 -1
  5. package/dist/hooks.cjs +2 -2
  6. package/dist/index.cjs +12 -5
  7. package/dist/index.mjs +8 -1
  8. package/dist/r/avatar-glass.json +1 -1
  9. package/dist/r/checkbox-glass.json +4 -5
  10. package/dist/r/circular-progress-glass.json +1 -1
  11. package/dist/r/dropdown-glass.json +1 -1
  12. package/dist/r/dropdown-menu-glass.json +1 -1
  13. package/dist/r/flag-alert-glass.json +1 -1
  14. package/dist/r/glass-card.json +3 -2
  15. package/dist/r/notification-glass.json +1 -1
  16. package/dist/r/popover-glass.json +1 -1
  17. package/dist/r/progress-glass.json +1 -1
  18. package/dist/r/registry.json +2 -2
  19. package/dist/r/skeleton-glass.json +1 -1
  20. package/dist/r/slider-glass.json +1 -1
  21. package/dist/r/stepper-glass.json +1 -1
  22. package/dist/r/tabs-glass.json +5 -4
  23. package/dist/r/toggle-glass.json +1 -1
  24. package/dist/shadcn-glass-ui.css +1 -1
  25. package/dist/{theme-context-DmTETrFi.cjs → theme-context-7NcW0KZL.cjs} +2 -2
  26. package/dist/themes.cjs +1 -1
  27. package/dist/{trust-score-card-glass-EfMB5l5J.mjs → trust-score-card-glass-BGqBcdyJ.mjs} +120 -177
  28. package/dist/{trust-score-card-glass-3VBi9soW.cjs → trust-score-card-glass-DtgFygh5.cjs} +124 -179
  29. package/dist/{use-focus-CswOSq71.cjs → use-focus-BFBcpBh1.cjs} +2 -2
  30. package/dist/{use-wallpaper-tint-WtRWtupA.cjs → use-wallpaper-tint-DTTStm5f.cjs} +2 -2
  31. package/dist/{utils-DX6rdBol.cjs → utils-CiuCe_Aq.cjs} +2 -2
  32. package/dist/utils.cjs +1 -1
  33. package/package.json +25 -3
  34. package/dist/components/blocks/avatar-gallery/index.d.ts +0 -2
  35. package/dist/components/blocks/avatar-gallery/index.d.ts.map +0 -1
  36. package/dist/components/blocks/avatar-gallery/page.d.ts +0 -7
  37. package/dist/components/blocks/avatar-gallery/page.d.ts.map +0 -1
  38. package/dist/components/blocks/badges/index.d.ts +0 -2
  39. package/dist/components/blocks/badges/index.d.ts.map +0 -1
  40. package/dist/components/blocks/badges/page.d.ts +0 -7
  41. package/dist/components/blocks/badges/page.d.ts.map +0 -1
  42. package/dist/components/blocks/buttons/index.d.ts +0 -2
  43. package/dist/components/blocks/buttons/index.d.ts.map +0 -1
  44. package/dist/components/blocks/buttons/page.d.ts +0 -7
  45. package/dist/components/blocks/buttons/page.d.ts.map +0 -1
  46. package/dist/components/blocks/form-elements/index.d.ts +0 -2
  47. package/dist/components/blocks/form-elements/index.d.ts.map +0 -1
  48. package/dist/components/blocks/form-elements/page.d.ts +0 -7
  49. package/dist/components/blocks/form-elements/page.d.ts.map +0 -1
  50. package/dist/components/blocks/index.d.ts +0 -14
  51. package/dist/components/blocks/index.d.ts.map +0 -1
  52. package/dist/components/blocks/notifications/index.d.ts +0 -2
  53. package/dist/components/blocks/notifications/index.d.ts.map +0 -1
  54. package/dist/components/blocks/notifications/page.d.ts +0 -7
  55. package/dist/components/blocks/notifications/page.d.ts.map +0 -1
  56. package/dist/components/blocks/progress/index.d.ts +0 -2
  57. package/dist/components/blocks/progress/index.d.ts.map +0 -1
  58. package/dist/components/blocks/progress/page.d.ts +0 -7
  59. package/dist/components/blocks/progress/page.d.ts.map +0 -1
  60. package/dist/components/blocks/registry.d.ts +0 -16
  61. package/dist/components/blocks/registry.d.ts.map +0 -1
  62. package/dist/components/demos/AnimatedBackground.d.ts +0 -5
  63. package/dist/components/demos/AnimatedBackground.d.ts.map +0 -1
  64. package/dist/components/demos/ComponentShowcase.d.ts +0 -6
  65. package/dist/components/demos/ComponentShowcase.d.ts.map +0 -1
  66. package/dist/components/demos/DesktopShowcase.d.ts +0 -3
  67. package/dist/components/demos/DesktopShowcase.d.ts.map +0 -1
  68. package/dist/components/demos/GlassFixesDemo.d.ts +0 -6
  69. package/dist/components/demos/GlassFixesDemo.d.ts.map +0 -1
  70. package/dist/components/demos/MobileShowcase.d.ts +0 -3
  71. package/dist/components/demos/MobileShowcase.d.ts.map +0 -1
  72. package/dist/components/glass/atomic/expandable-header-glass.d.ts +0 -16
  73. package/dist/components/glass/atomic/expandable-header-glass.d.ts.map +0 -1
  74. package/dist/components/glass/atomic/icon-button-glass.d.ts +0 -18
  75. package/dist/components/glass/atomic/icon-button-glass.d.ts.map +0 -1
  76. package/dist/components/glass/atomic/index.d.ts +0 -14
  77. package/dist/components/glass/atomic/index.d.ts.map +0 -1
  78. package/dist/components/glass/atomic/insight-card-glass.d.ts +0 -22
  79. package/dist/components/glass/atomic/insight-card-glass.d.ts.map +0 -1
  80. package/dist/components/glass/atomic/search-box-glass.d.ts +0 -17
  81. package/dist/components/glass/atomic/search-box-glass.d.ts.map +0 -1
  82. package/dist/components/glass/atomic/sort-dropdown-glass.d.ts +0 -38
  83. package/dist/components/glass/atomic/sort-dropdown-glass.d.ts.map +0 -1
  84. package/dist/components/glass/atomic/stat-item-glass.d.ts +0 -22
  85. package/dist/components/glass/atomic/stat-item-glass.d.ts.map +0 -1
  86. package/dist/components/glass/atomic/theme-toggle-glass.d.ts +0 -11
  87. package/dist/components/glass/atomic/theme-toggle-glass.d.ts.map +0 -1
  88. package/dist/components/glass/composite/ai-card-glass.d.ts +0 -7
  89. package/dist/components/glass/composite/ai-card-glass.d.ts.map +0 -1
  90. package/dist/components/glass/composite/career-stats-header-glass.d.ts +0 -15
  91. package/dist/components/glass/composite/career-stats-header-glass.d.ts.map +0 -1
  92. package/dist/components/glass/composite/circular-metric-glass.d.ts +0 -24
  93. package/dist/components/glass/composite/circular-metric-glass.d.ts.map +0 -1
  94. package/dist/components/glass/composite/contribution-metrics-glass.d.ts +0 -15
  95. package/dist/components/glass/composite/contribution-metrics-glass.d.ts.map +0 -1
  96. package/dist/components/glass/composite/index.d.ts +0 -22
  97. package/dist/components/glass/composite/index.d.ts.map +0 -1
  98. package/dist/components/glass/composite/metric-card-glass.d.ts +0 -96
  99. package/dist/components/glass/composite/metric-card-glass.d.ts.map +0 -1
  100. package/dist/components/glass/composite/metrics-grid-glass.d.ts +0 -17
  101. package/dist/components/glass/composite/metrics-grid-glass.d.ts.map +0 -1
  102. package/dist/components/glass/composite/repository-card-glass.d.ts +0 -16
  103. package/dist/components/glass/composite/repository-card-glass.d.ts.map +0 -1
  104. package/dist/components/glass/composite/repository-header-glass.d.ts +0 -16
  105. package/dist/components/glass/composite/repository-header-glass.d.ts.map +0 -1
  106. package/dist/components/glass/composite/repository-metadata-glass.d.ts +0 -13
  107. package/dist/components/glass/composite/repository-metadata-glass.d.ts.map +0 -1
  108. package/dist/components/glass/composite/split-layout-glass/index.d.ts +0 -16
  109. package/dist/components/glass/composite/split-layout-glass/index.d.ts.map +0 -1
  110. package/dist/components/glass/composite/split-layout-glass/split-layout-accordion.d.ts +0 -66
  111. package/dist/components/glass/composite/split-layout-glass/split-layout-accordion.d.ts.map +0 -1
  112. package/dist/components/glass/composite/split-layout-glass/split-layout-context.d.ts +0 -122
  113. package/dist/components/glass/composite/split-layout-glass/split-layout-context.d.ts.map +0 -1
  114. package/dist/components/glass/composite/split-layout-glass/split-layout-glass.d.ts +0 -177
  115. package/dist/components/glass/composite/split-layout-glass/split-layout-glass.d.ts.map +0 -1
  116. package/dist/components/glass/composite/trust-score-display-glass.d.ts +0 -15
  117. package/dist/components/glass/composite/trust-score-display-glass.d.ts.map +0 -1
  118. package/dist/components/glass/composite/user-info-glass.d.ts +0 -15
  119. package/dist/components/glass/composite/user-info-glass.d.ts.map +0 -1
  120. package/dist/components/glass/composite/user-stats-line-glass.d.ts +0 -15
  121. package/dist/components/glass/composite/user-stats-line-glass.d.ts.map +0 -1
  122. package/dist/components/glass/composite/year-card-glass.d.ts +0 -53
  123. package/dist/components/glass/composite/year-card-glass.d.ts.map +0 -1
  124. package/dist/components/glass/index.d.ts +0 -16
  125. package/dist/components/glass/index.d.ts.map +0 -1
  126. package/dist/components/glass/primitives/form-field-wrapper.d.ts +0 -69
  127. package/dist/components/glass/primitives/form-field-wrapper.d.ts.map +0 -1
  128. package/dist/components/glass/primitives/index.d.ts +0 -12
  129. package/dist/components/glass/primitives/index.d.ts.map +0 -1
  130. package/dist/components/glass/primitives/interactive-card.d.ts +0 -91
  131. package/dist/components/glass/primitives/interactive-card.d.ts.map +0 -1
  132. package/dist/components/glass/primitives/style-utils.d.ts +0 -147
  133. package/dist/components/glass/primitives/style-utils.d.ts.map +0 -1
  134. package/dist/components/glass/primitives/touch-target.d.ts +0 -46
  135. package/dist/components/glass/primitives/touch-target.d.ts.map +0 -1
  136. package/dist/components/glass/sections/career-stats-glass.d.ts +0 -17
  137. package/dist/components/glass/sections/career-stats-glass.d.ts.map +0 -1
  138. package/dist/components/glass/sections/flags-section-glass.d.ts +0 -13
  139. package/dist/components/glass/sections/flags-section-glass.d.ts.map +0 -1
  140. package/dist/components/glass/sections/header-branding-glass.d.ts +0 -16
  141. package/dist/components/glass/sections/header-branding-glass.d.ts.map +0 -1
  142. package/dist/components/glass/sections/header-nav-glass.d.ts +0 -7
  143. package/dist/components/glass/sections/header-nav-glass.d.ts.map +0 -1
  144. package/dist/components/glass/sections/index.d.ts +0 -13
  145. package/dist/components/glass/sections/index.d.ts.map +0 -1
  146. package/dist/components/glass/sections/profile-header-glass.d.ts +0 -16
  147. package/dist/components/glass/sections/profile-header-glass.d.ts.map +0 -1
  148. package/dist/components/glass/sections/projects-list-glass.d.ts +0 -42
  149. package/dist/components/glass/sections/projects-list-glass.d.ts.map +0 -1
  150. package/dist/components/glass/sections/trust-score-card-glass.d.ts +0 -12
  151. package/dist/components/glass/sections/trust-score-card-glass.d.ts.map +0 -1
  152. package/dist/components/glass/specialized/base-progress-glass.d.ts +0 -8
  153. package/dist/components/glass/specialized/base-progress-glass.d.ts.map +0 -1
  154. package/dist/components/glass/specialized/flag-alert-glass.d.ts +0 -8
  155. package/dist/components/glass/specialized/flag-alert-glass.d.ts.map +0 -1
  156. package/dist/components/glass/specialized/index.d.ts +0 -21
  157. package/dist/components/glass/specialized/index.d.ts.map +0 -1
  158. package/dist/components/glass/specialized/language-bar-glass.d.ts +0 -24
  159. package/dist/components/glass/specialized/language-bar-glass.d.ts.map +0 -1
  160. package/dist/components/glass/specialized/profile-avatar-glass.d.ts +0 -26
  161. package/dist/components/glass/specialized/profile-avatar-glass.d.ts.map +0 -1
  162. package/dist/components/glass/specialized/progress-glass.d.ts +0 -9
  163. package/dist/components/glass/specialized/progress-glass.d.ts.map +0 -1
  164. package/dist/components/glass/specialized/rainbow-progress-glass.d.ts +0 -8
  165. package/dist/components/glass/specialized/rainbow-progress-glass.d.ts.map +0 -1
  166. package/dist/components/glass/specialized/segmented-control-glass.d.ts +0 -11
  167. package/dist/components/glass/specialized/segmented-control-glass.d.ts.map +0 -1
  168. package/dist/components/glass/specialized/sparkline-glass.d.ts +0 -34
  169. package/dist/components/glass/specialized/sparkline-glass.d.ts.map +0 -1
  170. package/dist/components/glass/specialized/status-indicator-glass.d.ts +0 -8
  171. package/dist/components/glass/specialized/status-indicator-glass.d.ts.map +0 -1
  172. package/dist/components/glass/ui/alert-glass.d.ts +0 -13
  173. package/dist/components/glass/ui/alert-glass.d.ts.map +0 -1
  174. package/dist/components/glass/ui/avatar-glass.d.ts +0 -58
  175. package/dist/components/glass/ui/avatar-glass.d.ts.map +0 -1
  176. package/dist/components/glass/ui/badge-glass.d.ts +0 -74
  177. package/dist/components/glass/ui/badge-glass.d.ts.map +0 -1
  178. package/dist/components/glass/ui/button-glass.d.ts +0 -110
  179. package/dist/components/glass/ui/button-glass.d.ts.map +0 -1
  180. package/dist/components/glass/ui/card-glass.d.ts +0 -115
  181. package/dist/components/glass/ui/card-glass.d.ts.map +0 -1
  182. package/dist/components/glass/ui/checkbox-glass.d.ts +0 -113
  183. package/dist/components/glass/ui/checkbox-glass.d.ts.map +0 -1
  184. package/dist/components/glass/ui/circular-progress-glass.d.ts +0 -36
  185. package/dist/components/glass/ui/circular-progress-glass.d.ts.map +0 -1
  186. package/dist/components/glass/ui/combobox-glass.d.ts +0 -61
  187. package/dist/components/glass/ui/combobox-glass.d.ts.map +0 -1
  188. package/dist/components/glass/ui/dropdown-glass.d.ts +0 -83
  189. package/dist/components/glass/ui/dropdown-glass.d.ts.map +0 -1
  190. package/dist/components/glass/ui/dropdown-menu-glass.d.ts +0 -77
  191. package/dist/components/glass/ui/dropdown-menu-glass.d.ts.map +0 -1
  192. package/dist/components/glass/ui/glass-card.d.ts +0 -78
  193. package/dist/components/glass/ui/glass-card.d.ts.map +0 -1
  194. package/dist/components/glass/ui/index.d.ts +0 -44
  195. package/dist/components/glass/ui/index.d.ts.map +0 -1
  196. package/dist/components/glass/ui/input-glass.d.ts +0 -98
  197. package/dist/components/glass/ui/input-glass.d.ts.map +0 -1
  198. package/dist/components/glass/ui/modal-glass.d.ts +0 -180
  199. package/dist/components/glass/ui/modal-glass.d.ts.map +0 -1
  200. package/dist/components/glass/ui/notification-glass.d.ts +0 -13
  201. package/dist/components/glass/ui/notification-glass.d.ts.map +0 -1
  202. package/dist/components/glass/ui/popover-glass.d.ts +0 -71
  203. package/dist/components/glass/ui/popover-glass.d.ts.map +0 -1
  204. package/dist/components/glass/ui/sidebar-glass/index.d.ts +0 -100
  205. package/dist/components/glass/ui/sidebar-glass/index.d.ts.map +0 -1
  206. package/dist/components/glass/ui/sidebar-glass/sidebar-context.d.ts +0 -96
  207. package/dist/components/glass/ui/sidebar-glass/sidebar-context.d.ts.map +0 -1
  208. package/dist/components/glass/ui/sidebar-glass/sidebar-glass.d.ts +0 -88
  209. package/dist/components/glass/ui/sidebar-glass/sidebar-glass.d.ts.map +0 -1
  210. package/dist/components/glass/ui/sidebar-glass/sidebar-menu.d.ts +0 -121
  211. package/dist/components/glass/ui/sidebar-glass/sidebar-menu.d.ts.map +0 -1
  212. package/dist/components/glass/ui/skeleton-glass.d.ts +0 -8
  213. package/dist/components/glass/ui/skeleton-glass.d.ts.map +0 -1
  214. package/dist/components/glass/ui/slider-glass.d.ts +0 -38
  215. package/dist/components/glass/ui/slider-glass.d.ts.map +0 -1
  216. package/dist/components/glass/ui/stepper-glass.d.ts +0 -63
  217. package/dist/components/glass/ui/stepper-glass.d.ts.map +0 -1
  218. package/dist/components/glass/ui/tabs-glass.d.ts +0 -199
  219. package/dist/components/glass/ui/tabs-glass.d.ts.map +0 -1
  220. package/dist/components/glass/ui/toggle-glass.d.ts +0 -27
  221. package/dist/components/glass/ui/toggle-glass.d.ts.map +0 -1
  222. package/dist/components/glass/ui/tooltip-glass.d.ts +0 -65
  223. package/dist/components/glass/ui/tooltip-glass.d.ts.map +0 -1
  224. package/dist/components/ui/alert.d.ts +0 -8
  225. package/dist/components/ui/alert.d.ts.map +0 -1
  226. package/dist/components/ui/avatar.d.ts +0 -7
  227. package/dist/components/ui/avatar.d.ts.map +0 -1
  228. package/dist/components/ui/badge.d.ts +0 -8
  229. package/dist/components/ui/badge.d.ts.map +0 -1
  230. package/dist/components/ui/button.d.ts +0 -8
  231. package/dist/components/ui/button.d.ts.map +0 -1
  232. package/dist/components/ui/card.d.ts +0 -10
  233. package/dist/components/ui/card.d.ts.map +0 -1
  234. package/dist/components/ui/chart.d.ts +0 -69
  235. package/dist/components/ui/chart.d.ts.map +0 -1
  236. package/dist/components/ui/checkbox.d.ts +0 -5
  237. package/dist/components/ui/checkbox.d.ts.map +0 -1
  238. package/dist/components/ui/collapsible.d.ts +0 -6
  239. package/dist/components/ui/collapsible.d.ts.map +0 -1
  240. package/dist/components/ui/command.d.ts +0 -19
  241. package/dist/components/ui/command.d.ts.map +0 -1
  242. package/dist/components/ui/dialog.d.ts +0 -16
  243. package/dist/components/ui/dialog.d.ts.map +0 -1
  244. package/dist/components/ui/dropdown-menu.d.ts +0 -26
  245. package/dist/components/ui/dropdown-menu.d.ts.map +0 -1
  246. package/dist/components/ui/input.d.ts +0 -4
  247. package/dist/components/ui/input.d.ts.map +0 -1
  248. package/dist/components/ui/popover.d.ts +0 -8
  249. package/dist/components/ui/popover.d.ts.map +0 -1
  250. package/dist/components/ui/progress.d.ts +0 -5
  251. package/dist/components/ui/progress.d.ts.map +0 -1
  252. package/dist/components/ui/scroll-area.d.ts +0 -6
  253. package/dist/components/ui/scroll-area.d.ts.map +0 -1
  254. package/dist/components/ui/separator.d.ts +0 -5
  255. package/dist/components/ui/separator.d.ts.map +0 -1
  256. package/dist/components/ui/skeleton.d.ts +0 -3
  257. package/dist/components/ui/skeleton.d.ts.map +0 -1
  258. package/dist/components/ui/slider.d.ts +0 -5
  259. package/dist/components/ui/slider.d.ts.map +0 -1
  260. package/dist/components/ui/sonner.d.ts +0 -4
  261. package/dist/components/ui/sonner.d.ts.map +0 -1
  262. package/dist/components/ui/switch.d.ts +0 -5
  263. package/dist/components/ui/switch.d.ts.map +0 -1
  264. package/dist/components/ui/tabs.d.ts +0 -8
  265. package/dist/components/ui/tabs.d.ts.map +0 -1
  266. package/dist/components/ui/tooltip.d.ts +0 -8
  267. package/dist/components/ui/tooltip.d.ts.map +0 -1
  268. package/dist/components.d.ts.map +0 -1
  269. package/dist/demo-screenshot-aurora.png +0 -0
  270. package/dist/demo-screenshot.png +0 -0
  271. package/dist/demo-screenshot.png.zip +0 -0
  272. package/dist/hooks.d.ts.map +0 -1
  273. package/dist/index.cjs.map +0 -1
  274. package/dist/index.d.ts.map +0 -1
  275. package/dist/index.mjs.map +0 -1
  276. package/dist/lib/config.d.ts +0 -28
  277. package/dist/lib/config.d.ts.map +0 -1
  278. package/dist/lib/hooks/index.d.ts +0 -11
  279. package/dist/lib/hooks/index.d.ts.map +0 -1
  280. package/dist/lib/hooks/use-focus.d.ts +0 -61
  281. package/dist/lib/hooks/use-focus.d.ts.map +0 -1
  282. package/dist/lib/hooks/use-hover.d.ts +0 -54
  283. package/dist/lib/hooks/use-hover.d.ts.map +0 -1
  284. package/dist/lib/hooks/use-responsive.d.ts +0 -44
  285. package/dist/lib/hooks/use-responsive.d.ts.map +0 -1
  286. package/dist/lib/hooks/use-wallpaper-tint.d.ts +0 -57
  287. package/dist/lib/hooks/use-wallpaper-tint.d.ts.map +0 -1
  288. package/dist/lib/hooks.d.ts +0 -92
  289. package/dist/lib/hooks.d.ts.map +0 -1
  290. package/dist/lib/theme/tokens.d.ts +0 -441
  291. package/dist/lib/theme/tokens.d.ts.map +0 -1
  292. package/dist/lib/theme-context.d.ts +0 -115
  293. package/dist/lib/theme-context.d.ts.map +0 -1
  294. package/dist/lib/types.d.ts +0 -24
  295. package/dist/lib/types.d.ts.map +0 -1
  296. package/dist/lib/utils.d.ts +0 -8
  297. package/dist/lib/utils.d.ts.map +0 -1
  298. package/dist/lib/variants/alert-glass-variants.d.ts +0 -10
  299. package/dist/lib/variants/alert-glass-variants.d.ts.map +0 -1
  300. package/dist/lib/variants/alert-variants.d.ts +0 -8
  301. package/dist/lib/variants/alert-variants.d.ts.map +0 -1
  302. package/dist/lib/variants/avatar-glass-variants.d.ts +0 -12
  303. package/dist/lib/variants/avatar-glass-variants.d.ts.map +0 -1
  304. package/dist/lib/variants/badge-glass-variants.d.ts +0 -10
  305. package/dist/lib/variants/badge-glass-variants.d.ts.map +0 -1
  306. package/dist/lib/variants/badge-variants.d.ts +0 -8
  307. package/dist/lib/variants/badge-variants.d.ts.map +0 -1
  308. package/dist/lib/variants/button-glass-variants.d.ts +0 -29
  309. package/dist/lib/variants/button-glass-variants.d.ts.map +0 -1
  310. package/dist/lib/variants/button-variants.d.ts +0 -9
  311. package/dist/lib/variants/button-variants.d.ts.map +0 -1
  312. package/dist/lib/variants/dropdown-content-styles.d.ts +0 -102
  313. package/dist/lib/variants/dropdown-content-styles.d.ts.map +0 -1
  314. package/dist/lib/variants/dropdown-glass-variants.d.ts +0 -9
  315. package/dist/lib/variants/dropdown-glass-variants.d.ts.map +0 -1
  316. package/dist/lib/variants/glass-card-variants.d.ts +0 -13
  317. package/dist/lib/variants/glass-card-variants.d.ts.map +0 -1
  318. package/dist/lib/variants/index.d.ts +0 -26
  319. package/dist/lib/variants/index.d.ts.map +0 -1
  320. package/dist/lib/variants/input-glass-variants.d.ts +0 -9
  321. package/dist/lib/variants/input-glass-variants.d.ts.map +0 -1
  322. package/dist/lib/variants/insight-card-glass-variants.d.ts +0 -11
  323. package/dist/lib/variants/insight-card-glass-variants.d.ts.map +0 -1
  324. package/dist/lib/variants/modal-glass-variants.d.ts +0 -9
  325. package/dist/lib/variants/modal-glass-variants.d.ts.map +0 -1
  326. package/dist/lib/variants/notification-glass-variants.d.ts +0 -9
  327. package/dist/lib/variants/notification-glass-variants.d.ts.map +0 -1
  328. package/dist/lib/variants/progress-glass-variants.d.ts +0 -10
  329. package/dist/lib/variants/progress-glass-variants.d.ts.map +0 -1
  330. package/dist/lib/variants/skeleton-glass-variants.d.ts +0 -9
  331. package/dist/lib/variants/skeleton-glass-variants.d.ts.map +0 -1
  332. package/dist/lib/variants/sparkline-glass-variants.d.ts +0 -10
  333. package/dist/lib/variants/sparkline-glass-variants.d.ts.map +0 -1
  334. package/dist/lib/variants/stepper-glass-variants.d.ts +0 -40
  335. package/dist/lib/variants/stepper-glass-variants.d.ts.map +0 -1
  336. package/dist/lib/variants/toggle-glass-variants.d.ts +0 -26
  337. package/dist/lib/variants/toggle-glass-variants.d.ts.map +0 -1
  338. package/dist/lib/variants/tooltip-glass-variants.d.ts +0 -9
  339. package/dist/lib/variants/tooltip-glass-variants.d.ts.map +0 -1
  340. package/dist/theme-context-DLS2uAgJ.mjs.map +0 -1
  341. package/dist/theme-context-DmTETrFi.cjs.map +0 -1
  342. package/dist/themes.d.ts.map +0 -1
  343. package/dist/trust-score-card-glass-3VBi9soW.cjs.map +0 -1
  344. package/dist/trust-score-card-glass-EfMB5l5J.mjs.map +0 -1
  345. package/dist/use-focus-C5kPAKr_.mjs.map +0 -1
  346. package/dist/use-focus-CswOSq71.cjs.map +0 -1
  347. package/dist/use-wallpaper-tint-C0kYXNiN.mjs.map +0 -1
  348. package/dist/use-wallpaper-tint-WtRWtupA.cjs.map +0 -1
  349. package/dist/utils-B792GPM_.mjs.map +0 -1
  350. package/dist/utils-DX6rdBol.cjs.map +0 -1
  351. package/dist/utils.d.ts.map +0 -1
  352. package/docs/AI_IMPROVEMENTS_COMPLETE.md +0 -574
  353. package/docs/API_PATTERNS_COMPARISON.md +0 -419
  354. package/docs/COMPLIANCE_CHECKLIST.md +0 -307
  355. package/docs/COMPLIANCE_TESTING.md +0 -436
  356. package/docs/CSS_VARIABLES_AUDIT.md +0 -306
  357. package/docs/CSS_VARIABLES_REFACTORING_PLAN.md +0 -330
  358. package/docs/DROPDOWN_ARCHITECTURE.md +0 -290
  359. package/docs/METRIC_CARD_API_REDESIGN.md +0 -354
  360. package/docs/PRIMITIVE_MAPPING.md +0 -404
  361. package/docs/PUBLISHING.md +0 -593
  362. package/docs/REGISTRY_SUMMARY.md +0 -96
  363. package/docs/SECURITY.md +0 -117
  364. package/docs/api/README.md +0 -723
  365. package/docs/api/functions/ThemeProvider.md +0 -21
  366. package/docs/api/functions/cn.md +0 -27
  367. package/docs/api/functions/getNextTheme.md +0 -21
  368. package/docs/api/functions/getThemeConfig.md +0 -21
  369. package/docs/api/functions/useFocus.md +0 -53
  370. package/docs/api/functions/useHover.md +0 -47
  371. package/docs/api/functions/useResponsive.md +0 -31
  372. package/docs/api/functions/useTheme.md +0 -15
  373. package/docs/api/functions/useWallpaperTint.md +0 -36
  374. package/docs/api/globals.md +0 -139
  375. package/docs/api/interfaces/AlertGlassProps.md +0 -131
  376. package/docs/api/interfaces/AvatarGlassProps.md +0 -114
  377. package/docs/api/interfaces/BadgeGlassProps.md +0 -125
  378. package/docs/api/interfaces/ButtonGlassProps.md +0 -186
  379. package/docs/api/interfaces/CheckboxGlassProps.md +0 -125
  380. package/docs/api/interfaces/DropdownGlassProps.md +0 -123
  381. package/docs/api/interfaces/DropdownItem.md +0 -53
  382. package/docs/api/interfaces/GlassCardProps.md +0 -151
  383. package/docs/api/interfaces/InputGlassProps.md +0 -169
  384. package/docs/api/interfaces/NotificationGlassProps.md +0 -67
  385. package/docs/api/interfaces/ProgressGlassProps.md +0 -49
  386. package/docs/api/interfaces/SkeletonGlassProps.md +0 -41
  387. package/docs/api/interfaces/SliderGlassProps.md +0 -107
  388. package/docs/api/interfaces/TabItem.md +0 -25
  389. package/docs/api/interfaces/ThemeConfig.md +0 -25
  390. package/docs/api/interfaces/ThemeContextValue.md +0 -47
  391. package/docs/api/interfaces/ToggleGlassProps.md +0 -59
  392. package/docs/api/interfaces/TooltipGlassProps.md +0 -119
  393. package/docs/api/type-aliases/AlertType.md +0 -11
  394. package/docs/api/type-aliases/AlertVariant.md +0 -11
  395. package/docs/api/type-aliases/AvatarSize.md +0 -11
  396. package/docs/api/type-aliases/AvatarStatus.md +0 -13
  397. package/docs/api/type-aliases/BadgeSize.md +0 -11
  398. package/docs/api/type-aliases/BadgeVariant.md +0 -11
  399. package/docs/api/type-aliases/ButtonGlassSize.md +0 -11
  400. package/docs/api/type-aliases/ButtonGlassVariant.md +0 -11
  401. package/docs/api/type-aliases/DropdownAlign.md +0 -11
  402. package/docs/api/type-aliases/GlowType.md +0 -11
  403. package/docs/api/type-aliases/InputGlassSize.md +0 -11
  404. package/docs/api/type-aliases/IntensityType.md +0 -11
  405. package/docs/api/type-aliases/ModalSize.md +0 -11
  406. package/docs/api/type-aliases/NotificationType.md +0 -11
  407. package/docs/api/type-aliases/PaddingType.md +0 -11
  408. package/docs/api/type-aliases/ProgressGradient.md +0 -11
  409. package/docs/api/type-aliases/ProgressSize.md +0 -11
  410. package/docs/api/type-aliases/SkeletonVariant.md +0 -11
  411. package/docs/api/type-aliases/Theme.md +0 -11
  412. package/docs/api/type-aliases/ToggleGlassSize.md +0 -11
  413. package/docs/api/type-aliases/TooltipPosition.md +0 -11
  414. package/docs/api/variables/AICardGlass.md +0 -11
  415. package/docs/api/variables/AlertGlass.md +0 -11
  416. package/docs/api/variables/AvatarGlass.md +0 -11
  417. package/docs/api/variables/BadgeGlass.md +0 -11
  418. package/docs/api/variables/BaseProgressGlass.md +0 -11
  419. package/docs/api/variables/ButtonGlass.md +0 -11
  420. package/docs/api/variables/CareerStatsGlass.md +0 -11
  421. package/docs/api/variables/CareerStatsHeaderGlass.md +0 -11
  422. package/docs/api/variables/CheckboxGlass.md +0 -11
  423. package/docs/api/variables/CircularMetricGlass.md +0 -22
  424. package/docs/api/variables/CircularProgressGlass.md +0 -11
  425. package/docs/api/variables/ComboBoxGlass.md +0 -27
  426. package/docs/api/variables/ContributionMetricsGlass.md +0 -11
  427. package/docs/api/variables/DropdownGlass.md +0 -11
  428. package/docs/api/variables/ExpandableHeaderGlass.md +0 -11
  429. package/docs/api/variables/FlagAlertGlass.md +0 -11
  430. package/docs/api/variables/FlagsSectionGlass.md +0 -11
  431. package/docs/api/variables/FormFieldWrapper.md +0 -44
  432. package/docs/api/variables/GlassCard.md +0 -11
  433. package/docs/api/variables/HeaderBrandingGlass.md +0 -11
  434. package/docs/api/variables/HeaderNavGlass.md +0 -11
  435. package/docs/api/variables/IconButtonGlass.md +0 -11
  436. package/docs/api/variables/InputGlass.md +0 -11
  437. package/docs/api/variables/InteractiveCard.md +0 -45
  438. package/docs/api/variables/LanguageBarGlass.md +0 -11
  439. package/docs/api/variables/MetricCardGlass.md +0 -11
  440. package/docs/api/variables/MetricsGridGlass.md +0 -11
  441. package/docs/api/variables/ModalGlass.md +0 -73
  442. package/docs/api/variables/NotificationGlass.md +0 -11
  443. package/docs/api/variables/PopoverGlass.md +0 -11
  444. package/docs/api/variables/ProfileAvatarGlass.md +0 -11
  445. package/docs/api/variables/ProfileHeaderGlass.md +0 -11
  446. package/docs/api/variables/ProgressGlass.md +0 -11
  447. package/docs/api/variables/ProjectsListGlass.md +0 -11
  448. package/docs/api/variables/RainbowProgressGlass.md +0 -11
  449. package/docs/api/variables/RepositoryCardGlass.md +0 -11
  450. package/docs/api/variables/RepositoryHeaderGlass.md +0 -11
  451. package/docs/api/variables/RepositoryMetadataGlass.md +0 -11
  452. package/docs/api/variables/SearchBoxGlass.md +0 -11
  453. package/docs/api/variables/SegmentedControlGlass.md +0 -11
  454. package/docs/api/variables/SkeletonGlass.md +0 -11
  455. package/docs/api/variables/SliderGlass.md +0 -11
  456. package/docs/api/variables/SortDropdownGlass.md +0 -11
  457. package/docs/api/variables/StatItemGlass.md +0 -11
  458. package/docs/api/variables/StatusIndicatorGlass.md +0 -11
  459. package/docs/api/variables/THEMES.md +0 -11
  460. package/docs/api/variables/THEME_CONFIG.md +0 -11
  461. package/docs/api/variables/TabsGlass.md +0 -52
  462. package/docs/api/variables/ThemeToggleGlass.md +0 -11
  463. package/docs/api/variables/ToggleGlass.md +0 -11
  464. package/docs/api/variables/TooltipGlass.md +0 -11
  465. package/docs/api/variables/TouchTarget.md +0 -35
  466. package/docs/api/variables/TrustScoreCardGlass.md +0 -11
  467. package/docs/api/variables/TrustScoreDisplayGlass.md +0 -11
  468. package/docs/api/variables/UserInfoGlass.md +0 -11
  469. package/docs/api/variables/UserStatsLineGlass.md +0 -11
  470. package/docs/api/variables/YearCardGlass.md +0 -11
  471. package/docs/api/variables/alertVariants.md +0 -21
  472. package/docs/api/variables/avatarSizes.md +0 -21
  473. package/docs/api/variables/badgeVariants.md +0 -21
  474. package/docs/api/variables/buttonGlassVariants.md +0 -21
  475. package/docs/api/variables/cardIntensity.md +0 -21
  476. package/docs/api/variables/dropdownAlign.md +0 -21
  477. package/docs/api/variables/inputVariants.md +0 -21
  478. package/docs/api/variables/modalSizes.md +0 -21
  479. package/docs/api/variables/notificationVariants.md +0 -21
  480. package/docs/api/variables/progressSizes.md +0 -21
  481. package/docs/api/variables/shadcnAlertVariants.md +0 -21
  482. package/docs/api/variables/shadcnBadgeVariants.md +0 -21
  483. package/docs/api/variables/shadcnButtonVariants.md +0 -21
  484. package/docs/api/variables/skeletonVariants.md +0 -21
  485. package/docs/api/variables/statusSizes.md +0 -21
  486. package/docs/api/variables/toggleSizes.md +0 -21
  487. package/docs/api/variables/tooltipPositions.md +0 -21
  488. package/docs/design-system/UI_DESIGN.md +0 -628
  489. package/docs/technical/DEPENDENCIES.md +0 -291
  490. package/docs/visual-testing-guide.md +0 -362
package/CHANGELOG.md CHANGED
@@ -5,6 +5,32 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project
6
6
  adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.2.6] - 2025-12-19
9
+
10
+ ### Fixed
11
+
12
+ - **Issue #6:** TypeScript types now extend Radix UI primitives directly
13
+ - `CheckboxGlass` types extend `React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>`
14
+ - `TabsGlass` types extend corresponding Radix primitive types
15
+ - No more `as unknown as` type assertions needed when using with shadcn/ui
16
+
17
+ ### Changed
18
+
19
+ - **CheckboxGlass:** Migrated to Radix UI primitives internally
20
+ - Ref type changed from `HTMLInputElement` to `HTMLButtonElement` (Radix pattern)
21
+ - Now uses `data-[state=checked/unchecked/indeterminate]` for styling
22
+ - Enter key no longer toggles checkbox (WCAG 2.1.1 standard - Space only)
23
+ - Added `data-slot="checkbox"` for shadcn/ui v4 compatibility
24
+ - **TabsGlass:** Migrated to Radix UI primitives internally
25
+ - Keyboard navigation handled by Radix (Arrow keys, Home, End)
26
+ - New props available: `orientation`, `dir`, `activationMode` (from Radix)
27
+ - Added `data-slot` attributes for shadcn/ui v4 compatibility
28
+ - Tab indicator now uses CSS `::after` pseudo-element
29
+
30
+ ### Deprecated
31
+
32
+ - **CheckboxGlass:** `onChange` prop - use `onCheckedChange` instead (will be removed in v4.0)
33
+
8
34
  ## [2.2.5] - 2025-12-19
9
35
 
10
36
  ### Added
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- const require_trust_score_card_glass = require("../trust-score-card-glass-3VBi9soW.cjs");
2
+ const require_trust_score_card_glass = require("../trust-score-card-glass-DtgFygh5.cjs");
3
3
  let node_util = require("node:util");
4
4
  let node_fs = require("node:fs");
5
5
  let node_path = require("node:path");
@@ -1,7 +1,7 @@
1
- const require_trust_score_card_glass = require("./trust-score-card-glass-3VBi9soW.cjs");
2
- require("./utils-DX6rdBol.cjs");
3
- require("./use-focus-CswOSq71.cjs");
4
- require("./theme-context-DmTETrFi.cjs");
1
+ const require_trust_score_card_glass = require("./trust-score-card-glass-DtgFygh5.cjs");
2
+ require("./utils-CiuCe_Aq.cjs");
3
+ require("./use-focus-BFBcpBh1.cjs");
4
+ require("./theme-context-7NcW0KZL.cjs");
5
5
  exports.AICardGlass = require_trust_score_card_glass.AICardGlass;
6
6
  exports.AlertGlass = require_trust_score_card_glass.AlertGlass;
7
7
  exports.AvatarGlass = require_trust_score_card_glass.AvatarGlass;
@@ -1,5 +1,5 @@
1
1
  import "./utils-B792GPM_.mjs";
2
- import { A as FlagAlertGlass, B as IconButtonGlass, Bt as AvatarGlass, E as ProgressGlass, F as SortDropdownGlass, Ft as CheckboxGlass, H as TooltipGlass, I as SearchBoxGlass, It as ButtonGlass, Kt as AlertGlass, M as BaseProgressGlass, N as ThemeToggleGlass, Nt as CircularProgressGlass, O as ProfileAvatarGlass, P as StatItemGlass, Rt as BadgeGlass, T as RainbowProgressGlass, V as ExpandableHeaderGlass, Xt as FormFieldWrapper, Yt as InteractiveCard, Z as TabsGlass, Zt as TouchTarget, _ as ContributionMetricsGlass, a as HeaderBrandingGlass, b as AICardGlass, c as YearCardGlass, ct as NotificationGlass, d as TrustScoreDisplayGlass, et as SliderGlass, f as RepositoryMetadataGlass, ft as InputGlass, g as MetricCardGlass, h as MetricsGridGlass, ht as DropdownGlass, i as HeaderNavGlass, j as StatusIndicatorGlass, jt as ComboBoxGlass, k as LanguageBarGlass, l as UserStatsLineGlass, m as RepositoryCardGlass, n as ProjectsListGlass, o as FlagsSectionGlass, p as RepositoryHeaderGlass, pt as GlassCard, q as ToggleGlass, r as ProfileHeaderGlass, rt as PopoverGlass, s as CareerStatsGlass, t as TrustScoreCardGlass, tt as SkeletonGlass, u as UserInfoGlass, ut as ModalGlass, v as CircularMetricGlass, w as SegmentedControlGlass, y as CareerStatsHeaderGlass } from "./trust-score-card-glass-EfMB5l5J.mjs";
2
+ import { A as FlagAlertGlass, B as IconButtonGlass, Bt as AvatarGlass, E as ProgressGlass, F as SortDropdownGlass, Ft as CheckboxGlass, H as TooltipGlass, I as SearchBoxGlass, It as ButtonGlass, Kt as AlertGlass, M as BaseProgressGlass, N as ThemeToggleGlass, Nt as CircularProgressGlass, O as ProfileAvatarGlass, P as StatItemGlass, Rt as BadgeGlass, T as RainbowProgressGlass, V as ExpandableHeaderGlass, Xt as FormFieldWrapper, Yt as InteractiveCard, Z as TabsGlass, Zt as TouchTarget, _ as ContributionMetricsGlass, a as HeaderBrandingGlass, b as AICardGlass, c as YearCardGlass, ct as NotificationGlass, d as TrustScoreDisplayGlass, et as SliderGlass, f as RepositoryMetadataGlass, ft as InputGlass, g as MetricCardGlass, h as MetricsGridGlass, ht as DropdownGlass, i as HeaderNavGlass, j as StatusIndicatorGlass, jt as ComboBoxGlass, k as LanguageBarGlass, l as UserStatsLineGlass, m as RepositoryCardGlass, n as ProjectsListGlass, o as FlagsSectionGlass, p as RepositoryHeaderGlass, pt as GlassCard, q as ToggleGlass, r as ProfileHeaderGlass, rt as PopoverGlass, s as CareerStatsGlass, t as TrustScoreCardGlass, tt as SkeletonGlass, u as UserInfoGlass, ut as ModalGlass, v as CircularMetricGlass, w as SegmentedControlGlass, y as CareerStatsHeaderGlass } from "./trust-score-card-glass-BGqBcdyJ.mjs";
3
3
  import "./use-focus-C5kPAKr_.mjs";
4
4
  import "./theme-context-DLS2uAgJ.mjs";
5
5
  export { AICardGlass, AlertGlass, AvatarGlass, BadgeGlass, BaseProgressGlass, ButtonGlass, CareerStatsGlass, CareerStatsHeaderGlass, CheckboxGlass, CircularMetricGlass, CircularProgressGlass, ComboBoxGlass, ContributionMetricsGlass, DropdownGlass, ExpandableHeaderGlass, FlagAlertGlass, FlagsSectionGlass, FormFieldWrapper, GlassCard, HeaderBrandingGlass, HeaderNavGlass, IconButtonGlass, InputGlass, InteractiveCard, LanguageBarGlass, MetricCardGlass, MetricsGridGlass, ModalGlass, NotificationGlass, PopoverGlass, ProfileAvatarGlass, ProfileHeaderGlass, ProgressGlass, ProjectsListGlass, RainbowProgressGlass, RepositoryCardGlass, RepositoryHeaderGlass, RepositoryMetadataGlass, SearchBoxGlass, SegmentedControlGlass, SkeletonGlass, SliderGlass, SortDropdownGlass, StatItemGlass, StatusIndicatorGlass, TabsGlass, ThemeToggleGlass, ToggleGlass, TooltipGlass, TouchTarget, TrustScoreCardGlass, TrustScoreDisplayGlass, UserInfoGlass, UserStatsLineGlass, YearCardGlass };
package/dist/hooks.cjs CHANGED
@@ -1,5 +1,5 @@
1
- const require_use_focus = require("./use-focus-CswOSq71.cjs");
2
- const require_use_wallpaper_tint = require("./use-wallpaper-tint-WtRWtupA.cjs");
1
+ const require_use_focus = require("./use-focus-BFBcpBh1.cjs");
2
+ const require_use_wallpaper_tint = require("./use-wallpaper-tint-DTTStm5f.cjs");
3
3
  exports.useFocus = require_use_focus.useFocus;
4
4
  exports.useHover = require_use_focus.useHover;
5
5
  exports.useResponsive = require_use_wallpaper_tint.useResponsive;
package/dist/index.cjs CHANGED
@@ -1,8 +1,8 @@
1
- const require_trust_score_card_glass = require("./trust-score-card-glass-3VBi9soW.cjs");
2
- const require_utils = require("./utils-DX6rdBol.cjs");
3
- const require_use_focus = require("./use-focus-CswOSq71.cjs");
4
- const require_theme_context = require("./theme-context-DmTETrFi.cjs");
5
- const require_use_wallpaper_tint = require("./use-wallpaper-tint-WtRWtupA.cjs");
1
+ const require_trust_score_card_glass = require("./trust-score-card-glass-DtgFygh5.cjs");
2
+ const require_utils = require("./utils-CiuCe_Aq.cjs");
3
+ const require_use_focus = require("./use-focus-BFBcpBh1.cjs");
4
+ const require_theme_context = require("./theme-context-7NcW0KZL.cjs");
5
+ const require_use_wallpaper_tint = require("./use-wallpaper-tint-DTTStm5f.cjs");
6
6
  let react = require("react");
7
7
  react = require_trust_score_card_glass.__toESM(react);
8
8
  let lucide_react = require("lucide-react");
@@ -257,6 +257,7 @@ var StepperRoot = ({ value, onValueChange, orientation = "horizontal", variant =
257
257
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StepperContext.Provider, {
258
258
  value: contextValue,
259
259
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
260
+ "data-slot": "stepper",
260
261
  className: require_utils.cn(stepperRootVariants({ orientation }), className),
261
262
  "aria-label": "Progress steps",
262
263
  children
@@ -267,6 +268,7 @@ var StepperList = (0, react.forwardRef)(({ children, className, ...props }, ref)
267
268
  const { orientation } = useStepperContext();
268
269
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
269
270
  ref,
271
+ "data-slot": "stepper-list",
270
272
  role: "tablist",
271
273
  "aria-orientation": orientation,
272
274
  className: require_utils.cn(stepperListVariants({ orientation }), className),
@@ -349,6 +351,7 @@ var StepperStep = (0, react.forwardRef)(({ value: stepValue, label, description,
349
351
  }
350
352
  };
351
353
  if (orientation === "horizontal") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
354
+ "data-slot": "stepper-item",
352
355
  className: require_utils.cn(stepperStepContainerVariants({ orientation }), className),
353
356
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
354
357
  ref,
@@ -389,6 +392,7 @@ var StepperStep = (0, react.forwardRef)(({ value: stepValue, label, description,
389
392
  })]
390
393
  })]
391
394
  }), !isLast && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
395
+ "data-slot": "stepper-separator",
392
396
  className: require_utils.cn(stepperConnectorVariants({ orientation })),
393
397
  style: connectorStyles,
394
398
  "aria-hidden": "true"
@@ -396,6 +400,7 @@ var StepperStep = (0, react.forwardRef)(({ value: stepValue, label, description,
396
400
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
397
401
  className: "flex flex-col",
398
402
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
403
+ "data-slot": "stepper-item",
399
404
  className: require_utils.cn(stepperStepContainerVariants({ orientation }), className),
400
405
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
401
406
  ref,
@@ -436,6 +441,7 @@ var StepperStep = (0, react.forwardRef)(({ value: stepValue, label, description,
436
441
  })]
437
442
  })]
438
443
  }), !isLast && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
444
+ "data-slot": "stepper-separator",
439
445
  className: require_utils.cn(stepperConnectorVariants({ orientation })),
440
446
  style: connectorStyles,
441
447
  "aria-hidden": "true"
@@ -449,6 +455,7 @@ var StepperContent = ({ value, children, className }) => {
449
455
  if (!isActive) return null;
450
456
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
451
457
  role: "tabpanel",
458
+ "data-slot": "stepper-content",
452
459
  "aria-hidden": !isActive,
453
460
  className: require_utils.cn(stepperContentVariants({ orientation }), className),
454
461
  children
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { t as cn } from "./utils-B792GPM_.mjs";
2
- import { $ as TabsTrigger, A as FlagAlertGlass, At as DropdownMenuGlassTrigger, B as IconButtonGlass, Bt as AvatarGlass, C as sparklineContainerVariants, Ct as DropdownMenuGlassRadioGroup, D as progressSizes, Dt as DropdownMenuGlassSub, E as ProgressGlass, Et as DropdownMenuGlassShortcut, F as SortDropdownGlass, Ft as CheckboxGlass, G as TooltipGlassSimple, Gt as statusSizes, H as TooltipGlass, Ht as AvatarGlassImage, I as SearchBoxGlass, It as ButtonGlass, J as toggleSizes, Jt as AlertGlassTitle, K as TooltipGlassTrigger, Kt as AlertGlass, L as InsightCardGlass, Lt as buttonGlassVariants, M as BaseProgressGlass, Mt as inputVariants, N as ThemeToggleGlass, Nt as CircularProgressGlass, O as ProfileAvatarGlass, Ot as DropdownMenuGlassSubContent, P as StatItemGlass, Pt as Checkbox, Q as TabsList, Qt as alertVariants, R as insightCardVariants, Rt as BadgeGlass, S as sparklineBarVariants, St as DropdownMenuGlassPortal, T as RainbowProgressGlass, Tt as DropdownMenuGlassSeparator, U as TooltipGlassContent, Ut as AvatarGlassSimple, V as ExpandableHeaderGlass, Vt as AvatarGlassFallback, W as TooltipGlassProvider, Wt as avatarSizes, X as TabsContent, Xt as FormFieldWrapper, Y as Tabs, Yt as InteractiveCard, Z as TabsGlass, Zt as TouchTarget, _ as ContributionMetricsGlass, _t as DropdownMenuGlassCheckboxItem, a as HeaderBrandingGlass, at as PopoverGlassContent, b as AICardGlass, bt as DropdownMenuGlassItem, c as YearCardGlass, ct as NotificationGlass, d as TrustScoreDisplayGlass, dt as modalSizes, et as SliderGlass, f as RepositoryMetadataGlass, ft as InputGlass, g as MetricCardGlass, gt as DropdownMenuGlass, h as MetricsGridGlass, ht as DropdownGlass, i as HeaderNavGlass, it as PopoverGlassAnchor, j as StatusIndicatorGlass, jt as ComboBoxGlass, k as LanguageBarGlass, kt as DropdownMenuGlassSubTrigger, l as UserStatsLineGlass, lt as notificationVariants, m as RepositoryCardGlass, mt as cardIntensity, n as ProjectsListGlass, nt as skeletonVariants, o as FlagsSectionGlass, ot as PopoverGlassLegacy, p as RepositoryHeaderGlass, pt as GlassCard, q as ToggleGlass, qt as AlertGlassDescription, r as ProfileHeaderGlass, rt as PopoverGlass, s as CareerStatsGlass, st as PopoverGlassTrigger, t as TrustScoreCardGlass, tt as SkeletonGlass, u as UserInfoGlass, ut as ModalGlass, v as CircularMetricGlass, vt as DropdownMenuGlassContent, w as SegmentedControlGlass, wt as DropdownMenuGlassRadioItem, x as SparklineGlass, xt as DropdownMenuGlassLabel, y as CareerStatsHeaderGlass, yt as DropdownMenuGlassGroup, z as insightVariantConfig, zt as badgeVariants } from "./trust-score-card-glass-EfMB5l5J.mjs";
2
+ import { $ as TabsTrigger, A as FlagAlertGlass, At as DropdownMenuGlassTrigger, B as IconButtonGlass, Bt as AvatarGlass, C as sparklineContainerVariants, Ct as DropdownMenuGlassRadioGroup, D as progressSizes, Dt as DropdownMenuGlassSub, E as ProgressGlass, Et as DropdownMenuGlassShortcut, F as SortDropdownGlass, Ft as CheckboxGlass, G as TooltipGlassSimple, Gt as statusSizes, H as TooltipGlass, Ht as AvatarGlassImage, I as SearchBoxGlass, It as ButtonGlass, J as toggleSizes, Jt as AlertGlassTitle, K as TooltipGlassTrigger, Kt as AlertGlass, L as InsightCardGlass, Lt as buttonGlassVariants, M as BaseProgressGlass, Mt as inputVariants, N as ThemeToggleGlass, Nt as CircularProgressGlass, O as ProfileAvatarGlass, Ot as DropdownMenuGlassSubContent, P as StatItemGlass, Pt as Checkbox, Q as TabsList, Qt as alertVariants, R as insightCardVariants, Rt as BadgeGlass, S as sparklineBarVariants, St as DropdownMenuGlassPortal, T as RainbowProgressGlass, Tt as DropdownMenuGlassSeparator, U as TooltipGlassContent, Ut as AvatarGlassSimple, V as ExpandableHeaderGlass, Vt as AvatarGlassFallback, W as TooltipGlassProvider, Wt as avatarSizes, X as TabsContent, Xt as FormFieldWrapper, Y as Tabs, Yt as InteractiveCard, Z as TabsGlass, Zt as TouchTarget, _ as ContributionMetricsGlass, _t as DropdownMenuGlassCheckboxItem, a as HeaderBrandingGlass, at as PopoverGlassContent, b as AICardGlass, bt as DropdownMenuGlassItem, c as YearCardGlass, ct as NotificationGlass, d as TrustScoreDisplayGlass, dt as modalSizes, et as SliderGlass, f as RepositoryMetadataGlass, ft as InputGlass, g as MetricCardGlass, gt as DropdownMenuGlass, h as MetricsGridGlass, ht as DropdownGlass, i as HeaderNavGlass, it as PopoverGlassAnchor, j as StatusIndicatorGlass, jt as ComboBoxGlass, k as LanguageBarGlass, kt as DropdownMenuGlassSubTrigger, l as UserStatsLineGlass, lt as notificationVariants, m as RepositoryCardGlass, mt as cardIntensity, n as ProjectsListGlass, nt as skeletonVariants, o as FlagsSectionGlass, ot as PopoverGlassLegacy, p as RepositoryHeaderGlass, pt as GlassCard, q as ToggleGlass, qt as AlertGlassDescription, r as ProfileHeaderGlass, rt as PopoverGlass, s as CareerStatsGlass, st as PopoverGlassTrigger, t as TrustScoreCardGlass, tt as SkeletonGlass, u as UserInfoGlass, ut as ModalGlass, v as CircularMetricGlass, vt as DropdownMenuGlassContent, w as SegmentedControlGlass, wt as DropdownMenuGlassRadioItem, x as SparklineGlass, xt as DropdownMenuGlassLabel, y as CareerStatsHeaderGlass, yt as DropdownMenuGlassGroup, z as insightVariantConfig, zt as badgeVariants } from "./trust-score-card-glass-BGqBcdyJ.mjs";
3
3
  import { n as useHover, t as useFocus } from "./use-focus-C5kPAKr_.mjs";
4
4
  import { a as getThemeConfig, i as getNextTheme, n as THEME_CONFIG, o as useTheme, r as ThemeProvider, t as THEMES } from "./theme-context-DLS2uAgJ.mjs";
5
5
  import { n as useResponsive, t as useWallpaperTint } from "./use-wallpaper-tint-C0kYXNiN.mjs";
@@ -256,6 +256,7 @@ var StepperRoot = ({ value, onValueChange, orientation = "horizontal", variant =
256
256
  return /* @__PURE__ */ jsx(StepperContext.Provider, {
257
257
  value: contextValue,
258
258
  children: /* @__PURE__ */ jsx("div", {
259
+ "data-slot": "stepper",
259
260
  className: cn(stepperRootVariants({ orientation }), className),
260
261
  "aria-label": "Progress steps",
261
262
  children
@@ -266,6 +267,7 @@ var StepperList = forwardRef(({ children, className, ...props }, ref) => {
266
267
  const { orientation } = useStepperContext();
267
268
  return /* @__PURE__ */ jsx("div", {
268
269
  ref,
270
+ "data-slot": "stepper-list",
269
271
  role: "tablist",
270
272
  "aria-orientation": orientation,
271
273
  className: cn(stepperListVariants({ orientation }), className),
@@ -348,6 +350,7 @@ var StepperStep = forwardRef(({ value: stepValue, label, description, icon, comp
348
350
  }
349
351
  };
350
352
  if (orientation === "horizontal") return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
353
+ "data-slot": "stepper-item",
351
354
  className: cn(stepperStepContainerVariants({ orientation }), className),
352
355
  children: [/* @__PURE__ */ jsx("button", {
353
356
  ref,
@@ -388,6 +391,7 @@ var StepperStep = forwardRef(({ value: stepValue, label, description, icon, comp
388
391
  })]
389
392
  })]
390
393
  }), !isLast && /* @__PURE__ */ jsx("div", {
394
+ "data-slot": "stepper-separator",
391
395
  className: cn(stepperConnectorVariants({ orientation })),
392
396
  style: connectorStyles,
393
397
  "aria-hidden": "true"
@@ -395,6 +399,7 @@ var StepperStep = forwardRef(({ value: stepValue, label, description, icon, comp
395
399
  return /* @__PURE__ */ jsxs("div", {
396
400
  className: "flex flex-col",
397
401
  children: [/* @__PURE__ */ jsxs("div", {
402
+ "data-slot": "stepper-item",
398
403
  className: cn(stepperStepContainerVariants({ orientation }), className),
399
404
  children: [/* @__PURE__ */ jsx("button", {
400
405
  ref,
@@ -435,6 +440,7 @@ var StepperStep = forwardRef(({ value: stepValue, label, description, icon, comp
435
440
  })]
436
441
  })]
437
442
  }), !isLast && /* @__PURE__ */ jsx("div", {
443
+ "data-slot": "stepper-separator",
438
444
  className: cn(stepperConnectorVariants({ orientation })),
439
445
  style: connectorStyles,
440
446
  "aria-hidden": "true"
@@ -448,6 +454,7 @@ var StepperContent = ({ value, children, className }) => {
448
454
  if (!isActive) return null;
449
455
  return /* @__PURE__ */ jsx("div", {
450
456
  role: "tabpanel",
457
+ "data-slot": "stepper-content",
451
458
  "aria-hidden": !isActive,
452
459
  className: cn(stepperContentVariants({ orientation }), className),
453
460
  children
@@ -17,7 +17,7 @@
17
17
  {
18
18
  "path": "components/glass/ui/avatar-glass.tsx",
19
19
  "type": "registry:component",
20
- "content": "/**\n * AvatarGlass Component\n *\n * Glass-themed avatar with:\n * - Theme-aware styling (glass/light/aurora)\n * - Glow effect on hover\n * - Optional glow-pulse animation\n * - Status indicator with glow\n * - Size variants\n * - Built on Radix UI primitives\n *\n * @example Compound API (recommended)\n * ```tsx\n * <AvatarGlass size=\"default\">\n * <AvatarGlassImage src=\"/avatar.jpg\" alt=\"User\" />\n * <AvatarGlassFallback>JD</AvatarGlassFallback>\n * </AvatarGlass>\n * ```\n *\n * @example With status indicator\n * ```tsx\n * <AvatarGlass size=\"lg\" status=\"online\">\n * <AvatarGlassImage src=\"/avatar.jpg\" alt=\"User\" />\n * <AvatarGlassFallback>JD</AvatarGlassFallback>\n * </AvatarGlass>\n * ```\n *\n * @example With glow animation\n * ```tsx\n * <AvatarGlass size=\"xl\" glowing>\n * <AvatarGlassImage src=\"/avatar.jpg\" alt=\"User\" />\n * <AvatarGlassFallback>JD</AvatarGlassFallback>\n * </AvatarGlass>\n * ```\n */\n\n'use client';\n\nimport * as React from 'react';\nimport * as AvatarPrimitive from '@radix-ui/react-avatar';\nimport { cn } from '@/lib/utils';\nimport { useHover } from '@/lib/hooks/use-hover';\nimport { avatarSizes, statusSizes } from '@/lib/variants/avatar-glass-variants';\nimport '@/glass-theme.css';\n\n// ========================================\n// TYPES\n// ========================================\n\nexport type AvatarStatus = 'online' | 'offline' | 'busy' | 'away';\nexport type AvatarSize = 'sm' | 'md' | 'lg' | 'xl';\n\n// ========================================\n// HELPERS\n// ========================================\n\nconst getStatusVars = (statusType: AvatarStatus): { bg: string; glow: string } => {\n const statusVars: Record<AvatarStatus, { bg: string; glow: string }> = {\n online: { bg: 'var(--status-online)', glow: 'var(--status-online-glow)' },\n offline: { bg: 'var(--status-offline)', glow: 'none' },\n busy: { bg: 'var(--status-busy)', glow: 'var(--status-busy-glow)' },\n away: { bg: 'var(--status-away)', glow: 'var(--status-away-glow)' },\n };\n return statusVars[statusType];\n};\n\n// ========================================\n// CONTEXT\n// ========================================\n\ninterface AvatarGlassContextValue {\n size: AvatarSize;\n status?: AvatarStatus;\n glowing?: boolean;\n}\n\nconst AvatarGlassContext = React.createContext<AvatarGlassContextValue>({\n size: 'md',\n});\n\n// ========================================\n// COMPOUND COMPONENT: ROOT\n// ========================================\n\ninterface AvatarGlassRootProps extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root> {\n size?: AvatarSize;\n status?: AvatarStatus;\n glowing?: boolean;\n}\n\nconst AvatarGlassRoot = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n AvatarGlassRootProps\n>(({ className, size = 'md', status, glowing = false, children, ...props }, ref) => {\n const { isHovered, hoverProps } = useHover();\n\n const avatarStyles: React.CSSProperties = {\n background: 'var(--avatar-bg)',\n border: '3px solid var(--avatar-border)',\n boxShadow: isHovered ? 'var(--avatar-hover-glow)' : 'var(--avatar-shadow)',\n color: 'var(--text-inverse)',\n };\n\n return (\n <AvatarGlassContext.Provider value={{ size, status, glowing }}>\n <div\n className={cn('relative inline-flex', className)}\n onMouseEnter={hoverProps.onMouseEnter}\n onMouseLeave={hoverProps.onMouseLeave}\n >\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n avatarSizes({ size }),\n glowing && 'animate-[glow-pulse_2s_ease-in-out_infinite]'\n )}\n style={avatarStyles}\n {...props}\n >\n {children}\n </AvatarPrimitive.Root>\n\n {/* Status indicator */}\n {status && (\n <span\n className={cn(statusSizes({ size }))}\n style={{\n background: getStatusVars(status).bg,\n boxShadow: getStatusVars(status).glow,\n }}\n role=\"status\"\n aria-label={`Status: ${status}`}\n />\n )}\n </div>\n </AvatarGlassContext.Provider>\n );\n});\n\nAvatarGlassRoot.displayName = 'AvatarGlass';\n\n// ========================================\n// COMPOUND COMPONENT: IMAGE\n// ========================================\n\ntype AvatarGlassImageProps = React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>;\n\nconst AvatarGlassImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n AvatarGlassImageProps\n>(({ className, ...props }, ref) => {\n return (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn('aspect-square h-full w-full object-cover', className)}\n {...props}\n />\n );\n});\n\nAvatarGlassImage.displayName = 'AvatarGlassImage';\n\n// ========================================\n// COMPOUND COMPONENT: FALLBACK\n// ========================================\n\ntype AvatarGlassFallbackProps = React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>;\n\nconst AvatarGlassFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n AvatarGlassFallbackProps\n>(({ className, ...props }, ref) => {\n return (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n 'flex h-full w-full items-center justify-center font-semibold uppercase',\n className\n )}\n {...props}\n />\n );\n});\n\nAvatarGlassFallback.displayName = 'AvatarGlassFallback';\n\n// ========================================\n// HELPER FUNCTION (for simple use cases)\n// ========================================\n\nconst getInitials = (name: string): string => {\n if (!name || name.trim().length === 0) return '?';\n return name\n .split(' ')\n .map((part) => part[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n};\n\n// ========================================\n// SIMPLE WRAPPER (backward compatibility)\n// ========================================\n\ninterface AvatarGlassSimpleProps {\n name: string;\n size?: AvatarSize;\n status?: AvatarStatus;\n glowing?: boolean;\n className?: string;\n}\n\nconst AvatarGlassSimple: React.FC<AvatarGlassSimpleProps> = ({\n name,\n size = 'md',\n status,\n glowing,\n className,\n}) => {\n return (\n <AvatarGlassRoot size={size} status={status} glowing={glowing} className={className}>\n <AvatarGlassFallback>{getInitials(name)}</AvatarGlassFallback>\n </AvatarGlassRoot>\n );\n};\n\n// ========================================\n// EXPORTS\n// ========================================\n\n// Compound API (shadcn/ui pattern)\nexport const AvatarGlass = AvatarGlassRoot;\nexport { AvatarGlassImage, AvatarGlassFallback };\n\n// Simple wrapper (backward compatibility)\nexport { AvatarGlassSimple };\n"
20
+ "content": "/**\n * AvatarGlass Component\n *\n * Glass-themed avatar with:\n * - Theme-aware styling (glass/light/aurora)\n * - Glow effect on hover\n * - Optional glow-pulse animation\n * - Status indicator with glow\n * - Size variants\n * - Built on Radix UI primitives\n *\n * @example Compound API (recommended)\n * ```tsx\n * <AvatarGlass size=\"default\">\n * <AvatarGlassImage src=\"/avatar.jpg\" alt=\"User\" />\n * <AvatarGlassFallback>JD</AvatarGlassFallback>\n * </AvatarGlass>\n * ```\n *\n * @example With status indicator\n * ```tsx\n * <AvatarGlass size=\"lg\" status=\"online\">\n * <AvatarGlassImage src=\"/avatar.jpg\" alt=\"User\" />\n * <AvatarGlassFallback>JD</AvatarGlassFallback>\n * </AvatarGlass>\n * ```\n *\n * @example With glow animation\n * ```tsx\n * <AvatarGlass size=\"xl\" glowing>\n * <AvatarGlassImage src=\"/avatar.jpg\" alt=\"User\" />\n * <AvatarGlassFallback>JD</AvatarGlassFallback>\n * </AvatarGlass>\n * ```\n */\n\n'use client';\n\nimport * as React from 'react';\nimport * as AvatarPrimitive from '@radix-ui/react-avatar';\nimport { cn } from '@/lib/utils';\nimport { useHover } from '@/lib/hooks/use-hover';\nimport { avatarSizes, statusSizes } from '@/lib/variants/avatar-glass-variants';\nimport '@/glass-theme.css';\n\n// ========================================\n// TYPES\n// ========================================\n\nexport type AvatarStatus = 'online' | 'offline' | 'busy' | 'away';\nexport type AvatarSize = 'sm' | 'md' | 'lg' | 'xl';\n\n// ========================================\n// HELPERS\n// ========================================\n\nconst getStatusVars = (statusType: AvatarStatus): { bg: string; glow: string } => {\n const statusVars: Record<AvatarStatus, { bg: string; glow: string }> = {\n online: { bg: 'var(--status-online)', glow: 'var(--status-online-glow)' },\n offline: { bg: 'var(--status-offline)', glow: 'none' },\n busy: { bg: 'var(--status-busy)', glow: 'var(--status-busy-glow)' },\n away: { bg: 'var(--status-away)', glow: 'var(--status-away-glow)' },\n };\n return statusVars[statusType];\n};\n\n// ========================================\n// CONTEXT\n// ========================================\n\ninterface AvatarGlassContextValue {\n size: AvatarSize;\n status?: AvatarStatus;\n glowing?: boolean;\n}\n\nconst AvatarGlassContext = React.createContext<AvatarGlassContextValue>({\n size: 'md',\n});\n\n// ========================================\n// COMPOUND COMPONENT: ROOT\n// ========================================\n\ninterface AvatarGlassRootProps extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root> {\n size?: AvatarSize;\n status?: AvatarStatus;\n glowing?: boolean;\n}\n\nconst AvatarGlassRoot = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n AvatarGlassRootProps\n>(({ className, size = 'md', status, glowing = false, children, ...props }, ref) => {\n const { isHovered, hoverProps } = useHover();\n\n const avatarStyles: React.CSSProperties = {\n background: 'var(--avatar-bg)',\n border: '3px solid var(--avatar-border)',\n boxShadow: isHovered ? 'var(--avatar-hover-glow)' : 'var(--avatar-shadow)',\n color: 'var(--text-inverse)',\n };\n\n return (\n <AvatarGlassContext.Provider value={{ size, status, glowing }}>\n <div\n data-slot=\"avatar\"\n className={cn('relative inline-flex', className)}\n onMouseEnter={hoverProps.onMouseEnter}\n onMouseLeave={hoverProps.onMouseLeave}\n >\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n avatarSizes({ size }),\n glowing && 'animate-[glow-pulse_2s_ease-in-out_infinite]'\n )}\n style={avatarStyles}\n {...props}\n >\n {children}\n </AvatarPrimitive.Root>\n\n {/* Status indicator */}\n {status && (\n <span\n data-slot=\"avatar-status\"\n className={cn(statusSizes({ size }))}\n style={{\n background: getStatusVars(status).bg,\n boxShadow: getStatusVars(status).glow,\n }}\n role=\"status\"\n aria-label={`Status: ${status}`}\n />\n )}\n </div>\n </AvatarGlassContext.Provider>\n );\n});\n\nAvatarGlassRoot.displayName = 'AvatarGlass';\n\n// ========================================\n// COMPOUND COMPONENT: IMAGE\n// ========================================\n\ntype AvatarGlassImageProps = React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>;\n\nconst AvatarGlassImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n AvatarGlassImageProps\n>(({ className, ...props }, ref) => {\n return (\n <AvatarPrimitive.Image\n ref={ref}\n data-slot=\"avatar-image\"\n className={cn('aspect-square h-full w-full object-cover', className)}\n {...props}\n />\n );\n});\n\nAvatarGlassImage.displayName = 'AvatarGlassImage';\n\n// ========================================\n// COMPOUND COMPONENT: FALLBACK\n// ========================================\n\ntype AvatarGlassFallbackProps = React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>;\n\nconst AvatarGlassFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n AvatarGlassFallbackProps\n>(({ className, ...props }, ref) => {\n return (\n <AvatarPrimitive.Fallback\n ref={ref}\n data-slot=\"avatar-fallback\"\n className={cn(\n 'flex h-full w-full items-center justify-center font-semibold uppercase',\n className\n )}\n {...props}\n />\n );\n});\n\nAvatarGlassFallback.displayName = 'AvatarGlassFallback';\n\n// ========================================\n// HELPER FUNCTION (for simple use cases)\n// ========================================\n\nconst getInitials = (name: string): string => {\n if (!name || name.trim().length === 0) return '?';\n return name\n .split(' ')\n .map((part) => part[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n};\n\n// ========================================\n// SIMPLE WRAPPER (backward compatibility)\n// ========================================\n\ninterface AvatarGlassSimpleProps {\n name: string;\n size?: AvatarSize;\n status?: AvatarStatus;\n glowing?: boolean;\n className?: string;\n}\n\nconst AvatarGlassSimple: React.FC<AvatarGlassSimpleProps> = ({\n name,\n size = 'md',\n status,\n glowing,\n className,\n}) => {\n return (\n <AvatarGlassRoot size={size} status={status} glowing={glowing} className={className}>\n <AvatarGlassFallback>{getInitials(name)}</AvatarGlassFallback>\n </AvatarGlassRoot>\n );\n};\n\n// ========================================\n// EXPORTS\n// ========================================\n\n// Compound API (shadcn/ui pattern)\nexport const AvatarGlass = AvatarGlassRoot;\nexport { AvatarGlassImage, AvatarGlassFallback };\n\n// Simple wrapper (backward compatibility)\nexport { AvatarGlassSimple };\n"
21
21
  }
22
22
  ],
23
23
  "categories": [
@@ -3,22 +3,21 @@
3
3
  "name": "checkbox-glass",
4
4
  "type": "registry:ui",
5
5
  "title": "Checkbox Glass",
6
- "description": "Glass-themed checkbox with:",
6
+ "description": "Glass-themed checkbox built on Radix UI primitives with:",
7
7
  "dependencies": [
8
+ "@radix-ui/react-checkbox",
8
9
  "lucide-react",
9
10
  "react",
10
11
  "shadcn-glass-ui"
11
12
  ],
12
13
  "registryDependencies": [
13
- "cn",
14
- "use-focus",
15
- "use-hover"
14
+ "cn"
16
15
  ],
17
16
  "files": [
18
17
  {
19
18
  "path": "components/glass/ui/checkbox-glass.tsx",
20
19
  "type": "registry:component",
21
- "content": "/**\n * CheckboxGlass Component\n *\n * Glass-themed checkbox with:\n * - Theme-aware styling (glass/light/aurora)\n * - Glow effect on hover\n * - Optional label\n */\n\nimport * as React from 'react';\nimport { forwardRef, type CSSProperties } from 'react';\nimport { Check, Minus } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useHover } from '@/lib/hooks/use-hover';\nimport { useFocus } from '@/lib/hooks/use-focus';\nimport '@/glass-theme.css';\n\n// ========================================\n// PROPS INTERFACE\n// ========================================\n\n/**\n * Checked state type compatible with shadcn/ui (Radix UI)\n */\nexport type CheckedState = boolean | 'indeterminate';\n\n/**\n * Props for the CheckboxGlass component\n *\n * A glass-themed checkbox with accessible keyboard navigation, focus management,\n * and touch-friendly targets. Features glow effects and theme-aware styling.\n *\n * **shadcn/ui Compatibility (v2.3.0+):**\n * - Supports `onCheckedChange` callback (shadcn/ui pattern)\n * - Supports `'indeterminate'` state for tri-state checkboxes\n * - Backwards compatible with `onChange` prop\n *\n * @accessibility\n * - **Keyboard Navigation:** Full keyboard support with Enter/Space to toggle, Tab to focus (WCAG 2.1.1)\n * - **Focus Management:** Visible focus ring using `--focus-glow` CSS variable (WCAG 2.4.7)\n * - **Screen Readers:** Dual implementation with native `<input type=\"checkbox\">` (hidden) + visual `<div role=\"checkbox\">`\n * - **ARIA Attributes:** Uses `role=\"checkbox\"` and `aria-checked` for proper state announcement (including 'mixed' for indeterminate)\n * - **Label Association:** Visual label automatically associated with checkbox via `<label>` wrapper\n * - **Touch Targets:** 44x44px minimum touch area per Apple HIG (WCAG 2.5.5 compliance)\n * - **Color Contrast:** Check mark and backgrounds meet WCAG AA contrast ratio 4.5:1\n * - **Motion:** Transitions respect `prefers-reduced-motion` settings\n *\n * @example\n * ```tsx\n * // shadcn/ui compatible API\n * <CheckboxGlass\n * checked={isChecked}\n * onCheckedChange={(checked) => setIsChecked(checked === true)}\n * />\n *\n * // Indeterminate state (tri-state checkbox)\n * <CheckboxGlass\n * checked={allSelected ? true : someSelected ? 'indeterminate' : false}\n * onCheckedChange={(checked) => {\n * if (checked === true) selectAll();\n * else deselectAll();\n * }}\n * label=\"Select all\"\n * />\n *\n * // Legacy API (still supported)\n * <CheckboxGlass checked={agreed} onChange={setAgreed} label=\"I agree to terms\" />\n *\n * // Form integration with validation\n * <form onSubmit={handleSubmit}>\n * <CheckboxGlass\n * checked={newsletter}\n * onCheckedChange={setNewsletter}\n * label=\"Subscribe to newsletter\"\n * aria-describedby=\"newsletter-help\"\n * />\n * <p id=\"newsletter-help\">Receive weekly updates</p>\n * </form>\n *\n * // Disabled checkbox\n * <CheckboxGlass\n * checked={true}\n * onCheckedChange={() => {}}\n * label=\"This option is locked\"\n * disabled\n * />\n * ```\n *\n * @since v2.3.0 - Added shadcn/ui compatible `onCheckedChange` and `indeterminate` support\n */\nexport interface CheckboxGlassProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'onChange' | 'checked' | 'defaultChecked'\n> {\n /** Checked state: true, false, or 'indeterminate' (shadcn/ui compatible) */\n readonly checked?: CheckedState;\n /** Default checked state for uncontrolled usage */\n readonly defaultChecked?: CheckedState;\n /**\n * Callback when checked state changes (shadcn/ui compatible)\n * @param checked - New checked state\n */\n readonly onCheckedChange?: (checked: CheckedState) => void;\n /**\n * @deprecated Use `onCheckedChange` instead. Will be removed in v4.0.\n * Legacy callback for backwards compatibility.\n */\n readonly onChange?: (checked: boolean) => void;\n /** Optional label text */\n readonly label?: string;\n}\n\n// ========================================\n// COMPONENT\n// ========================================\n\nexport const CheckboxGlass = forwardRef<HTMLInputElement, CheckboxGlassProps>(\n (\n {\n className,\n checked: controlledChecked,\n defaultChecked,\n onCheckedChange,\n onChange,\n label,\n disabled,\n ...props\n },\n ref\n ) => {\n const { isHovered, hoverProps } = useHover();\n const { isFocusVisible, focusProps } = useFocus({ focusVisible: true });\n\n // Support both controlled and uncontrolled modes\n const [uncontrolledChecked, setUncontrolledChecked] = React.useState<CheckedState>(\n defaultChecked ?? false\n );\n const isControlled = controlledChecked !== undefined;\n const checked = isControlled ? controlledChecked : uncontrolledChecked;\n\n // Determine visual states\n const isChecked = checked === true;\n const isIndeterminate = checked === 'indeterminate';\n const showIndicator = isChecked || isIndeterminate;\n\n // Handle state change\n const handleChange = (newChecked: CheckedState) => {\n if (disabled) return;\n\n if (!isControlled) {\n setUncontrolledChecked(newChecked);\n }\n\n // Call shadcn/ui compatible callback\n onCheckedChange?.(newChecked);\n\n // Call legacy callback (deprecated)\n if (onChange && typeof newChecked === 'boolean') {\n onChange(newChecked);\n }\n };\n\n // Toggle to next state (indeterminate -> true, true -> false, false -> true)\n const toggleChecked = () => {\n if (isIndeterminate) {\n handleChange(true);\n } else {\n handleChange(!isChecked);\n }\n };\n\n const checkboxStyles: CSSProperties = {\n background: showIndicator ? 'var(--checkbox-checked-bg)' : 'var(--checkbox-bg)',\n border: `2px solid ${showIndicator ? 'var(--checkbox-checked-bg)' : 'var(--checkbox-border)'}`,\n boxShadow:\n isFocusVisible && !disabled\n ? 'var(--focus-glow)'\n : isHovered && !disabled\n ? 'var(--checkbox-glow)'\n : 'none',\n };\n\n // ARIA checked value for screen readers\n const ariaChecked = isIndeterminate ? 'mixed' : isChecked;\n\n return (\n <label\n className={cn(\n 'inline-flex items-center gap-2 md:gap-2.5',\n disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer',\n className\n )}\n onMouseEnter={hoverProps.onMouseEnter}\n onMouseLeave={hoverProps.onMouseLeave}\n >\n <input\n ref={ref}\n type=\"checkbox\"\n checked={isChecked}\n onChange={(e) => handleChange(e.target.checked)}\n disabled={disabled}\n className=\"sr-only\"\n {...props}\n />\n {/* Touch area wrapper - 44px minimum for Apple HIG compliance */}\n <span className=\"inline-flex items-center justify-center min-w-11 min-h-11\">\n {/* Visual checkbox - smaller but within 44px touch area */}\n <div\n onClick={toggleChecked}\n onFocus={focusProps.onFocus}\n onBlur={focusProps.onBlur}\n className=\"relative w-6 h-6 md:w-5 md:h-5 rounded-md flex items-center justify-center transition-all duration-300\"\n style={checkboxStyles}\n role=\"checkbox\"\n aria-checked={ariaChecked}\n aria-label={label || 'Checkbox'}\n tabIndex={disabled ? -1 : 0}\n onKeyDown={(e) => {\n if (!disabled && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n toggleChecked();\n }\n }}\n >\n {isChecked && (\n <Check\n className=\"w-3.5 h-3.5 md:w-3 md:h-3\"\n style={{ color: 'var(--text-inverse)' }}\n />\n )}\n {isIndeterminate && (\n <Minus\n className=\"w-3.5 h-3.5 md:w-3 md:h-3\"\n style={{ color: 'var(--text-inverse)' }}\n />\n )}\n </div>\n </span>\n {label && (\n <span className=\"text-xs md:text-sm\" style={{ color: 'var(--text-secondary)' }}>\n {label}\n </span>\n )}\n </label>\n );\n }\n);\n\nCheckboxGlass.displayName = 'CheckboxGlass';\n\n/**\n * Checkbox - shadcn/ui compatible alias for CheckboxGlass\n *\n * @example\n * ```tsx\n * import { Checkbox } from 'shadcn-glass-ui'\n *\n * <Checkbox\n * checked={isChecked}\n * onCheckedChange={(checked) => setIsChecked(checked === true)}\n * />\n * ```\n *\n * @since v2.3.0\n */\nexport const Checkbox = CheckboxGlass;\n"
20
+ "content": "/**\n * CheckboxGlass Component\n *\n * Glass-themed checkbox built on Radix UI primitives with:\n * - 100% shadcn/ui type compatibility\n * - Theme-aware styling (glass/light/aurora)\n * - Glow effect on hover/focus\n * - Optional label\n *\n * @since v2.2.6 - Migrated to Radix UI primitives for full type compatibility\n */\n\nimport * as React from 'react';\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox';\nimport { Check, Minus } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport '@/glass-theme.css';\n\n// ========================================\n// TYPES\n// ========================================\n\n/**\n * Checked state type compatible with shadcn/ui (Radix UI)\n */\nexport type CheckedState = boolean | 'indeterminate';\n\n/**\n * Props for the CheckboxGlass component\n *\n * Extends Radix UI Checkbox.Root props for 100% shadcn/ui compatibility.\n * All Radix props are supported including: checked, defaultChecked, onCheckedChange,\n * disabled, required, name, value, etc.\n *\n * **Type Compatibility (v2.3.1+):**\n * - Extends `React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>`\n * - No more `as unknown as` type assertions needed\n * - Full IntelliSense for all Radix props\n *\n * @accessibility\n * - **Keyboard Navigation:** Space to toggle (WCAG 2.1.1)\n * - **Focus Management:** Visible focus ring using `--focus-glow` CSS variable (WCAG 2.4.7)\n * - **Screen Readers:** Radix UI handles ARIA attributes automatically\n * - **Touch Targets:** 44x44px minimum touch area per Apple HIG (WCAG 2.5.5)\n * - **Color Contrast:** Check mark and backgrounds meet WCAG AA contrast ratio 4.5:1\n *\n * @example\n * ```tsx\n * // shadcn/ui compatible API\n * <CheckboxGlass\n * checked={isChecked}\n * onCheckedChange={(checked) => setIsChecked(checked === true)}\n * />\n *\n * // Indeterminate state (tri-state checkbox)\n * <CheckboxGlass\n * checked={allSelected ? true : someSelected ? 'indeterminate' : false}\n * onCheckedChange={(checked) => {\n * if (checked === true) selectAll();\n * else deselectAll();\n * }}\n * label=\"Select all\"\n * />\n *\n * // Legacy API (still supported)\n * <CheckboxGlass checked={agreed} onChange={setAgreed} label=\"I agree to terms\" />\n * ```\n *\n * @since v2.3.0 - Added shadcn/ui compatible `onCheckedChange` and `indeterminate` support\n * @since v2.2.6 - Migrated to Radix UI primitives for full type compatibility\n */\nexport interface CheckboxGlassProps extends Omit<\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>,\n 'onChange'\n> {\n /**\n * @deprecated Use `onCheckedChange` instead. Will be removed in v4.0.\n * Legacy callback for backwards compatibility.\n */\n readonly onChange?: (checked: boolean) => void;\n /** Optional label text (Glass UI extension) */\n readonly label?: string;\n}\n\n// ========================================\n// COMPONENT\n// ========================================\n\nexport const CheckboxGlass = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n CheckboxGlassProps\n>(({ className, label, onChange, onCheckedChange, disabled, checked, ...props }, ref) => {\n // Wrapper for legacy onChange callback\n const handleCheckedChange = React.useCallback(\n (newChecked: CheckedState) => {\n onCheckedChange?.(newChecked);\n // Legacy support (deprecated)\n if (onChange && typeof newChecked === 'boolean') {\n onChange(newChecked);\n }\n },\n [onCheckedChange, onChange]\n );\n\n // Determine visual states\n const isIndeterminate = checked === 'indeterminate';\n const isChecked = checked === true;\n const showIndicator = isChecked || isIndeterminate;\n\n // Inline styles for CSS variables (matches original implementation)\n const checkboxStyles: React.CSSProperties = {\n background: showIndicator ? 'var(--checkbox-checked-bg)' : 'var(--checkbox-bg)',\n borderColor: showIndicator ? 'var(--checkbox-checked-bg)' : 'var(--checkbox-border)',\n };\n\n return (\n <label\n className={cn(\n 'inline-flex items-center gap-2 md:gap-2.5',\n disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer',\n className\n )}\n >\n {/* Touch area wrapper - 44px minimum for Apple HIG compliance */}\n <span className=\"inline-flex items-center justify-center min-w-11 min-h-11\">\n <CheckboxPrimitive.Root\n ref={ref}\n data-slot=\"checkbox\"\n checked={checked}\n onCheckedChange={handleCheckedChange}\n disabled={disabled}\n className={cn(\n 'peer relative w-6 h-6 md:w-5 md:h-5 shrink-0',\n 'rounded-md border-2 transition-all duration-300',\n 'flex items-center justify-center',\n // Focus state\n 'focus-visible:outline-none focus-visible:shadow-(--focus-glow)',\n // Hover state\n 'hover:shadow-(--checkbox-glow)',\n // Disabled state\n 'disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:shadow-none'\n )}\n style={checkboxStyles}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"flex items-center justify-center text-current\"\n >\n {isIndeterminate ? (\n <Minus\n className=\"w-3.5 h-3.5 md:w-3 md:h-3\"\n style={{ color: 'var(--text-inverse)' }}\n />\n ) : (\n <Check\n className=\"w-3.5 h-3.5 md:w-3 md:h-3\"\n style={{ color: 'var(--text-inverse)' }}\n />\n )}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n </span>\n {label && (\n <span className=\"text-xs md:text-sm\" style={{ color: 'var(--text-secondary)' }}>\n {label}\n </span>\n )}\n </label>\n );\n});\n\nCheckboxGlass.displayName = 'CheckboxGlass';\n\n/**\n * Checkbox - shadcn/ui compatible alias for CheckboxGlass\n *\n * @example\n * ```tsx\n * import { Checkbox } from 'shadcn-glass-ui'\n *\n * <Checkbox\n * checked={isChecked}\n * onCheckedChange={(checked) => setIsChecked(checked === true)}\n * />\n * ```\n *\n * @since v2.3.0\n */\nexport const Checkbox = CheckboxGlass;\n"
22
21
  }
23
22
  ],
24
23
  "categories": [
@@ -15,7 +15,7 @@
15
15
  {
16
16
  "path": "components/glass/ui/circular-progress-glass.tsx",
17
17
  "type": "registry:component",
18
- "content": "/**\n * CircularProgressGlass Component\n *\n * SVG-based circular progress indicator with:\n * - Determinate and indeterminate variants\n * - Configurable size and thickness\n * - Glow effect with SVG filters\n * - Theme-aware styling\n * - Optional label in center\n * - Gradient colors support\n */\n\nimport { forwardRef, useMemo, useId } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '@/lib/utils';\nimport '@/glass-theme.css';\n\n// ========================================\n// VARIANTS\n// ========================================\n\nconst circularProgressVariants = cva('relative inline-flex items-center justify-center p-4', {\n variants: {\n size: {\n sm: 'w-20 h-20',\n md: 'w-28 h-28',\n lg: 'w-36 h-36',\n xl: 'w-44 h-44',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\n// ========================================\n// TYPES\n// ========================================\n\nexport type CircularProgressGradient = 'violet' | 'blue' | 'cyan' | 'amber' | 'emerald' | 'rose';\n\nexport interface CircularProgressGlassProps\n extends\n Omit<React.HTMLAttributes<HTMLDivElement>, 'children'>,\n VariantProps<typeof circularProgressVariants> {\n /** Progress value (0-100) for determinate variant */\n readonly value?: number;\n /** Variant type */\n readonly variant?: 'determinate' | 'indeterminate';\n /** Stroke width in pixels */\n readonly thickness?: number;\n /** Background track width in pixels */\n readonly trackWidth?: number;\n /** Progress color gradient */\n readonly color?: CircularProgressGradient;\n /** Track color (background circle) */\n readonly trackColor?: string;\n /** Show percentage label in center */\n readonly showLabel?: boolean;\n /** Custom label text (overrides percentage) */\n readonly label?: string;\n /** Custom color for the center label text */\n readonly labelColor?: string;\n /** Show glow effect */\n readonly showGlow?: boolean;\n /** Glow intensity */\n readonly glowIntensity?: 'low' | 'medium' | 'high';\n /** Stroke linecap style */\n readonly strokeLinecap?: 'round' | 'butt' | 'square';\n /** Animation duration in seconds */\n readonly animationDuration?: number;\n}\n\n// ========================================\n// HELPERS\n// ========================================\n\nconst getGradientColors = (gradient: CircularProgressGradient) => {\n const gradients: Record<CircularProgressGradient, { from: string; to: string; glowVar: string }> =\n {\n violet: { from: '#8b5cf6', to: '#a855f7', glowVar: '--progress-glow-violet' },\n blue: { from: '#3b82f6', to: '#60a5fa', glowVar: '--progress-glow-blue' },\n cyan: { from: '#06b6d4', to: '#22d3ee', glowVar: '--progress-glow-cyan' },\n amber: { from: '#f59e0b', to: '#fbbf24', glowVar: '--progress-glow-amber' },\n emerald: { from: '#10b981', to: '#34d399', glowVar: '--progress-glow-emerald' },\n rose: { from: '#f43f5e', to: '#fb7185', glowVar: '--progress-glow-rose' },\n };\n return gradients[gradient];\n};\n\nconst getGlowStdDeviation = (intensity: 'low' | 'medium' | 'high'): number => {\n const intensities = { low: 2, medium: 4, high: 6 };\n return intensities[intensity];\n};\n\n// ========================================\n// COMPONENT\n// ========================================\n\nexport const CircularProgressGlass = forwardRef<HTMLDivElement, CircularProgressGlassProps>(\n (\n {\n className,\n size = 'md',\n value = 0,\n variant = 'determinate',\n thickness = 8,\n trackWidth = 8,\n color = 'violet',\n trackColor = 'oklch(100% 0 0 / 0.1)',\n showLabel = true,\n label,\n labelColor,\n showGlow = true,\n glowIntensity = 'medium',\n strokeLinecap = 'round',\n animationDuration = 1,\n ...props\n },\n ref\n ) => {\n const clampedValue = Math.min(100, Math.max(0, value));\n const gradientColors = getGradientColors(color);\n\n // SVG dimensions\n const sizeMap = { sm: 64, md: 96, lg: 128, xl: 160 };\n const svgSize = sizeMap[size || 'md'];\n const radius = (svgSize - Math.max(thickness, trackWidth)) / 2;\n const circumference = 2 * Math.PI * radius;\n const center = svgSize / 2;\n\n // Calculate stroke dash offset for determinate progress\n const dashOffset = useMemo(() => {\n if (variant === 'indeterminate') return circumference * 0.75;\n return circumference * ((100 - clampedValue) / 100);\n }, [variant, clampedValue, circumference]);\n\n // Generate unique IDs for SVG elements (using useId for stable IDs)\n const uniqueId = useId();\n const gradientId = `circular-gradient-${uniqueId}`;\n const glowId = `circular-glow-${uniqueId}`;\n\n return (\n <div ref={ref} className={cn(circularProgressVariants({ size }), className)} {...props}>\n <svg\n width={svgSize}\n height={svgSize}\n className=\"transform -rotate-90 overflow-visible\"\n aria-hidden=\"true\"\n style={{ overflow: 'visible' }}\n >\n <defs>\n {/* Gradient definition */}\n <linearGradient id={gradientId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor={gradientColors.from} />\n <stop offset=\"100%\" stopColor={gradientColors.to} />\n </linearGradient>\n\n {/* Glow filter */}\n {showGlow && (\n <filter id={glowId}>\n <feGaussianBlur\n stdDeviation={getGlowStdDeviation(glowIntensity)}\n result=\"coloredBlur\"\n />\n <feMerge>\n <feMergeNode in=\"coloredBlur\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n )}\n </defs>\n\n {/* Background track */}\n <circle\n cx={center}\n cy={center}\n r={radius}\n fill=\"none\"\n stroke={trackColor}\n strokeWidth={trackWidth}\n />\n\n {/* Progress circle */}\n <circle\n cx={center}\n cy={center}\n r={radius}\n fill=\"none\"\n stroke={`url(#${gradientId})`}\n strokeWidth={thickness}\n strokeLinecap={strokeLinecap}\n strokeDasharray={circumference}\n strokeDashoffset={dashOffset}\n filter={showGlow ? `url(#${glowId})` : undefined}\n className={cn(\n 'transition-all',\n variant === 'indeterminate' && 'animate-circular-progress-spin'\n )}\n style={{\n transitionDuration: `${animationDuration}s`,\n transitionTimingFunction: 'cubic-bezier(0.4, 0, 0.2, 1)',\n }}\n />\n </svg>\n\n {/* Center label */}\n {showLabel && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <span\n className=\"text-sm font-semibold tabular-nums\"\n style={{ color: labelColor || gradientColors.to }}\n >\n {label || (variant === 'determinate' ? `${clampedValue}%` : '')}\n </span>\n </div>\n )}\n\n {/* Accessibility */}\n <div\n role=\"progressbar\"\n aria-valuenow={variant === 'determinate' ? clampedValue : undefined}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={\n label || (variant === 'determinate' ? `Progress: ${clampedValue}%` : 'Loading progress')\n }\n aria-valuetext={label || (variant === 'determinate' ? `${clampedValue}%` : 'Loading...')}\n className=\"sr-only\"\n >\n {label || (variant === 'determinate' ? `${clampedValue}%` : 'Loading...')}\n </div>\n </div>\n );\n }\n);\n\nCircularProgressGlass.displayName = 'CircularProgressGlass';\n"
18
+ "content": "/**\n * CircularProgressGlass Component\n *\n * SVG-based circular progress indicator with:\n * - Determinate and indeterminate variants\n * - Configurable size and thickness\n * - Glow effect with SVG filters\n * - Theme-aware styling\n * - Optional label in center\n * - Gradient colors support\n */\n\nimport { forwardRef, useMemo, useId } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '@/lib/utils';\nimport '@/glass-theme.css';\n\n// ========================================\n// VARIANTS\n// ========================================\n\nconst circularProgressVariants = cva('relative inline-flex items-center justify-center p-4', {\n variants: {\n size: {\n sm: 'w-20 h-20',\n md: 'w-28 h-28',\n lg: 'w-36 h-36',\n xl: 'w-44 h-44',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\n// ========================================\n// TYPES\n// ========================================\n\nexport type CircularProgressGradient = 'violet' | 'blue' | 'cyan' | 'amber' | 'emerald' | 'rose';\n\nexport interface CircularProgressGlassProps\n extends\n Omit<React.HTMLAttributes<HTMLDivElement>, 'children'>,\n VariantProps<typeof circularProgressVariants> {\n /** Progress value (0-100) for determinate variant */\n readonly value?: number;\n /** Variant type */\n readonly variant?: 'determinate' | 'indeterminate';\n /** Stroke width in pixels */\n readonly thickness?: number;\n /** Background track width in pixels */\n readonly trackWidth?: number;\n /** Progress color gradient */\n readonly color?: CircularProgressGradient;\n /** Track color (background circle) */\n readonly trackColor?: string;\n /** Show percentage label in center */\n readonly showLabel?: boolean;\n /** Custom label text (overrides percentage) */\n readonly label?: string;\n /** Custom color for the center label text */\n readonly labelColor?: string;\n /** Show glow effect */\n readonly showGlow?: boolean;\n /** Glow intensity */\n readonly glowIntensity?: 'low' | 'medium' | 'high';\n /** Stroke linecap style */\n readonly strokeLinecap?: 'round' | 'butt' | 'square';\n /** Animation duration in seconds */\n readonly animationDuration?: number;\n}\n\n// ========================================\n// HELPERS\n// ========================================\n\nconst getGradientColors = (gradient: CircularProgressGradient) => {\n const gradients: Record<CircularProgressGradient, { from: string; to: string; glowVar: string }> =\n {\n violet: { from: '#8b5cf6', to: '#a855f7', glowVar: '--progress-glow-violet' },\n blue: { from: '#3b82f6', to: '#60a5fa', glowVar: '--progress-glow-blue' },\n cyan: { from: '#06b6d4', to: '#22d3ee', glowVar: '--progress-glow-cyan' },\n amber: { from: '#f59e0b', to: '#fbbf24', glowVar: '--progress-glow-amber' },\n emerald: { from: '#10b981', to: '#34d399', glowVar: '--progress-glow-emerald' },\n rose: { from: '#f43f5e', to: '#fb7185', glowVar: '--progress-glow-rose' },\n };\n return gradients[gradient];\n};\n\nconst getGlowStdDeviation = (intensity: 'low' | 'medium' | 'high'): number => {\n const intensities = { low: 2, medium: 4, high: 6 };\n return intensities[intensity];\n};\n\n// ========================================\n// COMPONENT\n// ========================================\n\nexport const CircularProgressGlass = forwardRef<HTMLDivElement, CircularProgressGlassProps>(\n (\n {\n className,\n size = 'md',\n value = 0,\n variant = 'determinate',\n thickness = 8,\n trackWidth = 8,\n color = 'violet',\n trackColor = 'oklch(100% 0 0 / 0.1)',\n showLabel = true,\n label,\n labelColor,\n showGlow = true,\n glowIntensity = 'medium',\n strokeLinecap = 'round',\n animationDuration = 1,\n ...props\n },\n ref\n ) => {\n const clampedValue = Math.min(100, Math.max(0, value));\n const gradientColors = getGradientColors(color);\n\n // SVG dimensions\n const sizeMap = { sm: 64, md: 96, lg: 128, xl: 160 };\n const svgSize = sizeMap[size || 'md'];\n const radius = (svgSize - Math.max(thickness, trackWidth)) / 2;\n const circumference = 2 * Math.PI * radius;\n const center = svgSize / 2;\n\n // Calculate stroke dash offset for determinate progress\n const dashOffset = useMemo(() => {\n if (variant === 'indeterminate') return circumference * 0.75;\n return circumference * ((100 - clampedValue) / 100);\n }, [variant, clampedValue, circumference]);\n\n // Generate unique IDs for SVG elements (using useId for stable IDs)\n const uniqueId = useId();\n const gradientId = `circular-gradient-${uniqueId}`;\n const glowId = `circular-glow-${uniqueId}`;\n\n return (\n <div\n ref={ref}\n data-slot=\"circular-progress\"\n className={cn(circularProgressVariants({ size }), className)}\n {...props}\n >\n <svg\n width={svgSize}\n height={svgSize}\n className=\"transform -rotate-90 overflow-visible\"\n aria-hidden=\"true\"\n style={{ overflow: 'visible' }}\n >\n <defs>\n {/* Gradient definition */}\n <linearGradient id={gradientId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor={gradientColors.from} />\n <stop offset=\"100%\" stopColor={gradientColors.to} />\n </linearGradient>\n\n {/* Glow filter */}\n {showGlow && (\n <filter id={glowId}>\n <feGaussianBlur\n stdDeviation={getGlowStdDeviation(glowIntensity)}\n result=\"coloredBlur\"\n />\n <feMerge>\n <feMergeNode in=\"coloredBlur\" />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n )}\n </defs>\n\n {/* Background track */}\n <circle\n cx={center}\n cy={center}\n r={radius}\n fill=\"none\"\n stroke={trackColor}\n strokeWidth={trackWidth}\n />\n\n {/* Progress circle */}\n <circle\n cx={center}\n cy={center}\n r={radius}\n fill=\"none\"\n stroke={`url(#${gradientId})`}\n strokeWidth={thickness}\n strokeLinecap={strokeLinecap}\n strokeDasharray={circumference}\n strokeDashoffset={dashOffset}\n filter={showGlow ? `url(#${glowId})` : undefined}\n className={cn(\n 'transition-all',\n variant === 'indeterminate' && 'animate-circular-progress-spin'\n )}\n style={{\n transitionDuration: `${animationDuration}s`,\n transitionTimingFunction: 'cubic-bezier(0.4, 0, 0.2, 1)',\n }}\n />\n </svg>\n\n {/* Center label */}\n {showLabel && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <span\n className=\"text-sm font-semibold tabular-nums\"\n style={{ color: labelColor || gradientColors.to }}\n >\n {label || (variant === 'determinate' ? `${clampedValue}%` : '')}\n </span>\n </div>\n )}\n\n {/* Accessibility */}\n <div\n role=\"progressbar\"\n aria-valuenow={variant === 'determinate' ? clampedValue : undefined}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={\n label || (variant === 'determinate' ? `Progress: ${clampedValue}%` : 'Loading progress')\n }\n aria-valuetext={label || (variant === 'determinate' ? `${clampedValue}%` : 'Loading...')}\n className=\"sr-only\"\n >\n {label || (variant === 'determinate' ? `${clampedValue}%` : 'Loading...')}\n </div>\n </div>\n );\n }\n);\n\nCircularProgressGlass.displayName = 'CircularProgressGlass';\n"
19
19
  }
20
20
  ],
21
21
  "categories": [
@@ -16,7 +16,7 @@
16
16
  {
17
17
  "path": "components/glass/ui/dropdown-glass.tsx",
18
18
  "type": "registry:component",
19
- "content": "/**\n * DropdownGlass Component\n *\n * Glass-themed dropdown menu with two APIs:\n *\n * 1. **Simple API** (items prop) - Quick setup for basic menus\n * 2. **Compound API** (DropdownMenuGlass.*) - Full shadcn/ui pattern for complex menus\n *\n * @example Simple API (recommended for basic dropdowns)\n * ```tsx\n * import { DropdownGlass } from '@/components/glass/ui/dropdown-glass';\n *\n * <DropdownGlass\n * trigger={<button><MoreVertical /></button>}\n * items={[\n * { label: 'Edit', icon: Edit, onClick: handleEdit },\n * { divider: true },\n * { label: 'Delete', icon: Trash, onClick: handleDelete, danger: true }\n * ]}\n * />\n * ```\n *\n * @example Compound API (for complex dropdowns)\n * ```tsx\n * import {\n * DropdownMenuGlass,\n * DropdownMenuGlassTrigger,\n * DropdownMenuGlassContent,\n * DropdownMenuGlassItem,\n * DropdownMenuGlassSeparator,\n * } from '@/components/glass/ui/dropdown-menu-glass';\n *\n * <DropdownMenuGlass>\n * <DropdownMenuGlassTrigger asChild>\n * <Button>Open Menu</Button>\n * </DropdownMenuGlassTrigger>\n * <DropdownMenuGlassContent>\n * <DropdownMenuGlassItem>Edit</DropdownMenuGlassItem>\n * <DropdownMenuGlassSeparator />\n * <DropdownMenuGlassItem variant=\"destructive\">Delete</DropdownMenuGlassItem>\n * </DropdownMenuGlassContent>\n * </DropdownMenuGlass>\n * ```\n *\n * @see ./dropdown-menu-glass.tsx for compound component exports\n */\n\n'use client';\n\nimport * as React from 'react';\nimport type { LucideIcon } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { ICON_SIZES } from '@/components/glass/primitives';\nimport {\n DropdownMenuGlass,\n DropdownMenuGlassTrigger,\n DropdownMenuGlassContent,\n DropdownMenuGlassItem,\n DropdownMenuGlassSeparator,\n} from './dropdown-menu-glass';\nimport '@/glass-theme.css';\n\n// ========================================\n// TYPES\n// ========================================\n\nexport interface DropdownItem {\n readonly label?: string;\n readonly icon?: LucideIcon;\n readonly onClick?: () => void;\n readonly danger?: boolean;\n readonly divider?: boolean;\n}\n\n// ========================================\n// PROPS INTERFACE\n// ========================================\n\n/**\n * Props for the DropdownGlass component (Simple API)\n *\n * @accessibility\n * - **Keyboard Navigation:** Arrow keys navigate, Enter/Space activates, Escape closes\n * - **Focus Management:** Focus trapped within menu when open\n * - **Screen Readers:** Uses role=\"menu\" and role=\"menuitem\"\n * - **Touch Targets:** All items meet minimum 44x44px\n */\nexport interface DropdownGlassProps {\n /** Trigger element (button, etc.) */\n readonly trigger: React.ReactNode;\n /** Menu items array */\n readonly items: readonly DropdownItem[];\n /** Dropdown alignment */\n readonly align?: 'left' | 'right';\n /** Additional className */\n readonly className?: string;\n}\n\n// ========================================\n// COMPONENT\n// ========================================\n\n/**\n * DropdownGlass - Simple API wrapper\n *\n * For complex dropdowns with checkboxes, radio groups, sub-menus, etc.,\n * use the compound components from dropdown-menu-glass.tsx directly.\n */\nexport const DropdownGlass = React.forwardRef<HTMLDivElement, DropdownGlassProps>(\n ({ trigger, items, align = 'left', className }, ref) => {\n return (\n <div ref={ref} className={cn('relative inline-block', className)}>\n <DropdownMenuGlass>\n <DropdownMenuGlassTrigger asChild>{trigger}</DropdownMenuGlassTrigger>\n\n <DropdownMenuGlassContent align={align === 'left' ? 'start' : 'end'}>\n {items.map((item, idx) =>\n item.divider ? (\n <DropdownMenuGlassSeparator key={`divider-${idx}`} />\n ) : (\n <DropdownMenuGlassItem\n key={`item-${idx}`}\n variant={item.danger ? 'destructive' : 'default'}\n onSelect={item.onClick}\n >\n {item.icon && (\n <item.icon\n className={cn(\n ICON_SIZES.md,\n 'shrink-0',\n item.danger\n ? 'text-(--alert-danger-text)'\n : 'text-(--dropdown-icon) group-data-highlighted:text-(--dropdown-icon-hover)'\n )}\n />\n )}\n <span className=\"font-medium\">{item.label}</span>\n </DropdownMenuGlassItem>\n )\n )}\n </DropdownMenuGlassContent>\n </DropdownMenuGlass>\n </div>\n );\n }\n);\n\nDropdownGlass.displayName = 'DropdownGlass';\n\n// ========================================\n// RE-EXPORTS (for convenience)\n// ========================================\n\nexport {\n DropdownMenuGlass,\n DropdownMenuGlassTrigger,\n DropdownMenuGlassContent,\n DropdownMenuGlassItem,\n DropdownMenuGlassSeparator,\n} from './dropdown-menu-glass';\n"
19
+ "content": "/**\n * DropdownGlass Component\n *\n * Glass-themed dropdown menu with two APIs:\n *\n * 1. **Simple API** (items prop) - Quick setup for basic menus\n * 2. **Compound API** (DropdownMenuGlass.*) - Full shadcn/ui pattern for complex menus\n *\n * @example Simple API (recommended for basic dropdowns)\n * ```tsx\n * import { DropdownGlass } from '@/components/glass/ui/dropdown-glass';\n *\n * <DropdownGlass\n * trigger={<button><MoreVertical /></button>}\n * items={[\n * { label: 'Edit', icon: Edit, onClick: handleEdit },\n * { divider: true },\n * { label: 'Delete', icon: Trash, onClick: handleDelete, danger: true }\n * ]}\n * />\n * ```\n *\n * @example Compound API (for complex dropdowns)\n * ```tsx\n * import {\n * DropdownMenuGlass,\n * DropdownMenuGlassTrigger,\n * DropdownMenuGlassContent,\n * DropdownMenuGlassItem,\n * DropdownMenuGlassSeparator,\n * } from '@/components/glass/ui/dropdown-menu-glass';\n *\n * <DropdownMenuGlass>\n * <DropdownMenuGlassTrigger asChild>\n * <Button>Open Menu</Button>\n * </DropdownMenuGlassTrigger>\n * <DropdownMenuGlassContent>\n * <DropdownMenuGlassItem>Edit</DropdownMenuGlassItem>\n * <DropdownMenuGlassSeparator />\n * <DropdownMenuGlassItem variant=\"destructive\">Delete</DropdownMenuGlassItem>\n * </DropdownMenuGlassContent>\n * </DropdownMenuGlass>\n * ```\n *\n * @see ./dropdown-menu-glass.tsx for compound component exports\n */\n\n'use client';\n\nimport * as React from 'react';\nimport type { LucideIcon } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { ICON_SIZES } from '@/components/glass/primitives';\nimport {\n DropdownMenuGlass,\n DropdownMenuGlassTrigger,\n DropdownMenuGlassContent,\n DropdownMenuGlassItem,\n DropdownMenuGlassSeparator,\n} from './dropdown-menu-glass';\nimport '@/glass-theme.css';\n\n// ========================================\n// TYPES\n// ========================================\n\nexport interface DropdownItem {\n readonly label?: string;\n readonly icon?: LucideIcon;\n readonly onClick?: () => void;\n readonly danger?: boolean;\n readonly divider?: boolean;\n}\n\n// ========================================\n// PROPS INTERFACE\n// ========================================\n\n/**\n * Props for the DropdownGlass component (Simple API)\n *\n * @accessibility\n * - **Keyboard Navigation:** Arrow keys navigate, Enter/Space activates, Escape closes\n * - **Focus Management:** Focus trapped within menu when open\n * - **Screen Readers:** Uses role=\"menu\" and role=\"menuitem\"\n * - **Touch Targets:** All items meet minimum 44x44px\n */\nexport interface DropdownGlassProps {\n /** Trigger element (button, etc.) */\n readonly trigger: React.ReactNode;\n /** Menu items array */\n readonly items: readonly DropdownItem[];\n /** Dropdown alignment */\n readonly align?: 'left' | 'right';\n /** Additional className */\n readonly className?: string;\n}\n\n// ========================================\n// COMPONENT\n// ========================================\n\n/**\n * DropdownGlass - Simple API wrapper\n *\n * For complex dropdowns with checkboxes, radio groups, sub-menus, etc.,\n * use the compound components from dropdown-menu-glass.tsx directly.\n */\nexport const DropdownGlass = React.forwardRef<HTMLDivElement, DropdownGlassProps>(\n ({ trigger, items, align = 'left', className }, ref) => {\n return (\n <div ref={ref} data-slot=\"dropdown\" className={cn('relative inline-block', className)}>\n <DropdownMenuGlass>\n <DropdownMenuGlassTrigger asChild>{trigger}</DropdownMenuGlassTrigger>\n\n <DropdownMenuGlassContent align={align === 'left' ? 'start' : 'end'}>\n {items.map((item, idx) =>\n item.divider ? (\n <DropdownMenuGlassSeparator key={`divider-${idx}`} />\n ) : (\n <DropdownMenuGlassItem\n key={`item-${idx}`}\n variant={item.danger ? 'destructive' : 'default'}\n onSelect={item.onClick}\n >\n {item.icon && (\n <item.icon\n className={cn(\n ICON_SIZES.md,\n 'shrink-0',\n item.danger\n ? 'text-(--alert-danger-text)'\n : 'text-(--dropdown-icon) group-data-highlighted:text-(--dropdown-icon-hover)'\n )}\n />\n )}\n <span className=\"font-medium\">{item.label}</span>\n </DropdownMenuGlassItem>\n )\n )}\n </DropdownMenuGlassContent>\n </DropdownMenuGlass>\n </div>\n );\n }\n);\n\nDropdownGlass.displayName = 'DropdownGlass';\n\n// ========================================\n// RE-EXPORTS (for convenience)\n// ========================================\n\nexport {\n DropdownMenuGlass,\n DropdownMenuGlassTrigger,\n DropdownMenuGlassContent,\n DropdownMenuGlassItem,\n DropdownMenuGlassSeparator,\n} from './dropdown-menu-glass';\n"
20
20
  }
21
21
  ],
22
22
  "categories": [
@@ -17,7 +17,7 @@
17
17
  {
18
18
  "path": "components/glass/ui/dropdown-menu-glass.tsx",
19
19
  "type": "registry:component",
20
- "content": "/**\n * DropdownMenuGlass - Compound Component\n *\n * Glass-themed dropdown menu following shadcn/ui compound component pattern.\n * Built on Radix UI primitives with unified glass styling.\n *\n * @example Basic usage\n * ```tsx\n * <DropdownMenuGlass>\n * <DropdownMenuGlassTrigger asChild>\n * <Button>Open Menu</Button>\n * </DropdownMenuGlassTrigger>\n * <DropdownMenuGlassContent>\n * <DropdownMenuGlassItem onSelect={() => console.log('Edit')}>\n * <Edit className=\"mr-2 h-4 w-4\" />\n * Edit\n * </DropdownMenuGlassItem>\n * <DropdownMenuGlassSeparator />\n * <DropdownMenuGlassItem variant=\"destructive\">\n * <Trash className=\"mr-2 h-4 w-4\" />\n * Delete\n * </DropdownMenuGlassItem>\n * </DropdownMenuGlassContent>\n * </DropdownMenuGlass>\n * ```\n *\n * @example With labels and groups\n * ```tsx\n * <DropdownMenuGlass>\n * <DropdownMenuGlassTrigger asChild>\n * <Button variant=\"outline\">Options</Button>\n * </DropdownMenuGlassTrigger>\n * <DropdownMenuGlassContent>\n * <DropdownMenuGlassLabel>Actions</DropdownMenuGlassLabel>\n * <DropdownMenuGlassGroup>\n * <DropdownMenuGlassItem>Copy</DropdownMenuGlassItem>\n * <DropdownMenuGlassItem>Paste</DropdownMenuGlassItem>\n * </DropdownMenuGlassGroup>\n * <DropdownMenuGlassSeparator />\n * <DropdownMenuGlassLabel>Danger Zone</DropdownMenuGlassLabel>\n * <DropdownMenuGlassItem variant=\"destructive\">Delete</DropdownMenuGlassItem>\n * </DropdownMenuGlassContent>\n * </DropdownMenuGlass>\n * ```\n *\n * @see https://www.radix-ui.com/primitives/docs/components/dropdown-menu\n */\n\n'use client';\n\nimport * as React from 'react';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport {\n getDropdownContentStyles,\n dropdownContentClasses,\n getDropdownItemClasses,\n dropdownSeparatorClasses,\n dropdownLabelClasses,\n} from '@/lib/variants/dropdown-content-styles';\nimport '@/glass-theme.css';\n\n// ========================================\n// ROOT\n// ========================================\n\nconst DropdownMenuGlass = DropdownMenuPrimitive.Root;\n\n// ========================================\n// TRIGGER\n// ========================================\n\nconst DropdownMenuGlassTrigger = DropdownMenuPrimitive.Trigger;\n\n// ========================================\n// GROUP\n// ========================================\n\nconst DropdownMenuGlassGroup = DropdownMenuPrimitive.Group;\n\n// ========================================\n// PORTAL\n// ========================================\n\nconst DropdownMenuGlassPortal = DropdownMenuPrimitive.Portal;\n\n// ========================================\n// SUB\n// ========================================\n\nconst DropdownMenuGlassSub = DropdownMenuPrimitive.Sub;\n\n// ========================================\n// RADIO GROUP\n// ========================================\n\nconst DropdownMenuGlassRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\n// ========================================\n// SUB TRIGGER\n// ========================================\n\nconst DropdownMenuGlassSubTrigger = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n getDropdownItemClasses(),\n 'data-[state=open]:bg-[var(--dropdown-item-hover)]',\n inset && 'pl-8',\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuGlassSubTrigger.displayName = 'DropdownMenuGlassSubTrigger';\n\n// ========================================\n// SUB CONTENT\n// ========================================\n\nconst DropdownMenuGlassSubContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(dropdownContentClasses, 'p-1.5', className)}\n style={getDropdownContentStyles()}\n {...props}\n />\n));\nDropdownMenuGlassSubContent.displayName = 'DropdownMenuGlassSubContent';\n\n// ========================================\n// CONTENT\n// ========================================\n\nconst DropdownMenuGlassContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 8, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(dropdownContentClasses, 'p-1.5', className)}\n style={getDropdownContentStyles()}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n));\nDropdownMenuGlassContent.displayName = 'DropdownMenuGlassContent';\n\n// ========================================\n// ITEM\n// ========================================\n\nexport interface DropdownMenuGlassItemProps extends React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.Item\n> {\n inset?: boolean;\n variant?: 'default' | 'destructive';\n}\n\nconst DropdownMenuGlassItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Item>,\n DropdownMenuGlassItemProps\n>(({ className, inset, variant = 'default', ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n getDropdownItemClasses({ danger: variant === 'destructive' }),\n inset && 'pl-8',\n className\n )}\n {...props}\n />\n));\nDropdownMenuGlassItem.displayName = 'DropdownMenuGlassItem';\n\n// ========================================\n// CHECKBOX ITEM\n// ========================================\n\nconst DropdownMenuGlassCheckboxItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(getDropdownItemClasses(), 'pl-8 pr-2', className)}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n));\nDropdownMenuGlassCheckboxItem.displayName = 'DropdownMenuGlassCheckboxItem';\n\n// ========================================\n// RADIO ITEM\n// ========================================\n\nconst DropdownMenuGlassRadioItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(getDropdownItemClasses(), 'pl-8 pr-2', className)}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n));\nDropdownMenuGlassRadioItem.displayName = 'DropdownMenuGlassRadioItem';\n\n// ========================================\n// LABEL\n// ========================================\n\nconst DropdownMenuGlassLabel = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(dropdownLabelClasses, inset && 'pl-8', className)}\n {...props}\n />\n));\nDropdownMenuGlassLabel.displayName = 'DropdownMenuGlassLabel';\n\n// ========================================\n// SEPARATOR\n// ========================================\n\nconst DropdownMenuGlassSeparator = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(dropdownSeparatorClasses, '-mx-1 my-1', className)}\n {...props}\n />\n));\nDropdownMenuGlassSeparator.displayName = 'DropdownMenuGlassSeparator';\n\n// ========================================\n// SHORTCUT\n// ========================================\n\nconst DropdownMenuGlassShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn('ml-auto text-xs tracking-widest text-(--text-muted)', className)}\n {...props}\n />\n );\n};\nDropdownMenuGlassShortcut.displayName = 'DropdownMenuGlassShortcut';\n\n// ========================================\n// EXPORTS\n// ========================================\n\nexport {\n DropdownMenuGlass,\n DropdownMenuGlassTrigger,\n DropdownMenuGlassContent,\n DropdownMenuGlassItem,\n DropdownMenuGlassCheckboxItem,\n DropdownMenuGlassRadioItem,\n DropdownMenuGlassLabel,\n DropdownMenuGlassSeparator,\n DropdownMenuGlassShortcut,\n DropdownMenuGlassGroup,\n DropdownMenuGlassPortal,\n DropdownMenuGlassSub,\n DropdownMenuGlassSubContent,\n DropdownMenuGlassSubTrigger,\n DropdownMenuGlassRadioGroup,\n};\n"
20
+ "content": "/**\n * DropdownMenuGlass - Compound Component\n *\n * Glass-themed dropdown menu following shadcn/ui compound component pattern.\n * Built on Radix UI primitives with unified glass styling.\n *\n * @example Basic usage\n * ```tsx\n * <DropdownMenuGlass>\n * <DropdownMenuGlassTrigger asChild>\n * <Button>Open Menu</Button>\n * </DropdownMenuGlassTrigger>\n * <DropdownMenuGlassContent>\n * <DropdownMenuGlassItem onSelect={() => console.log('Edit')}>\n * <Edit className=\"mr-2 h-4 w-4\" />\n * Edit\n * </DropdownMenuGlassItem>\n * <DropdownMenuGlassSeparator />\n * <DropdownMenuGlassItem variant=\"destructive\">\n * <Trash className=\"mr-2 h-4 w-4\" />\n * Delete\n * </DropdownMenuGlassItem>\n * </DropdownMenuGlassContent>\n * </DropdownMenuGlass>\n * ```\n *\n * @example With labels and groups\n * ```tsx\n * <DropdownMenuGlass>\n * <DropdownMenuGlassTrigger asChild>\n * <Button variant=\"outline\">Options</Button>\n * </DropdownMenuGlassTrigger>\n * <DropdownMenuGlassContent>\n * <DropdownMenuGlassLabel>Actions</DropdownMenuGlassLabel>\n * <DropdownMenuGlassGroup>\n * <DropdownMenuGlassItem>Copy</DropdownMenuGlassItem>\n * <DropdownMenuGlassItem>Paste</DropdownMenuGlassItem>\n * </DropdownMenuGlassGroup>\n * <DropdownMenuGlassSeparator />\n * <DropdownMenuGlassLabel>Danger Zone</DropdownMenuGlassLabel>\n * <DropdownMenuGlassItem variant=\"destructive\">Delete</DropdownMenuGlassItem>\n * </DropdownMenuGlassContent>\n * </DropdownMenuGlass>\n * ```\n *\n * @see https://www.radix-ui.com/primitives/docs/components/dropdown-menu\n */\n\n'use client';\n\nimport * as React from 'react';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport {\n getDropdownContentStyles,\n dropdownContentClasses,\n getDropdownItemClasses,\n dropdownSeparatorClasses,\n dropdownLabelClasses,\n} from '@/lib/variants/dropdown-content-styles';\nimport '@/glass-theme.css';\n\n// ========================================\n// ROOT\n// ========================================\n\n// Note: DropdownMenuPrimitive.Root is a context provider and doesn't render DOM,\n// so data-slot is applied to Content instead. This matches shadcn/ui pattern.\nconst DropdownMenuGlassRoot = (\n props: React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Root>\n) => <DropdownMenuPrimitive.Root {...props} />;\nDropdownMenuGlassRoot.displayName = 'DropdownMenuGlass';\n\nconst DropdownMenuGlass = DropdownMenuGlassRoot;\n\n// ========================================\n// TRIGGER\n// ========================================\n\nconst DropdownMenuGlassTrigger = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Trigger>\n>((props, ref) => (\n <DropdownMenuPrimitive.Trigger data-slot=\"dropdown-menu-trigger\" ref={ref} {...props} />\n));\nDropdownMenuGlassTrigger.displayName = 'DropdownMenuGlassTrigger';\n\n// ========================================\n// GROUP\n// ========================================\n\nconst DropdownMenuGlassGroup = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Group>\n>((props, ref) => (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" ref={ref} {...props} />\n));\nDropdownMenuGlassGroup.displayName = 'DropdownMenuGlassGroup';\n\n// ========================================\n// PORTAL\n// ========================================\n\nconst DropdownMenuGlassPortal = DropdownMenuPrimitive.Portal;\n\n// ========================================\n// SUB\n// ========================================\n\n// Note: DropdownMenuPrimitive.Sub is a context provider and doesn't render DOM,\n// so data-slot is applied to SubContent instead. This matches shadcn/ui pattern.\nconst DropdownMenuGlassSub = (\n props: React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Sub>\n) => <DropdownMenuPrimitive.Sub {...props} />;\nDropdownMenuGlassSub.displayName = 'DropdownMenuGlassSub';\n\n// ========================================\n// RADIO GROUP\n// ========================================\n\nconst DropdownMenuGlassRadioGroup = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.RadioGroup>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioGroup>\n>((props, ref) => (\n <DropdownMenuPrimitive.RadioGroup data-slot=\"dropdown-menu-radio-group\" ref={ref} {...props} />\n));\nDropdownMenuGlassRadioGroup.displayName = 'DropdownMenuGlassRadioGroup';\n\n// ========================================\n// SUB TRIGGER\n// ========================================\n\nconst DropdownMenuGlassSubTrigger = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n data-slot=\"dropdown-menu-sub-trigger\"\n className={cn(\n getDropdownItemClasses(),\n 'data-[state=open]:bg-[var(--dropdown-item-hover)]',\n inset && 'pl-8',\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuGlassSubTrigger.displayName = 'DropdownMenuGlassSubTrigger';\n\n// ========================================\n// SUB CONTENT\n// ========================================\n\nconst DropdownMenuGlassSubContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(dropdownContentClasses, 'p-1.5', className)}\n style={getDropdownContentStyles()}\n {...props}\n />\n));\nDropdownMenuGlassSubContent.displayName = 'DropdownMenuGlassSubContent';\n\n// ========================================\n// CONTENT\n// ========================================\n\nconst DropdownMenuGlassContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 8, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(dropdownContentClasses, 'p-1.5', className)}\n style={getDropdownContentStyles()}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n));\nDropdownMenuGlassContent.displayName = 'DropdownMenuGlassContent';\n\n// ========================================\n// ITEM\n// ========================================\n\nexport interface DropdownMenuGlassItemProps extends React.ComponentPropsWithoutRef<\n typeof DropdownMenuPrimitive.Item\n> {\n inset?: boolean;\n variant?: 'default' | 'destructive';\n}\n\nconst DropdownMenuGlassItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Item>,\n DropdownMenuGlassItemProps\n>(({ className, inset, variant = 'default', ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n data-slot=\"dropdown-menu-item\"\n className={cn(\n getDropdownItemClasses({ danger: variant === 'destructive' }),\n inset && 'pl-8',\n className\n )}\n {...props}\n />\n));\nDropdownMenuGlassItem.displayName = 'DropdownMenuGlassItem';\n\n// ========================================\n// CHECKBOX ITEM\n// ========================================\n\nconst DropdownMenuGlassCheckboxItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(getDropdownItemClasses(), 'pl-8 pr-2', className)}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n));\nDropdownMenuGlassCheckboxItem.displayName = 'DropdownMenuGlassCheckboxItem';\n\n// ========================================\n// RADIO ITEM\n// ========================================\n\nconst DropdownMenuGlassRadioItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(getDropdownItemClasses(), 'pl-8 pr-2', className)}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n));\nDropdownMenuGlassRadioItem.displayName = 'DropdownMenuGlassRadioItem';\n\n// ========================================\n// LABEL\n// ========================================\n\nconst DropdownMenuGlassLabel = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n data-slot=\"dropdown-menu-label\"\n className={cn(dropdownLabelClasses, inset && 'pl-8', className)}\n {...props}\n />\n));\nDropdownMenuGlassLabel.displayName = 'DropdownMenuGlassLabel';\n\n// ========================================\n// SEPARATOR\n// ========================================\n\nconst DropdownMenuGlassSeparator = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n data-slot=\"dropdown-menu-separator\"\n className={cn(dropdownSeparatorClasses, '-mx-1 my-1', className)}\n {...props}\n />\n));\nDropdownMenuGlassSeparator.displayName = 'DropdownMenuGlassSeparator';\n\n// ========================================\n// SHORTCUT\n// ========================================\n\nconst DropdownMenuGlassShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn('ml-auto text-xs tracking-widest text-(--text-muted)', className)}\n {...props}\n />\n );\n};\nDropdownMenuGlassShortcut.displayName = 'DropdownMenuGlassShortcut';\n\n// ========================================\n// EXPORTS\n// ========================================\n\nexport {\n DropdownMenuGlass,\n DropdownMenuGlassTrigger,\n DropdownMenuGlassContent,\n DropdownMenuGlassItem,\n DropdownMenuGlassCheckboxItem,\n DropdownMenuGlassRadioItem,\n DropdownMenuGlassLabel,\n DropdownMenuGlassSeparator,\n DropdownMenuGlassShortcut,\n DropdownMenuGlassGroup,\n DropdownMenuGlassPortal,\n DropdownMenuGlassSub,\n DropdownMenuGlassSubContent,\n DropdownMenuGlassSubTrigger,\n DropdownMenuGlassRadioGroup,\n};\n"
21
21
  }
22
22
  ],
23
23
  "categories": [
@@ -14,7 +14,7 @@
14
14
  {
15
15
  "path": "components/glass/specialized/flag-alert-glass.tsx",
16
16
  "type": "registry:component",
17
- "content": "// ========================================\n// FLAG ALERT GLASS COMPONENT\n// Individual warning/danger flag alert\n// ========================================\n\nimport { forwardRef, useState, type CSSProperties } from 'react';\nimport { cn } from '@/lib/utils';\nimport { StatusIndicatorGlass, type StatusType } from './status-indicator-glass';\nimport '@/glass-theme.css';\n\nexport type FlagType = 'warning' | 'danger';\n\nexport interface FlagAlertGlassProps extends React.HTMLAttributes<HTMLDivElement> {\n readonly type?: FlagType;\n readonly title: string;\n readonly description?: string;\n}\n\n// CSS variable maps for flag types\nconst flagVarMap: Record<\n FlagType,\n { bg: string; border: string; text: string; statusType: StatusType }\n> = {\n danger: {\n bg: 'var(--alert-danger-bg)',\n border: 'var(--alert-danger-border)',\n text: 'var(--alert-danger-text)',\n statusType: 'red',\n },\n warning: {\n bg: 'var(--alert-warning-bg)',\n border: 'var(--alert-warning-border)',\n text: 'var(--alert-warning-text)',\n statusType: 'yellow',\n },\n};\n\nexport const FlagAlertGlass = forwardRef<HTMLDivElement, FlagAlertGlassProps>(\n ({ type = 'warning', title, description, className, ...props }, ref) => {\n const [isHovered, setIsHovered] = useState(false);\n const config = flagVarMap[type];\n\n const alertStyles: CSSProperties = {\n background: config.bg,\n borderColor: config.border,\n transform: isHovered ? 'translateX(4px)' : 'translateX(0)',\n };\n\n return (\n <div\n ref={ref}\n className={cn('p-2.5 md:p-3 rounded-xl border transition-all duration-300', className)}\n style={alertStyles}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n role=\"alert\"\n {...props}\n >\n <div\n className=\"flex items-center gap-1.5 md:gap-2 font-medium text-xs md:text-sm\"\n style={{ color: config.text }}\n >\n <StatusIndicatorGlass type={config.statusType} />\n {title}\n </div>\n {description && (\n <p className=\"text-(length:--font-size-2xs) md:text-xs mt-0.5 md:mt-1 ml-4 md:ml-5 text-(--text-muted)\">\n {description}\n </p>\n )}\n </div>\n );\n }\n);\n\nFlagAlertGlass.displayName = 'FlagAlertGlass';\n"
17
+ "content": "// ========================================\n// FLAG ALERT GLASS COMPONENT\n// Individual warning/danger flag alert\n// ========================================\n\nimport { forwardRef, useState, type CSSProperties } from 'react';\nimport { cn } from '@/lib/utils';\nimport { StatusIndicatorGlass, type StatusType } from './status-indicator-glass';\nimport '@/glass-theme.css';\n\nexport type FlagType = 'warning' | 'danger';\n\nexport interface FlagAlertGlassProps extends React.HTMLAttributes<HTMLDivElement> {\n readonly type?: FlagType;\n readonly title: string;\n readonly description?: string;\n}\n\n// CSS variable maps for flag types\nconst flagVarMap: Record<\n FlagType,\n { bg: string; border: string; text: string; statusType: StatusType }\n> = {\n danger: {\n bg: 'var(--alert-danger-bg)',\n border: 'var(--alert-danger-border)',\n text: 'var(--alert-danger-text)',\n statusType: 'red',\n },\n warning: {\n bg: 'var(--alert-warning-bg)',\n border: 'var(--alert-warning-border)',\n text: 'var(--alert-warning-text)',\n statusType: 'yellow',\n },\n};\n\nexport const FlagAlertGlass = forwardRef<HTMLDivElement, FlagAlertGlassProps>(\n ({ type = 'warning', title, description, className, ...props }, ref) => {\n const [isHovered, setIsHovered] = useState(false);\n const config = flagVarMap[type];\n\n const alertStyles: CSSProperties = {\n background: config.bg,\n borderColor: config.border,\n transform: isHovered ? 'translateX(4px)' : 'translateX(0)',\n };\n\n return (\n <div\n ref={ref}\n className={cn(\n 'p-2.5 md:p-3 rounded-xl border transition-all duration-300 max-w-md',\n className\n )}\n style={alertStyles}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n role=\"alert\"\n {...props}\n >\n <div\n className=\"flex items-center gap-1.5 md:gap-2 font-medium text-xs md:text-sm\"\n style={{ color: config.text }}\n >\n <StatusIndicatorGlass type={config.statusType} />\n {title}\n </div>\n {description && (\n <p className=\"text-(length:--font-size-2xs) md:text-xs mt-0.5 md:mt-1 ml-4 md:ml-5 text-(--text-muted)\">\n {description}\n </p>\n )}\n </div>\n );\n }\n);\n\nFlagAlertGlass.displayName = 'FlagAlertGlass';\n"
18
18
  }
19
19
  ],
20
20
  "categories": [
@@ -6,7 +6,8 @@
6
6
  "description": "Glass-themed container with:",
7
7
  "dependencies": [
8
8
  "@radix-ui/react-slot",
9
- "class-variance-authority"
9
+ "class-variance-authority",
10
+ "react"
10
11
  ],
11
12
  "registryDependencies": [
12
13
  "cn",
@@ -17,7 +18,7 @@
17
18
  {
18
19
  "path": "components/glass/ui/glass-card.tsx",
19
20
  "type": "registry:component",
20
- "content": "/**\n * GlassCard Component\n *\n * Glass-themed container with:\n * - Theme-aware styling (glass/light/aurora)\n * - Configurable blur intensity\n * - Optional glow effects\n * - Hover animations\n */\n\nimport {\n forwardRef,\n type ReactNode,\n type CSSProperties,\n} from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { type VariantProps } from 'class-variance-authority';\nimport { cn } from '@/lib/utils';\nimport { useHover } from '@/lib/hooks/use-hover';\nimport { cardIntensity } from '@/lib/variants/glass-card-variants';\nimport '@/glass-theme.css';\n\nimport type { GlowType, IntensityType, PaddingType } from '@/lib/variants/glass-card-variants';\n\n// ========================================\n// BLUR MAP\n// ========================================\n// Per UI_DESIGN.md design tokens:\n// - subtle: 8px (--glass-blur-sm) - light glass effect\n// - medium: 16px (--glass-blur-md) - standard cards (was 12px - breaking change)\n// - strong: 24px (--glass-blur-lg) - featured cards (was 16px - breaking change)\n\nconst blurMap: Record<IntensityType, string> = {\n subtle: 'var(--blur-sm)', // 8px\n medium: 'var(--blur-md)', // 16px (BREAKING: was 12px)\n strong: 'var(--blur-lg)', // 24px (BREAKING: was 16px)\n};\n\n// ========================================\n// PROPS INTERFACE\n// ========================================\n\n/**\n * Props for the GlassCard component\n *\n * A glass-themed container with configurable blur, glow effects, and hover animations.\n * Features polymorphic rendering via `asChild` for semantic HTML flexibility.\n *\n * @accessibility\n * - **Keyboard Navigation:** When used with `asChild` as a link/button, inherits native keyboard support (Enter/Space activation)\n * - **Focus Management:** Focus ring applied to child element when using `asChild` pattern with interactive elements\n * - **Screen Readers:** Semantic HTML preserved via `asChild` - use appropriate elements (`<a>`, `<button>`, `<article>`)\n * - **Hover State:** Hover effects are purely visual and do not affect functionality (progressive enhancement)\n * - **Touch Targets:** When interactive, ensure child element meets minimum 44x44px touch target (WCAG 2.5.5)\n * - **Color Contrast:** Card border and background meet WCAG AA contrast requirements, content contrast is consumer's responsibility\n * - **Motion:** Hover scale animation respects `prefers-reduced-motion` settings via CSS transitions\n *\n * @example\n * ```tsx\n * // Basic card\n * <GlassCard intensity=\"medium\">Content</GlassCard>\n *\n * // As a clickable link with accessible name\n * <GlassCard asChild intensity=\"medium\">\n * <a href=\"/details\" aria-label=\"View product details\">\n * <h3>Product Title</h3>\n * <p>Description</p>\n * </a>\n * </GlassCard>\n *\n * // Different intensity levels\n * <GlassCard intensity=\"subtle\">Subtle blur</GlassCard>\n * <GlassCard intensity=\"medium\">Standard blur</GlassCard>\n * <GlassCard intensity=\"strong\">Heavy blur</GlassCard>\n *\n * // With glow effects\n * <GlassCard glow=\"blue\">Blue glow card</GlassCard>\n * <GlassCard glow=\"violet\">Violet glow card</GlassCard>\n * <GlassCard glow=\"cyan\">Cyan glow card</GlassCard>\n *\n * // As a button (interactive) with role\n * <GlassCard asChild hover intensity=\"medium\">\n * <button onClick={handleClick} aria-label=\"Open settings\">\n * <Settings className=\"w-6 h-6\" />\n * <span>Settings</span>\n * </button>\n * </GlassCard>\n *\n * // Article card with semantic HTML\n * <GlassCard asChild intensity=\"medium\" padding=\"lg\">\n * <article>\n * <header><h2>Article Title</h2></header>\n * <p>Article content...</p>\n * <footer>Published: Jan 1, 2025</footer>\n * </article>\n * </GlassCard>\n * ```\n */\nexport interface GlassCardProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'style'>,\n VariantProps<typeof cardIntensity> {\n /**\n * Render as child element instead of div (polymorphic rendering).\n * Useful for making cards clickable links or custom interactive elements.\n * @default false\n * @example\n * ```tsx\n * <GlassCard asChild>\n * <a href=\"/article\">Article Content</a>\n * </GlassCard>\n * ```\n */\n readonly asChild?: boolean;\n\n readonly children: ReactNode;\n readonly glow?: GlowType;\n readonly padding?: PaddingType;\n}\n\n// ========================================\n// COMPONENT\n// ========================================\n\n// CSS variable maps for intensity\nconst bgVarMap: Record<IntensityType, string> = {\n subtle: 'var(--card-subtle-bg)',\n medium: 'var(--card-medium-bg)',\n strong: 'var(--card-strong-bg)',\n};\n\nconst borderVarMap: Record<IntensityType, string> = {\n subtle: 'var(--card-subtle-border)',\n medium: 'var(--card-medium-border)',\n strong: 'var(--card-strong-border)',\n};\n\nconst glowVarMap: Record<string, string> = {\n blue: 'var(--glow-blue)',\n violet: 'var(--glow-violet)',\n purple: 'var(--glow-violet)',\n cyan: 'var(--glow-cyan)',\n};\n\nexport const GlassCard = forwardRef<HTMLDivElement, GlassCardProps>(\n (\n {\n asChild = false,\n children,\n className,\n intensity = 'medium',\n glow = null,\n hover = true,\n padding = 'default',\n ...props\n },\n ref\n ) => {\n const { isHovered, hoverProps } = useHover();\n const intensityVal = intensity ?? 'medium';\n\n const cardStyles: CSSProperties = {\n background: isHovered && hover ? 'var(--card-hover-bg)' : bgVarMap[intensityVal],\n borderColor: isHovered && hover ? 'var(--card-hover-border)' : borderVarMap[intensityVal],\n backdropFilter: `blur(${blurMap[intensityVal]})`,\n WebkitBackdropFilter: `blur(${blurMap[intensityVal]})`,\n boxShadow: glow\n ? glowVarMap[glow]\n : isHovered && hover\n ? 'var(--card-hover-glow)'\n : 'var(--glow-neutral)',\n };\n\n // Polymorphic component - render as Slot when asChild is true\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp\n ref={ref}\n className={cn(cardIntensity({ intensity, hover, padding }), className)}\n style={cardStyles}\n onMouseEnter={hoverProps.onMouseEnter}\n onMouseLeave={hoverProps.onMouseLeave}\n {...props}\n >\n {children}\n </Comp>\n );\n }\n);\n\nGlassCard.displayName = 'GlassCard';\n"
21
+ "content": "/**\n * GlassCard Component\n *\n * Glass-themed container with:\n * - Theme-aware styling (glass/light/aurora)\n * - Configurable blur intensity\n * - Optional glow effects\n * - Hover animations\n */\n\nimport { forwardRef, type ReactNode, type CSSProperties } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { type VariantProps } from 'class-variance-authority';\nimport { cn } from '@/lib/utils';\nimport { useHover } from '@/lib/hooks/use-hover';\nimport { cardIntensity } from '@/lib/variants/glass-card-variants';\nimport '@/glass-theme.css';\n\nimport type { GlowType, IntensityType, PaddingType } from '@/lib/variants/glass-card-variants';\n\n// ========================================\n// BLUR MAP\n// ========================================\n// Per UI_DESIGN.md design tokens:\n// - subtle: 8px (--glass-blur-sm) - light glass effect\n// - medium: 16px (--glass-blur-md) - standard cards (was 12px - breaking change)\n// - strong: 24px (--glass-blur-lg) - featured cards (was 16px - breaking change)\n\nconst blurMap: Record<IntensityType, string> = {\n subtle: 'var(--blur-sm)', // 8px\n medium: 'var(--blur-md)', // 16px (BREAKING: was 12px)\n strong: 'var(--blur-lg)', // 24px (BREAKING: was 16px)\n};\n\n// ========================================\n// PROPS INTERFACE\n// ========================================\n\n/**\n * Props for the GlassCard component\n *\n * A glass-themed container with configurable blur, glow effects, and hover animations.\n * Features polymorphic rendering via `asChild` for semantic HTML flexibility.\n *\n * @accessibility\n * - **Keyboard Navigation:** When used with `asChild` as a link/button, inherits native keyboard support (Enter/Space activation)\n * - **Focus Management:** Focus ring applied to child element when using `asChild` pattern with interactive elements\n * - **Screen Readers:** Semantic HTML preserved via `asChild` - use appropriate elements (`<a>`, `<button>`, `<article>`)\n * - **Hover State:** Hover effects are purely visual and do not affect functionality (progressive enhancement)\n * - **Touch Targets:** When interactive, ensure child element meets minimum 44x44px touch target (WCAG 2.5.5)\n * - **Color Contrast:** Card border and background meet WCAG AA contrast requirements, content contrast is consumer's responsibility\n * - **Motion:** Hover scale animation respects `prefers-reduced-motion` settings via CSS transitions\n *\n * @example\n * ```tsx\n * // Basic card\n * <GlassCard intensity=\"medium\">Content</GlassCard>\n *\n * // As a clickable link with accessible name\n * <GlassCard asChild intensity=\"medium\">\n * <a href=\"/details\" aria-label=\"View product details\">\n * <h3>Product Title</h3>\n * <p>Description</p>\n * </a>\n * </GlassCard>\n *\n * // Different intensity levels\n * <GlassCard intensity=\"subtle\">Subtle blur</GlassCard>\n * <GlassCard intensity=\"medium\">Standard blur</GlassCard>\n * <GlassCard intensity=\"strong\">Heavy blur</GlassCard>\n *\n * // With glow effects\n * <GlassCard glow=\"blue\">Blue glow card</GlassCard>\n * <GlassCard glow=\"violet\">Violet glow card</GlassCard>\n * <GlassCard glow=\"cyan\">Cyan glow card</GlassCard>\n *\n * // As a button (interactive) with role\n * <GlassCard asChild hover intensity=\"medium\">\n * <button onClick={handleClick} aria-label=\"Open settings\">\n * <Settings className=\"w-6 h-6\" />\n * <span>Settings</span>\n * </button>\n * </GlassCard>\n *\n * // Article card with semantic HTML\n * <GlassCard asChild intensity=\"medium\" padding=\"lg\">\n * <article>\n * <header><h2>Article Title</h2></header>\n * <p>Article content...</p>\n * <footer>Published: Jan 1, 2025</footer>\n * </article>\n * </GlassCard>\n * ```\n */\nexport interface GlassCardProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'style'>, VariantProps<typeof cardIntensity> {\n /**\n * Render as child element instead of div (polymorphic rendering).\n * Useful for making cards clickable links or custom interactive elements.\n * @default false\n * @example\n * ```tsx\n * <GlassCard asChild>\n * <a href=\"/article\">Article Content</a>\n * </GlassCard>\n * ```\n */\n readonly asChild?: boolean;\n\n readonly children: ReactNode;\n readonly glow?: GlowType;\n readonly padding?: PaddingType;\n}\n\n// ========================================\n// COMPONENT\n// ========================================\n\n// CSS variable maps for intensity\nconst bgVarMap: Record<IntensityType, string> = {\n subtle: 'var(--card-subtle-bg)',\n medium: 'var(--card-medium-bg)',\n strong: 'var(--card-strong-bg)',\n};\n\nconst borderVarMap: Record<IntensityType, string> = {\n subtle: 'var(--card-subtle-border)',\n medium: 'var(--card-medium-border)',\n strong: 'var(--card-strong-border)',\n};\n\nconst glowVarMap: Record<string, string> = {\n blue: 'var(--glow-blue)',\n violet: 'var(--glow-violet)',\n purple: 'var(--glow-violet)',\n cyan: 'var(--glow-cyan)',\n};\n\nexport const GlassCard = forwardRef<HTMLDivElement, GlassCardProps>(\n (\n {\n asChild = false,\n children,\n className,\n intensity = 'medium',\n glow = null,\n hover = true,\n padding = 'default',\n ...props\n },\n ref\n ) => {\n const { isHovered, hoverProps } = useHover();\n const intensityVal = intensity ?? 'medium';\n\n const cardStyles: CSSProperties = {\n background: isHovered && hover ? 'var(--card-hover-bg)' : bgVarMap[intensityVal],\n borderColor: isHovered && hover ? 'var(--card-hover-border)' : borderVarMap[intensityVal],\n backdropFilter: `blur(${blurMap[intensityVal]})`,\n WebkitBackdropFilter: `blur(${blurMap[intensityVal]})`,\n boxShadow: glow\n ? glowVarMap[glow]\n : isHovered && hover\n ? 'var(--card-hover-glow)'\n : 'var(--glow-neutral)',\n };\n\n // Polymorphic component - render as Slot when asChild is true\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp\n ref={ref}\n data-slot=\"card\"\n className={cn(cardIntensity({ intensity, hover, padding }), className)}\n style={cardStyles}\n onMouseEnter={hoverProps.onMouseEnter}\n onMouseLeave={hoverProps.onMouseLeave}\n {...props}\n >\n {children}\n </Comp>\n );\n }\n);\n\nGlassCard.displayName = 'GlassCard';\n"
21
22
  }
22
23
  ],
23
24
  "categories": [