shadcn-glass-ui 2.2.3 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. package/CHANGELOG.md +57 -1
  2. package/dist/cli/commands/info.d.ts +15 -0
  3. package/dist/cli/commands/info.d.ts.map +1 -0
  4. package/dist/cli/commands/list.d.ts +23 -0
  5. package/dist/cli/commands/list.d.ts.map +1 -0
  6. package/dist/cli/index.cjs +1 -1
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/{index.js → index.mjs} +1 -1
  9. package/dist/cli/index.mjs.map +1 -0
  10. package/dist/cli/utils/format.d.ts +76 -0
  11. package/dist/cli/utils/format.d.ts.map +1 -0
  12. package/dist/cli/utils/fuzzy-search.d.ts +73 -0
  13. package/dist/cli/utils/fuzzy-search.d.ts.map +1 -0
  14. package/dist/cli/utils/load-exports.d.ts +141 -0
  15. package/dist/cli/utils/load-exports.d.ts.map +1 -0
  16. package/dist/components/blocks/avatar-gallery/index.d.ts +2 -0
  17. package/dist/components/blocks/avatar-gallery/index.d.ts.map +1 -0
  18. package/dist/components/blocks/avatar-gallery/page.d.ts +7 -0
  19. package/dist/components/blocks/avatar-gallery/page.d.ts.map +1 -0
  20. package/dist/components/blocks/badges/index.d.ts +2 -0
  21. package/dist/components/blocks/badges/index.d.ts.map +1 -0
  22. package/dist/components/blocks/badges/page.d.ts +7 -0
  23. package/dist/components/blocks/badges/page.d.ts.map +1 -0
  24. package/dist/components/blocks/buttons/index.d.ts +2 -0
  25. package/dist/components/blocks/buttons/index.d.ts.map +1 -0
  26. package/dist/components/blocks/buttons/page.d.ts +7 -0
  27. package/dist/components/blocks/buttons/page.d.ts.map +1 -0
  28. package/dist/components/blocks/form-elements/index.d.ts +2 -0
  29. package/dist/components/blocks/form-elements/index.d.ts.map +1 -0
  30. package/dist/components/blocks/form-elements/page.d.ts +7 -0
  31. package/dist/components/blocks/form-elements/page.d.ts.map +1 -0
  32. package/dist/components/blocks/index.d.ts +14 -0
  33. package/dist/components/blocks/index.d.ts.map +1 -0
  34. package/dist/components/blocks/notifications/index.d.ts +2 -0
  35. package/dist/components/blocks/notifications/index.d.ts.map +1 -0
  36. package/dist/components/blocks/notifications/page.d.ts +7 -0
  37. package/dist/components/blocks/notifications/page.d.ts.map +1 -0
  38. package/dist/components/blocks/progress/index.d.ts +2 -0
  39. package/dist/components/blocks/progress/index.d.ts.map +1 -0
  40. package/dist/components/blocks/progress/page.d.ts +7 -0
  41. package/dist/components/blocks/progress/page.d.ts.map +1 -0
  42. package/dist/components/blocks/registry.d.ts +16 -0
  43. package/dist/components/blocks/registry.d.ts.map +1 -0
  44. package/dist/components/demos/AnimatedBackground.d.ts +5 -0
  45. package/dist/components/demos/AnimatedBackground.d.ts.map +1 -0
  46. package/dist/components/demos/ComponentShowcase.d.ts +6 -0
  47. package/dist/components/demos/ComponentShowcase.d.ts.map +1 -0
  48. package/dist/components/demos/DesktopShowcase.d.ts +3 -0
  49. package/dist/components/demos/DesktopShowcase.d.ts.map +1 -0
  50. package/dist/components/demos/GlassFixesDemo.d.ts +6 -0
  51. package/dist/components/demos/GlassFixesDemo.d.ts.map +1 -0
  52. package/dist/components/demos/MobileShowcase.d.ts +3 -0
  53. package/dist/components/demos/MobileShowcase.d.ts.map +1 -0
  54. package/dist/components/glass/atomic/expandable-header-glass.d.ts +16 -0
  55. package/dist/components/glass/atomic/expandable-header-glass.d.ts.map +1 -0
  56. package/dist/components/glass/atomic/icon-button-glass.d.ts +18 -0
  57. package/dist/components/glass/atomic/icon-button-glass.d.ts.map +1 -0
  58. package/dist/components/glass/atomic/index.d.ts +14 -0
  59. package/dist/components/glass/atomic/index.d.ts.map +1 -0
  60. package/dist/components/glass/atomic/insight-card-glass.d.ts +22 -0
  61. package/dist/components/glass/atomic/insight-card-glass.d.ts.map +1 -0
  62. package/dist/components/glass/atomic/search-box-glass.d.ts +17 -0
  63. package/dist/components/glass/atomic/search-box-glass.d.ts.map +1 -0
  64. package/dist/components/glass/atomic/sort-dropdown-glass.d.ts +38 -0
  65. package/dist/components/glass/atomic/sort-dropdown-glass.d.ts.map +1 -0
  66. package/dist/components/glass/atomic/stat-item-glass.d.ts +22 -0
  67. package/dist/components/glass/atomic/stat-item-glass.d.ts.map +1 -0
  68. package/dist/components/glass/atomic/theme-toggle-glass.d.ts +11 -0
  69. package/dist/components/glass/atomic/theme-toggle-glass.d.ts.map +1 -0
  70. package/dist/components/glass/composite/ai-card-glass.d.ts +7 -0
  71. package/dist/components/glass/composite/ai-card-glass.d.ts.map +1 -0
  72. package/dist/components/glass/composite/career-stats-header-glass.d.ts +15 -0
  73. package/dist/components/glass/composite/career-stats-header-glass.d.ts.map +1 -0
  74. package/dist/components/glass/composite/circular-metric-glass.d.ts +24 -0
  75. package/dist/components/glass/composite/circular-metric-glass.d.ts.map +1 -0
  76. package/dist/components/glass/composite/contribution-metrics-glass.d.ts +15 -0
  77. package/dist/components/glass/composite/contribution-metrics-glass.d.ts.map +1 -0
  78. package/dist/components/glass/composite/index.d.ts +22 -0
  79. package/dist/components/glass/composite/index.d.ts.map +1 -0
  80. package/dist/components/glass/composite/metric-card-glass.d.ts +96 -0
  81. package/dist/components/glass/composite/metric-card-glass.d.ts.map +1 -0
  82. package/dist/components/glass/composite/metrics-grid-glass.d.ts +17 -0
  83. package/dist/components/glass/composite/metrics-grid-glass.d.ts.map +1 -0
  84. package/dist/components/glass/composite/repository-card-glass.d.ts +16 -0
  85. package/dist/components/glass/composite/repository-card-glass.d.ts.map +1 -0
  86. package/dist/components/glass/composite/repository-header-glass.d.ts +16 -0
  87. package/dist/components/glass/composite/repository-header-glass.d.ts.map +1 -0
  88. package/dist/components/glass/composite/repository-metadata-glass.d.ts +13 -0
  89. package/dist/components/glass/composite/repository-metadata-glass.d.ts.map +1 -0
  90. package/dist/components/glass/composite/split-layout-glass/index.d.ts +16 -0
  91. package/dist/components/glass/composite/split-layout-glass/index.d.ts.map +1 -0
  92. package/dist/components/glass/composite/split-layout-glass/split-layout-accordion.d.ts +66 -0
  93. package/dist/components/glass/composite/split-layout-glass/split-layout-accordion.d.ts.map +1 -0
  94. package/dist/components/glass/composite/split-layout-glass/split-layout-context.d.ts +122 -0
  95. package/dist/components/glass/composite/split-layout-glass/split-layout-context.d.ts.map +1 -0
  96. package/dist/components/glass/composite/split-layout-glass/split-layout-glass.d.ts +177 -0
  97. package/dist/components/glass/composite/split-layout-glass/split-layout-glass.d.ts.map +1 -0
  98. package/dist/components/glass/composite/trust-score-display-glass.d.ts +15 -0
  99. package/dist/components/glass/composite/trust-score-display-glass.d.ts.map +1 -0
  100. package/dist/components/glass/composite/user-info-glass.d.ts +15 -0
  101. package/dist/components/glass/composite/user-info-glass.d.ts.map +1 -0
  102. package/dist/components/glass/composite/user-stats-line-glass.d.ts +15 -0
  103. package/dist/components/glass/composite/user-stats-line-glass.d.ts.map +1 -0
  104. package/dist/components/glass/composite/year-card-glass.d.ts +53 -0
  105. package/dist/components/glass/composite/year-card-glass.d.ts.map +1 -0
  106. package/dist/components/glass/index.d.ts +16 -0
  107. package/dist/components/glass/index.d.ts.map +1 -0
  108. package/dist/components/glass/primitives/form-field-wrapper.d.ts +69 -0
  109. package/dist/components/glass/primitives/form-field-wrapper.d.ts.map +1 -0
  110. package/dist/components/glass/primitives/index.d.ts +12 -0
  111. package/dist/components/glass/primitives/index.d.ts.map +1 -0
  112. package/dist/components/glass/primitives/interactive-card.d.ts +91 -0
  113. package/dist/components/glass/primitives/interactive-card.d.ts.map +1 -0
  114. package/dist/components/glass/primitives/style-utils.d.ts +147 -0
  115. package/dist/components/glass/primitives/style-utils.d.ts.map +1 -0
  116. package/dist/components/glass/primitives/touch-target.d.ts +46 -0
  117. package/dist/components/glass/primitives/touch-target.d.ts.map +1 -0
  118. package/dist/components/glass/sections/career-stats-glass.d.ts +17 -0
  119. package/dist/components/glass/sections/career-stats-glass.d.ts.map +1 -0
  120. package/dist/components/glass/sections/flags-section-glass.d.ts +13 -0
  121. package/dist/components/glass/sections/flags-section-glass.d.ts.map +1 -0
  122. package/dist/components/glass/sections/header-branding-glass.d.ts +16 -0
  123. package/dist/components/glass/sections/header-branding-glass.d.ts.map +1 -0
  124. package/dist/components/glass/sections/header-nav-glass.d.ts +7 -0
  125. package/dist/components/glass/sections/header-nav-glass.d.ts.map +1 -0
  126. package/dist/components/glass/sections/index.d.ts +13 -0
  127. package/dist/components/glass/sections/index.d.ts.map +1 -0
  128. package/dist/components/glass/sections/profile-header-glass.d.ts +16 -0
  129. package/dist/components/glass/sections/profile-header-glass.d.ts.map +1 -0
  130. package/dist/components/glass/sections/projects-list-glass.d.ts +42 -0
  131. package/dist/components/glass/sections/projects-list-glass.d.ts.map +1 -0
  132. package/dist/components/glass/sections/trust-score-card-glass.d.ts +12 -0
  133. package/dist/components/glass/sections/trust-score-card-glass.d.ts.map +1 -0
  134. package/dist/components/glass/specialized/base-progress-glass.d.ts +8 -0
  135. package/dist/components/glass/specialized/base-progress-glass.d.ts.map +1 -0
  136. package/dist/components/glass/specialized/flag-alert-glass.d.ts +8 -0
  137. package/dist/components/glass/specialized/flag-alert-glass.d.ts.map +1 -0
  138. package/dist/components/glass/specialized/index.d.ts +21 -0
  139. package/dist/components/glass/specialized/index.d.ts.map +1 -0
  140. package/dist/components/glass/specialized/language-bar-glass.d.ts +24 -0
  141. package/dist/components/glass/specialized/language-bar-glass.d.ts.map +1 -0
  142. package/dist/components/glass/specialized/profile-avatar-glass.d.ts +26 -0
  143. package/dist/components/glass/specialized/profile-avatar-glass.d.ts.map +1 -0
  144. package/dist/components/glass/specialized/progress-glass.d.ts +9 -0
  145. package/dist/components/glass/specialized/progress-glass.d.ts.map +1 -0
  146. package/dist/components/glass/specialized/rainbow-progress-glass.d.ts +8 -0
  147. package/dist/components/glass/specialized/rainbow-progress-glass.d.ts.map +1 -0
  148. package/dist/components/glass/specialized/segmented-control-glass.d.ts +11 -0
  149. package/dist/components/glass/specialized/segmented-control-glass.d.ts.map +1 -0
  150. package/dist/components/glass/specialized/sparkline-glass.d.ts +34 -0
  151. package/dist/components/glass/specialized/sparkline-glass.d.ts.map +1 -0
  152. package/dist/components/glass/specialized/status-indicator-glass.d.ts +8 -0
  153. package/dist/components/glass/specialized/status-indicator-glass.d.ts.map +1 -0
  154. package/dist/components/glass/ui/alert-glass.d.ts +13 -0
  155. package/dist/components/glass/ui/alert-glass.d.ts.map +1 -0
  156. package/dist/components/glass/ui/avatar-glass.d.ts +58 -0
  157. package/dist/components/glass/ui/avatar-glass.d.ts.map +1 -0
  158. package/dist/components/glass/ui/badge-glass.d.ts +74 -0
  159. package/dist/components/glass/ui/badge-glass.d.ts.map +1 -0
  160. package/dist/components/glass/ui/button-glass.d.ts +110 -0
  161. package/dist/components/glass/ui/button-glass.d.ts.map +1 -0
  162. package/dist/components/glass/ui/card-glass.d.ts +115 -0
  163. package/dist/components/glass/ui/card-glass.d.ts.map +1 -0
  164. package/dist/components/glass/ui/checkbox-glass.d.ts +113 -0
  165. package/dist/components/glass/ui/checkbox-glass.d.ts.map +1 -0
  166. package/dist/components/glass/ui/circular-progress-glass.d.ts +36 -0
  167. package/dist/components/glass/ui/circular-progress-glass.d.ts.map +1 -0
  168. package/dist/components/glass/ui/combobox-glass.d.ts +61 -0
  169. package/dist/components/glass/ui/combobox-glass.d.ts.map +1 -0
  170. package/dist/components/glass/ui/dropdown-glass.d.ts +83 -0
  171. package/dist/components/glass/ui/dropdown-glass.d.ts.map +1 -0
  172. package/dist/components/glass/ui/dropdown-menu-glass.d.ts +77 -0
  173. package/dist/components/glass/ui/dropdown-menu-glass.d.ts.map +1 -0
  174. package/dist/components/glass/ui/glass-card.d.ts +78 -0
  175. package/dist/components/glass/ui/glass-card.d.ts.map +1 -0
  176. package/dist/components/glass/ui/index.d.ts +44 -0
  177. package/dist/components/glass/ui/index.d.ts.map +1 -0
  178. package/dist/components/glass/ui/input-glass.d.ts +98 -0
  179. package/dist/components/glass/ui/input-glass.d.ts.map +1 -0
  180. package/dist/components/glass/ui/modal-glass.d.ts +180 -0
  181. package/dist/components/glass/ui/modal-glass.d.ts.map +1 -0
  182. package/dist/components/glass/ui/notification-glass.d.ts +13 -0
  183. package/dist/components/glass/ui/notification-glass.d.ts.map +1 -0
  184. package/dist/components/glass/ui/popover-glass.d.ts +71 -0
  185. package/dist/components/glass/ui/popover-glass.d.ts.map +1 -0
  186. package/dist/components/glass/ui/sidebar-glass/index.d.ts +100 -0
  187. package/dist/components/glass/ui/sidebar-glass/index.d.ts.map +1 -0
  188. package/dist/components/glass/ui/sidebar-glass/sidebar-context.d.ts +96 -0
  189. package/dist/components/glass/ui/sidebar-glass/sidebar-context.d.ts.map +1 -0
  190. package/dist/components/glass/ui/sidebar-glass/sidebar-glass.d.ts +88 -0
  191. package/dist/components/glass/ui/sidebar-glass/sidebar-glass.d.ts.map +1 -0
  192. package/dist/components/glass/ui/sidebar-glass/sidebar-menu.d.ts +121 -0
  193. package/dist/components/glass/ui/sidebar-glass/sidebar-menu.d.ts.map +1 -0
  194. package/dist/components/glass/ui/skeleton-glass.d.ts +8 -0
  195. package/dist/components/glass/ui/skeleton-glass.d.ts.map +1 -0
  196. package/dist/components/glass/ui/slider-glass.d.ts +38 -0
  197. package/dist/components/glass/ui/slider-glass.d.ts.map +1 -0
  198. package/dist/components/glass/ui/stepper-glass.d.ts +63 -0
  199. package/dist/components/glass/ui/stepper-glass.d.ts.map +1 -0
  200. package/dist/components/glass/ui/tabs-glass.d.ts +199 -0
  201. package/dist/components/glass/ui/tabs-glass.d.ts.map +1 -0
  202. package/dist/components/glass/ui/toggle-glass.d.ts +27 -0
  203. package/dist/components/glass/ui/toggle-glass.d.ts.map +1 -0
  204. package/dist/components/glass/ui/tooltip-glass.d.ts +65 -0
  205. package/dist/components/glass/ui/tooltip-glass.d.ts.map +1 -0
  206. package/dist/components/ui/alert.d.ts +8 -0
  207. package/dist/components/ui/alert.d.ts.map +1 -0
  208. package/dist/components/ui/avatar.d.ts +7 -0
  209. package/dist/components/ui/avatar.d.ts.map +1 -0
  210. package/dist/components/ui/badge.d.ts +8 -0
  211. package/dist/components/ui/badge.d.ts.map +1 -0
  212. package/dist/components/ui/button.d.ts +8 -0
  213. package/dist/components/ui/button.d.ts.map +1 -0
  214. package/dist/components/ui/card.d.ts +10 -0
  215. package/dist/components/ui/card.d.ts.map +1 -0
  216. package/dist/components/ui/chart.d.ts +69 -0
  217. package/dist/components/ui/chart.d.ts.map +1 -0
  218. package/dist/components/ui/checkbox.d.ts +5 -0
  219. package/dist/components/ui/checkbox.d.ts.map +1 -0
  220. package/dist/components/ui/collapsible.d.ts +6 -0
  221. package/dist/components/ui/collapsible.d.ts.map +1 -0
  222. package/dist/components/ui/command.d.ts +19 -0
  223. package/dist/components/ui/command.d.ts.map +1 -0
  224. package/dist/components/ui/dialog.d.ts +16 -0
  225. package/dist/components/ui/dialog.d.ts.map +1 -0
  226. package/dist/components/ui/dropdown-menu.d.ts +26 -0
  227. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  228. package/dist/components/ui/input.d.ts +4 -0
  229. package/dist/components/ui/input.d.ts.map +1 -0
  230. package/dist/components/ui/popover.d.ts +8 -0
  231. package/dist/components/ui/popover.d.ts.map +1 -0
  232. package/dist/components/ui/progress.d.ts +5 -0
  233. package/dist/components/ui/progress.d.ts.map +1 -0
  234. package/dist/components/ui/scroll-area.d.ts +6 -0
  235. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  236. package/dist/components/ui/separator.d.ts +5 -0
  237. package/dist/components/ui/separator.d.ts.map +1 -0
  238. package/dist/components/ui/skeleton.d.ts +3 -0
  239. package/dist/components/ui/skeleton.d.ts.map +1 -0
  240. package/dist/components/ui/slider.d.ts +5 -0
  241. package/dist/components/ui/slider.d.ts.map +1 -0
  242. package/dist/components/ui/sonner.d.ts +4 -0
  243. package/dist/components/ui/sonner.d.ts.map +1 -0
  244. package/dist/components/ui/switch.d.ts +5 -0
  245. package/dist/components/ui/switch.d.ts.map +1 -0
  246. package/dist/components/ui/tabs.d.ts +8 -0
  247. package/dist/components/ui/tabs.d.ts.map +1 -0
  248. package/dist/components/ui/tooltip.d.ts +8 -0
  249. package/dist/components/ui/tooltip.d.ts.map +1 -0
  250. package/dist/components.cjs +4 -4
  251. package/dist/components.d.ts +56 -1932
  252. package/dist/components.d.ts.map +1 -0
  253. package/dist/components.mjs +5 -0
  254. package/dist/hooks.cjs +2 -2
  255. package/dist/hooks.d.ts +5 -225
  256. package/dist/hooks.d.ts.map +1 -0
  257. package/dist/{hooks.js → hooks.mjs} +2 -2
  258. package/dist/index.cjs +48 -1109
  259. package/dist/index.cjs.map +1 -1
  260. package/dist/index.d.ts +83 -1
  261. package/dist/index.d.ts.map +1 -0
  262. package/dist/{index.js → index.mjs} +29 -1115
  263. package/dist/index.mjs.map +1 -0
  264. package/dist/lib/config.d.ts +28 -0
  265. package/dist/lib/config.d.ts.map +1 -0
  266. package/dist/lib/hooks/index.d.ts +11 -0
  267. package/dist/lib/hooks/index.d.ts.map +1 -0
  268. package/dist/lib/hooks/use-focus.d.ts +61 -0
  269. package/dist/lib/hooks/use-focus.d.ts.map +1 -0
  270. package/dist/lib/hooks/use-hover.d.ts +54 -0
  271. package/dist/lib/hooks/use-hover.d.ts.map +1 -0
  272. package/dist/lib/hooks/use-responsive.d.ts +44 -0
  273. package/dist/lib/hooks/use-responsive.d.ts.map +1 -0
  274. package/dist/lib/hooks/use-wallpaper-tint.d.ts +57 -0
  275. package/dist/lib/hooks/use-wallpaper-tint.d.ts.map +1 -0
  276. package/dist/lib/hooks.d.ts +92 -0
  277. package/dist/lib/hooks.d.ts.map +1 -0
  278. package/dist/lib/theme/tokens.d.ts +441 -0
  279. package/dist/lib/theme/tokens.d.ts.map +1 -0
  280. package/dist/lib/theme-context.d.ts +115 -0
  281. package/dist/lib/theme-context.d.ts.map +1 -0
  282. package/dist/lib/types.d.ts +24 -0
  283. package/dist/lib/types.d.ts.map +1 -0
  284. package/dist/lib/utils.d.ts +8 -0
  285. package/dist/lib/utils.d.ts.map +1 -0
  286. package/dist/lib/variants/alert-glass-variants.d.ts +10 -0
  287. package/dist/lib/variants/alert-glass-variants.d.ts.map +1 -0
  288. package/dist/lib/variants/alert-variants.d.ts +8 -0
  289. package/dist/lib/variants/alert-variants.d.ts.map +1 -0
  290. package/dist/lib/variants/avatar-glass-variants.d.ts +12 -0
  291. package/dist/lib/variants/avatar-glass-variants.d.ts.map +1 -0
  292. package/dist/lib/variants/badge-glass-variants.d.ts +10 -0
  293. package/dist/lib/variants/badge-glass-variants.d.ts.map +1 -0
  294. package/dist/lib/variants/badge-variants.d.ts +8 -0
  295. package/dist/lib/variants/badge-variants.d.ts.map +1 -0
  296. package/dist/lib/variants/button-glass-variants.d.ts +29 -0
  297. package/dist/lib/variants/button-glass-variants.d.ts.map +1 -0
  298. package/dist/lib/variants/button-variants.d.ts +9 -0
  299. package/dist/lib/variants/button-variants.d.ts.map +1 -0
  300. package/dist/lib/variants/dropdown-content-styles.d.ts +102 -0
  301. package/dist/lib/variants/dropdown-content-styles.d.ts.map +1 -0
  302. package/dist/lib/variants/dropdown-glass-variants.d.ts +9 -0
  303. package/dist/lib/variants/dropdown-glass-variants.d.ts.map +1 -0
  304. package/dist/lib/variants/glass-card-variants.d.ts +13 -0
  305. package/dist/lib/variants/glass-card-variants.d.ts.map +1 -0
  306. package/dist/lib/variants/index.d.ts +26 -0
  307. package/dist/lib/variants/index.d.ts.map +1 -0
  308. package/dist/lib/variants/input-glass-variants.d.ts +9 -0
  309. package/dist/lib/variants/input-glass-variants.d.ts.map +1 -0
  310. package/dist/lib/variants/insight-card-glass-variants.d.ts +11 -0
  311. package/dist/lib/variants/insight-card-glass-variants.d.ts.map +1 -0
  312. package/dist/lib/variants/modal-glass-variants.d.ts +9 -0
  313. package/dist/lib/variants/modal-glass-variants.d.ts.map +1 -0
  314. package/dist/lib/variants/notification-glass-variants.d.ts +9 -0
  315. package/dist/lib/variants/notification-glass-variants.d.ts.map +1 -0
  316. package/dist/lib/variants/progress-glass-variants.d.ts +10 -0
  317. package/dist/lib/variants/progress-glass-variants.d.ts.map +1 -0
  318. package/dist/lib/variants/skeleton-glass-variants.d.ts +9 -0
  319. package/dist/lib/variants/skeleton-glass-variants.d.ts.map +1 -0
  320. package/dist/lib/variants/sparkline-glass-variants.d.ts +10 -0
  321. package/dist/lib/variants/sparkline-glass-variants.d.ts.map +1 -0
  322. package/dist/lib/variants/stepper-glass-variants.d.ts +40 -0
  323. package/dist/lib/variants/stepper-glass-variants.d.ts.map +1 -0
  324. package/dist/lib/variants/toggle-glass-variants.d.ts +26 -0
  325. package/dist/lib/variants/toggle-glass-variants.d.ts.map +1 -0
  326. package/dist/lib/variants/tooltip-glass-variants.d.ts +9 -0
  327. package/dist/lib/variants/tooltip-glass-variants.d.ts.map +1 -0
  328. package/dist/r/checkbox-glass.json +3 -2
  329. package/dist/r/tabs-glass.json +4 -2
  330. package/dist/{theme-context-_T5r1KG4.js → theme-context-DLS2uAgJ.mjs} +1 -1
  331. package/dist/theme-context-DLS2uAgJ.mjs.map +1 -0
  332. package/dist/{theme-context-BEA8K_rq.cjs → theme-context-DmTETrFi.cjs} +2 -2
  333. package/dist/{theme-context-BEA8K_rq.cjs.map → theme-context-DmTETrFi.cjs.map} +1 -1
  334. package/dist/themes.cjs +1 -1
  335. package/dist/themes.d.ts +2 -124
  336. package/dist/themes.d.ts.map +1 -0
  337. package/dist/{themes.js → themes.mjs} +1 -1
  338. package/dist/trust-score-card-glass-3VBi9soW.cjs +4893 -0
  339. package/dist/trust-score-card-glass-3VBi9soW.cjs.map +1 -0
  340. package/dist/trust-score-card-glass-EfMB5l5J.mjs +4226 -0
  341. package/dist/trust-score-card-glass-EfMB5l5J.mjs.map +1 -0
  342. package/dist/{use-focus-CX0TJJIj.js → use-focus-C5kPAKr_.mjs} +1 -1
  343. package/dist/use-focus-C5kPAKr_.mjs.map +1 -0
  344. package/dist/{use-focus-CdoUzFQ8.cjs → use-focus-CswOSq71.cjs} +2 -2
  345. package/dist/{use-focus-CdoUzFQ8.cjs.map → use-focus-CswOSq71.cjs.map} +1 -1
  346. package/dist/{use-wallpaper-tint-DUgmytlY.js → use-wallpaper-tint-C0kYXNiN.mjs} +1 -1
  347. package/dist/use-wallpaper-tint-C0kYXNiN.mjs.map +1 -0
  348. package/dist/{use-wallpaper-tint-Rq5UgY9L.cjs → use-wallpaper-tint-WtRWtupA.cjs} +2 -2
  349. package/dist/{use-wallpaper-tint-Rq5UgY9L.cjs.map → use-wallpaper-tint-WtRWtupA.cjs.map} +1 -1
  350. package/dist/{utils-CcyeqpKQ.js → utils-B792GPM_.mjs} +1 -1
  351. package/dist/utils-B792GPM_.mjs.map +1 -0
  352. package/dist/{utils-NLnOCttr.cjs → utils-DX6rdBol.cjs} +2 -2
  353. package/dist/{utils-NLnOCttr.cjs.map → utils-DX6rdBol.cjs.map} +1 -1
  354. package/dist/utils.cjs +1 -1
  355. package/dist/utils.d.ts +2 -10
  356. package/dist/utils.d.ts.map +1 -0
  357. package/dist/utils.mjs +2 -0
  358. package/package.json +8 -8
  359. package/dist/cli/index.js.map +0 -1
  360. package/dist/components.js +0 -5
  361. package/dist/index.js.map +0 -1
  362. package/dist/theme-context-_T5r1KG4.js.map +0 -1
  363. package/dist/trust-score-card-glass-DTS1RdIt.cjs +0 -28660
  364. package/dist/trust-score-card-glass-DTS1RdIt.cjs.map +0 -1
  365. package/dist/trust-score-card-glass-Dg4_b_g_.js +0 -27660
  366. package/dist/trust-score-card-glass-Dg4_b_g_.js.map +0 -1
  367. package/dist/use-focus-CX0TJJIj.js.map +0 -1
  368. package/dist/use-wallpaper-tint-DUgmytlY.js.map +0 -1
  369. package/dist/utils-CcyeqpKQ.js.map +0 -1
  370. package/dist/utils.js +0 -2
