gladvn 0.2.22 → 0.2.27

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 (463) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +70 -58
  3. package/bin/cli.js +352 -150
  4. package/llms.txt +7 -5
  5. package/package.json +14 -26
  6. package/src/blocks/auth-card.tsx +104 -0
  7. package/src/blocks/auth-dialog.tsx +116 -0
  8. package/src/blocks/auth-recovery.tsx +61 -0
  9. package/src/blocks/auth-split.tsx +132 -0
  10. package/src/blocks/dashboard.tsx +182 -0
  11. package/src/blocks/settings.tsx +104 -0
  12. package/src/components/macro/accordion-preset.tsx +2 -1
  13. package/src/components/macro/alert-dialog-preset.tsx +3 -2
  14. package/src/components/macro/alert-preset.tsx +2 -1
  15. package/src/components/macro/avatar-preset.tsx +2 -1
  16. package/src/components/macro/breadcrumb-preset.tsx +2 -1
  17. package/src/components/macro/card-preset.tsx +2 -1
  18. package/src/components/macro/carousel-preset.tsx +2 -1
  19. package/src/components/macro/checkbox-preset.tsx +2 -1
  20. package/src/components/macro/combobox-preset.tsx +5 -3
  21. package/src/components/macro/command-preset.tsx +7 -4
  22. package/src/components/macro/date-picker.tsx +3 -2
  23. package/src/components/macro/dialog-preset.tsx +3 -2
  24. package/src/components/macro/empty-preset.tsx +2 -1
  25. package/src/components/macro/field-preset.tsx +2 -1
  26. package/src/components/macro/input-otp-preset.tsx +2 -1
  27. package/src/components/macro/input-preset.tsx +2 -1
  28. package/src/components/macro/pagination-preset.tsx +2 -1
  29. package/src/components/macro/progress-preset.tsx +2 -1
  30. package/src/components/macro/select-preset.tsx +3 -2
  31. package/src/components/macro/slider-preset.tsx +2 -1
  32. package/src/components/macro/switch-preset.tsx +2 -1
  33. package/src/components/macro/tabs-preset.tsx +2 -1
  34. package/src/components/micro/accordion.test.tsx +96 -0
  35. package/src/components/micro/alert-dialog.tsx +1 -1
  36. package/src/components/micro/alert.test.tsx +77 -0
  37. package/src/components/micro/avatar.tsx +1 -1
  38. package/src/components/micro/badge.test.tsx +57 -0
  39. package/src/components/micro/breadcrumb.tsx +1 -1
  40. package/src/components/micro/button.test.tsx +101 -4
  41. package/src/components/micro/card.test.tsx +54 -0
  42. package/src/components/micro/card.tsx +1 -1
  43. package/src/components/micro/carousel.tsx +1 -1
  44. package/src/components/micro/chart.tsx +1 -1
  45. package/src/components/micro/checkbox.test.tsx +92 -0
  46. package/src/components/micro/combobox.tsx +1 -1
  47. package/src/components/micro/command.tsx +1 -1
  48. package/src/components/micro/context-menu.tsx +1 -1
  49. package/src/components/micro/dialog.test.tsx +127 -0
  50. package/src/components/micro/dialog.tsx +1 -1
  51. package/src/components/micro/direction.tsx +1 -1
  52. package/src/components/micro/drawer.tsx +2 -2
  53. package/src/components/micro/dropdown-menu.test.tsx +132 -0
  54. package/src/components/micro/dropdown-menu.tsx +1 -1
  55. package/src/components/micro/empty.tsx +1 -1
  56. package/src/components/micro/field.tsx +1 -1
  57. package/src/components/micro/input-group.tsx +1 -1
  58. package/src/components/micro/input.test.tsx +95 -0
  59. package/src/components/micro/item.tsx +1 -1
  60. package/src/components/micro/menubar.tsx +1 -1
  61. package/src/components/micro/navigation-menu.tsx +1 -1
  62. package/src/components/micro/pagination.tsx +1 -1
  63. package/src/components/micro/popover.test.tsx +83 -0
  64. package/src/components/micro/popover.tsx +1 -1
  65. package/src/components/micro/progress.tsx +1 -1
  66. package/src/components/micro/select.test.tsx +122 -0
  67. package/src/components/micro/select.tsx +1 -1
  68. package/src/components/micro/sheet.test.tsx +122 -0
  69. package/src/components/micro/sheet.tsx +1 -1
  70. package/src/components/micro/sidebar.tsx +1 -1
  71. package/src/components/micro/switch.test.tsx +108 -0
  72. package/src/components/micro/table.tsx +1 -1
  73. package/src/components/micro/tabs.test.tsx +90 -0
  74. package/src/components/micro/tooltip.test.tsx +107 -0
  75. package/src/components/micro/tooltip.tsx +1 -1
  76. package/src/dev/data.ts +8 -0
  77. package/src/dev/main.tsx +4 -0
  78. package/src/dev/showcase/accordion.tsx +4 -2
  79. package/src/dev/showcase/alert-dialog.tsx +7 -4
  80. package/src/dev/showcase/alert.tsx +6 -3
  81. package/src/dev/showcase/aspect-ratio.tsx +2 -1
  82. package/src/dev/showcase/avatar.tsx +6 -3
  83. package/src/dev/showcase/badge.tsx +2 -1
  84. package/src/dev/showcase/breadcrumb.tsx +7 -4
  85. package/src/dev/showcase/button.tsx +2 -1
  86. package/src/dev/showcase/calendar.tsx +2 -1
  87. package/src/dev/showcase/card.tsx +4 -2
  88. package/src/dev/showcase/carousel.tsx +4 -2
  89. package/src/dev/showcase/chart.tsx +4 -2
  90. package/src/dev/showcase/checkbox.tsx +4 -2
  91. package/src/dev/showcase/collapsible.tsx +4 -2
  92. package/src/dev/showcase/combobox.tsx +9 -5
  93. package/src/dev/showcase/command.tsx +6 -3
  94. package/src/dev/showcase/context-menu.tsx +5 -3
  95. package/src/dev/showcase/dialog.tsx +5 -3
  96. package/src/dev/showcase/drawer.tsx +5 -3
  97. package/src/dev/showcase/dropdown-menu.tsx +7 -4
  98. package/src/dev/showcase/empty.tsx +6 -3
  99. package/src/dev/showcase/hover-card.tsx +7 -4
  100. package/src/dev/showcase/input-group.tsx +6 -3
  101. package/src/dev/showcase/input-otp.tsx +6 -3
  102. package/src/dev/showcase/input.tsx +6 -3
  103. package/src/dev/showcase/item.tsx +4 -2
  104. package/src/dev/showcase/kbd.tsx +10 -6
  105. package/src/dev/showcase/label.tsx +2 -1
  106. package/src/dev/showcase/menubar.tsx +5 -3
  107. package/src/dev/showcase/navigation-menu.tsx +5 -3
  108. package/src/dev/showcase/overview.tsx +9 -5
  109. package/src/dev/showcase/pagination.tsx +4 -2
  110. package/src/dev/showcase/popover.tsx +5 -3
  111. package/src/dev/showcase/progress.tsx +4 -2
  112. package/src/dev/showcase/radio-group.tsx +2 -1
  113. package/src/dev/showcase/resizable.tsx +4 -2
  114. package/src/dev/showcase/scroll-area.tsx +2 -1
  115. package/src/dev/showcase/select.tsx +7 -4
  116. package/src/dev/showcase/separator.tsx +2 -1
  117. package/src/dev/showcase/sheet.tsx +5 -3
  118. package/src/dev/showcase/sidebar.tsx +4 -2
  119. package/src/dev/showcase/skeleton.tsx +2 -1
  120. package/src/dev/showcase/slider.tsx +6 -3
  121. package/src/dev/showcase/sonner.tsx +2 -1
  122. package/src/dev/showcase/spinner.tsx +2 -1
  123. package/src/dev/showcase/switch.tsx +2 -1
  124. package/src/dev/showcase/table.tsx +4 -2
  125. package/src/dev/showcase/tabs.tsx +4 -2
  126. package/src/dev/showcase/textarea.tsx +6 -3
  127. package/src/dev/showcase/toast.tsx +2 -1
  128. package/src/dev/showcase/toggle-group.tsx +6 -3
  129. package/src/dev/showcase/toggle.tsx +2 -1
  130. package/src/dev/showcase/tooltip.tsx +5 -3
  131. package/src/dev/showcase/why.tsx +271 -0
  132. package/src/hooks/use-mobile.test.ts +72 -0
  133. package/src/lib/utils.test.ts +26 -10
  134. package/src/styles/gladvn.css +0 -1
  135. package/src/styles/tokens.css +4 -0
  136. package/dist/components/macro/accordion-preset.d.ts +0 -14
  137. package/dist/components/macro/accordion-preset.d.ts.map +0 -1
  138. package/dist/components/macro/alert-dialog-preset.d.ts +0 -26
  139. package/dist/components/macro/alert-dialog-preset.d.ts.map +0 -1
  140. package/dist/components/macro/alert-preset.d.ts +0 -14
  141. package/dist/components/macro/alert-preset.d.ts.map +0 -1
  142. package/dist/components/macro/avatar-preset.d.ts +0 -11
  143. package/dist/components/macro/avatar-preset.d.ts.map +0 -1
  144. package/dist/components/macro/breadcrumb-preset.d.ts +0 -12
  145. package/dist/components/macro/breadcrumb-preset.d.ts.map +0 -1
  146. package/dist/components/macro/card-preset.d.ts +0 -10
  147. package/dist/components/macro/card-preset.d.ts.map +0 -1
  148. package/dist/components/macro/carousel-preset.d.ts +0 -18
  149. package/dist/components/macro/carousel-preset.d.ts.map +0 -1
  150. package/dist/components/macro/checkbox-preset.d.ts +0 -14
  151. package/dist/components/macro/checkbox-preset.d.ts.map +0 -1
  152. package/dist/components/macro/combobox-preset.d.ts +0 -27
  153. package/dist/components/macro/combobox-preset.d.ts.map +0 -1
  154. package/dist/components/macro/command-preset.d.ts +0 -16
  155. package/dist/components/macro/command-preset.d.ts.map +0 -1
  156. package/dist/components/macro/date-picker.d.ts +0 -62
  157. package/dist/components/macro/date-picker.d.ts.map +0 -1
  158. package/dist/components/macro/dialog-preset.d.ts +0 -24
  159. package/dist/components/macro/dialog-preset.d.ts.map +0 -1
  160. package/dist/components/macro/empty-preset.d.ts +0 -15
  161. package/dist/components/macro/empty-preset.d.ts.map +0 -1
  162. package/dist/components/macro/field-preset.d.ts +0 -15
  163. package/dist/components/macro/field-preset.d.ts.map +0 -1
  164. package/dist/components/macro/index.d.ts +0 -22
  165. package/dist/components/macro/index.d.ts.map +0 -1
  166. package/dist/components/macro/input-otp-preset.d.ts +0 -19
  167. package/dist/components/macro/input-otp-preset.d.ts.map +0 -1
  168. package/dist/components/macro/input-preset.d.ts +0 -21
  169. package/dist/components/macro/input-preset.d.ts.map +0 -1
  170. package/dist/components/macro/pagination-preset.d.ts +0 -13
  171. package/dist/components/macro/pagination-preset.d.ts.map +0 -1
  172. package/dist/components/macro/progress-preset.d.ts +0 -10
  173. package/dist/components/macro/progress-preset.d.ts.map +0 -1
  174. package/dist/components/macro/radio-group-preset.d.ts +0 -22
  175. package/dist/components/macro/radio-group-preset.d.ts.map +0 -1
  176. package/dist/components/macro/select-preset.d.ts +0 -42
  177. package/dist/components/macro/select-preset.d.ts.map +0 -1
  178. package/dist/components/macro/slider-preset.d.ts +0 -12
  179. package/dist/components/macro/slider-preset.d.ts.map +0 -1
  180. package/dist/components/macro/switch-preset.d.ts +0 -12
  181. package/dist/components/macro/switch-preset.d.ts.map +0 -1
  182. package/dist/components/macro/tabs-preset.d.ts +0 -17
  183. package/dist/components/macro/tabs-preset.d.ts.map +0 -1
  184. package/dist/components/macro/textarea-preset.d.ts +0 -17
  185. package/dist/components/macro/textarea-preset.d.ts.map +0 -1
  186. package/dist/components/micro/accordion.d.ts +0 -15
  187. package/dist/components/micro/accordion.d.ts.map +0 -1
  188. package/dist/components/micro/alert-dialog.d.ts +0 -33
  189. package/dist/components/micro/alert-dialog.d.ts.map +0 -1
  190. package/dist/components/micro/alert.d.ts +0 -35
  191. package/dist/components/micro/alert.d.ts.map +0 -1
  192. package/dist/components/micro/aspect-ratio.d.ts +0 -20
  193. package/dist/components/micro/aspect-ratio.d.ts.map +0 -1
  194. package/dist/components/micro/avatar.d.ts +0 -23
  195. package/dist/components/micro/avatar.d.ts.map +0 -1
  196. package/dist/components/micro/badge.d.ts +0 -23
  197. package/dist/components/micro/badge.d.ts.map +0 -1
  198. package/dist/components/micro/breadcrumb.d.ts +0 -31
  199. package/dist/components/micro/breadcrumb.d.ts.map +0 -1
  200. package/dist/components/micro/button.d.ts +0 -46
  201. package/dist/components/micro/button.d.ts.map +0 -1
  202. package/dist/components/micro/calendar.d.ts +0 -28
  203. package/dist/components/micro/calendar.d.ts.map +0 -1
  204. package/dist/components/micro/card.d.ts +0 -28
  205. package/dist/components/micro/card.d.ts.map +0 -1
  206. package/dist/components/micro/carousel.d.ts +0 -29
  207. package/dist/components/micro/carousel.d.ts.map +0 -1
  208. package/dist/components/micro/chart.d.ts +0 -49
  209. package/dist/components/micro/chart.d.ts.map +0 -1
  210. package/dist/components/micro/checkbox.d.ts +0 -17
  211. package/dist/components/micro/checkbox.d.ts.map +0 -1
  212. package/dist/components/micro/collapsible.d.ts +0 -15
  213. package/dist/components/micro/collapsible.d.ts.map +0 -1
  214. package/dist/components/micro/combobox.d.ts +0 -34
  215. package/dist/components/micro/combobox.d.ts.map +0 -1
  216. package/dist/components/micro/command.d.ts +0 -79
  217. package/dist/components/micro/command.d.ts.map +0 -1
  218. package/dist/components/micro/context-menu.d.ts +0 -58
  219. package/dist/components/micro/context-menu.d.ts.map +0 -1
  220. package/dist/components/micro/dialog.d.ts +0 -15
  221. package/dist/components/micro/dialog.d.ts.map +0 -1
  222. package/dist/components/micro/direction.d.ts +0 -2
  223. package/dist/components/micro/direction.d.ts.map +0 -1
  224. package/dist/components/micro/drawer.d.ts +0 -18
  225. package/dist/components/micro/drawer.d.ts.map +0 -1
  226. package/dist/components/micro/dropdown-menu.d.ts +0 -40
  227. package/dist/components/micro/dropdown-menu.d.ts.map +0 -1
  228. package/dist/components/micro/empty.d.ts +0 -30
  229. package/dist/components/micro/empty.d.ts.map +0 -1
  230. package/dist/components/micro/field.d.ts +0 -29
  231. package/dist/components/micro/field.d.ts.map +0 -1
  232. package/dist/components/micro/hover-card.d.ts +0 -18
  233. package/dist/components/micro/hover-card.d.ts.map +0 -1
  234. package/dist/components/micro/input-group.d.ts +0 -17
  235. package/dist/components/micro/input-group.d.ts.map +0 -1
  236. package/dist/components/micro/input-otp.d.ts +0 -44
  237. package/dist/components/micro/input-otp.d.ts.map +0 -1
  238. package/dist/components/micro/input.d.ts +0 -29
  239. package/dist/components/micro/input.d.ts.map +0 -1
  240. package/dist/components/micro/item.d.ts +0 -31
  241. package/dist/components/micro/item.d.ts.map +0 -1
  242. package/dist/components/micro/kbd.d.ts +0 -9
  243. package/dist/components/micro/kbd.d.ts.map +0 -1
  244. package/dist/components/micro/label.d.ts +0 -15
  245. package/dist/components/micro/label.d.ts.map +0 -1
  246. package/dist/components/micro/menubar.d.ts +0 -40
  247. package/dist/components/micro/menubar.d.ts.map +0 -1
  248. package/dist/components/micro/navigation-menu.d.ts +0 -26
  249. package/dist/components/micro/navigation-menu.d.ts.map +0 -1
  250. package/dist/components/micro/pagination.d.ts +0 -33
  251. package/dist/components/micro/pagination.d.ts.map +0 -1
  252. package/dist/components/micro/popover.d.ts +0 -24
  253. package/dist/components/micro/popover.d.ts.map +0 -1
  254. package/dist/components/micro/progress.d.ts +0 -19
  255. package/dist/components/micro/progress.d.ts.map +0 -1
  256. package/dist/components/micro/radio-group.d.ts +0 -13
  257. package/dist/components/micro/radio-group.d.ts.map +0 -1
  258. package/dist/components/micro/resizable.d.ts +0 -12
  259. package/dist/components/micro/resizable.d.ts.map +0 -1
  260. package/dist/components/micro/scroll-area.d.ts +0 -12
  261. package/dist/components/micro/scroll-area.d.ts.map +0 -1
  262. package/dist/components/micro/select.d.ts +0 -22
  263. package/dist/components/micro/select.d.ts.map +0 -1
  264. package/dist/components/micro/separator.d.ts +0 -9
  265. package/dist/components/micro/separator.d.ts.map +0 -1
  266. package/dist/components/micro/sheet.d.ts +0 -17
  267. package/dist/components/micro/sheet.d.ts.map +0 -1
  268. package/dist/components/micro/sidebar.d.ts +0 -28
  269. package/dist/components/micro/sidebar.d.ts.map +0 -1
  270. package/dist/components/micro/skeleton.d.ts +0 -16
  271. package/dist/components/micro/skeleton.d.ts.map +0 -1
  272. package/dist/components/micro/slider.d.ts +0 -21
  273. package/dist/components/micro/slider.d.ts.map +0 -1
  274. package/dist/components/micro/sonner.d.ts +0 -5
  275. package/dist/components/micro/sonner.d.ts.map +0 -1
  276. package/dist/components/micro/spinner.d.ts +0 -21
  277. package/dist/components/micro/spinner.d.ts.map +0 -1
  278. package/dist/components/micro/switch.d.ts +0 -13
  279. package/dist/components/micro/switch.d.ts.map +0 -1
  280. package/dist/components/micro/table.d.ts +0 -17
  281. package/dist/components/micro/table.d.ts.map +0 -1
  282. package/dist/components/micro/tabs.d.ts +0 -13
  283. package/dist/components/micro/tabs.d.ts.map +0 -1
  284. package/dist/components/micro/textarea.d.ts +0 -24
  285. package/dist/components/micro/textarea.d.ts.map +0 -1
  286. package/dist/components/micro/theme-provider.d.ts +0 -76
  287. package/dist/components/micro/theme-provider.d.ts.map +0 -1
  288. package/dist/components/micro/toggle-group.d.ts +0 -22
  289. package/dist/components/micro/toggle-group.d.ts.map +0 -1
  290. package/dist/components/micro/toggle.d.ts +0 -16
  291. package/dist/components/micro/toggle.d.ts.map +0 -1
  292. package/dist/components/micro/tooltip.d.ts +0 -21
  293. package/dist/components/micro/tooltip.d.ts.map +0 -1
  294. package/dist/dev/App.d.ts +0 -3
  295. package/dist/dev/App.d.ts.map +0 -1
  296. package/dist/dev/components/GladvnLogo.d.ts +0 -10
  297. package/dist/dev/components/GladvnLogo.d.ts.map +0 -1
  298. package/dist/dev/components/code-highlighter.d.ts +0 -5
  299. package/dist/dev/components/code-highlighter.d.ts.map +0 -1
  300. package/dist/dev/components/dev-context.d.ts +0 -12
  301. package/dist/dev/components/dev-context.d.ts.map +0 -1
  302. package/dist/dev/components/showcase.d.ts +0 -72
  303. package/dist/dev/components/showcase.d.ts.map +0 -1
  304. package/dist/dev/data.d.ts +0 -68
  305. package/dist/dev/data.d.ts.map +0 -1
  306. package/dist/dev/main.d.ts +0 -1
  307. package/dist/dev/main.d.ts.map +0 -1
  308. package/dist/dev/sections/buttons.d.ts +0 -2
  309. package/dist/dev/sections/buttons.d.ts.map +0 -1
  310. package/dist/dev/sections/display.d.ts +0 -2
  311. package/dist/dev/sections/display.d.ts.map +0 -1
  312. package/dist/dev/sections/feedback.d.ts +0 -2
  313. package/dist/dev/sections/feedback.d.ts.map +0 -1
  314. package/dist/dev/sections/forms.d.ts +0 -2
  315. package/dist/dev/sections/forms.d.ts.map +0 -1
  316. package/dist/dev/sections/interactive.d.ts +0 -2
  317. package/dist/dev/sections/interactive.d.ts.map +0 -1
  318. package/dist/dev/sections/overview.d.ts +0 -2
  319. package/dist/dev/sections/overview.d.ts.map +0 -1
  320. package/dist/dev/showcase/accordion.d.ts +0 -2
  321. package/dist/dev/showcase/accordion.d.ts.map +0 -1
  322. package/dist/dev/showcase/alert-dialog.d.ts +0 -2
  323. package/dist/dev/showcase/alert-dialog.d.ts.map +0 -1
  324. package/dist/dev/showcase/alert.d.ts +0 -2
  325. package/dist/dev/showcase/alert.d.ts.map +0 -1
  326. package/dist/dev/showcase/aspect-ratio.d.ts +0 -2
  327. package/dist/dev/showcase/aspect-ratio.d.ts.map +0 -1
  328. package/dist/dev/showcase/avatar.d.ts +0 -2
  329. package/dist/dev/showcase/avatar.d.ts.map +0 -1
  330. package/dist/dev/showcase/badge.d.ts +0 -2
  331. package/dist/dev/showcase/badge.d.ts.map +0 -1
  332. package/dist/dev/showcase/breadcrumb.d.ts +0 -2
  333. package/dist/dev/showcase/breadcrumb.d.ts.map +0 -1
  334. package/dist/dev/showcase/button.d.ts +0 -2
  335. package/dist/dev/showcase/button.d.ts.map +0 -1
  336. package/dist/dev/showcase/calendar.d.ts +0 -2
  337. package/dist/dev/showcase/calendar.d.ts.map +0 -1
  338. package/dist/dev/showcase/card.d.ts +0 -2
  339. package/dist/dev/showcase/card.d.ts.map +0 -1
  340. package/dist/dev/showcase/carousel.d.ts +0 -2
  341. package/dist/dev/showcase/carousel.d.ts.map +0 -1
  342. package/dist/dev/showcase/chart.d.ts +0 -2
  343. package/dist/dev/showcase/chart.d.ts.map +0 -1
  344. package/dist/dev/showcase/checkbox.d.ts +0 -2
  345. package/dist/dev/showcase/checkbox.d.ts.map +0 -1
  346. package/dist/dev/showcase/collapsible.d.ts +0 -3
  347. package/dist/dev/showcase/collapsible.d.ts.map +0 -1
  348. package/dist/dev/showcase/combobox.d.ts +0 -2
  349. package/dist/dev/showcase/combobox.d.ts.map +0 -1
  350. package/dist/dev/showcase/command.d.ts +0 -2
  351. package/dist/dev/showcase/command.d.ts.map +0 -1
  352. package/dist/dev/showcase/context-menu.d.ts +0 -2
  353. package/dist/dev/showcase/context-menu.d.ts.map +0 -1
  354. package/dist/dev/showcase/dialog.d.ts +0 -2
  355. package/dist/dev/showcase/dialog.d.ts.map +0 -1
  356. package/dist/dev/showcase/drawer.d.ts +0 -2
  357. package/dist/dev/showcase/drawer.d.ts.map +0 -1
  358. package/dist/dev/showcase/dropdown-menu.d.ts +0 -2
  359. package/dist/dev/showcase/dropdown-menu.d.ts.map +0 -1
  360. package/dist/dev/showcase/empty.d.ts +0 -2
  361. package/dist/dev/showcase/empty.d.ts.map +0 -1
  362. package/dist/dev/showcase/hover-card.d.ts +0 -2
  363. package/dist/dev/showcase/hover-card.d.ts.map +0 -1
  364. package/dist/dev/showcase/input-group.d.ts +0 -2
  365. package/dist/dev/showcase/input-group.d.ts.map +0 -1
  366. package/dist/dev/showcase/input-otp.d.ts +0 -2
  367. package/dist/dev/showcase/input-otp.d.ts.map +0 -1
  368. package/dist/dev/showcase/input.d.ts +0 -2
  369. package/dist/dev/showcase/input.d.ts.map +0 -1
  370. package/dist/dev/showcase/item.d.ts +0 -2
  371. package/dist/dev/showcase/item.d.ts.map +0 -1
  372. package/dist/dev/showcase/kbd.d.ts +0 -2
  373. package/dist/dev/showcase/kbd.d.ts.map +0 -1
  374. package/dist/dev/showcase/label.d.ts +0 -2
  375. package/dist/dev/showcase/label.d.ts.map +0 -1
  376. package/dist/dev/showcase/menubar.d.ts +0 -2
  377. package/dist/dev/showcase/menubar.d.ts.map +0 -1
  378. package/dist/dev/showcase/navigation-menu.d.ts +0 -3
  379. package/dist/dev/showcase/navigation-menu.d.ts.map +0 -1
  380. package/dist/dev/showcase/overview.d.ts +0 -2
  381. package/dist/dev/showcase/overview.d.ts.map +0 -1
  382. package/dist/dev/showcase/pagination.d.ts +0 -2
  383. package/dist/dev/showcase/pagination.d.ts.map +0 -1
  384. package/dist/dev/showcase/popover.d.ts +0 -2
  385. package/dist/dev/showcase/popover.d.ts.map +0 -1
  386. package/dist/dev/showcase/progress.d.ts +0 -2
  387. package/dist/dev/showcase/progress.d.ts.map +0 -1
  388. package/dist/dev/showcase/radio-group.d.ts +0 -2
  389. package/dist/dev/showcase/radio-group.d.ts.map +0 -1
  390. package/dist/dev/showcase/resizable.d.ts +0 -2
  391. package/dist/dev/showcase/resizable.d.ts.map +0 -1
  392. package/dist/dev/showcase/scroll-area.d.ts +0 -2
  393. package/dist/dev/showcase/scroll-area.d.ts.map +0 -1
  394. package/dist/dev/showcase/select.d.ts +0 -2
  395. package/dist/dev/showcase/select.d.ts.map +0 -1
  396. package/dist/dev/showcase/separator.d.ts +0 -2
  397. package/dist/dev/showcase/separator.d.ts.map +0 -1
  398. package/dist/dev/showcase/sheet.d.ts +0 -2
  399. package/dist/dev/showcase/sheet.d.ts.map +0 -1
  400. package/dist/dev/showcase/sidebar.d.ts +0 -2
  401. package/dist/dev/showcase/sidebar.d.ts.map +0 -1
  402. package/dist/dev/showcase/skeleton.d.ts +0 -2
  403. package/dist/dev/showcase/skeleton.d.ts.map +0 -1
  404. package/dist/dev/showcase/slider.d.ts +0 -2
  405. package/dist/dev/showcase/slider.d.ts.map +0 -1
  406. package/dist/dev/showcase/sonner.d.ts +0 -2
  407. package/dist/dev/showcase/sonner.d.ts.map +0 -1
  408. package/dist/dev/showcase/spinner.d.ts +0 -2
  409. package/dist/dev/showcase/spinner.d.ts.map +0 -1
  410. package/dist/dev/showcase/switch.d.ts +0 -2
  411. package/dist/dev/showcase/switch.d.ts.map +0 -1
  412. package/dist/dev/showcase/table.d.ts +0 -2
  413. package/dist/dev/showcase/table.d.ts.map +0 -1
  414. package/dist/dev/showcase/tabs.d.ts +0 -2
  415. package/dist/dev/showcase/tabs.d.ts.map +0 -1
  416. package/dist/dev/showcase/textarea.d.ts +0 -2
  417. package/dist/dev/showcase/textarea.d.ts.map +0 -1
  418. package/dist/dev/showcase/toast.d.ts +0 -2
  419. package/dist/dev/showcase/toast.d.ts.map +0 -1
  420. package/dist/dev/showcase/toggle-group.d.ts +0 -2
  421. package/dist/dev/showcase/toggle-group.d.ts.map +0 -1
  422. package/dist/dev/showcase/toggle.d.ts +0 -2
  423. package/dist/dev/showcase/toggle.d.ts.map +0 -1
  424. package/dist/dev/showcase/tooltip.d.ts +0 -2
  425. package/dist/dev/showcase/tooltip.d.ts.map +0 -1
  426. package/dist/hooks/use-controllable-state.d.ts +0 -14
  427. package/dist/hooks/use-controllable-state.d.ts.map +0 -1
  428. package/dist/hooks/use-mobile.d.ts +0 -2
  429. package/dist/hooks/use-mobile.d.ts.map +0 -1
  430. package/dist/index.cjs +0 -5099
  431. package/dist/index.cjs.map +0 -1
  432. package/dist/index.d.ts +0 -58
  433. package/dist/index.d.ts.map +0 -1
  434. package/dist/index.js +0 -4753
  435. package/dist/index.js.map +0 -1
  436. package/dist/lib/types.d.ts +0 -4
  437. package/dist/lib/types.d.ts.map +0 -1
  438. package/dist/lib/utils.d.ts +0 -3
  439. package/dist/lib/utils.d.ts.map +0 -1
  440. package/dist/preset.d.ts +0 -18
  441. package/dist/preset.d.ts.map +0 -1
  442. package/dist/test/setup.d.ts +0 -1
  443. package/dist/test/setup.d.ts.map +0 -1
  444. package/scripts/add-icononly-prop.ts +0 -84
  445. package/scripts/audit-best-practices.ts +0 -114
  446. package/scripts/audit-showcase.ts +0 -262
  447. package/scripts/audit-showcases.ts +0 -83
  448. package/scripts/clean-imports.ts +0 -21
  449. package/scripts/count_missing.ts +0 -24
  450. package/scripts/find-css-vars.ts +0 -62
  451. package/scripts/fix-portals.ts +0 -90
  452. package/scripts/format-codestrings.ts +0 -87
  453. package/scripts/full-audit.ts +0 -89
  454. package/scripts/merge-components.cjs +0 -65
  455. package/scripts/merge-components.js +0 -64
  456. package/scripts/optimize-barrel.ts +0 -116
  457. package/scripts/organize-imports.ts +0 -21
  458. package/scripts/refactor_divs.ts +0 -39
  459. package/scripts/regex-format.cjs +0 -67
  460. package/scripts/remove_div_wrappers.ts +0 -17
  461. package/scripts/tmp.tsx +0 -25
  462. package/scripts/update-gaps.ts +0 -83
  463. package/scripts/update_showcase_codestrings.ts +0 -87