@@ -115,4 +115,4 @@ function useFocus(options = {}) {
115
115
  }
116
116
  export { useHover as n, useFocus as t };
117
117
 
118
- //# sourceMappingURL=use-focus-CX0TJJIj.js.map
118
+ //# sourceMappingURL=use-focus-C5kPAKr_.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-focus-C5kPAKr_.mjs","names":["hoverProps: UseHoverReturn['hoverProps']","focusProps: UseFocusReturn['focusProps']"],"sources":["../src/lib/hooks/use-hover.ts","../src/lib/hooks/use-focus.ts"],"sourcesContent":["/**\n * useHover Hook\n *\n * Replaces the repeated hover state pattern found in 13+ components:\n *\n * ```tsx\n * // BEFORE (duplicated in every component)\n * const [isHovered, setIsHovered] = useState(false);\n * <div\n * onMouseEnter={() => setIsHovered(true)}\n * onMouseLeave={() => setIsHovered(false)}\n * />\n *\n * // AFTER\n * const { isHovered, hoverProps } = useHover();\n * <div {...hoverProps} />\n * ```\n */\n\nimport { useState, useCallback, type MouseEvent, type FocusEvent } from 'react';\n\nexport interface UseHoverOptions {\n /** Delay before hover state becomes true (ms) */\n enterDelay?: number;\n /** Delay before hover state becomes false (ms) */\n leaveDelay?: number;\n /** Include focus events for accessibility */\n includeFocus?: boolean;\n /** Callback when hover state changes */\n onHoverChange?: (isHovered: boolean) => void;\n}\n\nexport interface UseHoverReturn {\n /** Current hover state */\n isHovered: boolean;\n /** Props to spread on the target element */\n hoverProps: {\n onMouseEnter: (e: MouseEvent) => void;\n onMouseLeave: (e: MouseEvent) => void;\n onFocus?: (e: FocusEvent) => void;\n onBlur?: (e: FocusEvent) => void;\n };\n /** Manually set hover state */\n setIsHovered: (value: boolean) => void;\n}\n\n/**\n * Hook for managing hover state with optional delays and focus support.\n *\n * @example\n * ```tsx\n * const { isHovered, hoverProps } = useHover();\n *\n * return (\n * <div\n * {...hoverProps}\n * style={{ opacity: isHovered ? 1 : 0.8 }}\n * >\n * Hover me\n * </div>\n * );\n * ```\n *\n * @example With options\n * ```tsx\n * const { isHovered, hoverProps } = useHover({\n * enterDelay: 100,\n * leaveDelay: 200,\n * includeFocus: true,\n * onHoverChange: (hover) => console.log('Hovered:', hover),\n * });\n * ```\n */\nexport function useHover(options: UseHoverOptions = {}): UseHoverReturn {\n const {\n enterDelay = 0,\n leaveDelay = 0,\n includeFocus = false,\n onHoverChange,\n } = options;\n\n const [isHovered, setIsHoveredState] = useState(false);\n const [enterTimeout, setEnterTimeout] = useState<ReturnType<typeof setTimeout> | null>(null);\n const [leaveTimeout, setLeaveTimeout] = useState<ReturnType<typeof setTimeout> | null>(null);\n\n const setIsHovered = useCallback(\n (value: boolean) => {\n setIsHoveredState(value);\n onHoverChange?.(value);\n },\n [onHoverChange]\n );\n\n const handleMouseEnter = useCallback(\n () => {\n // Clear any pending leave timeout\n if (leaveTimeout) {\n clearTimeout(leaveTimeout);\n setLeaveTimeout(null);\n }\n\n if (enterDelay > 0) {\n const timeout = setTimeout(() => {\n setIsHovered(true);\n }, enterDelay);\n setEnterTimeout(timeout);\n } else {\n setIsHovered(true);\n }\n },\n [enterDelay, leaveTimeout, setIsHovered]\n );\n\n const handleMouseLeave = useCallback(\n () => {\n // Clear any pending enter timeout\n if (enterTimeout) {\n clearTimeout(enterTimeout);\n setEnterTimeout(null);\n }\n\n if (leaveDelay > 0) {\n const timeout = setTimeout(() => {\n setIsHovered(false);\n }, leaveDelay);\n setLeaveTimeout(timeout);\n } else {\n setIsHovered(false);\n }\n },\n [leaveDelay, enterTimeout, setIsHovered]\n );\n\n const handleFocus = useCallback(\n () => {\n if (includeFocus) {\n setIsHovered(true);\n }\n },\n [includeFocus, setIsHovered]\n );\n\n const handleBlur = useCallback(\n () => {\n if (includeFocus) {\n setIsHovered(false);\n }\n },\n [includeFocus, setIsHovered]\n );\n\n const hoverProps: UseHoverReturn['hoverProps'] = {\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n ...(includeFocus && {\n onFocus: handleFocus,\n onBlur: handleBlur,\n }),\n };\n\n return {\n isHovered,\n hoverProps,\n setIsHovered,\n };\n}\n\nexport default useHover;\n","/**\n * useFocus Hook\n *\n * Manages focus state for form elements with keyboard navigation support.\n * Similar to useHover but for focus events.\n *\n * Implements proper :focus-visible behavior by tracking keyboard vs mouse interaction\n * at the document level, ensuring focus rings only appear for keyboard navigation.\n */\n\nimport {\n useState,\n useCallback,\n useRef,\n useEffect,\n type FocusEvent,\n type KeyboardEvent,\n} from 'react';\n\n// Global state to track whether the last user interaction was via keyboard\nlet hadKeyboardEvent = false;\nlet isInitialized = false;\n\n/**\n * Initialize global keyboard/mouse tracking for focus-visible behavior.\n * This ensures focus rings only appear when navigating via keyboard (Tab key),\n * not when clicking with a mouse.\n */\nfunction initializeKeyboardTracking() {\n if (isInitialized || typeof window === 'undefined') return;\n\n isInitialized = true;\n\n // Track keyboard events (Tab, Shift, Arrow keys, etc.)\n const handleKeyDown = (e: globalThis.KeyboardEvent) => {\n // Only consider keyboard navigation keys\n if (e.key === 'Tab' || e.key.startsWith('Arrow') || e.key === 'Enter' || e.key === ' ') {\n hadKeyboardEvent = true;\n }\n };\n\n // Track mouse/pointer events - clear keyboard flag\n const handlePointerDown = () => {\n hadKeyboardEvent = false;\n };\n\n // Use capture phase to detect events before they reach components\n document.addEventListener('keydown', handleKeyDown, true);\n document.addEventListener('mousedown', handlePointerDown, true);\n document.addEventListener('pointerdown', handlePointerDown, true);\n document.addEventListener('touchstart', handlePointerDown, true);\n\n // Cleanup not needed - these are global listeners that persist for the app lifecycle\n}\n\nexport interface UseFocusOptions {\n /** Callback when focus state changes */\n onFocusChange?: (isFocused: boolean) => void;\n /** Include focus-visible behavior (keyboard focus only) */\n focusVisible?: boolean;\n /** Callback for keyboard events while focused */\n onKeyDown?: (e: KeyboardEvent) => void;\n}\n\nexport interface UseFocusReturn {\n /** Current focus state */\n isFocused: boolean;\n /** True only when focused via keyboard (if focusVisible enabled) */\n isFocusVisible: boolean;\n /** Props to spread on the target element */\n focusProps: {\n onFocus: (e: FocusEvent) => void;\n onBlur: (e: FocusEvent) => void;\n onKeyDown?: (e: KeyboardEvent) => void;\n };\n /** Manually set focus state */\n setIsFocused: (value: boolean) => void;\n /** Reference to track if last focus was from keyboard */\n focusRef: React.RefObject<boolean>;\n}\n\n/**\n * Hook for managing focus state with optional focus-visible support.\n *\n * @example Basic usage\n * ```tsx\n * const { isFocused, focusProps } = useFocus();\n *\n * return (\n * <input\n * {...focusProps}\n * style={{\n * borderColor: isFocused ? 'violet' : 'gray',\n * }}\n * />\n * );\n * ```\n *\n * @example Focus-visible for keyboard navigation\n * ```tsx\n * const { isFocusVisible, focusProps } = useFocus({ focusVisible: true });\n *\n * return (\n * <button\n * {...focusProps}\n * style={{\n * outline: isFocusVisible ? '2px solid violet' : 'none',\n * }}\n * >\n * Click or Tab to me\n * </button>\n * );\n * ```\n */\nexport function useFocus(options: UseFocusOptions = {}): UseFocusReturn {\n const { onFocusChange, focusVisible = false, onKeyDown } = options;\n\n const [isFocused, setIsFocusedState] = useState(false);\n const [isFocusVisible, setIsFocusVisible] = useState(false);\n const hadKeyboardEventRef = useRef(false);\n const focusRef = useRef(false);\n\n // Initialize global keyboard tracking on mount (runs once per app)\n useEffect(() => {\n if (focusVisible) {\n initializeKeyboardTracking();\n }\n }, [focusVisible]);\n\n const setIsFocused = useCallback(\n (value: boolean) => {\n setIsFocusedState(value);\n focusRef.current = value;\n onFocusChange?.(value);\n },\n [onFocusChange]\n );\n\n const handleFocus = useCallback(\n () => {\n setIsFocused(true);\n\n if (focusVisible) {\n // Use global keyboard tracking state for accurate focus-visible detection\n const isKeyboardFocus = hadKeyboardEvent;\n setIsFocusVisible(isKeyboardFocus);\n hadKeyboardEventRef.current = isKeyboardFocus;\n }\n },\n [setIsFocused, focusVisible]\n );\n\n const handleBlur = useCallback(\n () => {\n setIsFocused(false);\n setIsFocusVisible(false);\n },\n [setIsFocused]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n hadKeyboardEventRef.current = true;\n onKeyDown?.(e);\n },\n [onKeyDown]\n );\n\n const focusProps: UseFocusReturn['focusProps'] = {\n onFocus: handleFocus,\n onBlur: handleBlur,\n ...(onKeyDown && { onKeyDown: handleKeyDown }),\n };\n\n return {\n isFocused,\n isFocusVisible,\n focusProps,\n setIsFocused,\n focusRef,\n };\n}\n\nexport default useFocus;\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- const require_trust_score_card_glass = require("./trust-score-card-glass-DTS1RdIt.cjs");
1
+ const require_trust_score_card_glass = require("./trust-score-card-glass-3VBi9soW.cjs");
2
2
  let react = require("react");
3
3
  function useHover(options = {}) {
4
4
  const { enterDelay = 0, leaveDelay = 0, includeFocus = false, onHoverChange } = options;
@@ -127,4 +127,4 @@ Object.defineProperty(exports, "useHover", {
127
127
  }
128
128
  });
129
129
 
130
- //# sourceMappingURL=use-focus-CdoUzFQ8.cjs.map
130
+ //# sourceMappingURL=use-focus-CswOSq71.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-focus-CdoUzFQ8.cjs","names":["hoverProps: UseHoverReturn['hoverProps']","focusProps: UseFocusReturn['focusProps']"],"sources":["../src/lib/hooks/use-hover.ts","../src/lib/hooks/use-focus.ts"],"sourcesContent":["/**\n * useHover Hook\n *\n * Replaces the repeated hover state pattern found in 13+ components:\n *\n * ```tsx\n * // BEFORE (duplicated in every component)\n * const [isHovered, setIsHovered] = useState(false);\n * <div\n * onMouseEnter={() => setIsHovered(true)}\n * onMouseLeave={() => setIsHovered(false)}\n * />\n *\n * // AFTER\n * const { isHovered, hoverProps } = useHover();\n * <div {...hoverProps} />\n * ```\n */\n\nimport { useState, useCallback, type MouseEvent, type FocusEvent } from 'react';\n\nexport interface UseHoverOptions {\n /** Delay before hover state becomes true (ms) */\n enterDelay?: number;\n /** Delay before hover state becomes false (ms) */\n leaveDelay?: number;\n /** Include focus events for accessibility */\n includeFocus?: boolean;\n /** Callback when hover state changes */\n onHoverChange?: (isHovered: boolean) => void;\n}\n\nexport interface UseHoverReturn {\n /** Current hover state */\n isHovered: boolean;\n /** Props to spread on the target element */\n hoverProps: {\n onMouseEnter: (e: MouseEvent) => void;\n onMouseLeave: (e: MouseEvent) => void;\n onFocus?: (e: FocusEvent) => void;\n onBlur?: (e: FocusEvent) => void;\n };\n /** Manually set hover state */\n setIsHovered: (value: boolean) => void;\n}\n\n/**\n * Hook for managing hover state with optional delays and focus support.\n *\n * @example\n * ```tsx\n * const { isHovered, hoverProps } = useHover();\n *\n * return (\n * <div\n * {...hoverProps}\n * style={{ opacity: isHovered ? 1 : 0.8 }}\n * >\n * Hover me\n * </div>\n * );\n * ```\n *\n * @example With options\n * ```tsx\n * const { isHovered, hoverProps } = useHover({\n * enterDelay: 100,\n * leaveDelay: 200,\n * includeFocus: true,\n * onHoverChange: (hover) => console.log('Hovered:', hover),\n * });\n * ```\n */\nexport function useHover(options: UseHoverOptions = {}): UseHoverReturn {\n const {\n enterDelay = 0,\n leaveDelay = 0,\n includeFocus = false,\n onHoverChange,\n } = options;\n\n const [isHovered, setIsHoveredState] = useState(false);\n const [enterTimeout, setEnterTimeout] = useState<ReturnType<typeof setTimeout> | null>(null);\n const [leaveTimeout, setLeaveTimeout] = useState<ReturnType<typeof setTimeout> | null>(null);\n\n const setIsHovered = useCallback(\n (value: boolean) => {\n setIsHoveredState(value);\n onHoverChange?.(value);\n },\n [onHoverChange]\n );\n\n const handleMouseEnter = useCallback(\n () => {\n // Clear any pending leave timeout\n if (leaveTimeout) {\n clearTimeout(leaveTimeout);\n setLeaveTimeout(null);\n }\n\n if (enterDelay > 0) {\n const timeout = setTimeout(() => {\n setIsHovered(true);\n }, enterDelay);\n setEnterTimeout(timeout);\n } else {\n setIsHovered(true);\n }\n },\n [enterDelay, leaveTimeout, setIsHovered]\n );\n\n const handleMouseLeave = useCallback(\n () => {\n // Clear any pending enter timeout\n if (enterTimeout) {\n clearTimeout(enterTimeout);\n setEnterTimeout(null);\n }\n\n if (leaveDelay > 0) {\n const timeout = setTimeout(() => {\n setIsHovered(false);\n }, leaveDelay);\n setLeaveTimeout(timeout);\n } else {\n setIsHovered(false);\n }\n },\n [leaveDelay, enterTimeout, setIsHovered]\n );\n\n const handleFocus = useCallback(\n () => {\n if (includeFocus) {\n setIsHovered(true);\n }\n },\n [includeFocus, setIsHovered]\n );\n\n const handleBlur = useCallback(\n () => {\n if (includeFocus) {\n setIsHovered(false);\n }\n },\n [includeFocus, setIsHovered]\n );\n\n const hoverProps: UseHoverReturn['hoverProps'] = {\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n ...(includeFocus && {\n onFocus: handleFocus,\n onBlur: handleBlur,\n }),\n };\n\n return {\n isHovered,\n hoverProps,\n setIsHovered,\n };\n}\n\nexport default useHover;\n","/**\n * useFocus Hook\n *\n * Manages focus state for form elements with keyboard navigation support.\n * Similar to useHover but for focus events.\n *\n * Implements proper :focus-visible behavior by tracking keyboard vs mouse interaction\n * at the document level, ensuring focus rings only appear for keyboard navigation.\n */\n\nimport {\n useState,\n useCallback,\n useRef,\n useEffect,\n type FocusEvent,\n type KeyboardEvent,\n} from 'react';\n\n// Global state to track whether the last user interaction was via keyboard\nlet hadKeyboardEvent = false;\nlet isInitialized = false;\n\n/**\n * Initialize global keyboard/mouse tracking for focus-visible behavior.\n * This ensures focus rings only appear when navigating via keyboard (Tab key),\n * not when clicking with a mouse.\n */\nfunction initializeKeyboardTracking() {\n if (isInitialized || typeof window === 'undefined') return;\n\n isInitialized = true;\n\n // Track keyboard events (Tab, Shift, Arrow keys, etc.)\n const handleKeyDown = (e: globalThis.KeyboardEvent) => {\n // Only consider keyboard navigation keys\n if (e.key === 'Tab' || e.key.startsWith('Arrow') || e.key === 'Enter' || e.key === ' ') {\n hadKeyboardEvent = true;\n }\n };\n\n // Track mouse/pointer events - clear keyboard flag\n const handlePointerDown = () => {\n hadKeyboardEvent = false;\n };\n\n // Use capture phase to detect events before they reach components\n document.addEventListener('keydown', handleKeyDown, true);\n document.addEventListener('mousedown', handlePointerDown, true);\n document.addEventListener('pointerdown', handlePointerDown, true);\n document.addEventListener('touchstart', handlePointerDown, true);\n\n // Cleanup not needed - these are global listeners that persist for the app lifecycle\n}\n\nexport interface UseFocusOptions {\n /** Callback when focus state changes */\n onFocusChange?: (isFocused: boolean) => void;\n /** Include focus-visible behavior (keyboard focus only) */\n focusVisible?: boolean;\n /** Callback for keyboard events while focused */\n onKeyDown?: (e: KeyboardEvent) => void;\n}\n\nexport interface UseFocusReturn {\n /** Current focus state */\n isFocused: boolean;\n /** True only when focused via keyboard (if focusVisible enabled) */\n isFocusVisible: boolean;\n /** Props to spread on the target element */\n focusProps: {\n onFocus: (e: FocusEvent) => void;\n onBlur: (e: FocusEvent) => void;\n onKeyDown?: (e: KeyboardEvent) => void;\n };\n /** Manually set focus state */\n setIsFocused: (value: boolean) => void;\n /** Reference to track if last focus was from keyboard */\n focusRef: React.RefObject<boolean>;\n}\n\n/**\n * Hook for managing focus state with optional focus-visible support.\n *\n * @example Basic usage\n * ```tsx\n * const { isFocused, focusProps } = useFocus();\n *\n * return (\n * <input\n * {...focusProps}\n * style={{\n * borderColor: isFocused ? 'violet' : 'gray',\n * }}\n * />\n * );\n * ```\n *\n * @example Focus-visible for keyboard navigation\n * ```tsx\n * const { isFocusVisible, focusProps } = useFocus({ focusVisible: true });\n *\n * return (\n * <button\n * {...focusProps}\n * style={{\n * outline: isFocusVisible ? '2px solid violet' : 'none',\n * }}\n * >\n * Click or Tab to me\n * </button>\n * );\n * ```\n */\nexport function useFocus(options: UseFocusOptions = {}): UseFocusReturn {\n const { onFocusChange, focusVisible = false, onKeyDown } = options;\n\n const [isFocused, setIsFocusedState] = useState(false);\n const [isFocusVisible, setIsFocusVisible] = useState(false);\n const hadKeyboardEventRef = useRef(false);\n const focusRef = useRef(false);\n\n // Initialize global keyboard tracking on mount (runs once per app)\n useEffect(() => {\n if (focusVisible) {\n initializeKeyboardTracking();\n }\n }, [focusVisible]);\n\n const setIsFocused = useCallback(\n (value: boolean) => {\n setIsFocusedState(value);\n focusRef.current = value;\n onFocusChange?.(value);\n },\n [onFocusChange]\n );\n\n const handleFocus = useCallback(\n () => {\n setIsFocused(true);\n\n if (focusVisible) {\n // Use global keyboard tracking state for accurate focus-visible detection\n const isKeyboardFocus = hadKeyboardEvent;\n setIsFocusVisible(isKeyboardFocus);\n hadKeyboardEventRef.current = isKeyboardFocus;\n }\n },\n [setIsFocused, focusVisible]\n );\n\n const handleBlur = useCallback(\n () => {\n setIsFocused(false);\n setIsFocusVisible(false);\n },\n [setIsFocused]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n hadKeyboardEventRef.current = true;\n onKeyDown?.(e);\n },\n [onKeyDown]\n );\n\n const focusProps: UseFocusReturn['focusProps'] = {\n onFocus: handleFocus,\n onBlur: handleBlur,\n ...(onKeyDown && { onKeyDown: handleKeyDown }),\n };\n\n return {\n isFocused,\n isFocusVisible,\n focusProps,\n setIsFocused,\n focusRef,\n };\n}\n\nexport default useFocus;\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-focus-CswOSq71.cjs","names":["hoverProps: UseHoverReturn['hoverProps']","focusProps: UseFocusReturn['focusProps']"],"sources":["../src/lib/hooks/use-hover.ts","../src/lib/hooks/use-focus.ts"],"sourcesContent":["/**\n * useHover Hook\n *\n * Replaces the repeated hover state pattern found in 13+ components:\n *\n * ```tsx\n * // BEFORE (duplicated in every component)\n * const [isHovered, setIsHovered] = useState(false);\n * <div\n * onMouseEnter={() => setIsHovered(true)}\n * onMouseLeave={() => setIsHovered(false)}\n * />\n *\n * // AFTER\n * const { isHovered, hoverProps } = useHover();\n * <div {...hoverProps} />\n * ```\n */\n\nimport { useState, useCallback, type MouseEvent, type FocusEvent } from 'react';\n\nexport interface UseHoverOptions {\n /** Delay before hover state becomes true (ms) */\n enterDelay?: number;\n /** Delay before hover state becomes false (ms) */\n leaveDelay?: number;\n /** Include focus events for accessibility */\n includeFocus?: boolean;\n /** Callback when hover state changes */\n onHoverChange?: (isHovered: boolean) => void;\n}\n\nexport interface UseHoverReturn {\n /** Current hover state */\n isHovered: boolean;\n /** Props to spread on the target element */\n hoverProps: {\n onMouseEnter: (e: MouseEvent) => void;\n onMouseLeave: (e: MouseEvent) => void;\n onFocus?: (e: FocusEvent) => void;\n onBlur?: (e: FocusEvent) => void;\n };\n /** Manually set hover state */\n setIsHovered: (value: boolean) => void;\n}\n\n/**\n * Hook for managing hover state with optional delays and focus support.\n *\n * @example\n * ```tsx\n * const { isHovered, hoverProps } = useHover();\n *\n * return (\n * <div\n * {...hoverProps}\n * style={{ opacity: isHovered ? 1 : 0.8 }}\n * >\n * Hover me\n * </div>\n * );\n * ```\n *\n * @example With options\n * ```tsx\n * const { isHovered, hoverProps } = useHover({\n * enterDelay: 100,\n * leaveDelay: 200,\n * includeFocus: true,\n * onHoverChange: (hover) => console.log('Hovered:', hover),\n * });\n * ```\n */\nexport function useHover(options: UseHoverOptions = {}): UseHoverReturn {\n const {\n enterDelay = 0,\n leaveDelay = 0,\n includeFocus = false,\n onHoverChange,\n } = options;\n\n const [isHovered, setIsHoveredState] = useState(false);\n const [enterTimeout, setEnterTimeout] = useState<ReturnType<typeof setTimeout> | null>(null);\n const [leaveTimeout, setLeaveTimeout] = useState<ReturnType<typeof setTimeout> | null>(null);\n\n const setIsHovered = useCallback(\n (value: boolean) => {\n setIsHoveredState(value);\n onHoverChange?.(value);\n },\n [onHoverChange]\n );\n\n const handleMouseEnter = useCallback(\n () => {\n // Clear any pending leave timeout\n if (leaveTimeout) {\n clearTimeout(leaveTimeout);\n setLeaveTimeout(null);\n }\n\n if (enterDelay > 0) {\n const timeout = setTimeout(() => {\n setIsHovered(true);\n }, enterDelay);\n setEnterTimeout(timeout);\n } else {\n setIsHovered(true);\n }\n },\n [enterDelay, leaveTimeout, setIsHovered]\n );\n\n const handleMouseLeave = useCallback(\n () => {\n // Clear any pending enter timeout\n if (enterTimeout) {\n clearTimeout(enterTimeout);\n setEnterTimeout(null);\n }\n\n if (leaveDelay > 0) {\n const timeout = setTimeout(() => {\n setIsHovered(false);\n }, leaveDelay);\n setLeaveTimeout(timeout);\n } else {\n setIsHovered(false);\n }\n },\n [leaveDelay, enterTimeout, setIsHovered]\n );\n\n const handleFocus = useCallback(\n () => {\n if (includeFocus) {\n setIsHovered(true);\n }\n },\n [includeFocus, setIsHovered]\n );\n\n const handleBlur = useCallback(\n () => {\n if (includeFocus) {\n setIsHovered(false);\n }\n },\n [includeFocus, setIsHovered]\n );\n\n const hoverProps: UseHoverReturn['hoverProps'] = {\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n ...(includeFocus && {\n onFocus: handleFocus,\n onBlur: handleBlur,\n }),\n };\n\n return {\n isHovered,\n hoverProps,\n setIsHovered,\n };\n}\n\nexport default useHover;\n","/**\n * useFocus Hook\n *\n * Manages focus state for form elements with keyboard navigation support.\n * Similar to useHover but for focus events.\n *\n * Implements proper :focus-visible behavior by tracking keyboard vs mouse interaction\n * at the document level, ensuring focus rings only appear for keyboard navigation.\n */\n\nimport {\n useState,\n useCallback,\n useRef,\n useEffect,\n type FocusEvent,\n type KeyboardEvent,\n} from 'react';\n\n// Global state to track whether the last user interaction was via keyboard\nlet hadKeyboardEvent = false;\nlet isInitialized = false;\n\n/**\n * Initialize global keyboard/mouse tracking for focus-visible behavior.\n * This ensures focus rings only appear when navigating via keyboard (Tab key),\n * not when clicking with a mouse.\n */\nfunction initializeKeyboardTracking() {\n if (isInitialized || typeof window === 'undefined') return;\n\n isInitialized = true;\n\n // Track keyboard events (Tab, Shift, Arrow keys, etc.)\n const handleKeyDown = (e: globalThis.KeyboardEvent) => {\n // Only consider keyboard navigation keys\n if (e.key === 'Tab' || e.key.startsWith('Arrow') || e.key === 'Enter' || e.key === ' ') {\n hadKeyboardEvent = true;\n }\n };\n\n // Track mouse/pointer events - clear keyboard flag\n const handlePointerDown = () => {\n hadKeyboardEvent = false;\n };\n\n // Use capture phase to detect events before they reach components\n document.addEventListener('keydown', handleKeyDown, true);\n document.addEventListener('mousedown', handlePointerDown, true);\n document.addEventListener('pointerdown', handlePointerDown, true);\n document.addEventListener('touchstart', handlePointerDown, true);\n\n // Cleanup not needed - these are global listeners that persist for the app lifecycle\n}\n\nexport interface UseFocusOptions {\n /** Callback when focus state changes */\n onFocusChange?: (isFocused: boolean) => void;\n /** Include focus-visible behavior (keyboard focus only) */\n focusVisible?: boolean;\n /** Callback for keyboard events while focused */\n onKeyDown?: (e: KeyboardEvent) => void;\n}\n\nexport interface UseFocusReturn {\n /** Current focus state */\n isFocused: boolean;\n /** True only when focused via keyboard (if focusVisible enabled) */\n isFocusVisible: boolean;\n /** Props to spread on the target element */\n focusProps: {\n onFocus: (e: FocusEvent) => void;\n onBlur: (e: FocusEvent) => void;\n onKeyDown?: (e: KeyboardEvent) => void;\n };\n /** Manually set focus state */\n setIsFocused: (value: boolean) => void;\n /** Reference to track if last focus was from keyboard */\n focusRef: React.RefObject<boolean>;\n}\n\n/**\n * Hook for managing focus state with optional focus-visible support.\n *\n * @example Basic usage\n * ```tsx\n * const { isFocused, focusProps } = useFocus();\n *\n * return (\n * <input\n * {...focusProps}\n * style={{\n * borderColor: isFocused ? 'violet' : 'gray',\n * }}\n * />\n * );\n * ```\n *\n * @example Focus-visible for keyboard navigation\n * ```tsx\n * const { isFocusVisible, focusProps } = useFocus({ focusVisible: true });\n *\n * return (\n * <button\n * {...focusProps}\n * style={{\n * outline: isFocusVisible ? '2px solid violet' : 'none',\n * }}\n * >\n * Click or Tab to me\n * </button>\n * );\n * ```\n */\nexport function useFocus(options: UseFocusOptions = {}): UseFocusReturn {\n const { onFocusChange, focusVisible = false, onKeyDown } = options;\n\n const [isFocused, setIsFocusedState] = useState(false);\n const [isFocusVisible, setIsFocusVisible] = useState(false);\n const hadKeyboardEventRef = useRef(false);\n const focusRef = useRef(false);\n\n // Initialize global keyboard tracking on mount (runs once per app)\n useEffect(() => {\n if (focusVisible) {\n initializeKeyboardTracking();\n }\n }, [focusVisible]);\n\n const setIsFocused = useCallback(\n (value: boolean) => {\n setIsFocusedState(value);\n focusRef.current = value;\n onFocusChange?.(value);\n },\n [onFocusChange]\n );\n\n const handleFocus = useCallback(\n () => {\n setIsFocused(true);\n\n if (focusVisible) {\n // Use global keyboard tracking state for accurate focus-visible detection\n const isKeyboardFocus = hadKeyboardEvent;\n setIsFocusVisible(isKeyboardFocus);\n hadKeyboardEventRef.current = isKeyboardFocus;\n }\n },\n [setIsFocused, focusVisible]\n );\n\n const handleBlur = useCallback(\n () => {\n setIsFocused(false);\n setIsFocusVisible(false);\n },\n [setIsFocused]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n hadKeyboardEventRef.current = true;\n onKeyDown?.(e);\n },\n [onKeyDown]\n );\n\n const focusProps: UseFocusReturn['focusProps'] = {\n onFocus: handleFocus,\n onBlur: handleBlur,\n ...(onKeyDown && { onKeyDown: handleKeyDown }),\n };\n\n return {\n isFocused,\n isFocusVisible,\n focusProps,\n setIsFocused,\n focusRef,\n };\n}\n\nexport default useFocus;\n"],"mappings":"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"}
@@ -147,4 +147,4 @@ const useWallpaperTint = (options = {}) => {
147
147
  };