package/bin/cli.js CHANGED
@@ -16,6 +16,8 @@ if (process.argv.includes('--help') || process.argv.includes('-h')) {
16
16
  console.log(`
17
17
  Usage:
18
18
  npx gladvn init [destination]
19
+ npx gladvn add <component> [destination]
20
+ npx gladvn add-block <block> [destination]
19
21
 
20
22
  Options:
21
23
  [destination] The folder where components will be copied. Defaults to "gladvn".
@@ -26,10 +28,28 @@ Options:
26
28
 
27
29
  // Find destination
28
30
  let userDest = "gladvn";
31
+ let command = "init";
32
+ let componentToAdd = null;
29
33
  const args = process.argv.slice(2);
30
34
 
31
35
  if (args[0] === "init") {
32
36
  if (args[1]) userDest = args[1];
37
+ } else if (args[0] === "add") {
38
+ command = "add";
39
+ if (!args[1]) {
40
+ console.error(`\x1b[31m✖ Please specify a component to add (e.g. npx gladvn add button)\x1b[0m`);
41
+ process.exit(1);
42
+ }
43
+ componentToAdd = args[1];
44
+ if (args[2]) userDest = args[2];
45
+ } else if (args[0] === "add-block") {
46
+ command = "add-block";
47
+ if (!args[1]) {
48
+ console.error(`\x1b[31m✖ Please specify a block to add (e.g. npx gladvn add-block auth)\x1b[0m`);
49
+ process.exit(1);
50
+ }
51
+ componentToAdd = args[1];
52
+ if (args[2]) userDest = args[2];
33
53
  } else if (args[0]) {
34
54
  userDest = args[0];
35
55
  }
@@ -121,178 +141,287 @@ async function selectOption(message, options) {
121
141
  });
122
142
  }
123
143
 
144
+ async function selectMultipleOptions(message, options) {
145
+ return new Promise((resolve) => {
146
+ let selectedIndex = 0;
147
+ const selected = new Set();
148
+
149
+ const render = () => {
150
+ process.stdout.write('\x1B[?25l');
151
+ readline.cursorTo(process.stdout, 0);
152
+ readline.clearScreenDown(process.stdout);
153
+
154
+ console.log(`\x1b[33m?\x1b[0m \x1b[1m${message}\x1b[0m \x1b[90m(Press <space> to select, <enter> to confirm)\x1b[0m`);
155
+ options.forEach((opt, index) => {
156
+ const isChecked = selected.has(index);
157
+ const checkbox = isChecked ? '\x1b[32m◉\x1b[0m' : '\x1b[90m◯\x1b[0m';
158
+ if (index === selectedIndex) {
159
+ console.log(` \x1b[36m❯ ${checkbox} ${opt}\x1b[0m`);
160
+ } else {
161
+ console.log(` ${checkbox} ${opt}`);
162
+ }
163
+ });
164
+ readline.moveCursor(process.stdout, 0, -(options.length + 1));
165
+ };
166
+
167
+ render();
168
+
169
+ const onKeyPress = (str, key) => {
170
+ if (key.name === 'up') {
171
+ selectedIndex = selectedIndex > 0 ? selectedIndex - 1 : options.length - 1;
172
+ render();
173
+ } else if (key.name === 'down') {
174
+ selectedIndex = selectedIndex < options.length - 1 ? selectedIndex + 1 : 0;
175
+ render();
176
+ } else if (key.name === 'space') {
177
+ if (selected.has(selectedIndex)) {
178
+ selected.delete(selectedIndex);
179
+ } else {
180
+ selected.add(selectedIndex);
181
+ }
182
+ render();
183
+ } else if (key.name === 'return' || key.name === 'enter') {
184
+ cleanup();
185
+ const results = Array.from(selected).map(idx => options[idx]);
186
+ console.log(`\x1b[32m✔\x1b[0m \x1b[1m${message}\x1b[0m \x1b[90m…\x1b[0m \x1b[36m${results.length} selected\x1b[0m`);
187
+ resolve(results);
188
+ } else if (key.name === 'c' && key.ctrl) {
189
+ cleanup();
190
+ console.log('\n\x1b[31m✖ Cancelled.\x1b[0m');
191
+ process.exit(1);
192
+ }
193
+ };
194
+
195
+ const cleanup = () => {
196
+ process.stdin.removeListener('keypress', onKeyPress);
197
+ if (process.stdin.isTTY) process.stdin.setRawMode(false);
198
+ process.stdin.pause();
199
+ readline.moveCursor(process.stdout, 0, options.length + 1);
200
+ process.stdout.write('\x1B[?25h');
201
+ readline.moveCursor(process.stdout, 0, -(options.length + 1));
202
+ readline.clearScreenDown(process.stdout);
203
+ };
204
+
205
+ readline.emitKeypressEvents(process.stdin);
206
+ if (process.stdin.isTTY) process.stdin.setRawMode(true);
207
+ process.stdin.resume();
208
+ process.stdin.on('keypress', onKeyPress);
209
+ });
210
+ }
211
+
124
212
  async function main() {
125
213
  console.log(`\n${cyan}╔══════════════════════════════════════════════════════════════════╗${reset}`);
126
- console.log(`${cyan}║ ${bold}gladvn${reset}${cyan} Initialization ║${reset}`);
214
+ if (command === "add") {
215
+ console.log(`${cyan}║ ${bold}gladvn${reset}${cyan} — Add Component ║${reset}`);
216
+ } else if (command === "add-block") {
217
+ console.log(`${cyan}║ ${bold}gladvn${reset}${cyan} — Add Block ║${reset}`);
218
+ } else {
219
+ console.log(`${cyan}║ ${bold}gladvn${reset}${cyan} — Initialization ║${reset}`);
220
+ }
127
221
  console.log(`${cyan}╚══════════════════════════════════════════════════════════════════╝${reset}\n`);
128
222
 
129
- let targetCss = "app/globals.css";
130
- const cssFilesFull = findCssFiles(process.cwd());
131
- const cssFiles = cssFilesFull.map(f => path.relative(process.cwd(), f));
132
-
223
+ let hasErrors = false;
133
224
  const isTTY = process.stdin.isTTY;
134
225
 
135
- if (cssFiles.length === 0) {
136
- console.log(`\x1b[33m⚠ No CSS files found in the project.\x1b[0m`);
226
+ const componentsDir = path.join(srcDir, 'components');
227
+ let availableComponents = [];
228
+
229
+ if (fs.existsSync(componentsDir)) {
230
+ const subDirs = ['micro', 'macro'];
231
+ for (const sub of subDirs) {
232
+ const subPath = path.join(componentsDir, sub);
233
+ if (fs.existsSync(subPath)) {
234
+ const files = fs.readdirSync(subPath);
235
+ for (const file of files) {
236
+ if (file.endsWith('.tsx') || file.endsWith('.ts')) {
237
+ availableComponents.push(`${sub}/${file}`);
238
+ }
239
+ }
240
+ }
241
+ }
242
+ }
243
+
244
+ const blocksDir = path.join(srcDir, 'blocks');
245
+ let availableBlocks = [];
246
+
247
+ if (fs.existsSync(blocksDir)) {
248
+ const files = fs.readdirSync(blocksDir);
249
+ for (const file of files) {
250
+ if (file.endsWith('.tsx') || file.endsWith('.ts')) {
251
+ availableBlocks.push(file);
252
+ }
253
+ }
254
+ }
255
+
256
+ if (command === "add") {
257
+ console.log(`\x1b[36mAdding ${componentToAdd} to ${userDest}...\x1b[0m`);
258
+ const compMatches = availableComponents.filter(c => c.endsWith(`/${componentToAdd}.tsx`) || c.endsWith(`/${componentToAdd}.ts`));
259
+ if (compMatches.length === 0) {
260
+ console.error(`\x1b[31m✖ Component "${componentToAdd}" not found.\x1b[0m`);
261
+ process.exit(1);
262
+ }
137
263
 
138
- let answer = 'y';
139
- if (isTTY) {
140
- const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
141
- answer = await new Promise((resolve) => rl.question(`${yellow}? Do you want to create a new app/globals.css file? (Y/n)${reset} `, resolve));
142
- rl.close();
264
+ if (!fs.existsSync(destPath)) {
265
+ fs.mkdirSync(destPath, { recursive: true });
266
+ }
267
+ const comp = compMatches[0];
268
+ const sourcePath = path.join(componentsDir, comp);
269
+ const targetPath = path.join(destPath, 'components', comp);
270
+ const targetDir = path.dirname(targetPath);
271
+ if (!fs.existsSync(targetDir)) {
272
+ fs.mkdirSync(targetDir, { recursive: true });
273
+ }
274
+ try {
275
+ fs.cpSync(sourcePath, targetPath, { force: true });
276
+ console.log(`\x1b[32m✔ Added ${comp}\x1b[0m`);
277
+ } catch (err) {
278
+ console.error(`\x1b[31m✖ Failed to add ${comp}: ${err.message}\x1b[0m`);
279
+ hasErrors = true;
280
+ }
281
+ } else if (command === "add-block") {
282
+ console.log(`\x1b[36mAdding block ${componentToAdd} to ${userDest}...\x1b[0m`);
283
+ const blockMatches = availableBlocks.filter(b => b === `${componentToAdd}.tsx` || b === `${componentToAdd}.ts`);
284
+ if (blockMatches.length === 0) {
285
+ console.error(`\x1b[31m✖ Block "${componentToAdd}" not found.\x1b[0m`);
286
+ process.exit(1);
143
287
  }
144
288
 
145
- if (answer.trim().toLowerCase() !== 'n') {
146
- targetCss = "app/globals.css";
147
- const newCssPath = path.resolve(process.cwd(), targetCss);
148
- if (!fs.existsSync(path.dirname(newCssPath))) {
149
- fs.mkdirSync(path.dirname(newCssPath), { recursive: true });
150
- }
151
- fs.writeFileSync(newCssPath, `@import "tailwindcss";\n`);
152
- console.log(`\x1b[32m✔\x1b[0m \x1b[1mCreated\x1b[0m \x1b[36m${targetCss}\x1b[0m`);
153
- } else {
154
- targetCss = null;
289
+ if (!fs.existsSync(destPath)) {
290
+ fs.mkdirSync(destPath, { recursive: true });
291
+ }
292
+ const block = blockMatches[0];
293
+ const sourcePath = path.join(blocksDir, block);
294
+ const targetPath = path.join(destPath, 'blocks', block);
295
+ const targetDir = path.dirname(targetPath);
296
+ if (!fs.existsSync(targetDir)) {
297
+ fs.mkdirSync(targetDir, { recursive: true });
298
+ }
299
+ try {
300
+ fs.cpSync(sourcePath, targetPath, { force: true });
301
+ console.log(`\x1b[32m✔ Added block ${block}\x1b[0m`);
302
+ } catch (err) {
303
+ console.error(`\x1b[31m✖ Failed to add block ${block}: ${err.message}\x1b[0m`);
304
+ hasErrors = true;
155
305
  }
156
- } else if (!isTTY) {
157
- const rl = readline.createInterface({
158
- input: process.stdin,
159
- output: process.stdout,
160
- });
161
- const ask = (question) => new Promise((resolve) => rl.question(question, resolve));
162
- const cssFile = await ask(
163
- `${yellow} 📄 Path to your main CSS file? ${dim}(default: app/globals.css)${reset}\n > `
164
- );
165
- targetCss = cssFile.trim() || "app/globals.css";
166
- rl.close();
167
- } else if (cssFiles.length === 1) {
168
- targetCss = cssFiles[0];
169
- console.log(`\x1b[32m✔\x1b[0m \x1b[1mFound global CSS file\x1b[0m \x1b[90m…\x1b[0m \x1b[36m${targetCss}\x1b[0m`);
170
306
  } else {
171
- // We have more than 1 file, and environment is TTY
172
- targetCss = await selectOption("Which CSS file should we inject gladvn styles into?", cssFiles);
173
- }
307
+ // === INIT COMMAND ===
308
+ let targetCss = "app/globals.css";
309
+ const cssFilesFull = findCssFiles(process.cwd());
310
+ const cssFiles = cssFilesFull.map(f => path.relative(process.cwd(), f));
174
311
 
175
- let cssFilePath = null;
176
- if (targetCss) {
177
- cssFilePath = path.resolve(process.cwd(), targetCss);
178
- }
312
+ if (cssFiles.length === 0) {
313
+ console.log(`\x1b[33m⚠ No CSS files found in the project.\x1b[0m`);
314
+
315
+ let answer = 'y';
316
+ if (isTTY) {
317
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
318
+ answer = await new Promise((resolve) => rl.question(`${yellow}? Do you want to create a new app/globals.css file? (Y/n)${reset} `, resolve));
319
+ rl.close();
320
+ }
321
+
322
+ if (answer.trim().toLowerCase() !== 'n') {
323
+ targetCss = "app/globals.css";
324
+ const newCssPath = path.resolve(process.cwd(), targetCss);
325
+ if (!fs.existsSync(path.dirname(newCssPath))) {
326
+ fs.mkdirSync(path.dirname(newCssPath), { recursive: true });
327
+ }
328
+ fs.writeFileSync(newCssPath, `@import "tailwindcss";\n`);
329
+ console.log(`\x1b[32m✔\x1b[0m \x1b[1mCreated\x1b[0m \x1b[36m${targetCss}\x1b[0m`);
330
+ } else {
331
+ targetCss = null;
332
+ }
333
+ } else if (!isTTY) {
334
+ const rl = readline.createInterface({
335
+ input: process.stdin,
336
+ output: process.stdout,
337
+ });
338
+ const ask = (question) => new Promise((resolve) => rl.question(question, resolve));
339
+ const cssFile = await ask(
340
+ `${yellow} 📄 Path to your main CSS file? ${dim}(default: app/globals.css)${reset}\n > `
341
+ );
342
+ targetCss = cssFile.trim() || "app/globals.css";
343
+ rl.close();
344
+ } else if (cssFiles.length === 1) {
345
+ targetCss = cssFiles[0];
346
+ console.log(`\x1b[32m✔\x1b[0m \x1b[1mFound global CSS file\x1b[0m \x1b[90m…\x1b[0m \x1b[36m${targetCss}\x1b[0m`);
347
+ } else {
348
+ targetCss = await selectOption("Which CSS file should we inject gladvn styles into?", cssFiles);
349
+ }
179
350
 
180
- // 1. Copy files
181
- let dirsToCopy = [];
182
- if (fs.existsSync(srcDir)) {
183
- const excludeList = ['dev', 'test', 'vite-env.d.ts'];
184
- dirsToCopy = fs.readdirSync(srcDir).filter(item => !excludeList.includes(item));
185
- }
351
+ let cssFilePath = null;
352
+ if (targetCss) {
353
+ cssFilePath = path.resolve(process.cwd(), targetCss);
354
+ }
186
355
 
187
- console.log(`\n\x1b[36mInitializing gladvn components into ${userDest}...\x1b[0m`);
356
+ // 1. Copy files
357
+ console.log(`\n\x1b[36mInitializing gladvn components into ${userDest}...\x1b[0m`);
188
358
 
189
- if (!fs.existsSync(destPath)) {
190
- fs.mkdirSync(destPath, { recursive: true });
191
- }
359
+ if (!fs.existsSync(destPath)) {
360
+ fs.mkdirSync(destPath, { recursive: true });
361
+ }
192
362
 
193
- let hasErrors = false;
363
+ // Always copy core directories
194
364
 
195
- for (const dir of dirsToCopy) {
365
+ const coreDirs = ['hooks', 'lib', 'styles'];
366
+ for (const dir of coreDirs) {
196
367
  const sourcePath = path.join(srcDir, dir);
197
368
  const targetPath = path.join(destPath, dir);
198
-
199
369
  if (fs.existsSync(sourcePath)) {
200
370
  try {
201
371
  fs.cpSync(sourcePath, targetPath, { recursive: true, force: true });
202
- console.log(`\x1b[32m✔ Copied ${dir}\x1b[0m`);
203
372
  } catch (err) {
204
- console.error(`\x1b[31m✖ Failed to copy ${dir}/: ${err.message}\x1b[0m`);
373
+ console.error(`\x1b[31m✖ Failed to copy core ${dir}/: ${err.message}\x1b[0m`);
205
374
  hasErrors = true;
206
375
  }
207
- } else {
208
- console.warn(`\x1b[33m⚠ Source directory src/${dir} not found in package.\x1b[0m`);
209
376
  }
210
377
  }
378
+ console.log(`\x1b[32m✔ Copied core files (lib, hooks, styles)\x1b[0m`);
211
379
 
212
- // 2. Inject CSS import
380
+ // 2. Inject CSS
213
381
  if (cssFilePath && fs.existsSync(cssFilePath)) {
214
- const gladvnCssPath = path.resolve(destPath, "styles", "gladvn.css");
215
- const tokensCssPath = path.resolve(destPath, "styles", "tokens.css");
216
- const cssDir = path.dirname(cssFilePath);
217
-
218
- let relPath = path.relative(cssDir, gladvnCssPath);
382
+ const cssContent = fs.readFileSync(cssFilePath, 'utf8');
383
+ const cssTarget = path.join(destPath, 'styles', 'gladvn.css');
384
+ let relPath = path.relative(path.dirname(cssFilePath), cssTarget).replace(/\\/g, '/');
219
385
  if (!relPath.startsWith('.')) relPath = './' + relPath;
220
- relPath = relPath.replace(/\\/g, '/');
221
-
222
- let tokensRelPath = path.relative(cssDir, tokensCssPath);
223
- if (!tokensRelPath.startsWith('.')) tokensRelPath = './' + tokensRelPath;
224
- tokensRelPath = tokensRelPath.replace(/\\/g, '/');
225
-
226
- let content = fs.readFileSync(cssFilePath, "utf8");
227
-
228
- if (content.includes(relPath)) {
229
- console.log(`\x1b[90m⏭ CSS imports already exist in ${targetCss}\x1b[0m`);
230
- } else {
231
- const importStatement = `@import "${tokensRelPath}";\n@import "${relPath}";`;
232
-
233
- const tailwindPattern = /@import\s+["']tailwindcss["'];?\s*\n?/;
234
- if (tailwindPattern.test(content)) {
235
- content = content.replace(tailwindPattern, (match) => match + importStatement + '\n');
386
+ const importStmt = `@import "${relPath}";`;
387
+ if (!cssContent.includes(importStmt) && !cssContent.includes('gladvn.css')) {
388
+ if (cssContent.includes('@import "tailwindcss";')) {
389
+ fs.writeFileSync(cssFilePath, cssContent.replace('@import "tailwindcss";', `@import "tailwindcss";\n${importStmt}`));
390
+ } else if (cssContent.includes('@tailwind base;')) {
391
+ fs.writeFileSync(cssFilePath, cssContent.replace('@tailwind base;', `@tailwind base;\n${importStmt}`));
236
392
  } else {
237
- content = importStatement + '\n' + content;
393
+ fs.writeFileSync(cssFilePath, `${importStmt}\n${cssContent}`);
238
394
  }
239
-
240
- fs.writeFileSync(cssFilePath, content);
241
- console.log(`\x1b[32m✔ Injected CSS imports into ${targetCss}\x1b[0m`);
395
+ console.log(`\x1b[32m✔ Injected gladvn CSS into ${path.basename(cssFilePath)}\x1b[0m`);
242
396
  }
243
- } else if (targetCss) {
244
- console.log(`\x1b[33m⚠ CSS file not found at ${targetCss}. You will need to manually import ${userDest}/styles/gladvn.css\x1b[0m`);
245
- } else {
246
- console.log(`\x1b[33m⚠ No CSS file configured. You will need to manually import ${userDest}/styles/gladvn.css into your project.\x1b[0m`);
247
397
  }
248
398
 
249
- // 2.5 Configure tsconfig.json
250
- if (isTTY) {
251
- const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
252
- const answer = await new Promise((resolve) => rl.question(`\n${yellow}? Do you want to configure tsconfig.json to use the @gladvn/* alias? (Y/n)${reset} `, resolve));
253
- rl.close();
254
-
255
- if (answer.trim().toLowerCase() !== 'n') {
256
- const tsconfigPath = path.resolve(process.cwd(), 'tsconfig.json');
257
- if (fs.existsSync(tsconfigPath)) {
258
- let tsContent = fs.readFileSync(tsconfigPath, 'utf8');
259
- const aliasPath = `./${userDest}/*`;
260
- const rootAliasPath = `./${userDest}`;
261
-
262
- if (tsContent.includes('"@gladvn/*"')) {
263
- if (!tsContent.includes(`"@gladvn":`)) {
264
- const aliasRegex = /"@gladvn\/\*"\s*:/;
265
- if (aliasRegex.test(tsContent)) {
266
- tsContent = tsContent.replace(aliasRegex, `"@gladvn": ["${rootAliasPath}"],\n "@gladvn/*":`);
267
- fs.writeFileSync(tsconfigPath, tsContent);
268
- console.log(`\x1b[32m✔ Injected @gladvn alias alongside existing @gladvn/*\x1b[0m`);
269
- }
270
- } else {
271
- console.log(`\x1b[90m⏭ @gladvn aliases already exist in tsconfig.json\x1b[0m`);
272
- }
273
- } else {
274
- const pathsRegex = /"paths"\s*:\s*\{/;
275
- if (pathsRegex.test(tsContent)) {
276
- tsContent = tsContent.replace(pathsRegex, `"paths": {\n "@gladvn": ["${rootAliasPath}"],\n "@gladvn/*": ["${aliasPath}"],`);
277
- fs.writeFileSync(tsconfigPath, tsContent);
278
- console.log(`\x1b[32m✔ Injected @gladvn alias into existing paths\x1b[0m`);
279
- } else {
280
- const compilerOptionsRegex = /"compilerOptions"\s*:\s*\{/;
281
- if (compilerOptionsRegex.test(tsContent)) {
282
- tsContent = tsContent.replace(compilerOptionsRegex, `"compilerOptions": {\n "paths": {\n "@gladvn": ["${rootAliasPath}"],\n "@gladvn/*": ["${aliasPath}"]\n },`);
283
- fs.writeFileSync(tsconfigPath, tsContent);
284
- console.log(`\x1b[32m✔ Injected paths object and @gladvn alias\x1b[0m`);
285
- } else {
286
- console.log(`\x1b[33m⚠ Could not find compilerOptions in tsconfig.json. Please add manually.\x1b[0m`);
287
- }
288
- }
289
- }
290
- } else {
291
- console.log(`\x1b[33m⚠ tsconfig.json not found. Please configure alias manually if desired.\x1b[0m`);
399
+ // 3. Configure Path Alias
400
+ let tsconfigPath = path.join(process.cwd(), 'tsconfig.json');
401
+ if (!fs.existsSync(tsconfigPath)) tsconfigPath = path.join(process.cwd(), 'jsconfig.json');
402
+
403
+ if (fs.existsSync(tsconfigPath)) {
404
+ let content = fs.readFileSync(tsconfigPath, 'utf8');
405
+ if (!content.includes('@gladvn/*')) {
406
+ const pathsEmptyRegex = /"paths"\s*:\s*\{\s*\}/;
407
+ const compilerOptionsEmptyRegex = /"compilerOptions"\s*:\s*\{\s*\}/;
408
+
409
+ if (pathsEmptyRegex.test(content)) {
410
+ content = content.replace(pathsEmptyRegex, `"paths": {\n "@gladvn/*": ["./${userDest}/*"]\n }`);
411
+ } else if (content.match(/"paths"\s*:\s*\{/)) {
412
+ content = content.replace(/"paths"\s*:\s*\{/, `"paths": {\n "@gladvn/*": ["./${userDest}/*"],`);
413
+ } else if (compilerOptionsEmptyRegex.test(content)) {
414
+ content = content.replace(compilerOptionsEmptyRegex, `"compilerOptions": {\n "paths": {\n "@gladvn/*": ["./${userDest}/*"]\n }\n }`);
415
+ } else if (content.match(/"compilerOptions"\s*:\s*\{/)) {
416
+ content = content.replace(/"compilerOptions"\s*:\s*\{/, `"compilerOptions": {\n "paths": {\n "@gladvn/*": ["./${userDest}/*"]\n },`);
292
417
  }
418
+ fs.writeFileSync(tsconfigPath, content);
419
+ console.log(`\x1b[32m✔ Configured path alias @gladvn/* in ${path.basename(tsconfigPath)}\x1b[0m`);
293
420
  }
294
421
  }
295
422
 
423
+ } // END OF INIT COMMAND
424
+
296
425
  // 3. Install dependencies
297
426
  try {
298
427
  const pkgPath = path.resolve(__dirname, "../package.json");
@@ -301,27 +430,94 @@ async function main() {
301
430
  const depsObj = pkg.dependencies || {};
302
431
 
303
432
  if (Object.keys(depsObj).length > 0) {
304
- const depsToInstall = Object.entries(depsObj).map(([name, version]) => `${name}@"${version}"`);
433
+ // Scan copied files to determine which dependencies are actually used
434
+ function findSourceFiles(dir, fileList = []) {
435
+ if (!fs.existsSync(dir)) return fileList;
436
+ const files = fs.readdirSync(dir);
437
+ for (const file of files) {
438
+ const filePath = path.join(dir, file);
439
+ const stat = fs.statSync(filePath);
440
+ if (stat.isDirectory()) {
441
+ findSourceFiles(filePath, fileList);
442
+ } else if (file.match(/\.(tsx?|jsx?)$/)) {
443
+ fileList.push(filePath);
444
+ }
445
+ }
446
+ return fileList;
447
+ }
305
448
 
306
- let pm = "npm";
307
- let installCmd = "install";
449
+ const sourceFiles = findSourceFiles(destPath);
450
+ const usedDeps = new Set();
451
+ const importRegex = /(?:import(?: type)?|from|require)\s*\(?\s*['"]([^'"]+)['"]/g;
308
452
 
309
- if (fs.existsSync(path.resolve(process.cwd(), "pnpm-lock.yaml"))) {
310
- pm = "pnpm";
311
- installCmd = "add";
312
- } else if (fs.existsSync(path.resolve(process.cwd(), "yarn.lock"))) {
313
- pm = "yarn";
314
- installCmd = "add";
315
- } else if (fs.existsSync(path.resolve(process.cwd(), "bun.lockb"))) {
316
- pm = "bun";
317
- installCmd = "add";
453
+ for (const file of sourceFiles) {
454
+ let content = fs.readFileSync(file, 'utf-8');
455
+ // Naively strip out comments to prevent false positive imports
456
+ content = content.replace(/\/\*[\s\S]*?\*\/|\/\/.*/g, '');
457
+ let match;
458
+ while ((match = importRegex.exec(content)) !== null) {
459
+ const importPath = match[1];
460
+ // Check if the import path matches any of our dependencies
461
+ for (const dep of Object.keys(depsObj)) {
462
+ if (importPath === dep || importPath.startsWith(dep + '/')) {
463
+ usedDeps.add(dep);
464
+ }
465
+ }
466
+ }
318
467
  }
468
+
469
+ if (usedDeps.size > 0) {
470
+ // Check user's package.json to see what is already installed
471
+ const userPkgPath = path.resolve(process.cwd(), 'package.json');
472
+ let userDeps = {};
473
+ if (fs.existsSync(userPkgPath)) {
474
+ try {
475
+ const userPkg = JSON.parse(fs.readFileSync(userPkgPath, 'utf8'));
476
+ userDeps = { ...userPkg.dependencies, ...userPkg.devDependencies };
477
+ } catch (e) {}
478
+ }
319
479
 
320
- const fullCmd = `${pm} ${installCmd} ${depsToInstall.join(" ")}`;
480
+ const depsToInstall = [];
481
+ for (const dep of usedDeps) {
482
+ if (!userDeps[dep]) {
483
+ depsToInstall.push(`${dep}@"${depsObj[dep]}"`);
484
+ }
485
+ }
321
486
 
322
- console.log(`\n\x1b[36mInstalling required dependencies using ${pm}...\x1b[0m`);
323
- execSync(fullCmd, { stdio: "inherit", cwd: process.cwd() });
324
- console.log(`\x1b[32m✔ Dependencies installed successfully!\x1b[0m`);
487
+ if (depsToInstall.length > 0) {
488
+ let pm = "npm";
489
+ let installCmd = "install";
490
+
491
+ function hasLockfile(name) {
492
+ let dir = process.cwd();
493
+ while (true) {
494
+ if (fs.existsSync(path.join(dir, name))) return true;
495
+ const parent = path.dirname(dir);
496
+ if (parent === dir) return false;
497
+ dir = parent;
498
+ }
499
+ }
500
+
501
+ if (hasLockfile("pnpm-lock.yaml")) {
502
+ pm = "pnpm";
503
+ installCmd = "add";
504
+ } else if (hasLockfile("yarn.lock")) {
505
+ pm = "yarn";
506
+ installCmd = "add";
507
+ } else if (hasLockfile("bun.lockb")) {
508
+ pm = "bun";
509
+ installCmd = "add";
510
+ }
511
+
512
+ const fullCmd = `${pm} ${installCmd} ${depsToInstall.join(" ")}`;
513
+
514
+ console.log(`\n\x1b[36mInstalling missing dependencies using ${pm}...\x1b[0m`);
515
+ execSync(fullCmd, { stdio: "inherit", cwd: process.cwd() });
516
+ console.log(`\x1b[32m✔ Dependencies installed successfully!\x1b[0m`);
517
+ } else {
518
+ console.log(`\n\x1b[90m⏭ All required dependencies are already installed.\x1b[0m`);
519
+ }
520
+ }
325
521
  }
326
522
  } catch (err) {
327
523
  console.error(`\x1b[31m✖ Failed to install dependencies: ${err.message}\x1b[0m`);
@@ -329,7 +525,13 @@ async function main() {
329
525
  }
330
526
 
331
527
  if (!hasErrors) {
332
- console.log(`\n\x1b[32m✨ Successfully initialized gladvn files in ${userDest}!\x1b[0m`);
528
+ if (command === "add") {
529
+ console.log(`\n\x1b[32m✨ Successfully added ${componentToAdd}!\x1b[0m`);
530
+ } else if (command === "add-block") {
531
+ console.log(`\n\x1b[32m✨ Successfully added block ${componentToAdd}!\x1b[0m`);
532
+ } else {
533
+ console.log(`\n\x1b[32m✨ Successfully initialized gladvn files in ${userDest}!\x1b[0m`);
534
+ }
333
535
  }
334
536
  }
335
537
 
package/llms.txt CHANGED
@@ -3,12 +3,14 @@
3
3
  You are an AI Coding Assistant helping a developer use the `gladvn` UI library.
4
4
  `gladvn` is a React component library built on top of Radix UI and Tailwind CSS, focusing on beautiful, accessible, and highly composable components.
5
5
 
6
- Follow these strict guidelines when generating or modifying code that uses `gladvn`:
6
+ ### Installation
7
+ - Use `npx gladvn init` to scaffold components into a project.
8
+ - **NEVER** use `npm install gladvn`. The components are copied directly into the project's source code, typically under a `@gladvn/` alias (e.g., `src/gladvn/`).
7
9
 
8
- ## 1. Imports
9
- - **Always** import components directly from the package root:
10
- `import { Button, Card, Dialog } from "gladvn";`
11
- - **Never** import from internal paths like `gladvn/dist/...` or `src/components/ui/...`.
10
+ ### Import Guidelines
11
+ - **ALWAYS** import components using the local alias path.
12
+ - Correct: `import { Button } from "@/gladvn/components/micro/button"` or `import { Button } from "@gladvn/components/micro/button"` (depending on the project's setup).
13
+ - Incorrect: `import { Button } from "gladvn"`
12
14
 
13
15
  ## 2. Composition over Configuration
14
16
  `gladvn` heavily uses a composable architecture. When building complex UI, always use the provided sub-components rather than passing large configuration objects.