148
148
  export { useResponsive as n, useWallpaperTint as t };
149
149
 
150
- //# sourceMappingURL=use-wallpaper-tint-DUgmytlY.js.map
150
+ //# sourceMappingURL=use-wallpaper-tint-C0kYXNiN.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-wallpaper-tint-C0kYXNiN.mjs","names":["colors: { r: number; g: number; b: number }[]"],"sources":["../src/lib/hooks/use-responsive.ts","../src/lib/hooks/use-wallpaper-tint.ts"],"sourcesContent":["import { useState, useEffect } from 'react';\n\n/**\n * Tailwind CSS breakpoints\n * @see https://tailwindcss.com/docs/responsive-design\n */\nconst BREAKPOINTS = {\n xs: 0,\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n '2xl': 1536,\n} as const;\n\nexport type Breakpoint = keyof typeof BREAKPOINTS;\n\nexport interface UseResponsiveReturn {\n /** Window width is less than 768px (mobile) */\n isMobile: boolean;\n /** Window width is >= 768px and < 1024px (tablet) */\n isTablet: boolean;\n /** Window width is >= 1024px (desktop) */\n isDesktop: boolean;\n /** Current active breakpoint */\n currentBreakpoint: Breakpoint;\n /** Current window width in pixels */\n width: number;\n}\n\n/**\n * Hook to detect current responsive breakpoint\n *\n * @returns Responsive state with current breakpoint and device type flags\n *\n * @example\n * ```tsx\n * const { isMobile, isTablet, isDesktop, currentBreakpoint } = useResponsive();\n *\n * return (\n * <div className={isMobile ? 'flex-col' : 'flex-row'}>\n * {currentBreakpoint === 'lg' && <Sidebar />}\n * </div>\n * );\n * ```\n */\nexport function useResponsive(): UseResponsiveReturn {\n const [width, setWidth] = useState<number>(\n typeof window !== 'undefined' ? window.innerWidth : BREAKPOINTS.lg\n );\n\n useEffect(() => {\n // Server-side rendering guard\n if (typeof window === 'undefined') return;\n\n const handleResize = () => {\n setWidth(window.innerWidth);\n };\n\n // Set initial value\n handleResize();\n\n // Add event listener\n window.addEventListener('resize', handleResize);\n\n // Cleanup\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n // Calculate current breakpoint\n const getCurrentBreakpoint = (): Breakpoint => {\n if (width >= BREAKPOINTS['2xl']) return '2xl';\n if (width >= BREAKPOINTS.xl) return 'xl';\n if (width >= BREAKPOINTS.lg) return 'lg';\n if (width >= BREAKPOINTS.md) return 'md';\n if (width >= BREAKPOINTS.sm) return 'sm';\n return 'xs';\n };\n\n const currentBreakpoint = getCurrentBreakpoint();\n\n return {\n isMobile: width < BREAKPOINTS.md,\n isTablet: width >= BREAKPOINTS.md && width < BREAKPOINTS.lg,\n isDesktop: width >= BREAKPOINTS.lg,\n currentBreakpoint,\n width,\n };\n}\n","// ========================================\n// WALLPAPER TINT HOOK\n// Extract dominant color from background image\n// ========================================\n\nimport { useState, useEffect, useCallback } from \"react\";\n\nexport interface WallpaperTintOptions {\n /**\n * The image URL to sample for tint color\n */\n imageUrl?: string;\n\n /**\n * Debounce delay in milliseconds\n * @default 300\n */\n debounceMs?: number;\n\n /**\n * Number of sample points to take from the image\n * @default 10\n */\n sampleSize?: number;\n\n /**\n * Whether to enable the tint extraction\n * @default true\n */\n enabled?: boolean;\n}\n\nexport interface WallpaperTintResult {\n /**\n * The extracted tint color in RGB format\n * Example: \"120, 80, 200\"\n */\n tintColor: string | null;\n\n /**\n * Whether the tint extraction is in progress\n */\n isLoading: boolean;\n\n /**\n * Error message if extraction failed\n */\n error: string | null;\n\n /**\n * Re-extract the tint color from the current image\n */\n refresh: () => void;\n}\n\n/**\n * Converts RGB values to a luminance value (0-255)\n */\nconst getLuminance = (r: number, g: number, b: number): number => {\n // Use standard luminance formula\n return 0.299 * r + 0.587 * g + 0.114 * b;\n};\n\n/**\n * Extracts the dominant color from an image using canvas sampling\n */\nconst extractDominantColor = async (\n imageUrl: string,\n sampleSize: number = 10\n): Promise<string> => {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = \"Anonymous\"; // Enable CORS\n\n img.onload = () => {\n try {\n // Create canvas for sampling\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n reject(new Error(\"Failed to get canvas context\"));\n return;\n }\n\n // Set canvas size to image size\n canvas.width = img.width;\n canvas.height = img.height;\n\n // Draw image to canvas\n ctx.drawImage(img, 0, 0);\n\n // Sample colors from grid\n const colors: { r: number; g: number; b: number }[] = [];\n const stepX = Math.floor(img.width / sampleSize);\n const stepY = Math.floor(img.height / sampleSize);\n\n for (let y = stepY / 2; y < img.height; y += stepY) {\n for (let x = stepX / 2; x < img.width; x += stepX) {\n const pixel = ctx.getImageData(x, y, 1, 1).data;\n colors.push({\n r: pixel[0],\n g: pixel[1],\n b: pixel[2],\n });\n }\n }\n\n // Calculate average color (simple approach)\n const avgColor = colors.reduce(\n (acc, color) => ({\n r: acc.r + color.r,\n g: acc.g + color.g,\n b: acc.b + color.b,\n }),\n { r: 0, g: 0, b: 0 }\n );\n\n const count = colors.length;\n avgColor.r = Math.round(avgColor.r / count);\n avgColor.g = Math.round(avgColor.g / count);\n avgColor.b = Math.round(avgColor.b / count);\n\n // Adjust color based on luminance for better glass effect\n const luminance = getLuminance(avgColor.r, avgColor.g, avgColor.b);\n\n // If too dark, lighten it\n if (luminance < 80) {\n const factor = 1.5;\n avgColor.r = Math.min(255, Math.round(avgColor.r * factor));\n avgColor.g = Math.min(255, Math.round(avgColor.g * factor));\n avgColor.b = Math.min(255, Math.round(avgColor.b * factor));\n }\n\n // If too bright, darken it slightly\n if (luminance > 200) {\n const factor = 0.7;\n avgColor.r = Math.round(avgColor.r * factor);\n avgColor.g = Math.round(avgColor.g * factor);\n avgColor.b = Math.round(avgColor.b * factor);\n }\n\n resolve(`${avgColor.r}, ${avgColor.g}, ${avgColor.b}`);\n } catch (error) {\n reject(error);\n }\n };\n\n img.onerror = () => {\n reject(new Error(\"Failed to load image\"));\n };\n\n img.src = imageUrl;\n });\n};\n\n/**\n * Hook to extract and use wallpaper tint color\n *\n * @example\n * ```tsx\n * const { tintColor, isLoading } = useWallpaperTint({\n * imageUrl: '/path/to/background.jpg',\n * });\n *\n * // Use tintColor in CSS variables\n * <div style={{ '--wallpaper-tint': tintColor }}>\n * <GlassCard />\n * </div>\n * ```\n */\nexport const useWallpaperTint = (\n options: WallpaperTintOptions = {}\n): WallpaperTintResult => {\n const {\n imageUrl,\n debounceMs = 300,\n sampleSize = 10,\n enabled = true,\n } = options;\n\n const [tintColor, setTintColor] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const extractTint = useCallback(async () => {\n if (!imageUrl || !enabled) {\n setTintColor(null);\n setError(null);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const color = await extractDominantColor(imageUrl, sampleSize);\n setTintColor(color);\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"Failed to extract tint color\";\n setError(errorMessage);\n setTintColor(null);\n } finally {\n setIsLoading(false);\n }\n }, [imageUrl, sampleSize, enabled]);\n\n useEffect(() => {\n if (!enabled) return;\n\n const timeoutId = setTimeout(() => {\n extractTint();\n }, debounceMs);\n\n return () => clearTimeout(timeoutId);\n }, [extractTint, debounceMs, enabled]);\n\n return {\n tintColor,\n isLoading,\n error,\n refresh: extractTint,\n };\n};\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- const require_trust_score_card_glass = require("./trust-score-card-glass-DTS1RdIt.cjs");
1
+ const require_trust_score_card_glass = require("./trust-score-card-glass-3VBi9soW.cjs");
2
2
  let react = require("react");
3
3
  var BREAKPOINTS = {
4
4
  xs: 0,
@@ -159,4 +159,4 @@ Object.defineProperty(exports, "useWallpaperTint", {
159
159
  }
160
160
  });
161
161
 
162
- //# sourceMappingURL=use-wallpaper-tint-Rq5UgY9L.cjs.map
162
+ //# sourceMappingURL=use-wallpaper-tint-WtRWtupA.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-wallpaper-tint-Rq5UgY9L.cjs","names":["colors: { r: number; g: number; b: number }[]"],"sources":["../src/lib/hooks/use-responsive.ts","../src/lib/hooks/use-wallpaper-tint.ts"],"sourcesContent":["import { useState, useEffect } from 'react';\n\n/**\n * Tailwind CSS breakpoints\n * @see https://tailwindcss.com/docs/responsive-design\n */\nconst BREAKPOINTS = {\n xs: 0,\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n '2xl': 1536,\n} as const;\n\nexport type Breakpoint = keyof typeof BREAKPOINTS;\n\nexport interface UseResponsiveReturn {\n /** Window width is less than 768px (mobile) */\n isMobile: boolean;\n /** Window width is >= 768px and < 1024px (tablet) */\n isTablet: boolean;\n /** Window width is >= 1024px (desktop) */\n isDesktop: boolean;\n /** Current active breakpoint */\n currentBreakpoint: Breakpoint;\n /** Current window width in pixels */\n width: number;\n}\n\n/**\n * Hook to detect current responsive breakpoint\n *\n * @returns Responsive state with current breakpoint and device type flags\n *\n * @example\n * ```tsx\n * const { isMobile, isTablet, isDesktop, currentBreakpoint } = useResponsive();\n *\n * return (\n * <div className={isMobile ? 'flex-col' : 'flex-row'}>\n * {currentBreakpoint === 'lg' && <Sidebar />}\n * </div>\n * );\n * ```\n */\nexport function useResponsive(): UseResponsiveReturn {\n const [width, setWidth] = useState<number>(\n typeof window !== 'undefined' ? window.innerWidth : BREAKPOINTS.lg\n );\n\n useEffect(() => {\n // Server-side rendering guard\n if (typeof window === 'undefined') return;\n\n const handleResize = () => {\n setWidth(window.innerWidth);\n };\n\n // Set initial value\n handleResize();\n\n // Add event listener\n window.addEventListener('resize', handleResize);\n\n // Cleanup\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n // Calculate current breakpoint\n const getCurrentBreakpoint = (): Breakpoint => {\n if (width >= BREAKPOINTS['2xl']) return '2xl';\n if (width >= BREAKPOINTS.xl) return 'xl';\n if (width >= BREAKPOINTS.lg) return 'lg';\n if (width >= BREAKPOINTS.md) return 'md';\n if (width >= BREAKPOINTS.sm) return 'sm';\n return 'xs';\n };\n\n const currentBreakpoint = getCurrentBreakpoint();\n\n return {\n isMobile: width < BREAKPOINTS.md,\n isTablet: width >= BREAKPOINTS.md && width < BREAKPOINTS.lg,\n isDesktop: width >= BREAKPOINTS.lg,\n currentBreakpoint,\n width,\n };\n}\n","// ========================================\n// WALLPAPER TINT HOOK\n// Extract dominant color from background image\n// ========================================\n\nimport { useState, useEffect, useCallback } from \"react\";\n\nexport interface WallpaperTintOptions {\n /**\n * The image URL to sample for tint color\n */\n imageUrl?: string;\n\n /**\n * Debounce delay in milliseconds\n * @default 300\n */\n debounceMs?: number;\n\n /**\n * Number of sample points to take from the image\n * @default 10\n */\n sampleSize?: number;\n\n /**\n * Whether to enable the tint extraction\n * @default true\n */\n enabled?: boolean;\n}\n\nexport interface WallpaperTintResult {\n /**\n * The extracted tint color in RGB format\n * Example: \"120, 80, 200\"\n */\n tintColor: string | null;\n\n /**\n * Whether the tint extraction is in progress\n */\n isLoading: boolean;\n\n /**\n * Error message if extraction failed\n */\n error: string | null;\n\n /**\n * Re-extract the tint color from the current image\n */\n refresh: () => void;\n}\n\n/**\n * Converts RGB values to a luminance value (0-255)\n */\nconst getLuminance = (r: number, g: number, b: number): number => {\n // Use standard luminance formula\n return 0.299 * r + 0.587 * g + 0.114 * b;\n};\n\n/**\n * Extracts the dominant color from an image using canvas sampling\n */\nconst extractDominantColor = async (\n imageUrl: string,\n sampleSize: number = 10\n): Promise<string> => {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = \"Anonymous\"; // Enable CORS\n\n img.onload = () => {\n try {\n // Create canvas for sampling\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n reject(new Error(\"Failed to get canvas context\"));\n return;\n }\n\n // Set canvas size to image size\n canvas.width = img.width;\n canvas.height = img.height;\n\n // Draw image to canvas\n ctx.drawImage(img, 0, 0);\n\n // Sample colors from grid\n const colors: { r: number; g: number; b: number }[] = [];\n const stepX = Math.floor(img.width / sampleSize);\n const stepY = Math.floor(img.height / sampleSize);\n\n for (let y = stepY / 2; y < img.height; y += stepY) {\n for (let x = stepX / 2; x < img.width; x += stepX) {\n const pixel = ctx.getImageData(x, y, 1, 1).data;\n colors.push({\n r: pixel[0],\n g: pixel[1],\n b: pixel[2],\n });\n }\n }\n\n // Calculate average color (simple approach)\n const avgColor = colors.reduce(\n (acc, color) => ({\n r: acc.r + color.r,\n g: acc.g + color.g,\n b: acc.b + color.b,\n }),\n { r: 0, g: 0, b: 0 }\n );\n\n const count = colors.length;\n avgColor.r = Math.round(avgColor.r / count);\n avgColor.g = Math.round(avgColor.g / count);\n avgColor.b = Math.round(avgColor.b / count);\n\n // Adjust color based on luminance for better glass effect\n const luminance = getLuminance(avgColor.r, avgColor.g, avgColor.b);\n\n // If too dark, lighten it\n if (luminance < 80) {\n const factor = 1.5;\n avgColor.r = Math.min(255, Math.round(avgColor.r * factor));\n avgColor.g = Math.min(255, Math.round(avgColor.g * factor));\n avgColor.b = Math.min(255, Math.round(avgColor.b * factor));\n }\n\n // If too bright, darken it slightly\n if (luminance > 200) {\n const factor = 0.7;\n avgColor.r = Math.round(avgColor.r * factor);\n avgColor.g = Math.round(avgColor.g * factor);\n avgColor.b = Math.round(avgColor.b * factor);\n }\n\n resolve(`${avgColor.r}, ${avgColor.g}, ${avgColor.b}`);\n } catch (error) {\n reject(error);\n }\n };\n\n img.onerror = () => {\n reject(new Error(\"Failed to load image\"));\n };\n\n img.src = imageUrl;\n });\n};\n\n/**\n * Hook to extract and use wallpaper tint color\n *\n * @example\n * ```tsx\n * const { tintColor, isLoading } = useWallpaperTint({\n * imageUrl: '/path/to/background.jpg',\n * });\n *\n * // Use tintColor in CSS variables\n * <div style={{ '--wallpaper-tint': tintColor }}>\n * <GlassCard />\n * </div>\n * ```\n */\nexport const useWallpaperTint = (\n options: WallpaperTintOptions = {}\n): WallpaperTintResult => {\n const {\n imageUrl,\n debounceMs = 300,\n sampleSize = 10,\n enabled = true,\n } = options;\n\n const [tintColor, setTintColor] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const extractTint = useCallback(async () => {\n if (!imageUrl || !enabled) {\n setTintColor(null);\n setError(null);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const color = await extractDominantColor(imageUrl, sampleSize);\n setTintColor(color);\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"Failed to extract tint color\";\n setError(errorMessage);\n setTintColor(null);\n } finally {\n setIsLoading(false);\n }\n }, [imageUrl, sampleSize, enabled]);\n\n useEffect(() => {\n if (!enabled) return;\n\n const timeoutId = setTimeout(() => {\n extractTint();\n }, debounceMs);\n\n return () => clearTimeout(timeoutId);\n }, [extractTint, debounceMs, enabled]);\n\n return {\n tintColor,\n isLoading,\n error,\n refresh: extractTint,\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-wallpaper-tint-WtRWtupA.cjs","names":["colors: { r: number; g: number; b: number }[]"],"sources":["../src/lib/hooks/use-responsive.ts","../src/lib/hooks/use-wallpaper-tint.ts"],"sourcesContent":["import { useState, useEffect } from 'react';\n\n/**\n * Tailwind CSS breakpoints\n * @see https://tailwindcss.com/docs/responsive-design\n */\nconst BREAKPOINTS = {\n xs: 0,\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n '2xl': 1536,\n} as const;\n\nexport type Breakpoint = keyof typeof BREAKPOINTS;\n\nexport interface UseResponsiveReturn {\n /** Window width is less than 768px (mobile) */\n isMobile: boolean;\n /** Window width is >= 768px and < 1024px (tablet) */\n isTablet: boolean;\n /** Window width is >= 1024px (desktop) */\n isDesktop: boolean;\n /** Current active breakpoint */\n currentBreakpoint: Breakpoint;\n /** Current window width in pixels */\n width: number;\n}\n\n/**\n * Hook to detect current responsive breakpoint\n *\n * @returns Responsive state with current breakpoint and device type flags\n *\n * @example\n * ```tsx\n * const { isMobile, isTablet, isDesktop, currentBreakpoint } = useResponsive();\n *\n * return (\n * <div className={isMobile ? 'flex-col' : 'flex-row'}>\n * {currentBreakpoint === 'lg' && <Sidebar />}\n * </div>\n * );\n * ```\n */\nexport function useResponsive(): UseResponsiveReturn {\n const [width, setWidth] = useState<number>(\n typeof window !== 'undefined' ? window.innerWidth : BREAKPOINTS.lg\n );\n\n useEffect(() => {\n // Server-side rendering guard\n if (typeof window === 'undefined') return;\n\n const handleResize = () => {\n setWidth(window.innerWidth);\n };\n\n // Set initial value\n handleResize();\n\n // Add event listener\n window.addEventListener('resize', handleResize);\n\n // Cleanup\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n // Calculate current breakpoint\n const getCurrentBreakpoint = (): Breakpoint => {\n if (width >= BREAKPOINTS['2xl']) return '2xl';\n if (width >= BREAKPOINTS.xl) return 'xl';\n if (width >= BREAKPOINTS.lg) return 'lg';\n if (width >= BREAKPOINTS.md) return 'md';\n if (width >= BREAKPOINTS.sm) return 'sm';\n return 'xs';\n };\n\n const currentBreakpoint = getCurrentBreakpoint();\n\n return {\n isMobile: width < BREAKPOINTS.md,\n isTablet: width >= BREAKPOINTS.md && width < BREAKPOINTS.lg,\n isDesktop: width >= BREAKPOINTS.lg,\n currentBreakpoint,\n width,\n };\n}\n","// ========================================\n// WALLPAPER TINT HOOK\n// Extract dominant color from background image\n// ========================================\n\nimport { useState, useEffect, useCallback } from \"react\";\n\nexport interface WallpaperTintOptions {\n /**\n * The image URL to sample for tint color\n */\n imageUrl?: string;\n\n /**\n * Debounce delay in milliseconds\n * @default 300\n */\n debounceMs?: number;\n\n /**\n * Number of sample points to take from the image\n * @default 10\n */\n sampleSize?: number;\n\n /**\n * Whether to enable the tint extraction\n * @default true\n */\n enabled?: boolean;\n}\n\nexport interface WallpaperTintResult {\n /**\n * The extracted tint color in RGB format\n * Example: \"120, 80, 200\"\n */\n tintColor: string | null;\n\n /**\n * Whether the tint extraction is in progress\n */\n isLoading: boolean;\n\n /**\n * Error message if extraction failed\n */\n error: string | null;\n\n /**\n * Re-extract the tint color from the current image\n */\n refresh: () => void;\n}\n\n/**\n * Converts RGB values to a luminance value (0-255)\n */\nconst getLuminance = (r: number, g: number, b: number): number => {\n // Use standard luminance formula\n return 0.299 * r + 0.587 * g + 0.114 * b;\n};\n\n/**\n * Extracts the dominant color from an image using canvas sampling\n */\nconst extractDominantColor = async (\n imageUrl: string,\n sampleSize: number = 10\n): Promise<string> => {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = \"Anonymous\"; // Enable CORS\n\n img.onload = () => {\n try {\n // Create canvas for sampling\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n reject(new Error(\"Failed to get canvas context\"));\n return;\n }\n\n // Set canvas size to image size\n canvas.width = img.width;\n canvas.height = img.height;\n\n // Draw image to canvas\n ctx.drawImage(img, 0, 0);\n\n // Sample colors from grid\n const colors: { r: number; g: number; b: number }[] = [];\n const stepX = Math.floor(img.width / sampleSize);\n const stepY = Math.floor(img.height / sampleSize);\n\n for (let y = stepY / 2; y < img.height; y += stepY) {\n for (let x = stepX / 2; x < img.width; x += stepX) {\n const pixel = ctx.getImageData(x, y, 1, 1).data;\n colors.push({\n r: pixel[0],\n g: pixel[1],\n b: pixel[2],\n });\n }\n }\n\n // Calculate average color (simple approach)\n const avgColor = colors.reduce(\n (acc, color) => ({\n r: acc.r + color.r,\n g: acc.g + color.g,\n b: acc.b + color.b,\n }),\n { r: 0, g: 0, b: 0 }\n );\n\n const count = colors.length;\n avgColor.r = Math.round(avgColor.r / count);\n avgColor.g = Math.round(avgColor.g / count);\n avgColor.b = Math.round(avgColor.b / count);\n\n // Adjust color based on luminance for better glass effect\n const luminance = getLuminance(avgColor.r, avgColor.g, avgColor.b);\n\n // If too dark, lighten it\n if (luminance < 80) {\n const factor = 1.5;\n avgColor.r = Math.min(255, Math.round(avgColor.r * factor));\n avgColor.g = Math.min(255, Math.round(avgColor.g * factor));\n avgColor.b = Math.min(255, Math.round(avgColor.b * factor));\n }\n\n // If too bright, darken it slightly\n if (luminance > 200) {\n const factor = 0.7;\n avgColor.r = Math.round(avgColor.r * factor);\n avgColor.g = Math.round(avgColor.g * factor);\n avgColor.b = Math.round(avgColor.b * factor);\n }\n\n resolve(`${avgColor.r}, ${avgColor.g}, ${avgColor.b}`);\n } catch (error) {\n reject(error);\n }\n };\n\n img.onerror = () => {\n reject(new Error(\"Failed to load image\"));\n };\n\n img.src = imageUrl;\n });\n};\n\n/**\n * Hook to extract and use wallpaper tint color\n *\n * @example\n * ```tsx\n * const { tintColor, isLoading } = useWallpaperTint({\n * imageUrl: '/path/to/background.jpg',\n * });\n *\n * // Use tintColor in CSS variables\n * <div style={{ '--wallpaper-tint': tintColor }}>\n * <GlassCard />\n * </div>\n * ```\n */\nexport const useWallpaperTint = (\n options: WallpaperTintOptions = {}\n): WallpaperTintResult => {\n const {\n imageUrl,\n debounceMs = 300,\n sampleSize = 10,\n enabled = true,\n } = options;\n\n const [tintColor, setTintColor] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const extractTint = useCallback(async () => {\n if (!imageUrl || !enabled) {\n setTintColor(null);\n setError(null);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const color = await extractDominantColor(imageUrl, sampleSize);\n setTintColor(color);\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"Failed to extract tint color\";\n setError(errorMessage);\n setTintColor(null);\n } finally {\n setIsLoading(false);\n }\n }, [imageUrl, sampleSize, enabled]);\n\n useEffect(() => {\n if (!enabled) return;\n\n const timeoutId = setTimeout(() => {\n extractTint();\n }, debounceMs);\n\n return () => clearTimeout(timeoutId);\n }, [extractTint, debounceMs, enabled]);\n\n return {\n tintColor,\n isLoading,\n error,\n refresh: extractTint,\n };\n};\n"],"mappings":"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"}
@@ -5,4 +5,4 @@ const cn = (...inputs) => {
5
5
  };
6
6
  export { cn as t };
7
7
 
8
- //# sourceMappingURL=utils-CcyeqpKQ.js.map
8
+ //# sourceMappingURL=utils-B792GPM_.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-B792GPM_.mjs","names":[],"sources":["../src/lib/utils.ts"],"sourcesContent":["// ========================================\n// GLASS THEME UTILITIES\n// ========================================\n\nimport { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Combine class names with Tailwind merge support (shadcn standard)\n * @param inputs - Array of class values\n * @returns Merged class string\n */\nexport const cn = (...inputs: ClassValue[]): string => {\n return twMerge(clsx(inputs));\n};\n"],"mappings":";;AAYA,MAAa,MAAM,GAAG,WAAiC;AACrD,QAAO,QAAQ,KAAK,OAAO,CAAC"}
@@ -1,4 +1,4 @@
1
- const require_trust_score_card_glass = require("./trust-score-card-glass-DTS1RdIt.cjs");
1
+ const require_trust_score_card_glass = require("./trust-score-card-glass-3VBi9soW.cjs");
2
2
  let clsx = require("clsx");
3
3
  let tailwind_merge = require("tailwind-merge");
4
4
  const cn = (...inputs) => {
@@ -11,4 +11,4 @@ Object.defineProperty(exports, "cn", {
11
11
  }
12
12
  });
13
13
 
14
- //# sourceMappingURL=utils-NLnOCttr.cjs.map
14
+ //# sourceMappingURL=utils-DX6rdBol.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils-NLnOCttr.cjs","names":[],"sources":["../src/lib/utils.ts"],"sourcesContent":["// ========================================\n// GLASS THEME UTILITIES\n// ========================================\n\nimport { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Combine class names with Tailwind merge support (shadcn standard)\n * @param inputs - Array of class values\n * @returns Merged class string\n */\nexport const cn = (...inputs: ClassValue[]): string => {\n return twMerge(clsx(inputs));\n};\n"],"mappings":";;;AAYA,MAAa,MAAM,GAAG,WAAiC;AACrD,SAAA,GAAA,eAAA,UAAA,GAAA,KAAA,MAAoB,OAAO,CAAC"}
1
+ {"version":3,"file":"utils-DX6rdBol.cjs","names":[],"sources":["../src/lib/utils.ts"],"sourcesContent":["// ========================================\n// GLASS THEME UTILITIES\n// ========================================\n\nimport { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Combine class names with Tailwind merge support (shadcn standard)\n * @param inputs - Array of class values\n * @returns Merged class string\n */\nexport const cn = (...inputs: ClassValue[]): string => {\n return twMerge(clsx(inputs));\n};\n"],"mappings":";;;AAYA,MAAa,MAAM,GAAG,WAAiC;AACrD,SAAA,GAAA,eAAA,UAAA,GAAA,KAAA,MAAoB,OAAO,CAAC"}
package/dist/utils.cjs CHANGED
@@ -1,2 +1,2 @@
1
- const require_utils = require("./utils-NLnOCttr.cjs");
1
+ const require_utils = require("./utils-DX6rdBol.cjs");
2
2
  exports.cn = require_utils.cn;
package/dist/utils.d.ts CHANGED
@@ -1,10 +1,2 @@
1
- import { ClassValue } from 'clsx';
2
-
3
- /**
4
- * Combine class names with Tailwind merge support (shadcn standard)
5
- * @param inputs - Array of class values
6
- * @returns Merged class string
7
- */
8
- export declare const cn: (...inputs: ClassValue[]) => string;
9
-
10
- export { }
1
+ export { cn } from './lib/utils';
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC"}
package/dist/utils.mjs ADDED
@@ -0,0 +1,2 @@
1
+ import { t as cn } from "./utils-B792GPM_.mjs";
2
+ export { cn };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "shadcn-glass-ui",
3
3
  "private": false,
4
- "version": "2.2.3",
4
+ "version": "2.3.0",
5
5
  "description": "Glassmorphism UI library for React - AI-friendly with 59 components, strict TypeScript, and comprehensive docs",
6
6
  "author": "Yhooi2",
7
7
  "license": "MIT",
@@ -41,16 +41,16 @@
41
41
  "bugs": "https://github.com/Yhooi2/shadcn-glass-ui-library/issues",
42
42
  "type": "module",
43
43
  "main": "./dist/index.cjs",
44
- "module": "./dist/index.js",
44
+ "module": "./dist/index.mjs",
45
45
  "types": "./dist/index.d.ts",
46
46
  "bin": {
47
- "shadcn-glass-ui": "./dist/cli/index.js"
47
+ "shadcn-glass-ui": "./dist/cli/index.mjs"
48
48
  },
49
49
  "exports": {
50
50
  ".": {
51
51
  "import": {
52
52
  "types": "./dist/index.d.ts",
53
- "default": "./dist/index.js"
53
+ "default": "./dist/index.mjs"
54
54
  },
55
55
  "require": {
56
56
  "types": "./dist/index.d.ts",
@@ -60,7 +60,7 @@
60
60
  "./components": {
61
61
  "import": {
62
62
  "types": "./dist/components.d.ts",
63
- "default": "./dist/components.js"
63
+ "default": "./dist/components.mjs"
64
64
  },
65
65
  "require": {
66
66
  "types": "./dist/components.d.ts",
@@ -70,7 +70,7 @@
70
70
  "./hooks": {
71
71
  "import": {
72
72
  "types": "./dist/hooks.d.ts",
73
- "default": "./dist/hooks.js"
73
+ "default": "./dist/hooks.mjs"
74
74
  },
75
75
  "require": {
76
76
  "types": "./dist/hooks.d.ts",
@@ -80,7 +80,7 @@
80
80
  "./utils": {
81
81
  "import": {
82
82
  "types": "./dist/utils.d.ts",
83
- "default": "./dist/utils.js"
83
+ "default": "./dist/utils.mjs"
84
84
  },
85
85
  "require": {
86
86
  "types": "./dist/utils.d.ts",
@@ -90,7 +90,7 @@
90
90
  "./themes": {
91
91
  "import": {
92
92
  "types": "./dist/themes.d.ts",
93
- "default": "./dist/themes.js"
93
+ "default": "./dist/themes.mjs"
94
94
  },
95
95
  "require": {
96
96
  "types": "./dist/themes.d.ts",
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":["cachedExportsMap: ExportsMap | null","components: Array<{\n name: string;\n path: string;\n category: string;\n level: number;\n }>","categories: Array<{\n key: string;\n level: number;\n description: string;\n count: number;\n }>","matrix: number[][]","CATEGORY_EMOJI: Record<string, string>","props: string[]","flags: string[]","config: ParseArgsConfig"],"sources":["../../src/cli/utils/load-exports.ts","../../src/cli/utils/fuzzy-search.ts","../../src/cli/utils/format.ts","../../src/cli/commands/info.ts","../../src/cli/commands/list.ts","../../src/cli/index.ts"],"sourcesContent":["/**\n * Load EXPORTS_MAP.json Utility\n *\n * Loads the machine-readable component registry from docs/EXPORTS_MAP.json.\n * Handles multiple paths for development vs published package scenarios.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n// ========================================\n// TYPES\n// ========================================\n\nexport interface ComponentExport {\n name: string;\n path: string;\n type: string;\n description: string;\n props?: string;\n variants?: string[];\n sizes?: string[];\n statuses?: string[];\n category?: string;\n keywords?: string[];\n shadcnCompatible?: boolean;\n compoundAPI?: boolean;\n subComponents?: string[];\n supportsAsChild?: boolean;\n contains?: string[];\n}\n\nexport interface CategoryData {\n level?: number;\n description: string;\n exports: ComponentExport[];\n}\n\nexport interface ExportsMap {\n $schema: string;\n title: string;\n description: string;\n version: string;\n library: string;\n repository: string;\n lastUpdated: string;\n components: Record<string, CategoryData>;\n utilities: {\n exports: Array<{\n name: string;\n path: string;\n type: string;\n description: string;\n signature?: string;\n }>;\n };\n theme: {\n exports: Array<{\n name: string;\n path: string;\n type: string;\n description: string;\n }>;\n };\n hooks: {\n exports: Array<{\n name: string;\n path: string;\n type: string;\n description: string;\n signature?: string;\n }>;\n };\n types: {\n exports: Array<{\n name: string;\n path: string;\n type: string;\n description: string;\n }>;\n };\n variants: {\n exports: Array<{\n name: string;\n path: string;\n type: string;\n description: string;\n }>;\n };\n statistics: {\n totalComponents: number;\n byLevel: Record<string, number>;\n };\n compatibility: {\n shadcnUI: {\n version: string;\n compatibleComponents: string[];\n };\n breakingChanges: Array<{\n version: string;\n changes: string[];\n }>;\n };\n usage: {\n mostCommon: string[];\n useCases: Record<string, string[]>;\n };\n}\n\n// ========================================\n// LOADER\n// ========================================\n\nlet cachedExportsMap: ExportsMap | null = null;\n\n/**\n * Load EXPORTS_MAP.json from various possible locations\n */\nexport function loadExportsMap(): ExportsMap {\n if (cachedExportsMap) {\n return cachedExportsMap;\n }\n\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n // Possible paths to EXPORTS_MAP.json\n // Order: development paths first, then published package paths\n const paths = [\n // Development: running from src/cli/utils/\n resolve(__dirname, '../../../docs/EXPORTS_MAP.json'),\n // Development: running from dist/cli/utils/\n resolve(__dirname, '../../../docs/EXPORTS_MAP.json'),\n // Published package: when installed in node_modules\n resolve(process.cwd(), 'node_modules/shadcn-glass-ui/docs/EXPORTS_MAP.json'),\n // Fallback: relative to cwd\n resolve(process.cwd(), 'docs/EXPORTS_MAP.json'),\n ];\n\n for (const path of paths) {\n try {\n const content = readFileSync(path, 'utf-8');\n cachedExportsMap = JSON.parse(content) as ExportsMap;\n return cachedExportsMap;\n } catch {\n // Try next path\n continue;\n }\n }\n\n throw new Error(\n 'EXPORTS_MAP.json not found. Please ensure:\\n' +\n ' - You are running from the project root, or\\n' +\n ' - The shadcn-glass-ui package is installed correctly'\n );\n}\n\n/**\n * Get all components as a flat array\n */\nexport function getAllComponents(): Array<{\n name: string;\n path: string;\n category: string;\n level: number;\n}> {\n const exportsMap = loadExportsMap();\n const components: Array<{\n name: string;\n path: string;\n category: string;\n level: number;\n }> = [];\n\n for (const [categoryKey, categoryData] of Object.entries(exportsMap.components)) {\n if (categoryData.exports) {\n for (const exp of categoryData.exports) {\n components.push({\n name: exp.name,\n path: exp.path,\n category: categoryKey,\n level: categoryData.level ?? 0,\n });\n }\n }\n }\n\n return components;\n}\n\n/**\n * Find component details by name\n */\nexport function findComponentByName(name: string): {\n component: ComponentExport;\n category: string;\n level: number;\n} | null {\n const exportsMap = loadExportsMap();\n\n for (const [categoryKey, categoryData] of Object.entries(exportsMap.components)) {\n if (categoryData.exports) {\n const found = categoryData.exports.find((exp) => exp.name === name);\n if (found) {\n return {\n component: found,\n category: categoryKey,\n level: categoryData.level ?? 0,\n };\n }\n }\n }\n\n return null;\n}\n\n/**\n * Get components by category\n */\nexport function getComponentsByCategory(category: string): ComponentExport[] {\n const exportsMap = loadExportsMap();\n const categoryData = exportsMap.components[category];\n\n if (!categoryData || !categoryData.exports) {\n return [];\n }\n\n return categoryData.exports;\n}\n\n/**\n * Get all categories with metadata\n */\nexport function getCategories(): Array<{\n key: string;\n level: number;\n description: string;\n count: number;\n}> {\n const exportsMap = loadExportsMap();\n const categories: Array<{\n key: string;\n level: number;\n description: string;\n count: number;\n }> = [];\n\n for (const [key, data] of Object.entries(exportsMap.components)) {\n categories.push({\n key,\n level: data.level ?? 0,\n description: data.description,\n count: data.exports?.length ?? 0,\n });\n }\n\n return categories.sort((a, b) => a.level - b.level);\n}\n\n/**\n * Get library statistics\n */\nexport function getStatistics(): {\n totalComponents: number;\n byLevel: Record<string, number>;\n version: string;\n} {\n const exportsMap = loadExportsMap();\n\n return {\n totalComponents: exportsMap.statistics.totalComponents,\n byLevel: exportsMap.statistics.byLevel,\n version: exportsMap.version,\n };\n}\n","/**\n * Fuzzy Search Utility\n *\n * Provides fuzzy matching for component names.\n * Supports various input formats:\n * - Exact: ButtonGlass\n * - Lowercase: buttonglass, button\n * - Kebab-case: button-glass\n * - Partial: btn, badge\n * - Typos: buton (Levenshtein distance)\n */\n\n// ========================================\n// TYPES\n// ========================================\n\nexport interface ComponentMatch {\n name: string;\n path: string;\n category: string;\n level: number;\n score: number;\n}\n\nexport interface SearchableComponent {\n name: string;\n path: string;\n category: string;\n level: number;\n}\n\n// ========================================\n// NORMALIZATION\n// ========================================\n\n/**\n * Normalize a search query for comparison\n *\n * Transforms:\n * - \"ButtonGlass\" -> \"button\"\n * - \"button-glass\" -> \"buttonglass\"\n * - \"BUTTON\" -> \"button\"\n */\nexport function normalizeQuery(query: string): string {\n return query\n .toLowerCase()\n .replace(/glass$/i, '') // Remove \"Glass\" suffix\n .replace(/-/g, '') // Remove hyphens\n .replace(/_/g, '') // Remove underscores\n .trim();\n}\n\n/**\n * Normalize component name for comparison\n */\nexport function normalizeComponentName(name: string): string {\n return name\n .toLowerCase()\n .replace(/glass$/i, '')\n .replace(/-/g, '')\n .replace(/_/g, '');\n}\n\n// ========================================\n// SCORING\n// ========================================\n\n/**\n * Calculate Levenshtein distance between two strings\n */\nexport function levenshteinDistance(a: string, b: string): number {\n const matrix: number[][] = [];\n\n // Initialize first column\n for (let i = 0; i <= b.length; i++) {\n matrix[i] = [i];\n }\n\n // Initialize first row\n for (let j = 0; j <= a.length; j++) {\n matrix[0][j] = j;\n }\n\n // Fill in the rest of the matrix\n for (let i = 1; i <= b.length; i++) {\n for (let j = 1; j <= a.length; j++) {\n if (b.charAt(i - 1) === a.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1, // substitution\n matrix[i][j - 1] + 1, // insertion\n matrix[i - 1][j] + 1 // deletion\n );\n }\n }\n }\n\n return matrix[b.length][a.length];\n}\n\n/**\n * Calculate match score for a component\n *\n * Scoring:\n * - 100: Exact match (normalized)\n * - 80: Starts with query\n * - 60: Contains query\n * - 40-20: Small Levenshtein distance (typo tolerance)\n * - 0: No match\n */\nexport function calculateMatchScore(query: string, componentName: string): number {\n const normalizedQuery = normalizeQuery(query);\n const normalizedName = normalizeComponentName(componentName);\n\n // Exact match (normalized)\n if (normalizedName === normalizedQuery) {\n return 100;\n }\n\n // Exact match with original name (case-insensitive)\n if (componentName.toLowerCase() === query.toLowerCase()) {\n return 100;\n }\n\n // Starts with query\n if (normalizedName.startsWith(normalizedQuery)) {\n return 80;\n }\n\n // Contains query\n if (normalizedName.includes(normalizedQuery)) {\n return 60;\n }\n\n // Levenshtein distance for typo tolerance\n const distance = levenshteinDistance(normalizedQuery, normalizedName);\n\n // Allow up to 2 character differences for short queries\n // and up to 3 for longer queries\n const maxDistance = normalizedQuery.length <= 4 ? 2 : 3;\n\n if (distance <= maxDistance) {\n // Score decreases with distance: 40 for 1, 30 for 2, 20 for 3\n return Math.max(20, 50 - distance * 10);\n }\n\n return 0;\n}\n\n// ========================================\n// FUZZY MATCHING\n// ========================================\n\n/**\n * Find components matching a query with fuzzy search\n *\n * @param query - Search query (e.g., \"button\", \"ButtonGlass\", \"btn\")\n * @param components - Array of searchable components\n * @returns Sorted array of matches with scores\n */\nexport function fuzzyMatch(query: string, components: SearchableComponent[]): ComponentMatch[] {\n if (!query || query.trim().length === 0) {\n return [];\n }\n\n const matches = components\n .map((comp) => ({\n ...comp,\n score: calculateMatchScore(query, comp.name),\n }))\n .filter((match) => match.score > 0)\n .sort((a, b) => {\n // Primary sort by score (descending)\n if (b.score !== a.score) {\n return b.score - a.score;\n }\n // Secondary sort by level (ascending - core components first)\n if (a.level !== b.level) {\n return a.level - b.level;\n }\n // Tertiary sort by name (alphabetical)\n return a.name.localeCompare(b.name);\n });\n\n return matches;\n}\n\n/**\n * Find the best matching component\n *\n * @param query - Search query\n * @param components - Array of searchable components\n * @returns Best match or null\n */\nexport function findBestMatch(\n query: string,\n components: SearchableComponent[]\n): ComponentMatch | null {\n const matches = fuzzyMatch(query, components);\n return matches.length > 0 ? matches[0] : null;\n}\n\n/**\n * Check if a query has any matches\n */\nexport function hasMatch(query: string, components: SearchableComponent[]): boolean {\n return fuzzyMatch(query, components).length > 0;\n}\n","/**\n * CLI Output Formatting Utilities\n *\n * ANSI color codes and formatting helpers for CLI output.\n * Zero dependencies - uses built-in escape sequences.\n */\n\nexport const COLORS = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n italic: '\\x1b[3m',\n underline: '\\x1b[4m',\n\n // Foreground colors\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n\n // Bright foreground colors\n brightRed: '\\x1b[91m',\n brightGreen: '\\x1b[92m',\n brightYellow: '\\x1b[93m',\n brightBlue: '\\x1b[94m',\n brightMagenta: '\\x1b[95m',\n brightCyan: '\\x1b[96m',\n} as const;\n\n/**\n * Category emoji mapping\n */\nexport const CATEGORY_EMOJI: Record<string, string> = {\n primitives: '🧱',\n core: '⚙️',\n atomic: '🔹',\n specialized: '🎯',\n composite: '🧩',\n sections: '📄',\n};\n\n/**\n * Apply color to text\n */\nexport function color(text: string, colorCode: string): string {\n return `${colorCode}${text}${COLORS.reset}`;\n}\n\n/**\n * Bold text\n */\nexport function bold(text: string): string {\n return `${COLORS.bold}${text}${COLORS.reset}`;\n}\n\n/**\n * Dim text\n */\nexport function dim(text: string): string {\n return `${COLORS.dim}${text}${COLORS.reset}`;\n}\n\n/**\n * Create a horizontal line\n */\nexport function line(length: number = 50): string {\n return dim('─'.repeat(length));\n}\n\n/**\n * Success message with green checkmark\n */\nexport function success(text: string): string {\n return `${COLORS.green}✓${COLORS.reset} ${text}`;\n}\n\n/**\n * Error message with red X\n */\nexport function error(text: string): string {\n return `${COLORS.red}✗${COLORS.reset} ${text}`;\n}\n\n/**\n * Warning message with yellow triangle\n */\nexport function warning(text: string): string {\n return `${COLORS.yellow}⚠${COLORS.reset} ${text}`;\n}\n\n/**\n * Info message with blue circle\n */\nexport function info(text: string): string {\n return `${COLORS.cyan}ℹ${COLORS.reset} ${text}`;\n}\n\n/**\n * Bullet point\n */\nexport function bullet(text: string, colorCode: string = COLORS.cyan): string {\n return ` ${colorCode}•${COLORS.reset} ${text}`;\n}\n\n/**\n * Print a section header\n */\nexport function sectionHeader(title: string): string {\n return `\\n${COLORS.bold}${title}:${COLORS.reset}`;\n}\n\n/**\n * Format key-value pair\n */\nexport function keyValue(key: string, value: string, keyWidth: number = 12): string {\n const paddedKey = key.padEnd(keyWidth);\n return `${COLORS.bold}${paddedKey}${COLORS.reset} ${value}`;\n}\n","/**\n * Info Command\n *\n * Shows detailed information about a specific component.\n *\n * Usage:\n * npx shadcn-glass-ui info ButtonGlass\n * npx shadcn-glass-ui info button\n * npx shadcn-glass-ui info btn\n */\n\nimport {\n getAllComponents,\n findComponentByName,\n type ComponentExport,\n} from '../utils/load-exports.js';\nimport { fuzzyMatch, type ComponentMatch } from '../utils/fuzzy-search.js';\nimport {\n COLORS,\n bold,\n dim,\n line,\n success,\n bullet,\n sectionHeader,\n keyValue,\n color,\n} from '../utils/format.js';\n\n// ========================================\n// USAGE EXAMPLE GENERATOR\n// ========================================\n\n/**\n * Generate a usage example for a component\n */\nfunction generateUsageExample(comp: ComponentExport): string {\n const name = comp.name;\n\n // Compound component API\n if (comp.compoundAPI && comp.subComponents && comp.subComponents.length > 0) {\n const subComps = comp.subComponents;\n const contentComp = subComps.find((s) => s.includes('Content')) || subComps[1] || subComps[0];\n\n return `<${name}.Root>\n <${name}.${contentComp}>\n {/* Content here */}\n </${name}.${contentComp}>\n</${name}.Root>`;\n }\n\n // Regular component with props\n const props: string[] = [];\n\n if (comp.variants && comp.variants.length > 0) {\n props.push(`variant=\"${comp.variants[0]}\"`);\n }\n\n if (comp.sizes && comp.sizes.length > 0) {\n props.push(`size=\"${comp.sizes[0]}\"`);\n }\n\n const propsStr = props.length > 0 ? ' ' + props.join(' ') : '';\n\n // Self-closing for certain component types\n const selfClosing = [\n 'Avatar',\n 'Progress',\n 'Skeleton',\n 'Slider',\n 'Checkbox',\n 'Toggle',\n 'Input',\n ].some((type) => name.includes(type));\n\n if (selfClosing) {\n return `<${name}${propsStr} />`;\n }\n\n return `<${name}${propsStr}>\n {/* Content here */}\n</${name}>`;\n}\n\n// ========================================\n// INFO PRINTER\n// ========================================\n\n/**\n * Print detailed component information\n */\nfunction printComponentInfo(\n comp: ComponentExport,\n category: string,\n level: number,\n alternativeMatches: ComponentMatch[]\n): void {\n // Header\n console.log(`\\n${color(bold(comp.name), COLORS.cyan)}`);\n console.log(line(50));\n\n // Show alternative matches if there are multiple\n if (alternativeMatches.length > 1) {\n console.log(dim(`Found ${alternativeMatches.length} matches. Showing best match.`));\n if (alternativeMatches.length <= 5) {\n const others = alternativeMatches\n .slice(1)\n .map((m) => m.name)\n .join(', ');\n console.log(dim(`Other matches: ${others}`));\n }\n console.log('');\n }\n\n // Description\n console.log(sectionHeader('Description'));\n console.log(` ${comp.description}`);\n console.log('');\n\n // Metadata\n console.log(keyValue('Category:', category));\n console.log(keyValue('Level:', `L${level}`));\n console.log(keyValue('Type:', comp.type));\n console.log(keyValue('Path:', comp.path));\n\n if (comp.props) {\n console.log(keyValue('Props:', comp.props));\n }\n\n // Variants\n if (comp.variants && comp.variants.length > 0) {\n console.log(sectionHeader('Variants'));\n comp.variants.forEach((v) => {\n console.log(bullet(v, COLORS.green));\n });\n }\n\n // Sizes\n if (comp.sizes && comp.sizes.length > 0) {\n console.log(sectionHeader('Sizes'));\n comp.sizes.forEach((s) => {\n console.log(bullet(s, COLORS.yellow));\n });\n }\n\n // Statuses (for Avatar, etc.)\n if (comp.statuses && comp.statuses.length > 0) {\n console.log(sectionHeader('Statuses'));\n comp.statuses.forEach((s) => {\n console.log(bullet(s, COLORS.blue));\n });\n }\n\n // Features\n console.log('');\n if (comp.shadcnCompatible) {\n console.log(success('shadcn/ui compatible'));\n }\n if (comp.compoundAPI) {\n console.log(success('Compound component API'));\n if (comp.subComponents && comp.subComponents.length > 0) {\n console.log(dim(` Sub-components: ${comp.subComponents.join(', ')}`));\n }\n }\n if (comp.supportsAsChild) {\n console.log(success('Supports asChild pattern'));\n }\n\n // Usage Example\n console.log(sectionHeader('Usage Example'));\n console.log(line(21));\n console.log('');\n console.log(color(`import { ${comp.name} } from 'shadcn-glass-ui';`, COLORS.cyan));\n console.log('');\n console.log(generateUsageExample(comp));\n\n // Keywords\n if (comp.keywords && comp.keywords.length > 0) {\n console.log('');\n console.log(dim(`Keywords: ${comp.keywords.join(', ')}`));\n }\n\n console.log('');\n}\n\n// ========================================\n// MAIN COMMAND\n// ========================================\n\n/**\n * Execute the info command\n */\nexport async function showComponentInfo(query: string): Promise<void> {\n // Load all components\n const allComponents = getAllComponents();\n\n // Fuzzy search\n const matches = fuzzyMatch(query, allComponents);\n\n if (matches.length === 0) {\n console.log(`\\n${color('No component found matching', COLORS.red)} \"${query}\"`);\n console.log(dim('\\nTry one of these:'));\n console.log(dim(' npx shadcn-glass-ui list'));\n console.log(dim(' npx shadcn-glass-ui info button'));\n console.log(dim(' npx shadcn-glass-ui info modal'));\n console.log('');\n process.exit(1);\n }\n\n // Get best match details\n const bestMatch = matches[0];\n const details = findComponentByName(bestMatch.name);\n\n if (!details) {\n console.log(`\\n${color('Component details not found for', COLORS.red)} \"${bestMatch.name}\"`);\n process.exit(1);\n }\n\n // Print info\n printComponentInfo(details.component, details.category, details.level, matches);\n}\n","/**\n * List Command\n *\n * Lists all available components, optionally filtered by category.\n *\n * Usage:\n * npx shadcn-glass-ui list\n * npx shadcn-glass-ui list --category=core\n * npx shadcn-glass-ui list --level=1\n */\n\nimport {\n loadExportsMap,\n getCategories,\n getStatistics,\n type ComponentExport,\n} from '../utils/load-exports.js';\nimport { COLORS, CATEGORY_EMOJI, bold, dim, line, color } from '../utils/format.js';\n\n// ========================================\n// COMPONENT PRINTER\n// ========================================\n\n/**\n * Print a single component entry\n */\nfunction printComponent(comp: ComponentExport): void {\n const flags: string[] = [];\n\n if (comp.shadcnCompatible) {\n flags.push(color('shadcn', COLORS.green));\n }\n if (comp.compoundAPI) {\n flags.push(color('compound', COLORS.yellow));\n }\n if (comp.supportsAsChild) {\n flags.push(color('asChild', COLORS.magenta));\n }\n\n const flagStr = flags.length > 0 ? ` [${flags.join(', ')}]` : '';\n\n console.log(` ${color('•', COLORS.cyan)} ${comp.name}${flagStr}`);\n}\n\n/**\n * Print a category section\n */\nfunction printCategory(\n key: string,\n level: number,\n description: string,\n components: ComponentExport[]\n): void {\n const emoji = CATEGORY_EMOJI[key] || '📦';\n const levelStr = `L${level}`;\n\n console.log(`${emoji} ${bold(key.toUpperCase())} ${dim(`(${levelStr})`)}`);\n console.log(` ${dim(description)}`);\n console.log('');\n\n for (const comp of components) {\n printComponent(comp);\n }\n\n console.log('');\n}\n\n// ========================================\n// MAIN COMMAND\n// ========================================\n\nexport interface ListOptions {\n category?: string;\n level?: string;\n}\n\n/**\n * Execute the list command\n */\nexport async function listComponents(options: ListOptions = {}): Promise<void> {\n const exportsMap = loadExportsMap();\n const categories = getCategories();\n const stats = getStatistics();\n\n // Header\n console.log(`\\n${color(bold('shadcn-glass-ui Components'), COLORS.cyan)}`);\n console.log(`${dim(`Version ${stats.version}`)}`);\n console.log(line(50));\n console.log('');\n\n let totalCount = 0;\n let filteredCount = 0;\n\n // Filter options\n const categoryFilter = options.category?.toLowerCase();\n const levelFilter = options.level !== undefined ? parseInt(options.level, 10) : undefined;\n\n for (const cat of categories) {\n const categoryData = exportsMap.components[cat.key];\n\n if (!categoryData || !categoryData.exports || categoryData.exports.length === 0) {\n continue;\n }\n\n // Apply category filter\n if (categoryFilter && cat.key.toLowerCase() !== categoryFilter) {\n totalCount += categoryData.exports.length;\n continue;\n }\n\n // Apply level filter\n if (levelFilter !== undefined && cat.level !== levelFilter) {\n totalCount += categoryData.exports.length;\n continue;\n }\n\n printCategory(cat.key, cat.level, cat.description, categoryData.exports);\n\n totalCount += categoryData.exports.length;\n filteredCount += categoryData.exports.length;\n }\n\n // Footer\n console.log(line(21));\n\n if (categoryFilter || levelFilter !== undefined) {\n console.log(`${bold(`Showing: ${filteredCount}`)} ${dim(`of ${totalCount} total components`)}`);\n } else {\n console.log(`${bold(`Total: ${totalCount} components`)}`);\n }\n\n // Help hints\n console.log('');\n if (!categoryFilter && levelFilter === undefined) {\n console.log(dim('Filter by category: npx shadcn-glass-ui list --category=core'));\n console.log(dim('Filter by level: npx shadcn-glass-ui list --level=1'));\n }\n console.log(dim('Get component info: npx shadcn-glass-ui info <name>'));\n console.log('');\n}\n\n/**\n * Print available categories for help\n */\nexport function printAvailableCategories(): void {\n const categories = getCategories();\n\n console.log('\\nAvailable categories:');\n for (const cat of categories) {\n const emoji = CATEGORY_EMOJI[cat.key] || '📦';\n console.log(` ${emoji} ${cat.key} (L${cat.level}) - ${cat.count} components`);\n }\n console.log('');\n}\n","#!/usr/bin/env node\n/**\n * shadcn-glass-ui CLI\n *\n * Command-line interface for the shadcn-glass-ui component library.\n *\n * Commands:\n * info <name> Show detailed component information\n * list List all available components\n *\n * Usage:\n * npx shadcn-glass-ui info ButtonGlass\n * npx shadcn-glass-ui info button\n * npx shadcn-glass-ui list\n * npx shadcn-glass-ui list --category=core\n */\n\nimport { parseArgs, type ParseArgsConfig } from 'node:util';\nimport { readFileSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { showComponentInfo } from './commands/info.js';\nimport { listComponents, printAvailableCategories } from './commands/list.js';\nimport { COLORS, bold, dim, color } from './utils/format.js';\n\n// ========================================\n// VERSION\n// ========================================\n\n/**\n * Get package version\n */\nfunction getVersion(): string {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n // Try to read package.json from various locations\n const paths = [\n resolve(__dirname, '../../package.json'), // From dist/cli/\n resolve(__dirname, '../../../package.json'), // From src/cli/\n resolve(process.cwd(), 'package.json'), // From cwd\n resolve(process.cwd(), 'node_modules/shadcn-glass-ui/package.json'), // From installed\n ];\n\n for (const path of paths) {\n try {\n const pkg = JSON.parse(readFileSync(path, 'utf-8'));\n if (pkg.name === 'shadcn-glass-ui') {\n return pkg.version;\n }\n } catch {\n continue;\n }\n }\n\n return 'unknown';\n}\n\n// ========================================\n// HELP\n// ========================================\n\n/**\n * Print help message\n */\nfunction printHelp(): void {\n console.log(`\n${color(bold('shadcn-glass-ui'), COLORS.cyan)} - Glassmorphism UI Component Library\n\n${bold('Usage:')}\n npx shadcn-glass-ui <command> [options]\n\n${bold('Commands:')}\n info <name> Show detailed component information\n list List all available components\n\n${bold('Options:')}\n --help, -h Show this help message\n --version, -v Show version number\n --category Filter list by category (e.g., --category=core)\n --level Filter list by level (e.g., --level=1)\n\n${bold('Examples:')}\n ${dim('# Get info about a component (fuzzy search supported)')}\n npx shadcn-glass-ui info ButtonGlass\n npx shadcn-glass-ui info button\n npx shadcn-glass-ui info modal\n\n ${dim('# List all components')}\n npx shadcn-glass-ui list\n\n ${dim('# List components by category')}\n npx shadcn-glass-ui list --category=core\n npx shadcn-glass-ui list --category=composite\n\n ${dim('# List components by level')}\n npx shadcn-glass-ui list --level=1\n\n${bold('Categories:')}\n primitives (L0) Foundation building blocks\n core (L1) Basic interactive components\n atomic (L2) Small specialized components\n specialized (L3) Domain-specific components\n composite (L4) Multi-element widgets\n sections (L5) Full page sections\n\n${bold('More info:')}\n Documentation: https://yhooi2.github.io/shadcn-glass-ui-library/\n Repository: https://github.com/Yhooi2/shadcn-glass-ui-library\n`);\n}\n\n// ========================================\n// MAIN\n// ========================================\n\n/**\n * Parse command line arguments\n */\nfunction parseCliArgs(): {\n command: string | undefined;\n args: string[];\n options: {\n help: boolean;\n version: boolean;\n category?: string;\n level?: string;\n };\n} {\n const config: ParseArgsConfig = {\n allowPositionals: true,\n strict: false,\n options: {\n help: { type: 'boolean', short: 'h', default: false },\n version: { type: 'boolean', short: 'v', default: false },\n category: { type: 'string' },\n level: { type: 'string' },\n },\n };\n\n try {\n const { values, positionals } = parseArgs(config);\n const [command, ...args] = positionals;\n\n return {\n command,\n args,\n options: {\n help: values.help as boolean,\n version: values.version as boolean,\n category: values.category as string | undefined,\n level: values.level as string | undefined,\n },\n };\n } catch (error) {\n // Handle unknown options gracefully\n if (error instanceof Error && error.message.includes('Unknown option')) {\n console.error(`${color('Error:', COLORS.red)} ${error.message}`);\n console.log(dim('\\nRun \"npx shadcn-glass-ui --help\" for usage information.'));\n process.exit(1);\n }\n throw error;\n }\n}\n\n/**\n * Main CLI entry point\n */\nasync function main(): Promise<void> {\n const { command, args, options } = parseCliArgs();\n\n // Handle global options\n if (options.version) {\n console.log(getVersion());\n process.exit(0);\n }\n\n if (options.help || !command) {\n printHelp();\n process.exit(0);\n }\n\n // Handle commands\n switch (command.toLowerCase()) {\n case 'info': {\n if (args.length === 0) {\n console.error(`${color('Error:', COLORS.red)} Component name required`);\n console.log(dim('\\nUsage: npx shadcn-glass-ui info <ComponentName>'));\n console.log(dim('Example: npx shadcn-glass-ui info ButtonGlass'));\n process.exit(1);\n }\n await showComponentInfo(args[0]);\n break;\n }\n\n case 'list': {\n await listComponents({\n category: options.category,\n level: options.level,\n });\n break;\n }\n\n case 'categories': {\n printAvailableCategories();\n break;\n }\n\n default: {\n console.error(`${color('Error:', COLORS.red)} Unknown command \"${command}\"`);\n console.log(dim('\\nAvailable commands: info, list'));\n console.log(dim('Run \"npx shadcn-glass-ui --help\" for usage information.'));\n process.exit(1);\n }\n }\n}\n\n// Run CLI\nmain().catch((error) => {\n console.error(`${color('Error:', COLORS.red)} ${error.message}`);\n if (process.env.DEBUG) {\n console.error(error.stack);\n }\n process.exit(1);\n});\n"],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- import { $ as BaseProgressGlass, Dt as NotificationGlass, G as SegmentedControlGlass, K as RainbowProgressGlass, Mt as GlassCard, Pt as DropdownGlass, Q as StatusIndicatorGlass, St as PopoverGlass, X as LanguageBarGlass, Xt as ComboBoxGlass, Y as ProfileAvatarGlass, Z as FlagAlertGlass, _ as ContributionMetricsGlass, _t as SliderGlass, a as HeaderBrandingGlass, an as ButtonGlass, b as AICardGlass, bn as TouchTarget, bt as SkeletonGlass, c as YearCardGlass, ct as ExpandableHeaderGlass, d as TrustScoreDisplayGlass, et as ThemeToggleGlass, f as RepositoryMetadataGlass, g as MetricCardGlass, gt as TabsGlass, h as MetricsGridGlass, hn as AlertGlass, i as HeaderNavGlass, in as CheckboxGlass, jt as InputGlass, kt as ModalGlass, l as UserStatsLineGlass, ln as AvatarGlass, lt as TooltipGlass, m as RepositoryCardGlass, mt as ToggleGlass, n as ProjectsListGlass, nt as SortDropdownGlass, o as FlagsSectionGlass, p as RepositoryHeaderGlass, q as ProgressGlass, r as ProfileHeaderGlass, rn as CircularProgressGlass, rt as SearchBoxGlass, s as CareerStatsGlass, sn as BadgeGlass, st as IconButtonGlass, t as TrustScoreCardGlass, tt as StatItemGlass, u as UserInfoGlass, v as CircularMetricGlass, vn as InteractiveCard, y as CareerStatsHeaderGlass, yn as FormFieldWrapper } from "./trust-score-card-glass-Dg4_b_g_.js";
2
- import "./utils-CcyeqpKQ.js";
3
- import "./use-focus-CX0TJJIj.js";
4
- import "./theme-context-_T5r1KG4.js";
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 };