love-ui 1.2.12 → 1.2.14

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 (988) hide show
  1. package/dist/index.js +8 -7
  2. package/dist/mcp-server.js +1 -1
  3. package/package.json +3 -2
  4. package/packages/loveui-skills/SKILL.md +99 -0
  5. package/packages/loveui-skills/agents/openai.yaml +11 -0
  6. package/packages/loveui-skills/references/design-directions.md +60 -0
  7. package/packages/loveui-skills/references/mcp-catalog-workflow.md +68 -0
  8. package/packages/loveui-skills/references/page-blueprints.md +76 -0
  9. package/packages/loveui-skills/references/quality-gates.md +51 -0
  10. package/public/r/accordion-controlled.json +1 -1
  11. package/public/r/accordion-demo.json +1 -1
  12. package/public/r/accordion-multiple.json +1 -1
  13. package/public/r/accordion-single.json +1 -1
  14. package/public/r/alert-demo.json +1 -1
  15. package/public/r/alert-dialog-demo.json +1 -1
  16. package/public/r/alert-error.json +1 -1
  17. package/public/r/alert-info.json +1 -1
  18. package/public/r/alert-success.json +1 -1
  19. package/public/r/alert-warning.json +1 -1
  20. package/public/r/alert-with-icon-action.json +1 -1
  21. package/public/r/alert-with-icon.json +1 -1
  22. package/public/r/announcement-tagless.json +1 -1
  23. package/public/r/announcement-themes.json +1 -1
  24. package/public/r/announcement.json +1 -1
  25. package/public/r/autocomplete-async.json +1 -1
  26. package/public/r/autocomplete-autohighlight.json +1 -1
  27. package/public/r/autocomplete-demo.json +1 -1
  28. package/public/r/autocomplete-disabled.json +1 -1
  29. package/public/r/autocomplete-form.json +1 -1
  30. package/public/r/autocomplete-grouped.json +1 -1
  31. package/public/r/autocomplete-inline.json +1 -1
  32. package/public/r/autocomplete-lg.json +1 -1
  33. package/public/r/autocomplete-limit.json +1 -1
  34. package/public/r/autocomplete-sm.json +1 -1
  35. package/public/r/autocomplete-with-clear.json +1 -1
  36. package/public/r/autocomplete-with-label.json +1 -1
  37. package/public/r/autocomplete-with-trigger-clear.json +1 -1
  38. package/public/r/avatar-demo.json +1 -1
  39. package/public/r/avatar-fallback.json +1 -1
  40. package/public/r/avatar-group.json +1 -1
  41. package/public/r/avatar-radius.json +1 -1
  42. package/public/r/avatar-size.json +1 -1
  43. package/public/r/avatar-stack-hover.json +1 -1
  44. package/public/r/avatar-stack.json +1 -1
  45. package/public/r/badge-demo.json +1 -1
  46. package/public/r/badge-destructive.json +1 -1
  47. package/public/r/badge-error.json +1 -1
  48. package/public/r/badge-info.json +1 -1
  49. package/public/r/badge-lg.json +1 -1
  50. package/public/r/badge-outline.json +1 -1
  51. package/public/r/badge-secondary.json +1 -1
  52. package/public/r/badge-sm.json +1 -1
  53. package/public/r/badge-success.json +1 -1
  54. package/public/r/badge-warning.json +1 -1
  55. package/public/r/badge-with-icon.json +1 -1
  56. package/public/r/badge-with-link.json +1 -1
  57. package/public/r/banner-inset.json +1 -1
  58. package/public/r/banner-themes.json +1 -1
  59. package/public/r/banner.json +1 -1
  60. package/public/r/bookmarks.json +206 -0
  61. package/public/r/breadcrumb-custom-separator.json +1 -1
  62. package/public/r/breadcrumb-demo.json +1 -1
  63. package/public/r/button-demo.json +1 -1
  64. package/public/r/button-destructive-outline.json +1 -1
  65. package/public/r/button-destructive.json +1 -1
  66. package/public/r/button-disabled.json +1 -1
  67. package/public/r/button-ghost.json +1 -1
  68. package/public/r/button-lg.json +1 -1
  69. package/public/r/button-link.json +1 -1
  70. package/public/r/button-loading.json +1 -1
  71. package/public/r/button-outline.json +1 -1
  72. package/public/r/button-secondary.json +1 -1
  73. package/public/r/button-sm.json +1 -1
  74. package/public/r/button-with-icon.json +1 -1
  75. package/public/r/button-with-link.json +1 -1
  76. package/public/r/button-xl.json +1 -1
  77. package/public/r/button-xs.json +1 -1
  78. package/public/r/calendar-headless.json +1 -1
  79. package/public/r/calendar-rac.json +16 -0
  80. package/public/r/calendar.json +1 -1
  81. package/public/r/card-demo.json +1 -1
  82. package/public/r/chart.json +15 -0
  83. package/public/r/checkbox-card.json +1 -1
  84. package/public/r/checkbox-demo.json +1 -1
  85. package/public/r/checkbox-disabled.json +1 -1
  86. package/public/r/checkbox-form.json +1 -1
  87. package/public/r/checkbox-group-demo.json +1 -1
  88. package/public/r/checkbox-group-disabled.json +1 -1
  89. package/public/r/checkbox-group-form.json +1 -1
  90. package/public/r/checkbox-group-nested-parent.json +1 -1
  91. package/public/r/checkbox-group-parent.json +1 -1
  92. package/public/r/checkbox-tree.json +12 -0
  93. package/public/r/checkbox-with-description.json +1 -1
  94. package/public/r/choicebox-inline.json +1 -1
  95. package/public/r/choicebox.json +1 -1
  96. package/public/r/codebase.json +1 -1
  97. package/public/r/collaborative-canvas.json +1 -1
  98. package/public/r/collapsible-demo.json +1 -1
  99. package/public/r/combobox-autohighlight.json +1 -1
  100. package/public/r/combobox-controlled.json +1 -1
  101. package/public/r/combobox-create-new.json +1 -1
  102. package/public/r/combobox-demo.json +1 -1
  103. package/public/r/combobox-disabled.json +1 -1
  104. package/public/r/combobox-fixed-width.json +1 -1
  105. package/public/r/combobox-form.json +1 -1
  106. package/public/r/combobox-grouped.json +1 -1
  107. package/public/r/combobox-lg.json +1 -1
  108. package/public/r/combobox-multiple-form.json +1 -1
  109. package/public/r/combobox-multiple.json +1 -1
  110. package/public/r/combobox-sm.json +1 -1
  111. package/public/r/combobox-with-clear.json +1 -1
  112. package/public/r/combobox-with-inner-input.json +1 -1
  113. package/public/r/combobox-with-label.json +1 -1
  114. package/public/r/command.json +18 -0
  115. package/public/r/comp-01.json +22 -0
  116. package/public/r/comp-02.json +23 -0
  117. package/public/r/comp-03.json +23 -0
  118. package/public/r/comp-04.json +23 -0
  119. package/public/r/comp-05.json +22 -0
  120. package/public/r/comp-06.json +23 -0
  121. package/public/r/comp-07.json +22 -0
  122. package/public/r/comp-08.json +23 -0
  123. package/public/r/comp-09.json +22 -0
  124. package/public/r/comp-10.json +22 -0
  125. package/public/r/comp-100.json +23 -0
  126. package/public/r/comp-101.json +23 -0
  127. package/public/r/comp-102.json +23 -0
  128. package/public/r/comp-103.json +23 -0
  129. package/public/r/comp-104.json +23 -0
  130. package/public/r/comp-105.json +23 -0
  131. package/public/r/comp-106.json +22 -0
  132. package/public/r/comp-107.json +22 -0
  133. package/public/r/comp-108.json +23 -0
  134. package/public/r/comp-109.json +22 -0
  135. package/public/r/comp-11.json +22 -0
  136. package/public/r/comp-110.json +22 -0
  137. package/public/r/comp-111.json +21 -0
  138. package/public/r/comp-112.json +21 -0
  139. package/public/r/comp-113.json +22 -0
  140. package/public/r/comp-114.json +23 -0
  141. package/public/r/comp-115.json +22 -0
  142. package/public/r/comp-116.json +22 -0
  143. package/public/r/comp-117.json +23 -0
  144. package/public/r/comp-118.json +23 -0
  145. package/public/r/comp-119.json +27 -0
  146. package/public/r/comp-12.json +22 -0
  147. package/public/r/comp-120.json +27 -0
  148. package/public/r/comp-121.json +27 -0
  149. package/public/r/comp-122.json +27 -0
  150. package/public/r/comp-123.json +22 -0
  151. package/public/r/comp-124.json +22 -0
  152. package/public/r/comp-125.json +31 -0
  153. package/public/r/comp-126.json +31 -0
  154. package/public/r/comp-127.json +21 -0
  155. package/public/r/comp-128.json +21 -0
  156. package/public/r/comp-129.json +24 -0
  157. package/public/r/comp-13.json +22 -0
  158. package/public/r/comp-130.json +23 -0
  159. package/public/r/comp-131.json +23 -0
  160. package/public/r/comp-132.json +23 -0
  161. package/public/r/comp-133.json +23 -0
  162. package/public/r/comp-134.json +23 -0
  163. package/public/r/comp-135.json +24 -0
  164. package/public/r/comp-136.json +23 -0
  165. package/public/r/comp-137.json +23 -0
  166. package/public/r/comp-138.json +25 -0
  167. package/public/r/comp-139.json +23 -0
  168. package/public/r/comp-14.json +22 -0
  169. package/public/r/comp-140.json +23 -0
  170. package/public/r/comp-141.json +23 -0
  171. package/public/r/comp-142.json +25 -0
  172. package/public/r/comp-143.json +23 -0
  173. package/public/r/comp-144.json +24 -0
  174. package/public/r/comp-145.json +24 -0
  175. package/public/r/comp-146.json +24 -0
  176. package/public/r/comp-147.json +24 -0
  177. package/public/r/comp-148.json +25 -0
  178. package/public/r/comp-149.json +24 -0
  179. package/public/r/comp-15.json +22 -0
  180. package/public/r/comp-150.json +21 -0
  181. package/public/r/comp-151.json +23 -0
  182. package/public/r/comp-152.json +23 -0
  183. package/public/r/comp-153.json +23 -0
  184. package/public/r/comp-154.json +23 -0
  185. package/public/r/comp-155.json +23 -0
  186. package/public/r/comp-156.json +25 -0
  187. package/public/r/comp-157.json +27 -0
  188. package/public/r/comp-158.json +24 -0
  189. package/public/r/comp-159.json +24 -0
  190. package/public/r/comp-16.json +22 -0
  191. package/public/r/comp-160.json +24 -0
  192. package/public/r/comp-161.json +24 -0
  193. package/public/r/comp-162.json +24 -0
  194. package/public/r/comp-163.json +28 -0
  195. package/public/r/comp-164.json +24 -0
  196. package/public/r/comp-165.json +24 -0
  197. package/public/r/comp-166.json +25 -0
  198. package/public/r/comp-167.json +24 -0
  199. package/public/r/comp-168.json +24 -0
  200. package/public/r/comp-169.json +23 -0
  201. package/public/r/comp-17.json +25 -0
  202. package/public/r/comp-170.json +25 -0
  203. package/public/r/comp-171.json +28 -0
  204. package/public/r/comp-172.json +23 -0
  205. package/public/r/comp-173.json +23 -0
  206. package/public/r/comp-174.json +23 -0
  207. package/public/r/comp-175.json +23 -0
  208. package/public/r/comp-176.json +23 -0
  209. package/public/r/comp-177.json +23 -0
  210. package/public/r/comp-178.json +23 -0
  211. package/public/r/comp-179.json +24 -0
  212. package/public/r/comp-18.json +25 -0
  213. package/public/r/comp-180.json +23 -0
  214. package/public/r/comp-181.json +25 -0
  215. package/public/r/comp-182.json +24 -0
  216. package/public/r/comp-183.json +25 -0
  217. package/public/r/comp-184.json +25 -0
  218. package/public/r/comp-185.json +24 -0
  219. package/public/r/comp-186.json +25 -0
  220. package/public/r/comp-187.json +25 -0
  221. package/public/r/comp-188.json +25 -0
  222. package/public/r/comp-189.json +23 -0
  223. package/public/r/comp-19.json +23 -0
  224. package/public/r/comp-190.json +23 -0
  225. package/public/r/comp-191.json +24 -0
  226. package/public/r/comp-192.json +23 -0
  227. package/public/r/comp-193.json +23 -0
  228. package/public/r/comp-194.json +24 -0
  229. package/public/r/comp-195.json +23 -0
  230. package/public/r/comp-196.json +24 -0
  231. package/public/r/comp-197.json +23 -0
  232. package/public/r/comp-198.json +23 -0
  233. package/public/r/comp-199.json +23 -0
  234. package/public/r/comp-20.json +23 -0
  235. package/public/r/comp-200.json +25 -0
  236. package/public/r/comp-201.json +22 -0
  237. package/public/r/comp-202.json +22 -0
  238. package/public/r/comp-203.json +23 -0
  239. package/public/r/comp-204.json +23 -0
  240. package/public/r/comp-205.json +23 -0
  241. package/public/r/comp-206.json +24 -0
  242. package/public/r/comp-207.json +23 -0
  243. package/public/r/comp-208.json +23 -0
  244. package/public/r/comp-209.json +23 -0
  245. package/public/r/comp-21.json +23 -0
  246. package/public/r/comp-210.json +24 -0
  247. package/public/r/comp-211.json +24 -0
  248. package/public/r/comp-212.json +23 -0
  249. package/public/r/comp-213.json +23 -0
  250. package/public/r/comp-214.json +23 -0
  251. package/public/r/comp-215.json +24 -0
  252. package/public/r/comp-216.json +22 -0
  253. package/public/r/comp-217.json +22 -0
  254. package/public/r/comp-218.json +25 -0
  255. package/public/r/comp-219.json +23 -0
  256. package/public/r/comp-22.json +23 -0
  257. package/public/r/comp-220.json +24 -0
  258. package/public/r/comp-221.json +23 -0
  259. package/public/r/comp-222.json +26 -0
  260. package/public/r/comp-223.json +26 -0
  261. package/public/r/comp-224.json +23 -0
  262. package/public/r/comp-225.json +24 -0
  263. package/public/r/comp-226.json +26 -0
  264. package/public/r/comp-227.json +26 -0
  265. package/public/r/comp-228.json +26 -0
  266. package/public/r/comp-229.json +30 -0
  267. package/public/r/comp-23.json +24 -0
  268. package/public/r/comp-230.json +30 -0
  269. package/public/r/comp-231.json +32 -0
  270. package/public/r/comp-232.json +31 -0
  271. package/public/r/comp-233.json +30 -0
  272. package/public/r/comp-234.json +28 -0
  273. package/public/r/comp-235.json +28 -0
  274. package/public/r/comp-236.json +24 -0
  275. package/public/r/comp-237.json +26 -0
  276. package/public/r/comp-238.json +26 -0
  277. package/public/r/comp-239.json +26 -0
  278. package/public/r/comp-24.json +23 -0
  279. package/public/r/comp-240.json +23 -0
  280. package/public/r/comp-241.json +24 -0
  281. package/public/r/comp-242.json +23 -0
  282. package/public/r/comp-243.json +23 -0
  283. package/public/r/comp-244.json +23 -0
  284. package/public/r/comp-245.json +23 -0
  285. package/public/r/comp-246.json +23 -0
  286. package/public/r/comp-247.json +23 -0
  287. package/public/r/comp-248.json +23 -0
  288. package/public/r/comp-249.json +24 -0
  289. package/public/r/comp-25.json +24 -0
  290. package/public/r/comp-250.json +25 -0
  291. package/public/r/comp-251.json +25 -0
  292. package/public/r/comp-252.json +25 -0
  293. package/public/r/comp-253.json +25 -0
  294. package/public/r/comp-254.json +35 -0
  295. package/public/r/comp-255.json +30 -0
  296. package/public/r/comp-256.json +25 -0
  297. package/public/r/comp-257.json +25 -0
  298. package/public/r/comp-258.json +32 -0
  299. package/public/r/comp-259.json +26 -0
  300. package/public/r/comp-26.json +24 -0
  301. package/public/r/comp-260.json +26 -0
  302. package/public/r/comp-261.json +24 -0
  303. package/public/r/comp-262.json +31 -0
  304. package/public/r/comp-263.json +25 -0
  305. package/public/r/comp-264.json +33 -0
  306. package/public/r/comp-265.json +32 -0
  307. package/public/r/comp-266.json +24 -0
  308. package/public/r/comp-267.json +19 -0
  309. package/public/r/comp-268.json +19 -0
  310. package/public/r/comp-269.json +19 -0
  311. package/public/r/comp-27.json +24 -0
  312. package/public/r/comp-270.json +19 -0
  313. package/public/r/comp-271.json +19 -0
  314. package/public/r/comp-272.json +19 -0
  315. package/public/r/comp-273.json +19 -0
  316. package/public/r/comp-274.json +19 -0
  317. package/public/r/comp-275.json +19 -0
  318. package/public/r/comp-276.json +19 -0
  319. package/public/r/comp-277.json +21 -0
  320. package/public/r/comp-278.json +21 -0
  321. package/public/r/comp-279.json +23 -0
  322. package/public/r/comp-28.json +24 -0
  323. package/public/r/comp-280.json +23 -0
  324. package/public/r/comp-281.json +23 -0
  325. package/public/r/comp-282.json +23 -0
  326. package/public/r/comp-283.json +23 -0
  327. package/public/r/comp-284.json +23 -0
  328. package/public/r/comp-285.json +23 -0
  329. package/public/r/comp-286.json +23 -0
  330. package/public/r/comp-287.json +24 -0
  331. package/public/r/comp-288.json +23 -0
  332. package/public/r/comp-289.json +24 -0
  333. package/public/r/comp-29.json +24 -0
  334. package/public/r/comp-290.json +24 -0
  335. package/public/r/comp-291.json +24 -0
  336. package/public/r/comp-292.json +24 -0
  337. package/public/r/comp-293.json +26 -0
  338. package/public/r/comp-294.json +24 -0
  339. package/public/r/comp-295.json +23 -0
  340. package/public/r/comp-296.json +23 -0
  341. package/public/r/comp-297.json +30 -0
  342. package/public/r/comp-298.json +26 -0
  343. package/public/r/comp-299.json +28 -0
  344. package/public/r/comp-30.json +23 -0
  345. package/public/r/comp-300.json +29 -0
  346. package/public/r/comp-301.json +24 -0
  347. package/public/r/comp-302.json +18 -0
  348. package/public/r/comp-303.json +18 -0
  349. package/public/r/comp-304.json +18 -0
  350. package/public/r/comp-305.json +21 -0
  351. package/public/r/comp-306.json +21 -0
  352. package/public/r/comp-307.json +21 -0
  353. package/public/r/comp-308.json +21 -0
  354. package/public/r/comp-309.json +21 -0
  355. package/public/r/comp-31.json +21 -0
  356. package/public/r/comp-310.json +23 -0
  357. package/public/r/comp-311.json +20 -0
  358. package/public/r/comp-312.json +21 -0
  359. package/public/r/comp-313.json +26 -0
  360. package/public/r/comp-314.json +26 -0
  361. package/public/r/comp-315.json +24 -0
  362. package/public/r/comp-316.json +25 -0
  363. package/public/r/comp-317.json +24 -0
  364. package/public/r/comp-318.json +24 -0
  365. package/public/r/comp-319.json +24 -0
  366. package/public/r/comp-32.json +21 -0
  367. package/public/r/comp-320.json +27 -0
  368. package/public/r/comp-321.json +28 -0
  369. package/public/r/comp-322.json +27 -0
  370. package/public/r/comp-323.json +30 -0
  371. package/public/r/comp-324.json +28 -0
  372. package/public/r/comp-325.json +29 -0
  373. package/public/r/comp-326.json +30 -0
  374. package/public/r/comp-327.json +30 -0
  375. package/public/r/comp-328.json +37 -0
  376. package/public/r/comp-329.json +38 -0
  377. package/public/r/comp-33.json +18 -0
  378. package/public/r/comp-330.json +27 -0
  379. package/public/r/comp-331.json +42 -0
  380. package/public/r/comp-332.json +25 -0
  381. package/public/r/comp-333.json +29 -0
  382. package/public/r/comp-334.json +22 -0
  383. package/public/r/comp-335.json +22 -0
  384. package/public/r/comp-336.json +22 -0
  385. package/public/r/comp-337.json +22 -0
  386. package/public/r/comp-338.json +22 -0
  387. package/public/r/comp-339.json +22 -0
  388. package/public/r/comp-34.json +27 -0
  389. package/public/r/comp-340.json +22 -0
  390. package/public/r/comp-341.json +22 -0
  391. package/public/r/comp-342.json +22 -0
  392. package/public/r/comp-343.json +22 -0
  393. package/public/r/comp-344.json +22 -0
  394. package/public/r/comp-345.json +22 -0
  395. package/public/r/comp-346.json +22 -0
  396. package/public/r/comp-347.json +22 -0
  397. package/public/r/comp-348.json +22 -0
  398. package/public/r/comp-349.json +22 -0
  399. package/public/r/comp-35.json +27 -0
  400. package/public/r/comp-350.json +22 -0
  401. package/public/r/comp-351.json +22 -0
  402. package/public/r/comp-352.json +24 -0
  403. package/public/r/comp-353.json +24 -0
  404. package/public/r/comp-354.json +23 -0
  405. package/public/r/comp-355.json +23 -0
  406. package/public/r/comp-356.json +23 -0
  407. package/public/r/comp-357.json +23 -0
  408. package/public/r/comp-358.json +23 -0
  409. package/public/r/comp-359.json +24 -0
  410. package/public/r/comp-36.json +26 -0
  411. package/public/r/comp-360.json +25 -0
  412. package/public/r/comp-361.json +23 -0
  413. package/public/r/comp-362.json +24 -0
  414. package/public/r/comp-363.json +27 -0
  415. package/public/r/comp-364.json +26 -0
  416. package/public/r/comp-365.json +24 -0
  417. package/public/r/comp-366.json +23 -0
  418. package/public/r/comp-367.json +23 -0
  419. package/public/r/comp-368.json +23 -0
  420. package/public/r/comp-369.json +23 -0
  421. package/public/r/comp-37.json +23 -0
  422. package/public/r/comp-370.json +23 -0
  423. package/public/r/comp-371.json +24 -0
  424. package/public/r/comp-372.json +24 -0
  425. package/public/r/comp-373.json +25 -0
  426. package/public/r/comp-374.json +26 -0
  427. package/public/r/comp-375.json +25 -0
  428. package/public/r/comp-376.json +26 -0
  429. package/public/r/comp-377.json +27 -0
  430. package/public/r/comp-378.json +24 -0
  431. package/public/r/comp-379.json +24 -0
  432. package/public/r/comp-38.json +23 -0
  433. package/public/r/comp-380.json +24 -0
  434. package/public/r/comp-381.json +26 -0
  435. package/public/r/comp-382.json +25 -0
  436. package/public/r/comp-383.json +26 -0
  437. package/public/r/comp-384.json +24 -0
  438. package/public/r/comp-385.json +24 -0
  439. package/public/r/comp-386.json +24 -0
  440. package/public/r/comp-387.json +28 -0
  441. package/public/r/comp-388.json +26 -0
  442. package/public/r/comp-389.json +24 -0
  443. package/public/r/comp-39.json +23 -0
  444. package/public/r/comp-390.json +23 -0
  445. package/public/r/comp-391.json +23 -0
  446. package/public/r/comp-392.json +23 -0
  447. package/public/r/comp-393.json +23 -0
  448. package/public/r/comp-394.json +24 -0
  449. package/public/r/comp-395.json +24 -0
  450. package/public/r/comp-396.json +24 -0
  451. package/public/r/comp-397.json +25 -0
  452. package/public/r/comp-398.json +26 -0
  453. package/public/r/comp-399.json +26 -0
  454. package/public/r/comp-40.json +23 -0
  455. package/public/r/comp-400.json +20 -0
  456. package/public/r/comp-401.json +19 -0
  457. package/public/r/comp-402.json +19 -0
  458. package/public/r/comp-403.json +19 -0
  459. package/public/r/comp-404.json +19 -0
  460. package/public/r/comp-405.json +19 -0
  461. package/public/r/comp-406.json +19 -0
  462. package/public/r/comp-407.json +19 -0
  463. package/public/r/comp-408.json +19 -0
  464. package/public/r/comp-409.json +22 -0
  465. package/public/r/comp-41.json +29 -0
  466. package/public/r/comp-410.json +22 -0
  467. package/public/r/comp-411.json +22 -0
  468. package/public/r/comp-412.json +19 -0
  469. package/public/r/comp-413.json +22 -0
  470. package/public/r/comp-414.json +22 -0
  471. package/public/r/comp-415.json +22 -0
  472. package/public/r/comp-416.json +23 -0
  473. package/public/r/comp-417.json +22 -0
  474. package/public/r/comp-418.json +23 -0
  475. package/public/r/comp-419.json +23 -0
  476. package/public/r/comp-42.json +30 -0
  477. package/public/r/comp-420.json +23 -0
  478. package/public/r/comp-421.json +23 -0
  479. package/public/r/comp-422.json +23 -0
  480. package/public/r/comp-423.json +24 -0
  481. package/public/r/comp-424.json +22 -0
  482. package/public/r/comp-425.json +23 -0
  483. package/public/r/comp-426.json +23 -0
  484. package/public/r/comp-427.json +23 -0
  485. package/public/r/comp-428.json +23 -0
  486. package/public/r/comp-429.json +23 -0
  487. package/public/r/comp-43.json +32 -0
  488. package/public/r/comp-430.json +23 -0
  489. package/public/r/comp-431.json +23 -0
  490. package/public/r/comp-432.json +23 -0
  491. package/public/r/comp-433.json +24 -0
  492. package/public/r/comp-434.json +24 -0
  493. package/public/r/comp-435.json +24 -0
  494. package/public/r/comp-436.json +24 -0
  495. package/public/r/comp-437.json +25 -0
  496. package/public/r/comp-438.json +23 -0
  497. package/public/r/comp-439.json +24 -0
  498. package/public/r/comp-44.json +25 -0
  499. package/public/r/comp-440.json +25 -0
  500. package/public/r/comp-441.json +25 -0
  501. package/public/r/comp-442.json +24 -0
  502. package/public/r/comp-443.json +24 -0
  503. package/public/r/comp-444.json +24 -0
  504. package/public/r/comp-445.json +24 -0
  505. package/public/r/comp-446.json +24 -0
  506. package/public/r/comp-447.json +25 -0
  507. package/public/r/comp-448.json +23 -0
  508. package/public/r/comp-449.json +23 -0
  509. package/public/r/comp-45.json +25 -0
  510. package/public/r/comp-450.json +23 -0
  511. package/public/r/comp-451.json +23 -0
  512. package/public/r/comp-452.json +23 -0
  513. package/public/r/comp-453.json +25 -0
  514. package/public/r/comp-454.json +22 -0
  515. package/public/r/comp-455.json +22 -0
  516. package/public/r/comp-456.json +22 -0
  517. package/public/r/comp-457.json +21 -0
  518. package/public/r/comp-458.json +22 -0
  519. package/public/r/comp-459.json +26 -0
  520. package/public/r/comp-46.json +26 -0
  521. package/public/r/comp-460.json +26 -0
  522. package/public/r/comp-461.json +27 -0
  523. package/public/r/comp-462.json +27 -0
  524. package/public/r/comp-463.json +30 -0
  525. package/public/r/comp-464.json +29 -0
  526. package/public/r/comp-465.json +29 -0
  527. package/public/r/comp-466.json +21 -0
  528. package/public/r/comp-467.json +23 -0
  529. package/public/r/comp-468.json +21 -0
  530. package/public/r/comp-469.json +21 -0
  531. package/public/r/comp-47.json +32 -0
  532. package/public/r/comp-470.json +21 -0
  533. package/public/r/comp-471.json +21 -0
  534. package/public/r/comp-472.json +23 -0
  535. package/public/r/comp-473.json +24 -0
  536. package/public/r/comp-474.json +22 -0
  537. package/public/r/comp-475.json +22 -0
  538. package/public/r/comp-476.json +21 -0
  539. package/public/r/comp-477.json +31 -0
  540. package/public/r/comp-478.json +36 -0
  541. package/public/r/comp-479.json +28 -0
  542. package/public/r/comp-48.json +32 -0
  543. package/public/r/comp-480.json +30 -0
  544. package/public/r/comp-481.json +34 -0
  545. package/public/r/comp-482.json +33 -0
  546. package/public/r/comp-483.json +37 -0
  547. package/public/r/comp-484.json +41 -0
  548. package/public/r/comp-485.json +43 -0
  549. package/public/r/comp-486.json +23 -0
  550. package/public/r/comp-487.json +26 -0
  551. package/public/r/comp-488.json +27 -0
  552. package/public/r/comp-489.json +28 -0
  553. package/public/r/comp-49.json +32 -0
  554. package/public/r/comp-490.json +23 -0
  555. package/public/r/comp-491.json +24 -0
  556. package/public/r/comp-492.json +25 -0
  557. package/public/r/comp-493.json +23 -0
  558. package/public/r/comp-494.json +23 -0
  559. package/public/r/comp-495.json +24 -0
  560. package/public/r/comp-496.json +23 -0
  561. package/public/r/comp-497.json +24 -0
  562. package/public/r/comp-498.json +24 -0
  563. package/public/r/comp-499.json +24 -0
  564. package/public/r/comp-50.json +32 -0
  565. package/public/r/comp-500.json +25 -0
  566. package/public/r/comp-501.json +25 -0
  567. package/public/r/comp-502.json +26 -0
  568. package/public/r/comp-503.json +27 -0
  569. package/public/r/comp-504.json +28 -0
  570. package/public/r/comp-505.json +28 -0
  571. package/public/r/comp-506.json +26 -0
  572. package/public/r/comp-507.json +27 -0
  573. package/public/r/comp-508.json +25 -0
  574. package/public/r/comp-509.json +25 -0
  575. package/public/r/comp-51.json +23 -0
  576. package/public/r/comp-510.json +24 -0
  577. package/public/r/comp-511.json +27 -0
  578. package/public/r/comp-512.json +27 -0
  579. package/public/r/comp-513.json +21 -0
  580. package/public/r/comp-514.json +21 -0
  581. package/public/r/comp-515.json +21 -0
  582. package/public/r/comp-516.json +22 -0
  583. package/public/r/comp-517.json +22 -0
  584. package/public/r/comp-518.json +21 -0
  585. package/public/r/comp-519.json +21 -0
  586. package/public/r/comp-52.json +23 -0
  587. package/public/r/comp-520.json +22 -0
  588. package/public/r/comp-521.json +22 -0
  589. package/public/r/comp-522.json +21 -0
  590. package/public/r/comp-523.json +21 -0
  591. package/public/r/comp-524.json +21 -0
  592. package/public/r/comp-525.json +21 -0
  593. package/public/r/comp-526.json +22 -0
  594. package/public/r/comp-527.json +23 -0
  595. package/public/r/comp-528.json +22 -0
  596. package/public/r/comp-529.json +22 -0
  597. package/public/r/comp-53.json +24 -0
  598. package/public/r/comp-530.json +22 -0
  599. package/public/r/comp-531.json +22 -0
  600. package/public/r/comp-532.json +22 -0
  601. package/public/r/comp-533.json +22 -0
  602. package/public/r/comp-534.json +22 -0
  603. package/public/r/comp-535.json +22 -0
  604. package/public/r/comp-536.json +22 -0
  605. package/public/r/comp-537.json +22 -0
  606. package/public/r/comp-538.json +22 -0
  607. package/public/r/comp-539.json +22 -0
  608. package/public/r/comp-54.json +26 -0
  609. package/public/r/comp-540.json +21 -0
  610. package/public/r/comp-541.json +21 -0
  611. package/public/r/comp-542.json +124 -0
  612. package/public/r/comp-543.json +29 -0
  613. package/public/r/comp-544.json +26 -0
  614. package/public/r/comp-545.json +29 -0
  615. package/public/r/comp-546.json +29 -0
  616. package/public/r/comp-547.json +29 -0
  617. package/public/r/comp-548.json +29 -0
  618. package/public/r/comp-549.json +29 -0
  619. package/public/r/comp-55.json +27 -0
  620. package/public/r/comp-550.json +29 -0
  621. package/public/r/comp-551.json +30 -0
  622. package/public/r/comp-552.json +29 -0
  623. package/public/r/comp-553.json +29 -0
  624. package/public/r/comp-554.json +36 -0
  625. package/public/r/comp-555.json +23 -0
  626. package/public/r/comp-556.json +23 -0
  627. package/public/r/comp-557.json +23 -0
  628. package/public/r/comp-558.json +23 -0
  629. package/public/r/comp-559.json +23 -0
  630. package/public/r/comp-56.json +26 -0
  631. package/public/r/comp-560.json +23 -0
  632. package/public/r/comp-561.json +25 -0
  633. package/public/r/comp-562.json +23 -0
  634. package/public/r/comp-563.json +23 -0
  635. package/public/r/comp-564.json +24 -0
  636. package/public/r/comp-565.json +20 -0
  637. package/public/r/comp-566.json +20 -0
  638. package/public/r/comp-567.json +20 -0
  639. package/public/r/comp-568.json +20 -0
  640. package/public/r/comp-569.json +20 -0
  641. package/public/r/comp-57.json +26 -0
  642. package/public/r/comp-570.json +20 -0
  643. package/public/r/comp-571.json +23 -0
  644. package/public/r/comp-572.json +23 -0
  645. package/public/r/comp-573.json +20 -0
  646. package/public/r/comp-574.json +22 -0
  647. package/public/r/comp-575.json +20 -0
  648. package/public/r/comp-576.json +21 -0
  649. package/public/r/comp-577.json +23 -0
  650. package/public/r/comp-578.json +28 -0
  651. package/public/r/comp-579.json +28 -0
  652. package/public/r/comp-58.json +25 -0
  653. package/public/r/comp-580.json +29 -0
  654. package/public/r/comp-581.json +45 -0
  655. package/public/r/comp-582.json +42 -0
  656. package/public/r/comp-583.json +41 -0
  657. package/public/r/comp-584.json +41 -0
  658. package/public/r/comp-585.json +41 -0
  659. package/public/r/comp-586.json +34 -0
  660. package/public/r/comp-587.json +29 -0
  661. package/public/r/comp-588.json +33 -0
  662. package/public/r/comp-589.json +37 -0
  663. package/public/r/comp-59.json +22 -0
  664. package/public/r/comp-590.json +40 -0
  665. package/public/r/comp-591.json +29 -0
  666. package/public/r/comp-592.json +41 -0
  667. package/public/r/comp-593.json +36 -0
  668. package/public/r/comp-594.json +33 -0
  669. package/public/r/comp-595.json +22 -0
  670. package/public/r/comp-596.json +26 -0
  671. package/public/r/comp-597.json +22 -0
  672. package/public/r/comp-598.json +22 -0
  673. package/public/r/comp-599.json +22 -0
  674. package/public/r/comp-60.json +23 -0
  675. package/public/r/comp-600.json +17 -0
  676. package/public/r/comp-601.json +20 -0
  677. package/public/r/comp-602.json +17 -0
  678. package/public/r/comp-603.json +20 -0
  679. package/public/r/comp-604.json +17 -0
  680. package/public/r/comp-605.json +17 -0
  681. package/public/r/comp-606.json +20 -0
  682. package/public/r/comp-607.json +20 -0
  683. package/public/r/comp-608.json +20 -0
  684. package/public/r/comp-609.json +20 -0
  685. package/public/r/comp-61.json +23 -0
  686. package/public/r/comp-610.json +23 -0
  687. package/public/r/comp-611.json +23 -0
  688. package/public/r/comp-612.json +17 -0
  689. package/public/r/comp-613.json +20 -0
  690. package/public/r/comp-614.json +17 -0
  691. package/public/r/comp-615.json +26 -0
  692. package/public/r/comp-616.json +26 -0
  693. package/public/r/comp-617.json +26 -0
  694. package/public/r/comp-62.json +23 -0
  695. package/public/r/comp-63.json +22 -0
  696. package/public/r/comp-64.json +23 -0
  697. package/public/r/comp-65.json +22 -0
  698. package/public/r/comp-66.json +22 -0
  699. package/public/r/comp-67.json +23 -0
  700. package/public/r/comp-68.json +24 -0
  701. package/public/r/comp-69.json +24 -0
  702. package/public/r/comp-70.json +24 -0
  703. package/public/r/comp-71.json +22 -0
  704. package/public/r/comp-72.json +21 -0
  705. package/public/r/comp-73.json +18 -0
  706. package/public/r/comp-74.json +27 -0
  707. package/public/r/comp-75.json +22 -0
  708. package/public/r/comp-76.json +23 -0
  709. package/public/r/comp-77.json +22 -0
  710. package/public/r/comp-78.json +21 -0
  711. package/public/r/comp-79.json +22 -0
  712. package/public/r/comp-80.json +21 -0
  713. package/public/r/comp-81.json +21 -0
  714. package/public/r/comp-82.json +22 -0
  715. package/public/r/comp-83.json +21 -0
  716. package/public/r/comp-84.json +21 -0
  717. package/public/r/comp-85.json +22 -0
  718. package/public/r/comp-86.json +22 -0
  719. package/public/r/comp-87.json +21 -0
  720. package/public/r/comp-88.json +22 -0
  721. package/public/r/comp-89.json +21 -0
  722. package/public/r/comp-90.json +22 -0
  723. package/public/r/comp-91.json +22 -0
  724. package/public/r/comp-92.json +22 -0
  725. package/public/r/comp-93.json +22 -0
  726. package/public/r/comp-94.json +24 -0
  727. package/public/r/comp-95.json +26 -0
  728. package/public/r/comp-96.json +21 -0
  729. package/public/r/comp-97.json +21 -0
  730. package/public/r/comp-98.json +22 -0
  731. package/public/r/comp-99.json +23 -0
  732. package/public/r/comparison-event-handlers.json +1 -1
  733. package/public/r/comparison-hover.json +1 -1
  734. package/public/r/comparison.json +1 -1
  735. package/public/r/context-menu.json +16 -0
  736. package/public/r/contribution-graph-custom-footer.json +1 -1
  737. package/public/r/credit-card-apple.json +1 -1
  738. package/public/r/credit-card-back.json +1 -1
  739. package/public/r/credit-card.json +1 -1
  740. package/public/r/cropper.json +15 -0
  741. package/public/r/cursor-color.json +1 -1
  742. package/public/r/cursor-message.json +1 -1
  743. package/public/r/cursor-name-message.json +1 -1
  744. package/public/r/cursor-name.json +1 -1
  745. package/public/r/cursor.json +1 -1
  746. package/public/r/dashboard-1.json +263 -0
  747. package/public/r/dashboard-2.json +264 -0
  748. package/public/r/dashboard-3.json +225 -0
  749. package/public/r/datefield-rac.json +15 -0
  750. package/public/r/deck-controlled.json +1 -1
  751. package/public/r/deck-product-cards.json +1 -1
  752. package/public/r/deck.json +1 -1
  753. package/public/r/dialog-close-confirmation.json +1 -1
  754. package/public/r/dialog-demo.json +1 -1
  755. package/public/r/dialog-from-menu.json +1 -1
  756. package/public/r/dialog-nested.json +1 -1
  757. package/public/r/dialog-stack-controlled.json +1 -1
  758. package/public/r/dialog-stack-navigation.json +1 -1
  759. package/public/r/dialog-stack-six.json +1 -1
  760. package/public/r/dialog-stack.json +1 -1
  761. package/public/r/dropdown-menu.json +15 -0
  762. package/public/r/dropzone-custom-empty-state.json +1 -1
  763. package/public/r/dropzone-image-preview.json +1 -1
  764. package/public/r/editor.json +1 -1
  765. package/public/r/emails.json +243 -0
  766. package/public/r/empty-demo.json +1 -1
  767. package/public/r/example-app-calendar.json +323 -0
  768. package/public/r/field-2.json +19 -0
  769. package/public/r/field-autocomplete.json +1 -1
  770. package/public/r/field-checkbox-group.json +1 -1
  771. package/public/r/field-checkbox.json +1 -1
  772. package/public/r/field-combobox-multiple.json +1 -1
  773. package/public/r/field-combobox.json +1 -1
  774. package/public/r/field-complete-form.json +1 -1
  775. package/public/r/field-demo.json +1 -1
  776. package/public/r/field-disabled.json +1 -1
  777. package/public/r/field-error.json +1 -1
  778. package/public/r/field-number-field.json +1 -1
  779. package/public/r/field-radio.json +1 -1
  780. package/public/r/field-required.json +1 -1
  781. package/public/r/field-select.json +1 -1
  782. package/public/r/field-slider.json +1 -1
  783. package/public/r/field-switch.json +1 -1
  784. package/public/r/field-textarea.json +1 -1
  785. package/public/r/field-validity.json +1 -1
  786. package/public/r/fieldset-demo.json +1 -1
  787. package/public/r/files.json +195 -0
  788. package/public/r/form-demo.json +1 -1
  789. package/public/r/form-zod.json +1 -1
  790. package/public/r/form.json +1 -1
  791. package/public/r/frame-demo.json +1 -1
  792. package/public/r/gantt-lanes.json +1 -1
  793. package/public/r/gantt-no-sidebar.json +1 -1
  794. package/public/r/gantt-read-only.json +1 -1
  795. package/public/r/gantt.json +1 -1
  796. package/public/r/glimpse-custom.json +1 -1
  797. package/public/r/glimpse.json +1 -1
  798. package/public/r/gooey-toast-demo.json +1 -1
  799. package/public/r/gooey-toast-promise.json +1 -1
  800. package/public/r/gooey-toast-states.json +1 -1
  801. package/public/r/gooey-toast-with-button.json +1 -1
  802. package/public/r/group-demo.json +1 -1
  803. package/public/r/group-with-input.json +1 -1
  804. package/public/r/hero.json +1 -1
  805. package/public/r/hover-card.json +15 -0
  806. package/public/r/image-crop-circular.json +1 -1
  807. package/public/r/image-crop-custom.json +1 -1
  808. package/public/r/image-crop.json +1 -1
  809. package/public/r/image-zoom-background.json +1 -1
  810. package/public/r/image-zoom-margin.json +1 -1
  811. package/public/r/image-zoom.json +1 -1
  812. package/public/r/input-demo.json +1 -1
  813. package/public/r/input-disabled.json +1 -1
  814. package/public/r/input-file.json +1 -1
  815. package/public/r/input-group.json +20 -0
  816. package/public/r/input-lg.json +1 -1
  817. package/public/r/input-sm.json +1 -1
  818. package/public/r/input-with-button.json +1 -1
  819. package/public/r/input-with-label.json +1 -1
  820. package/public/r/kanban-simple.json +1 -1
  821. package/public/r/kanban.json +1 -1
  822. package/public/r/kbd.json +12 -0
  823. package/public/r/leads.json +271 -0
  824. package/public/r/list-simple.json +1 -1
  825. package/public/r/list.json +1 -1
  826. package/public/r/maps.json +188 -0
  827. package/public/r/menu-checkbox.json +1 -1
  828. package/public/r/menu-close-on-click.json +1 -1
  829. package/public/r/menu-demo.json +1 -1
  830. package/public/r/menu-group-labels.json +1 -1
  831. package/public/r/menu-hover.json +1 -1
  832. package/public/r/menu-link.json +1 -1
  833. package/public/r/menu-nested.json +1 -1
  834. package/public/r/menu-radio-group.json +1 -1
  835. package/public/r/meter-demo.json +1 -1
  836. package/public/r/meter-with-formatted-value.json +1 -1
  837. package/public/r/meter-with-range.json +1 -1
  838. package/public/r/mini-calendar-controlled.json +1 -1
  839. package/public/r/multiselect.json +15 -0
  840. package/public/r/navigation-menu.json +12 -0
  841. package/public/r/number-field-form.json +1 -1
  842. package/public/r/number-field-with-label.json +1 -1
  843. package/public/r/number-field-with-scrub.json +1 -1
  844. package/public/r/number-field-with-step.json +1 -1
  845. package/public/r/pill-avatar-group.json +1 -1
  846. package/public/r/pill-delta.json +1 -1
  847. package/public/r/pill-icon.json +1 -1
  848. package/public/r/pill-indicator.json +1 -1
  849. package/public/r/pill-status.json +1 -1
  850. package/public/r/pill.json +1 -1
  851. package/public/r/popover-demo.json +1 -1
  852. package/public/r/popover-with-close.json +1 -1
  853. package/public/r/preview-card-demo.json +1 -1
  854. package/public/r/pricing.json +1 -1
  855. package/public/r/progress-with-formatted-value.json +1 -1
  856. package/public/r/progress-with-label-value.json +1 -1
  857. package/public/r/radio-group-card.json +1 -1
  858. package/public/r/radio-group-demo.json +1 -1
  859. package/public/r/radio-group-disabled.json +1 -1
  860. package/public/r/radio-group-form.json +1 -1
  861. package/public/r/radio-group-with-description.json +1 -1
  862. package/public/r/reel-custom.json +1 -1
  863. package/public/r/reel-images.json +1 -1
  864. package/public/r/reel-minimal.json +1 -1
  865. package/public/r/reel.json +1 -1
  866. package/public/r/registry.json +18217 -0
  867. package/public/r/relative-time-controlled.json +1 -1
  868. package/public/r/relative-time-format-date.json +1 -1
  869. package/public/r/relative-time-format-time.json +1 -1
  870. package/public/r/relative-time.json +1 -1
  871. package/public/r/rentals.json +187 -0
  872. package/public/r/roadmap.json +1 -1
  873. package/public/r/sandbox-no-file-explorer.json +1 -1
  874. package/public/r/sandbox.json +1 -1
  875. package/public/r/scroll-area-both.json +1 -1
  876. package/public/r/scroll-area-demo.json +1 -1
  877. package/public/r/scroll-area-horizontal.json +1 -1
  878. package/public/r/select-demo.json +1 -1
  879. package/public/r/select-disabled.json +1 -1
  880. package/public/r/select-form.json +1 -1
  881. package/public/r/select-lg.json +1 -1
  882. package/public/r/select-native.json +12 -0
  883. package/public/r/select-sm.json +1 -1
  884. package/public/r/select-with-groups.json +1 -1
  885. package/public/r/select-without-alignment.json +1 -1
  886. package/public/r/select.json +1 -1
  887. package/public/r/separator-demo.json +1 -1
  888. package/public/r/sheet-demo.json +1 -1
  889. package/public/r/sheet-position.json +1 -1
  890. package/public/r/sidebar-nav.json +22 -0
  891. package/public/r/skeleton-demo.json +1 -1
  892. package/public/r/skeleton.json +1 -1
  893. package/public/r/slider-form.json +1 -1
  894. package/public/r/slider-with-label-value.json +1 -1
  895. package/public/r/sonner.json +16 -0
  896. package/public/r/stats-card.json +22 -0
  897. package/public/r/status-custom.json +1 -1
  898. package/public/r/stepper.json +15 -0
  899. package/public/r/stories-images.json +1 -1
  900. package/public/r/switch-card.json +1 -1
  901. package/public/r/switch-demo.json +1 -1
  902. package/public/r/switch-disabled.json +1 -1
  903. package/public/r/switch-form.json +1 -1
  904. package/public/r/switch-with-description.json +1 -1
  905. package/public/r/table-demo.json +1 -1
  906. package/public/r/table-framed.json +1 -1
  907. package/public/r/table-simple.json +1 -1
  908. package/public/r/table.json +1 -1
  909. package/public/r/tabs-demo.json +1 -1
  910. package/public/r/tabs-underline-vertical.json +1 -1
  911. package/public/r/tabs-underline.json +1 -1
  912. package/public/r/tabs-vertical.json +1 -1
  913. package/public/r/tags-create.json +1 -1
  914. package/public/r/tags-filter.json +1 -1
  915. package/public/r/tags.json +1 -1
  916. package/public/r/template-auth-eight.json +28 -0
  917. package/public/r/template-auth-five.json +28 -0
  918. package/public/r/template-auth-four.json +29 -0
  919. package/public/r/template-auth-nine.json +28 -0
  920. package/public/r/template-auth-one.json +49 -0
  921. package/public/r/template-auth-seven.json +29 -0
  922. package/public/r/template-auth-six.json +28 -0
  923. package/public/r/template-auth-three.json +49 -0
  924. package/public/r/template-auth-two.json +44 -0
  925. package/public/r/template-hero-eight.json +83 -0
  926. package/public/r/template-hero-eleven.json +29 -0
  927. package/public/r/template-hero-five.json +35 -0
  928. package/public/r/template-hero-four.json +35 -0
  929. package/public/r/template-hero-fourteen.json +101 -0
  930. package/public/r/template-hero-nine.json +74 -0
  931. package/public/r/template-hero-one.json +90 -0
  932. package/public/r/template-hero-seven.json +83 -0
  933. package/public/r/template-hero-six.json +83 -0
  934. package/public/r/template-hero-ten.json +77 -0
  935. package/public/r/template-hero-thirteen.json +101 -0
  936. package/public/r/template-hero-three.json +35 -0
  937. package/public/r/template-hero-twelve.json +30 -0
  938. package/public/r/template-hero-two.json +96 -0
  939. package/public/r/template-logo-cloud-five.json +68 -0
  940. package/public/r/template-logo-cloud-four.json +71 -0
  941. package/public/r/template-logo-cloud-one.json +89 -0
  942. package/public/r/template-logo-cloud-three.json +71 -0
  943. package/public/r/template-logo-cloud-two.json +74 -0
  944. package/public/r/textarea-demo.json +1 -1
  945. package/public/r/textarea-disabled.json +1 -1
  946. package/public/r/textarea-form.json +1 -1
  947. package/public/r/textarea-lg.json +1 -1
  948. package/public/r/textarea-sm.json +1 -1
  949. package/public/r/textarea-with-label.json +1 -1
  950. package/public/r/ticker-inline.json +1 -1
  951. package/public/r/timeline.json +15 -0
  952. package/public/r/toast-demo.json +1 -1
  953. package/public/r/toast-heights.json +1 -1
  954. package/public/r/toast-loading.json +1 -1
  955. package/public/r/toast-promise.json +1 -1
  956. package/public/r/toast-with-action.json +1 -1
  957. package/public/r/toast-with-status.json +1 -1
  958. package/public/r/toggle-demo.json +1 -1
  959. package/public/r/toggle-disabled.json +1 -1
  960. package/public/r/toggle-group-demo.json +1 -1
  961. package/public/r/toggle-group-disabled.json +1 -1
  962. package/public/r/toggle-group-lg.json +1 -1
  963. package/public/r/toggle-group-multiple.json +1 -1
  964. package/public/r/toggle-group-outline-with-separator.json +1 -1
  965. package/public/r/toggle-group-outline.json +1 -1
  966. package/public/r/toggle-group-sm.json +1 -1
  967. package/public/r/toggle-group-with-disabled-item.json +1 -1
  968. package/public/r/toggle-icon-group.json +1 -1
  969. package/public/r/toggle-lg.json +1 -1
  970. package/public/r/toggle-outline.json +1 -1
  971. package/public/r/toggle-sm.json +1 -1
  972. package/public/r/toggle-with-icon.json +1 -1
  973. package/public/r/toolbar-demo.json +1 -1
  974. package/public/r/tooltip-demo.json +1 -1
  975. package/public/r/tooltip-grouped.json +1 -1
  976. package/public/r/tree-controlled.json +1 -1
  977. package/public/r/tree-custom-icons.json +1 -1
  978. package/public/r/tree-no-lines.json +1 -1
  979. package/public/r/tree-simple.json +1 -1
  980. package/public/r/tree.json +1 -1
  981. package/public/r/typography.json +1 -1
  982. package/public/r/ui.json +5 -0
  983. package/public/r/use-character-limit.json +12 -0
  984. package/public/r/use-file-upload.json +12 -0
  985. package/public/r/use-pagination.json +12 -0
  986. package/public/r/use-slider-with-input.json +12 -0
  987. package/public/r/use-toast.json +12 -0
  988. package/public/r/utils.json +16 -0
@@ -0,0 +1,243 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "emails",
4
+ "type": "registry:block",
5
+ "title": "Incident Mailbox",
6
+ "description": "An operations-focused incident mailbox with alert triage, thread detail, and escalation navigation.",
7
+ "files": [
8
+ {
9
+ "path": "registry/example-apps/default/emails/components/emails/email-detail.tsx",
10
+ "type": "registry:component",
11
+ "target": "components/example-apps/emails/components/emails/email-detail.tsx",
12
+ "content": "\"use client\"\n\nimport {\n IconArchive,\n IconCalendar,\n IconChecks,\n IconChevronLeft,\n IconChevronRight,\n IconClock,\n IconDotsVertical,\n IconFile,\n IconFileSpreadsheet,\n IconFileText,\n IconFileZip,\n IconFilter,\n IconFolderOpen,\n IconMailPlus,\n IconPhoto,\n IconReceipt,\n IconSettings,\n IconShare,\n IconShield,\n IconSparkles,\n IconStar,\n IconTag,\n IconTrash,\n IconVolume,\n IconX,\n} from \"@tabler/icons-react\"\nimport { format } from \"date-fns\"\n\nimport { Avatar, AvatarFallback, AvatarImage } from \"@loveui/ui/ui/avatar\"\nimport { Button } from \"@loveui/ui/ui/button\"\n\nimport { cn } from \"../../lib/utils\"\nimport { useEmailsStore } from \"../../store/emails-store\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\"\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\"\nimport { VerifiedIcon } from \"../ui/verified-icon\"\n\nfunction getFileIcon(type: string) {\n if (type.includes(\"pdf\")) {\n return IconFileText\n } else if (type.includes(\"word\") || type.includes(\"document\")) {\n return IconFileText\n } else if (type.includes(\"excel\") || type.includes(\"spreadsheet\")) {\n return IconFileSpreadsheet\n } else if (type.includes(\"powerpoint\") || type.includes(\"presentation\")) {\n return IconFileText\n } else if (\n type.includes(\"image\") ||\n type.includes(\"png\") ||\n type.includes(\"jpg\") ||\n type.includes(\"jpeg\")\n ) {\n return IconPhoto\n } else if (type.includes(\"zip\") || type.includes(\"archive\")) {\n return IconFileZip\n }\n return IconFile\n}\n\nfunction getFileGradient(type: string) {\n if (type.includes(\"pdf\")) {\n return { start: \"#f75936\", end: \"#a73a24\" }\n } else if (type.includes(\"word\") || type.includes(\"document\")) {\n return { start: \"#2b5797\", end: \"#1e3d6b\" }\n } else if (type.includes(\"excel\") || type.includes(\"spreadsheet\")) {\n return { start: \"#217346\", end: \"#165530\" }\n } else if (type.includes(\"powerpoint\") || type.includes(\"presentation\")) {\n return { start: \"#d04423\", end: \"#9b3319\" }\n } else if (\n type.includes(\"image\") ||\n type.includes(\"png\") ||\n type.includes(\"jpg\") ||\n type.includes(\"jpeg\")\n ) {\n return { start: \"#8b5cf6\", end: \"#6d28d9\" }\n } else if (type.includes(\"zip\") || type.includes(\"archive\")) {\n return { start: \"#f59e0b\", end: \"#d97706\" }\n }\n return { start: \"#6b7280\", end: \"#4b5563\" }\n}\n\nexport function EmailDetail() {\n const {\n emails,\n selectedEmailId,\n toggleStar,\n clearSelectedEmail,\n selectEmail,\n } = useEmailsStore()\n const email = emails.find((e) => e.id === selectedEmailId)\n\n const currentIndex = emails.findIndex((e) => e.id === selectedEmailId)\n const isFirstEmail = currentIndex === 0\n const isLastEmail = currentIndex === emails.length - 1\n\n const goToPreviousEmail = () => {\n if (!isFirstEmail && currentIndex > 0) {\n selectEmail(emails[currentIndex - 1].id)\n }\n }\n\n const goToNextEmail = () => {\n if (!isLastEmail && currentIndex < emails.length - 1) {\n selectEmail(emails[currentIndex + 1].id)\n }\n }\n\n if (!email) {\n return (\n <div className=\"flex h-full items-center justify-center bg-card\">\n <div className=\"text-center text-muted-foreground\">\n <p>Select an alert to review</p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"flex h-full flex-col bg-card\">\n <div className=\"flex items-center justify-between border-b border-border px-3 py-3 md:px-6 md:py-4\">\n <div className=\"hidden items-center gap-3 lg:flex\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"icon-sm\">\n <IconSparkles className=\"size-4 text-foreground\" stroke={1.5} />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>AI Assistant</p>\n </TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"icon-sm\">\n <IconArchive\n className=\"size-4 text-muted-foreground\"\n stroke={1.5}\n />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Archive</p>\n </TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"icon-sm\">\n <IconSettings\n className=\"size-4 text-muted-foreground\"\n stroke={1.5}\n />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Mark as noise</p>\n </TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"icon-sm\">\n <IconTrash\n className=\"size-4 text-muted-foreground\"\n stroke={1.5}\n />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Delete</p>\n </TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"icon-sm\">\n <IconMailPlus\n className=\"size-4 text-muted-foreground\"\n stroke={1.5}\n />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Mark as unread</p>\n </TooltipContent>\n </Tooltip>\n\n <Tooltip>\n <TooltipTrigger asChild>\n <Button variant=\"ghost\" size=\"icon-sm\">\n <IconFolderOpen\n className=\"size-4 text-muted-foreground\"\n stroke={1.5}\n />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Move to folder</p>\n </TooltipContent>\n </Tooltip>\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon-sm\">\n <IconDotsVertical\n className=\"size-4 text-muted-foreground\"\n stroke={1.5}\n />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-64\">\n <DropdownMenuItem>\n <IconClock className=\"mr-2 size-4\" stroke={1.5} />\n Snooze\n </DropdownMenuItem>\n <DropdownMenuItem>\n <IconChecks className=\"mr-2 size-4\" stroke={1.5} />\n Add to Tasks\n </DropdownMenuItem>\n <DropdownMenuItem>\n <IconCalendar className=\"mr-2 size-4\" stroke={1.5} />\n Create event\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuSub>\n <DropdownMenuSubTrigger>\n <IconTag className=\"mr-2 size-4\" stroke={1.5} />\n Label as\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n <DropdownMenuItem>Ops</DropdownMenuItem>\n <DropdownMenuItem>Investigation</DropdownMenuItem>\n <DropdownMenuItem>SEV-1</DropdownMenuItem>\n <DropdownMenuItem>Postmortem</DropdownMenuItem>\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n <DropdownMenuItem>\n <IconFilter className=\"mr-2 size-4\" stroke={1.5} />\n Filter messages like these\n </DropdownMenuItem>\n <DropdownMenuItem>\n <IconVolume className=\"mr-2 size-4\" stroke={1.5} />\n Mute\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem>\n <IconSettings className=\"mr-2 size-4\" stroke={1.5} />\n Switch to advanced toolbar\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n <div className=\"flex items-center gap-1 md:gap-2 lg:hidden\">\n <Button variant=\"ghost\" size=\"icon-sm\">\n <IconSparkles className=\"size-4 text-foreground\" stroke={1.5} />\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon-sm\">\n <IconDotsVertical\n className=\"size-4 text-muted-foreground\"\n stroke={1.5}\n />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-48\">\n <DropdownMenuItem>\n <IconArchive className=\"size-4\" stroke={1.5} />\n <span>Archive</span>\n </DropdownMenuItem>\n <DropdownMenuItem>\n <IconSettings className=\"size-4\" stroke={1.5} />\n <span>Mark as noise</span>\n </DropdownMenuItem>\n <DropdownMenuItem variant=\"destructive\">\n <IconTrash className=\"size-4\" stroke={1.5} />\n <span>Delete</span>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem>\n <IconMailPlus className=\"size-4\" stroke={1.5} />\n <span>Mark as unread</span>\n </DropdownMenuItem>\n <DropdownMenuItem>\n <IconFolderOpen className=\"size-4\" stroke={1.5} />\n <span>Move to folder</span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n <div className=\"flex items-center gap-2 md:gap-3\">\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={clearSelectedEmail}\n className=\"hidden md:flex\"\n >\n <IconX className=\"size-4 text-muted-foreground\" stroke={1.5} />\n </Button>\n <p className=\"hidden text-[11px] whitespace-nowrap text-muted-foreground sm:block md:text-[13px]\">\n {currentIndex + 1} from {emails.length}\n </p>\n <div className=\"flex items-center gap-0.5 md:gap-1\">\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={goToPreviousEmail}\n disabled={isFirstEmail}\n >\n <IconChevronLeft\n className={cn(\n \"size-4\",\n isFirstEmail\n ? \"text-muted-foreground/30\"\n : \"text-muted-foreground\"\n )}\n stroke={1.5}\n />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={goToNextEmail}\n disabled={isLastEmail}\n >\n <IconChevronRight\n className={cn(\n \"size-4\",\n isLastEmail\n ? \"text-muted-foreground/30\"\n : \"text-muted-foreground\"\n )}\n stroke={1.5}\n />\n </Button>\n </div>\n </div>\n </div>\n\n <div className=\"border-b border-border px-3 py-3 md:px-6 md:py-4\">\n <div className=\"flex items-start justify-between gap-2 md:items-center md:gap-4\">\n <div className=\"flex min-w-0 flex-1 items-start gap-2 md:items-center md:gap-2.5\">\n <Avatar className=\"size-8 shrink-0 md:size-10\">\n <AvatarImage src={email.from.avatar} alt={email.from.name} />\n <AvatarFallback>{email.from.name.charAt(0)}</AvatarFallback>\n </Avatar>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1\">\n <p className=\"truncate text-sm font-medium text-foreground md:text-base\">\n {email.from.name}\n </p>\n {email.from.verified && (\n <VerifiedIcon className=\"size-3 shrink-0 md:size-4\" />\n )}\n </div>\n <p className=\"truncate text-[12px] text-muted-foreground md:text-[14px]\">\n <span className=\"hidden sm:inline\">From: </span>\n <span className=\"text-foreground\">{email.from.email}</span>\n </p>\n <p className=\"mt-0.5 text-[11px] text-muted-foreground md:hidden\">\n {format(email.date, \"MMM dd, yyyy\")}\n </p>\n </div>\n </div>\n\n <div className=\"hidden items-center gap-3 md:flex lg:gap-4\">\n <p className=\"hidden text-[14px] whitespace-nowrap text-muted-foreground opacity-70 lg:block\">\n {format(email.date, \"MMMM dd, yyyy hh:mm\")}\n </p>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => toggleStar(email.id)}\n >\n <IconStar\n className={cn(\n \"size-4\",\n email.starred\n ? \"fill-yellow-500 text-yellow-500\"\n : \"text-muted-foreground\"\n )}\n stroke={1.5}\n />\n </Button>\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"hidden lg:flex\">\n <IconShare\n className=\"size-4 text-muted-foreground\"\n stroke={1.5}\n />\n </Button>\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"hidden lg:flex\">\n <IconReceipt\n className=\"size-4 text-muted-foreground\"\n stroke={1.5}\n />\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon-sm\">\n <IconDotsVertical\n className=\"size-4 text-muted-foreground\"\n stroke={1.5}\n />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n <DropdownMenuItem className=\"lg:hidden\">\n <IconShare className=\"size-4\" stroke={1.5} />\n <span>Reply</span>\n </DropdownMenuItem>\n <DropdownMenuItem className=\"lg:hidden\">\n <IconReceipt className=\"size-4\" stroke={1.5} />\n <span>Forward</span>\n </DropdownMenuItem>\n <DropdownMenuSeparator className=\"lg:hidden\" />\n <DropdownMenuItem>\n <IconArchive className=\"size-4\" stroke={1.5} />\n <span>Archive</span>\n </DropdownMenuItem>\n <DropdownMenuItem variant=\"destructive\">\n <IconTrash className=\"size-4\" stroke={1.5} />\n <span>Delete</span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n <div className=\"flex shrink-0 items-center gap-1 md:hidden\">\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => toggleStar(email.id)}\n >\n <IconStar\n className={cn(\n \"size-4\",\n email.starred\n ? \"fill-yellow-500 text-yellow-500\"\n : \"text-muted-foreground\"\n )}\n stroke={1.5}\n />\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon-sm\">\n <IconDotsVertical\n className=\"size-4 text-muted-foreground\"\n stroke={1.5}\n />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n <DropdownMenuItem>\n <IconShare className=\"size-4\" stroke={1.5} />\n <span>Reply</span>\n </DropdownMenuItem>\n <DropdownMenuItem>\n <IconReceipt className=\"size-4\" stroke={1.5} />\n <span>Forward</span>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem>\n <IconArchive className=\"size-4\" stroke={1.5} />\n <span>Archive</span>\n </DropdownMenuItem>\n <DropdownMenuItem variant=\"destructive\">\n <IconTrash className=\"size-4\" stroke={1.5} />\n <span>Delete</span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </div>\n\n <div className=\"flex-1 overflow-y-auto px-3 py-3 md:px-6 md:py-4\">\n <p className=\"mb-3 text-[18px] leading-tight font-medium tracking-tight text-foreground md:mb-4 md:text-[20px]\">\n {email.subject}\n </p>\n\n <div className=\"text-[13px] leading-relaxed tracking-tight whitespace-pre-wrap text-foreground/80 md:text-[14px] dark:text-[#cccccc]\">\n {email.body}\n </div>\n\n {email.attachments && email.attachments.length > 0 && (\n <div className=\"mt-4 md:mt-6\">\n <div className=\"mb-2 flex items-center gap-1.5\">\n <p className=\"text-[12px] font-semibold text-foreground md:text-[13px]\">\n Attachment\n </p>\n <div className=\"flex items-center gap-0.5\">\n <p className=\"text-[11px] text-muted-foreground md:text-[12px]\">\n Secure by\n </p>\n <p className=\"text-[11px] text-foreground md:text-[12px]\">\n data.ai\n </p>\n <IconShield\n className=\"size-3 text-[#38bdf8] md:size-4\"\n stroke={1.5}\n />\n </div>\n </div>\n\n <div className=\"flex flex-wrap gap-2\">\n {email.attachments.map((attachment) => {\n const FileIconComponent = getFileIcon(attachment.type)\n const gradient = getFileGradient(attachment.type)\n\n return (\n <div\n key={attachment.id}\n className=\"flex items-center gap-2 rounded-md border border-border bg-muted px-2 py-1.5 md:px-3\"\n >\n <div\n className=\"flex size-5 shrink-0 items-center justify-center rounded md:size-6\"\n style={{\n background: `linear-gradient(135deg, ${gradient.start}, ${gradient.end})`,\n }}\n >\n <FileIconComponent\n className=\"size-3 text-white md:size-3.5\"\n stroke={1.5}\n />\n </div>\n <div className=\"leading-tight\">\n <p className=\"max-w-[150px] truncate text-[12px] font-medium text-foreground md:max-w-none md:text-[13px]\">\n {attachment.name}\n </p>\n <p className=\"text-[11px] text-muted-foreground md:text-[12px]\">\n {attachment.size}\n </p>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n"
13
+ },
14
+ {
15
+ "path": "registry/example-apps/default/emails/components/emails/email-list.tsx",
16
+ "type": "registry:component",
17
+ "target": "components/example-apps/emails/components/emails/email-list.tsx",
18
+ "content": "\"use client\"\n\nimport { format } from \"date-fns\"\n\nimport { Avatar, AvatarFallback, AvatarImage } from \"@loveui/ui/ui/avatar\"\n\nimport { cn } from \"../../lib/utils\"\nimport { useEmailsStore } from \"../../store/emails-store\"\nimport { VerifiedIcon } from \"../ui/verified-icon\"\n\ninterface EmailListProps {\n onEmailClick?: (emailId: string) => void\n}\n\nexport function EmailList({ onEmailClick }: EmailListProps) {\n const { emails, selectedEmailId, selectEmail } = useEmailsStore()\n\n const handleEmailClick = (emailId: string) => {\n selectEmail(emailId)\n onEmailClick?.(emailId)\n }\n\n if (emails.length === 0) {\n return (\n <div className=\"flex h-full items-center justify-center bg-card\">\n <div className=\"text-center text-muted-foreground\">\n <p>No alerts found</p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"flex h-full flex-col overflow-hidden bg-card\">\n <div className=\"flex items-center justify-between border-b border-border px-5 py-3\">\n <div className=\"flex items-center gap-2\">\n <div className=\"size-3.5 rounded border border-border\" />\n <p className=\"text-sm font-medium text-foreground\">Active Alerts</p>\n </div>\n </div>\n\n <div className=\"flex-1 overflow-y-auto\">\n {emails.map((email) => {\n const isSelected = selectedEmailId === email.id\n const isRead = email.read\n\n return (\n <button\n key={email.id}\n onClick={() => handleEmailClick(email.id)}\n className={cn(\n \"flex w-full gap-2.5 border-b border-border p-4 text-left transition-colors hover:bg-muted/70\",\n isSelected && \"bg-muted\",\n !isRead && \"bg-muted/50\"\n )}\n >\n <div className={cn(\"flex w-full gap-2.5\")}>\n <Avatar className=\"mt-1.5 size-7 shrink-0\">\n <AvatarImage src={email.from.avatar} alt={email.from.name} />\n <AvatarFallback>{email.from.name.charAt(0)}</AvatarFallback>\n </Avatar>\n\n <div className=\"flex-1 overflow-hidden\">\n <div className=\"flex items-start justify-between gap-2.5\">\n <div className=\"flex-1 overflow-hidden\">\n <div className=\"flex items-center gap-1\">\n <p\n className={cn(\n \"truncate text-[14px] tracking-tight\",\n !isRead || isSelected\n ? \"font-medium text-foreground\"\n : \"text-foreground\"\n )}\n >\n {email.from.name}\n </p>\n {email.from.verified && (\n <VerifiedIcon className=\"size-4 shrink-0\" />\n )}\n </div>\n <p className=\"truncate text-[12px] tracking-tight text-[#38bdf8]\">\n {email.from.email}\n </p>\n </div>\n <p\n className={cn(\n \"shrink-0 text-[12px] tracking-tight\",\n !isRead\n ? \"font-medium text-foreground\"\n : \"text-foreground\"\n )}\n >\n {format(email.date, \"MMM dd\")}\n </p>\n </div>\n\n <div className=\"mt-1.5 space-y-0.5\">\n <p className=\"line-clamp-2 text-[12px] leading-relaxed tracking-tight text-foreground\">\n {email.body}\n </p>\n </div>\n </div>\n </div>\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n"
19
+ },
20
+ {
21
+ "path": "registry/example-apps/default/emails/components/emails/emails-header.tsx",
22
+ "type": "registry:component",
23
+ "target": "components/example-apps/emails/components/emails/emails-header.tsx",
24
+ "content": "\"use client\"\n\nimport {\n IconDotsVertical,\n IconLink,\n IconMail,\n IconMenu2,\n IconWand,\n} from \"@tabler/icons-react\"\n\nimport { Avatar, AvatarFallback, AvatarImage } from \"@loveui/ui/ui/avatar\"\nimport { Button } from \"@loveui/ui/ui/button\"\n\nimport { useEmailsStore } from \"../../store/emails-store\"\nimport { ThemeToggle } from \"../theme-toggle\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\"\n\ninterface EmailsHeaderProps {\n onMobileMenuClick?: () => void\n}\n\nexport function EmailsHeader({ onMobileMenuClick }: EmailsHeaderProps) {\n const { emails } = useEmailsStore()\n return (\n <div className=\"flex h-14 items-center justify-between border-b border-border bg-background px-3 md:px-6\">\n <div className=\"flex flex-1 items-center gap-2 md:gap-4\">\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"md:hidden\"\n onClick={onMobileMenuClick}\n >\n <IconMenu2 className=\"size-5\" stroke={1.5} />\n </Button>\n\n <div className=\"flex items-center gap-2 md:gap-2.5\">\n <IconMail className=\"size-4 text-foreground\" stroke={1.5} />\n <p className=\"text-sm font-normal tracking-tight text-foreground md:text-base\">\n Incident Mailbox\n </p>\n </div>\n <div className=\"hidden items-center gap-2.5 sm:flex\">\n <div className=\"size-1 rounded-full bg-muted-foreground/20\" />\n <p className=\"text-sm font-normal tracking-tight text-foreground md:text-base\">\n {emails.length} alerts\n </p>\n </div>\n </div>\n\n <div className=\"hidden items-center gap-4 md:flex\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-[13px] text-muted-foreground\">\n Last triage 20 min ago\n </p>\n <div className=\"flex items-center\">\n {[1, 2, 3, 4].map((i) => (\n <Avatar\n key={i}\n className=\"-ml-2 size-5 border-2 border-background first:ml-0\"\n >\n <AvatarImage\n src={`https://api.dicebear.com/9.x/glass/svg?seed=User${i}`}\n />\n <AvatarFallback>U{i}</AvatarFallback>\n </Avatar>\n ))}\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <ThemeToggle />\n <Button\n size=\"sm\"\n className=\"relative h-[30px] overflow-hidden bg-linear-to-r from-white to-white hover:opacity-90\"\n >\n <div className=\"absolute inset-0 bg-[radial-gradient(ellipse_at_top_right,rgba(205,175,250,1),transparent_50%),radial-gradient(ellipse_at_bottom_right,rgba(129,169,248,1),transparent_50%),radial-gradient(ellipse_at_top_left,rgba(247,203,191,1),transparent_50%),radial-gradient(ellipse_at_bottom_left,rgba(164,252,245,1),transparent_50%)]\" />\n <IconWand className=\"relative size-4 text-black\" stroke={1.5} />\n <span className=\"relative text-black\">Upgrade to Pro</span>\n </Button>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2 md:hidden\">\n <ThemeToggle />\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon-sm\">\n <IconDotsVertical className=\"size-4\" stroke={1.5} />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n <DropdownMenuItem>\n <IconLink className=\"size-4\" stroke={1.5} />\n <span>Share</span>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem>\n <IconWand className=\"size-4\" stroke={1.5} />\n <span>Upgrade to Pro</span>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <div className=\"px-2 py-1.5\">\n <p className=\"text-xs text-muted-foreground\">\n {emails.length} alerts\n </p>\n <p className=\"text-xs text-muted-foreground\">\n Last triage 20 min ago\n </p>\n </div>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n )\n}\n"
25
+ },
26
+ {
27
+ "path": "registry/example-apps/default/emails/components/emails/emails-horizontal-nav.tsx",
28
+ "type": "registry:component",
29
+ "target": "components/example-apps/emails/components/emails/emails-horizontal-nav.tsx",
30
+ "content": "\"use client\"\n\nimport {\n IconAlertTriangle,\n IconArchive,\n IconAsterisk,\n IconFileText,\n IconInbox,\n IconMailPlus,\n IconMenu2,\n IconSend,\n IconStar,\n IconTrash,\n} from \"@tabler/icons-react\"\n\nimport { Button } from \"@loveui/ui/ui/button\"\nimport { Separator } from \"@loveui/ui/ui/separator\"\n\nimport { cn } from \"../../lib/utils\"\nimport { useEmailsStore } from \"../../store/emails-store\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\"\n\nexport function EmailsHorizontalNav() {\n const { emails, currentFolder, setFolder } = useEmailsStore()\n\n const mainFolders = [\n {\n id: \"inbox\",\n label: \"Active Alerts\",\n icon: IconInbox,\n count: emails.length.toString() as string | undefined,\n },\n { id: \"sent\", label: \"Escalated\", icon: IconSend, count: undefined },\n {\n id: \"drafts\",\n label: \"Draft Notes\",\n icon: IconFileText,\n count: undefined,\n },\n { id: \"starred\", label: \"Watchlist\", icon: IconStar, count: undefined },\n { id: \"archive\", label: \"Resolved\", icon: IconArchive, count: undefined },\n ]\n\n const additionalFolders = [\n { id: \"deleted\", label: \"Discarded\", icon: IconTrash, count: undefined },\n { id: \"spam\", label: \"Noise\", icon: IconAlertTriangle, count: undefined },\n { id: \"junk\", label: \"Low Priority\", icon: IconAsterisk, count: undefined },\n ]\n\n const allFolders = [...mainFolders, ...additionalFolders]\n\n return (\n <div className=\"flex h-[54px] items-center border-b border-border bg-background px-3 md:px-4\">\n <div className=\"flex w-full items-center gap-2 md:gap-3\">\n <Button\n size=\"sm\"\n className=\"relative h-[30px] shrink-0 overflow-hidden bg-linear-to-r from-white to-white hover:opacity-90\"\n >\n <div className=\"absolute inset-0 bg-[radial-gradient(ellipse_at_top_right,rgba(205,175,250,1),transparent_50%),radial-gradient(ellipse_at_bottom_right,rgba(129,169,248,1),transparent_50%),radial-gradient(ellipse_at_top_left,rgba(247,203,191,1),transparent_50%),radial-gradient(ellipse_at_bottom_left,rgba(164,252,245,1),transparent_50%)]\" />\n <IconMailPlus className=\"relative size-4 text-black\" stroke={1.5} />\n <span className=\"relative hidden text-black sm:inline\">Escalate</span>\n </Button>\n\n <Separator orientation=\"vertical\" className=\"hidden h-5 sm:block\" />\n\n <div className=\"hidden flex-1 items-center gap-2.5 2xl:flex\">\n {allFolders.map((folder) => {\n const Icon = folder.icon\n const isActive = currentFolder === folder.id\n\n return (\n <Button\n key={folder.id}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setFolder(folder.id as string)}\n className={cn(\n \"h-[30px] gap-1.5\",\n isActive && \"bg-muted text-foreground hover:bg-muted\"\n )}\n >\n <Icon className=\"size-4\" stroke={1.5} />\n <span className=\"text-[13px]\">{folder.label}</span>\n {folder.count && isActive && (\n <span className=\"text-[12px]\">{folder.count}</span>\n )}\n </Button>\n )\n })}\n </div>\n\n <div className=\"hidden flex-1 items-center gap-2.5 xl:flex 2xl:hidden\">\n {mainFolders.map((folder) => {\n const Icon = folder.icon\n const isActive = currentFolder === folder.id\n\n return (\n <Button\n key={folder.id}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setFolder(folder.id as string)}\n className={cn(\n \"h-[30px] gap-1.5\",\n isActive && \"bg-muted text-foreground hover:bg-muted\"\n )}\n >\n <Icon className=\"size-4\" stroke={1.5} />\n <span className=\"text-[13px]\">{folder.label}</span>\n {folder.count && isActive && (\n <span className=\"text-[12px]\">{folder.count}</span>\n )}\n </Button>\n )\n })}\n\n <Separator orientation=\"vertical\" className=\"h-5\" />\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-[30px] gap-1.5\">\n <IconMenu2 className=\"size-4\" stroke={1.5} />\n <span className=\"text-[13px]\">More</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-48\">\n {additionalFolders.map((folder) => {\n const Icon = folder.icon\n const isActive = currentFolder === folder.id\n\n return (\n <DropdownMenuItem\n key={folder.id}\n onClick={() => setFolder(folder.id as string)}\n className={cn(isActive && \"bg-muted\")}\n >\n <Icon className=\"size-4\" stroke={1.5} />\n <span>{folder.label}</span>\n </DropdownMenuItem>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n <div className=\"hidden flex-1 items-center gap-2.5 lg:flex xl:hidden\">\n {mainFolders.slice(0, 3).map((folder) => {\n const Icon = folder.icon\n const isActive = currentFolder === folder.id\n\n return (\n <Button\n key={folder.id}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setFolder(folder.id as string)}\n className={cn(\n \"h-[30px] gap-1.5\",\n isActive && \"bg-muted text-foreground hover:bg-muted\"\n )}\n >\n <Icon className=\"size-4\" stroke={1.5} />\n <span className=\"text-[13px]\">{folder.label}</span>\n {folder.count && isActive && (\n <span className=\"text-[12px]\">{folder.count}</span>\n )}\n </Button>\n )\n })}\n\n <Separator orientation=\"vertical\" className=\"h-5\" />\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-[30px] gap-1.5\">\n <IconMenu2 className=\"size-4\" stroke={1.5} />\n <span className=\"text-[13px]\">More</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-48\">\n {mainFolders.slice(3).map((folder) => {\n const Icon = folder.icon\n const isActive = currentFolder === folder.id\n\n return (\n <DropdownMenuItem\n key={folder.id}\n onClick={() => setFolder(folder.id as string)}\n className={cn(isActive && \"bg-muted\")}\n >\n <Icon className=\"size-4\" stroke={1.5} />\n <span>{folder.label}</span>\n </DropdownMenuItem>\n )\n })}\n <DropdownMenuSeparator />\n {additionalFolders.map((folder) => {\n const Icon = folder.icon\n const isActive = currentFolder === folder.id\n\n return (\n <DropdownMenuItem\n key={folder.id}\n onClick={() => setFolder(folder.id as string)}\n className={cn(isActive && \"bg-muted\")}\n >\n <Icon className=\"size-4\" stroke={1.5} />\n <span>{folder.label}</span>\n </DropdownMenuItem>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n <div className=\"hidden flex-1 items-center gap-2 md:flex lg:hidden\">\n {mainFolders.slice(0, 2).map((folder) => {\n const Icon = folder.icon\n const isActive = currentFolder === folder.id\n\n return (\n <Button\n key={folder.id}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setFolder(folder.id as string)}\n className={cn(\n \"h-[30px] gap-1.5\",\n isActive && \"bg-muted text-foreground hover:bg-muted\"\n )}\n >\n <Icon className=\"size-4\" stroke={1.5} />\n <span className=\"text-[13px]\">{folder.label}</span>\n </Button>\n )\n })}\n\n <Separator orientation=\"vertical\" className=\"h-5\" />\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-[30px] gap-1.5\">\n <IconMenu2 className=\"size-4\" stroke={1.5} />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-48\">\n {mainFolders.slice(2).map((folder) => {\n const Icon = folder.icon\n const isActive = currentFolder === folder.id\n\n return (\n <DropdownMenuItem\n key={folder.id}\n onClick={() => setFolder(folder.id as string)}\n className={cn(isActive && \"bg-muted\")}\n >\n <Icon className=\"size-4\" stroke={1.5} />\n <span>{folder.label}</span>\n {folder.count && isActive && (\n <span className=\"ml-auto text-xs text-muted-foreground\">\n {folder.count}\n </span>\n )}\n </DropdownMenuItem>\n )\n })}\n <DropdownMenuSeparator />\n {additionalFolders.map((folder) => {\n const Icon = folder.icon\n const isActive = currentFolder === folder.id\n\n return (\n <DropdownMenuItem\n key={folder.id}\n onClick={() => setFolder(folder.id as string)}\n className={cn(isActive && \"bg-muted\")}\n >\n <Icon className=\"size-4\" stroke={1.5} />\n <span>{folder.label}</span>\n </DropdownMenuItem>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n <div className=\"flex flex-1 items-center gap-2 md:hidden\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-[30px] gap-1.5\">\n <IconMenu2 className=\"size-4\" stroke={1.5} />\n <span className=\"text-[13px]\">Folders</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-48\">\n {mainFolders.map((folder) => {\n const Icon = folder.icon\n const isActive = currentFolder === folder.id\n\n return (\n <DropdownMenuItem\n key={folder.id}\n onClick={() => setFolder(folder.id as string)}\n className={cn(isActive && \"bg-muted\")}\n >\n <Icon className=\"size-4\" stroke={1.5} />\n <span>{folder.label}</span>\n {folder.count && isActive && (\n <span className=\"ml-auto text-xs text-muted-foreground\">\n {folder.count}\n </span>\n )}\n </DropdownMenuItem>\n )\n })}\n <DropdownMenuSeparator />\n {additionalFolders.map((folder) => {\n const Icon = folder.icon\n const isActive = currentFolder === folder.id\n\n return (\n <DropdownMenuItem\n key={folder.id}\n onClick={() => setFolder(folder.id as string)}\n className={cn(isActive && \"bg-muted\")}\n >\n <Icon className=\"size-4\" stroke={1.5} />\n <span>{folder.label}</span>\n </DropdownMenuItem>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </div>\n )\n}\n"
31
+ },
32
+ {
33
+ "path": "registry/example-apps/default/emails/components/emails/emails-vertical-sidebar-mobile.tsx",
34
+ "type": "registry:component",
35
+ "target": "components/example-apps/emails/components/emails/emails-vertical-sidebar-mobile.tsx",
36
+ "content": "\"use client\"\n\nimport {\n IconFiles,\n IconFolder,\n IconGitFork,\n IconLayoutDashboard,\n IconLifebuoy,\n IconMail,\n IconPlugConnected,\n IconShield,\n IconSparkles,\n IconWaveSine,\n} from \"@tabler/icons-react\"\n\nimport { Avatar, AvatarFallback, AvatarImage } from \"@loveui/ui/ui/avatar\"\nimport { Button } from \"@loveui/ui/ui/button\"\n\nimport { cn } from \"../../lib/utils\"\n\ninterface EmailsVerticalSidebarMobileProps {\n onItemClick?: () => void\n}\n\nexport function EmailsVerticalSidebarMobile({\n onItemClick,\n}: EmailsVerticalSidebarMobileProps = {}) {\n const topItems = [\n { icon: IconSparkles, label: \"Automation\", active: false },\n { icon: IconLayoutDashboard, label: \"Status\", active: false },\n { icon: IconMail, label: \"Active Alerts\", active: true },\n { icon: IconFolder, label: \"Runbooks\", active: false },\n { icon: IconWaveSine, label: \"Escalated\", active: false },\n { icon: IconGitFork, label: \"Low Priority\", active: false },\n { icon: IconFiles, label: \"Resolved\", active: false },\n ]\n\n const bottomItems = [\n { icon: IconShield, label: \"Security\" },\n { icon: IconPlugConnected, label: \"Integrations\" },\n { icon: IconLifebuoy, label: \"Support\" },\n ]\n\n return (\n <div className=\"flex h-screen w-full flex-col items-start gap-4 border-r border-border bg-background px-3 py-4\">\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"default\"\n size=\"icon-sm\"\n className=\"relative size-9 overflow-hidden rounded-lg bg-linear-to-br from-white via-purple-200 to-blue-200 hover:opacity-90\"\n >\n <div className=\"absolute inset-0 bg-[radial-gradient(ellipse_at_top_right,rgba(205,175,250,1),transparent_50%),radial-gradient(ellipse_at_bottom_right,rgba(129,169,248,1),transparent_50%),radial-gradient(ellipse_at_top_left,rgba(247,203,191,1),transparent_50%),radial-gradient(ellipse_at_bottom_left,rgba(164,252,245,1),transparent_50%)]\" />\n <svg className=\"relative size-4\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8 2L2 8L8 14\"\n stroke=\"black\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8 2L14 8L8 14\"\n stroke=\"black\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </Button>\n <div className=\"flex flex-col justify-center\">\n <span className=\"text-sm font-semibold text-foreground\">\n OpsBridge\n </span>\n <span className=\"text-xs text-muted-foreground\">incident center</span>\n </div>\n </div>\n\n <div className=\"flex w-full flex-col gap-1\">\n {topItems.map((item) => (\n <Button\n key={item.label}\n variant=\"ghost\"\n size=\"sm\"\n onClick={onItemClick}\n className={cn(\n \"w-full justify-start gap-2 px-3\",\n item.active && \"bg-muted text-foreground hover:bg-muted\"\n )}\n >\n <item.icon className=\"size-4 shrink-0\" stroke={1.5} />\n <span className=\"text-sm\">{item.label}</span>\n </Button>\n ))}\n </div>\n\n <div className=\"flex-1\" />\n\n <div className=\"flex w-full flex-col gap-1\">\n {bottomItems.map((item) => (\n <Button\n key={item.label}\n variant=\"ghost\"\n size=\"sm\"\n onClick={onItemClick}\n className=\"w-full justify-start gap-2 px-3 text-muted-foreground\"\n >\n <item.icon className=\"size-4 shrink-0\" stroke={1.5} />\n <span className=\"text-sm\">{item.label}</span>\n </Button>\n ))}\n </div>\n\n <Button\n variant=\"ghost\"\n className=\"h-auto w-full justify-start gap-2 px-3 py-2\"\n >\n <Avatar className=\"size-8 shrink-0 rounded-lg\">\n <AvatarImage src=\"https://api.dicebear.com/9.x/glass/svg?seed=User\" />\n <AvatarFallback>U</AvatarFallback>\n </Avatar>\n <div className=\"flex flex-col items-start text-left\">\n <span className=\"text-xs font-medium text-foreground\">Ava Patel</span>\n <span className=\"text-[10px] text-muted-foreground\">\n ava.patel@opsbridge.io\n </span>\n </div>\n </Button>\n </div>\n )\n}\n"
37
+ },
38
+ {
39
+ "path": "registry/example-apps/default/emails/components/emails/emails-vertical-sidebar.tsx",
40
+ "type": "registry:component",
41
+ "target": "components/example-apps/emails/components/emails/emails-vertical-sidebar.tsx",
42
+ "content": "\"use client\"\n\nimport {\n IconFiles,\n IconFolder,\n IconGitFork,\n IconLayoutDashboard,\n IconLifebuoy,\n IconMail,\n IconPlugConnected,\n IconShield,\n IconSparkles,\n IconWaveSine,\n} from \"@tabler/icons-react\"\n\nimport { Avatar, AvatarFallback, AvatarImage } from \"@loveui/ui/ui/avatar\"\nimport { Button } from \"@loveui/ui/ui/button\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\"\n\ninterface EmailsVerticalSidebarProps {\n onItemClick?: () => void\n}\n\nexport function EmailsVerticalSidebar({\n onItemClick,\n}: EmailsVerticalSidebarProps = {}) {\n const topIcons = [\n { icon: IconSparkles, label: \"Automation\", active: false },\n { icon: IconLayoutDashboard, label: \"Status\", active: false },\n { icon: IconMail, label: \"Incidents\", active: true },\n { icon: IconFolder, label: \"Runbooks\", active: false },\n { icon: IconWaveSine, label: \"Metrics\", active: false },\n { icon: IconGitFork, label: \"Deploys\", active: false },\n { icon: IconFiles, label: \"Reports\", active: false },\n ]\n\n const bottomIcons = [\n { icon: IconShield, label: \"Security\" },\n { icon: IconPlugConnected, label: \"Integrations\" },\n { icon: IconLifebuoy, label: \"Support\" },\n ]\n\n return (\n <div className=\"flex h-screen w-14 flex-col items-center gap-4 border-r border-border bg-background py-4\">\n <Button\n variant=\"default\"\n size=\"icon-sm\"\n className=\"relative mb-2 size-8 overflow-hidden rounded-lg bg-linear-to-br from-white via-purple-200 to-blue-200 hover:opacity-90\"\n >\n <div className=\"absolute inset-0 bg-[radial-gradient(ellipse_at_top_right,rgba(205,175,250,1),transparent_50%),radial-gradient(ellipse_at_bottom_right,rgba(129,169,248,1),transparent_50%),radial-gradient(ellipse_at_top_left,rgba(247,203,191,1),transparent_50%),radial-gradient(ellipse_at_bottom_left,rgba(164,252,245,1),transparent_50%)]\" />\n <svg className=\"relative size-4\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8 2L2 8L8 14\"\n stroke=\"black\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8 2L14 8L8 14\"\n stroke=\"black\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </Button>\n\n <div className=\"flex flex-col gap-2\">\n {topIcons.map((item) => (\n <Tooltip key={item.label}>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={onItemClick}\n className={cn(\n \"size-8\",\n item.active && \"bg-muted text-foreground hover:bg-muted\"\n )}\n >\n <item.icon className=\"size-4\" stroke={1.5} />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">{item.label}</TooltipContent>\n </Tooltip>\n ))}\n </div>\n\n <div className=\"flex-1\" />\n\n <div className=\"flex flex-col gap-2\">\n {bottomIcons.map((item) => (\n <Tooltip key={item.label}>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={onItemClick}\n className=\"size-8 text-muted-foreground\"\n >\n <item.icon className=\"size-4\" stroke={1.5} />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">{item.label}</TooltipContent>\n </Tooltip>\n ))}\n </div>\n\n <Avatar className=\"size-8 cursor-pointer\">\n <AvatarImage src=\"https://api.dicebear.com/9.x/glass/svg?seed=User\" />\n <AvatarFallback>U</AvatarFallback>\n </Avatar>\n </div>\n )\n}\n"
43
+ },
44
+ {
45
+ "path": "registry/example-apps/default/emails/components/theme-provider.tsx",
46
+ "type": "registry:component",
47
+ "target": "components/example-apps/emails/components/theme-provider.tsx",
48
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { ThemeProvider as NextThemesProvider } from \"next-themes\"\n\nexport function ThemeProvider({\n children,\n ...props\n}: React.ComponentProps<typeof NextThemesProvider>) {\n return <NextThemesProvider {...props}>{children}</NextThemesProvider>\n}\n"
49
+ },
50
+ {
51
+ "path": "registry/example-apps/default/emails/components/theme-toggle.tsx",
52
+ "type": "registry:component",
53
+ "target": "components/example-apps/emails/components/theme-toggle.tsx",
54
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { IconMoon, IconSun } from \"@tabler/icons-react\"\nimport { useTheme } from \"next-themes\"\n\nimport { Button } from \"@loveui/ui/ui/button\"\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"./ui/dropdown-menu\"\n\nexport function ThemeToggle() {\n const { setTheme } = useTheme()\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon-sm\" className=\"size-8\">\n <IconSun className=\"size-4 scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90\" />\n <IconMoon className=\"absolute size-4 scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0\" />\n <span className=\"sr-only\">Toggle theme</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => setTheme(\"light\")}>\n Light\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(\"dark\")}>\n Dark\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(\"system\")}>\n System\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n"
55
+ },
56
+ {
57
+ "path": "registry/example-apps/default/emails/components/ui/alert-dialog.tsx",
58
+ "type": "registry:ui",
59
+ "target": "components/example-apps/emails/components/ui/alert-dialog.tsx",
60
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { AlertDialog as AlertDialogPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\n\nfunction AlertDialog({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />\n}\n\nfunction AlertDialogTrigger({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {\n return (\n <AlertDialogPrimitive.Trigger data-slot=\"alert-dialog-trigger\" {...props} />\n )\n}\n\nfunction AlertDialogPortal({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {\n return (\n <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\n )\n}\n\nfunction AlertDialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {\n return (\n <AlertDialogPrimitive.Overlay\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n \"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 fixed inset-0 z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogContent({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Content> & {\n size?: \"default\" | \"sm\"\n}) {\n return (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n data-slot=\"alert-dialog-content\"\n data-size={size}\n className={cn(\n \"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-6 rounded-xl bg-background p-6 ring-1 ring-foreground/10 duration-100 outline-none data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-lg\",\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n )\n}\n\nfunction AlertDialogHeader({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(\n \"grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogFooter({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogMedia({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-media\"\n className={cn(\n \"mb-2 inline-flex size-16 items-center justify-center rounded-md bg-muted sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {\n return (\n <AlertDialogPrimitive.Title\n data-slot=\"alert-dialog-title\"\n className={cn(\n \"text-lg font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {\n return (\n <AlertDialogPrimitive.Description\n data-slot=\"alert-dialog-description\"\n className={cn(\n \"text-sm text-balance text-muted-foreground md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogAction({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Action> &\n Pick<React.ComponentProps<typeof Button>, \"variant\" | \"size\">) {\n return (\n <Button variant={variant} size={size} asChild>\n <AlertDialogPrimitive.Action\n data-slot=\"alert-dialog-action\"\n className={cn(className)}\n {...props}\n />\n </Button>\n )\n}\n\nfunction AlertDialogCancel({\n className,\n variant = \"outline\",\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Cancel> &\n Pick<React.ComponentProps<typeof Button>, \"variant\" | \"size\">) {\n return (\n <Button variant={variant} size={size} asChild>\n <AlertDialogPrimitive.Cancel\n data-slot=\"alert-dialog-cancel\"\n className={cn(className)}\n {...props}\n />\n </Button>\n )\n}\n\nexport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogMedia,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogTrigger,\n}\n"
61
+ },
62
+ {
63
+ "path": "registry/example-apps/default/emails/components/ui/avatar.tsx",
64
+ "type": "registry:ui",
65
+ "target": "components/example-apps/emails/components/ui/avatar.tsx",
66
+ "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Avatar = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"relative flex size-10 shrink-0 overflow-hidden rounded-full\",\n className\n )}\n {...props}\n />\n))\nAvatar.displayName = \"Avatar\"\n\nconst AvatarImage = React.forwardRef<\n HTMLImageElement,\n React.ImgHTMLAttributes<HTMLImageElement>\n>(({ className, src, alt, ...props }, ref) => {\n const [hasError, setHasError] = React.useState(false)\n\n if (!src || hasError) {\n return null\n }\n\n return (\n <img\n ref={ref}\n src={src}\n alt={alt}\n onError={() => setHasError(true)}\n className={cn(\"aspect-square size-full object-cover\", className)}\n {...props}\n />\n )\n})\nAvatarImage.displayName = \"AvatarImage\"\n\nconst AvatarFallback = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex size-full items-center justify-center rounded-full bg-muted text-sm font-medium\",\n className\n )}\n {...props}\n />\n))\nAvatarFallback.displayName = \"AvatarFallback\"\n\nexport { Avatar, AvatarImage, AvatarFallback }\n"
67
+ },
68
+ {
69
+ "path": "registry/example-apps/default/emails/components/ui/badge.tsx",
70
+ "type": "registry:ui",
71
+ "target": "components/example-apps/emails/components/ui/badge.tsx",
72
+ "content": "import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst badgeVariants = cva(\n \"group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all transition-colors focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n secondary:\n \"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80\",\n destructive:\n \"bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20\",\n outline:\n \"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground\",\n ghost:\n \"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n data-variant={variant}\n className={cn(badgeVariants({ variant }), className)}\n {...(props as any)}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n"
73
+ },
74
+ {
75
+ "path": "registry/example-apps/default/emails/components/ui/button.tsx",
76
+ "type": "registry:ui",
77
+ "target": "components/example-apps/emails/components/ui/button.tsx",
78
+ "content": "import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-border bg-background shadow-xs hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-9 gap-1.5 px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-[min(var(--radius-md),8px)] px-2 text-xs in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 gap-1 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5\",\n lg: \"h-10 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3\",\n icon: \"size-9\",\n \"icon-xs\":\n \"size-6 rounded-[min(var(--radius-md),8px)] in-data-[slot=button-group]:rounded-md [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...(props as any)}\n />\n )\n}\n\nexport { Button, buttonVariants }\n"
79
+ },
80
+ {
81
+ "path": "registry/example-apps/default/emails/components/ui/card.tsx",
82
+ "type": "registry:ui",
83
+ "target": "components/example-apps/emails/components/ui/card.tsx",
84
+ "content": "import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Card({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & { size?: \"default\" | \"sm\" }) {\n return (\n <div\n data-slot=\"card\"\n data-size={size}\n className={cn(\n \"group/card flex flex-col gap-6 overflow-hidden rounded-xl bg-card py-6 text-sm text-card-foreground shadow-xs ring-1 ring-foreground/10 has-[>img:first-child]:pt-0 data-[size=sm]:gap-4 data-[size=sm]:py-4 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-6 group-data-[size=sm]/card:px-4 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-6 group-data-[size=sm]/card:[.border-b]:pb-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\n \"text-base leading-normal font-medium group-data-[size=sm]/card:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-6 group-data-[size=sm]/card:px-4\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n \"flex items-center rounded-b-xl px-6 group-data-[size=sm]/card:px-4 [.border-t]:pt-6 group-data-[size=sm]/card:[.border-t]:pt-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n"
85
+ },
86
+ {
87
+ "path": "registry/example-apps/default/emails/components/ui/combobox.tsx",
88
+ "type": "registry:ui",
89
+ "target": "components/example-apps/emails/components/ui/combobox.tsx",
90
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Combobox as ComboboxPrimitive } from \"@base-ui/react\"\nimport { IconCheck, IconChevronDown, IconX } from \"@tabler/icons-react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupInput,\n} from \"./input-group\"\n\nconst Combobox = ComboboxPrimitive.Root\n\nfunction ComboboxValue({ ...props }: ComboboxPrimitive.Value.Props) {\n return <ComboboxPrimitive.Value data-slot=\"combobox-value\" {...props} />\n}\n\nfunction ComboboxTrigger({\n className,\n children,\n ...props\n}: ComboboxPrimitive.Trigger.Props) {\n return (\n <ComboboxPrimitive.Trigger\n data-slot=\"combobox-trigger\"\n className={cn(\"[&_svg:not([class*='size-'])]:size-4\", className)}\n {...props}\n >\n {children}\n <IconChevronDown className=\"pointer-events-none size-4 text-muted-foreground\" />\n </ComboboxPrimitive.Trigger>\n )\n}\n\nfunction ComboboxClear({ className, ...props }: ComboboxPrimitive.Clear.Props) {\n return (\n <ComboboxPrimitive.Clear\n data-slot=\"combobox-clear\"\n render={<InputGroupButton variant=\"ghost\" size=\"icon-xs\" />}\n className={cn(className)}\n {...props}\n >\n <IconX className=\"pointer-events-none\" />\n </ComboboxPrimitive.Clear>\n )\n}\n\nfunction ComboboxInput({\n className,\n children,\n disabled = false,\n showTrigger = true,\n showClear = false,\n ...props\n}: ComboboxPrimitive.Input.Props & {\n showTrigger?: boolean\n showClear?: boolean\n}) {\n return (\n <InputGroup className={cn(\"w-auto\", className)}>\n <ComboboxPrimitive.Input\n render={<InputGroupInput disabled={disabled} />}\n {...props}\n />\n <InputGroupAddon align=\"inline-end\">\n {showTrigger && (\n <InputGroupButton\n size=\"icon-xs\"\n variant=\"ghost\"\n asChild\n data-slot=\"input-group-button\"\n className=\"group-has-data-[slot=combobox-clear]/input-group:hidden data-pressed:bg-transparent\"\n disabled={disabled}\n >\n <ComboboxTrigger />\n </InputGroupButton>\n )}\n {showClear && <ComboboxClear disabled={disabled} />}\n </InputGroupAddon>\n {children}\n </InputGroup>\n )\n}\n\nfunction ComboboxContent({\n className,\n side = \"bottom\",\n sideOffset = 6,\n align = \"start\",\n alignOffset = 0,\n anchor,\n ...props\n}: ComboboxPrimitive.Popup.Props &\n Pick<\n ComboboxPrimitive.Positioner.Props,\n \"side\" | \"align\" | \"sideOffset\" | \"alignOffset\" | \"anchor\"\n >) {\n return (\n <ComboboxPrimitive.Portal>\n <ComboboxPrimitive.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n anchor={anchor}\n className=\"isolate z-50\"\n >\n <ComboboxPrimitive.Popup\n data-slot=\"combobox-content\"\n data-chips={!!anchor}\n className={cn(\n \"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 group/combobox-content relative max-h-(--available-height) max-h-72 w-(--anchor-width) max-w-(--available-width) min-w-36 min-w-[calc(var(--anchor-width)+--spacing(7))] origin-(--transform-origin) overflow-hidden rounded-md bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[chips=true]:min-w-(--anchor-width) *:data-[slot=input-group]:m-1 *:data-[slot=input-group]:mb-0 *:data-[slot=input-group]:h-8 *:data-[slot=input-group]:border-input/30 *:data-[slot=input-group]:bg-input/30 *:data-[slot=input-group]:shadow-none\",\n className\n )}\n {...props}\n />\n </ComboboxPrimitive.Positioner>\n </ComboboxPrimitive.Portal>\n )\n}\n\nfunction ComboboxList({ className, ...props }: ComboboxPrimitive.List.Props) {\n return (\n <ComboboxPrimitive.List\n data-slot=\"combobox-list\"\n className={cn(\n \"no-scrollbar max-h-[min(calc(--spacing(72)---spacing(9)),calc(var(--available-height)---spacing(9)))] scroll-py-1 overflow-y-auto overscroll-contain p-1 data-empty:p-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxItem({\n className,\n children,\n ...props\n}: ComboboxPrimitive.Item.Props) {\n return (\n <ComboboxPrimitive.Item\n data-slot=\"combobox-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground not-data-[variant=destructive]:data-highlighted:**:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ComboboxPrimitive.ItemIndicator\n render={\n <span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\" />\n }\n >\n <IconCheck className=\"pointer-events-none\" />\n </ComboboxPrimitive.ItemIndicator>\n </ComboboxPrimitive.Item>\n )\n}\n\nfunction ComboboxGroup({ className, ...props }: ComboboxPrimitive.Group.Props) {\n return (\n <ComboboxPrimitive.Group\n data-slot=\"combobox-group\"\n className={cn(className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxLabel({\n className,\n ...props\n}: ComboboxPrimitive.GroupLabel.Props) {\n return (\n <ComboboxPrimitive.GroupLabel\n data-slot=\"combobox-label\"\n className={cn(\"px-2 py-1.5 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxCollection({ ...props }: ComboboxPrimitive.Collection.Props) {\n return (\n <ComboboxPrimitive.Collection data-slot=\"combobox-collection\" {...props} />\n )\n}\n\nfunction ComboboxEmpty({ className, ...props }: ComboboxPrimitive.Empty.Props) {\n return (\n <ComboboxPrimitive.Empty\n data-slot=\"combobox-empty\"\n className={cn(\n \"hidden w-full justify-center py-2 text-center text-sm text-muted-foreground group-data-empty/combobox-content:flex\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxSeparator({\n className,\n ...props\n}: ComboboxPrimitive.Separator.Props) {\n return (\n <ComboboxPrimitive.Separator\n data-slot=\"combobox-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction ComboboxChips({\n className,\n ...props\n}: React.ComponentPropsWithRef<typeof ComboboxPrimitive.Chips> &\n ComboboxPrimitive.Chips.Props) {\n return (\n <ComboboxPrimitive.Chips\n data-slot=\"combobox-chips\"\n className={cn(\n \"flex min-h-9 flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent bg-clip-padding px-2.5 py-1.5 text-sm shadow-xs transition-[color,box-shadow] focus-within:border-ring focus-within:ring-[3px] focus-within:ring-ring/50 has-aria-invalid:border-destructive has-aria-invalid:ring-[3px] has-aria-invalid:ring-destructive/20 has-data-[slot=combobox-chip]:px-1.5 dark:bg-input/30 dark:has-aria-invalid:border-destructive/50 dark:has-aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ComboboxChip({\n className,\n children,\n showRemove = true,\n ...props\n}: ComboboxPrimitive.Chip.Props & {\n showRemove?: boolean\n}) {\n return (\n <ComboboxPrimitive.Chip\n data-slot=\"combobox-chip\"\n className={cn(\n \"flex h-[calc(--spacing(5.5))] w-fit items-center justify-center gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground has-disabled:pointer-events-none has-disabled:cursor-not-allowed has-disabled:opacity-50 has-data-[slot=combobox-chip-remove]:pr-0\",\n className\n )}\n {...props}\n >\n {children}\n {showRemove && (\n <ComboboxPrimitive.ChipRemove\n render={<Button variant=\"ghost\" size=\"icon-xs\" />}\n className=\"-ml-1 opacity-50 hover:opacity-100\"\n data-slot=\"combobox-chip-remove\"\n >\n <IconX className=\"pointer-events-none\" />\n </ComboboxPrimitive.ChipRemove>\n )}\n </ComboboxPrimitive.Chip>\n )\n}\n\nfunction ComboboxChipsInput({\n className,\n children,\n ...props\n}: ComboboxPrimitive.Input.Props) {\n return (\n <ComboboxPrimitive.Input\n data-slot=\"combobox-chip-input\"\n className={cn(\"min-w-16 flex-1 outline-none\", className)}\n {...props}\n />\n )\n}\n\nfunction useComboboxAnchor() {\n return React.useRef<HTMLDivElement | null>(null)\n}\n\nexport {\n Combobox,\n ComboboxInput,\n ComboboxContent,\n ComboboxList,\n ComboboxItem,\n ComboboxGroup,\n ComboboxLabel,\n ComboboxCollection,\n ComboboxEmpty,\n ComboboxSeparator,\n ComboboxChips,\n ComboboxChip,\n ComboboxChipsInput,\n ComboboxTrigger,\n ComboboxValue,\n useComboboxAnchor,\n}\n"
91
+ },
92
+ {
93
+ "path": "registry/example-apps/default/emails/components/ui/drawer.tsx",
94
+ "type": "registry:ui",
95
+ "target": "components/example-apps/emails/components/ui/drawer.tsx",
96
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog } from \"@base-ui/react/dialog\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Drawer = Dialog.Root\n\nconst DrawerTrigger = Dialog.Trigger\n\nconst DrawerClose = Dialog.Close\n\nconst DrawerPortal = Dialog.Portal\n\nconst DrawerOverlay = React.forwardRef<\n HTMLDivElement,\n React.ComponentPropsWithoutRef<typeof Dialog.Backdrop>\n>(({ className, ...props }, ref) => (\n <Dialog.Backdrop\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 transition-opacity duration-300 data-[ending-style]:opacity-0 data-[starting-style]:opacity-0\",\n className\n )}\n {...props}\n />\n))\nDrawerOverlay.displayName = \"DrawerOverlay\"\n\nconst DrawerContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentPropsWithoutRef<typeof Dialog.Popup> & {\n children?: React.ReactNode\n }\n>(({ className, children, ...props }, ref) => (\n <DrawerPortal>\n <DrawerOverlay />\n <Dialog.Popup\n ref={ref}\n className={cn(\n \"fixed inset-x-0 bottom-0 z-50 flex flex-col rounded-t-[10px] border bg-background transition-transform duration-300 ease-out data-[ending-style]:translate-y-full data-[starting-style]:translate-y-full\",\n className\n )}\n {...props}\n >\n <div className=\"mx-auto mt-4 h-2 w-[100px] rounded-full bg-muted\" />\n {children}\n </Dialog.Popup>\n </DrawerPortal>\n))\nDrawerContent.displayName = \"DrawerContent\"\n\nconst DrawerHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"grid gap-1.5 p-4 text-center sm:text-left\", className)}\n {...props}\n />\n)\nDrawerHeader.displayName = \"DrawerHeader\"\n\nconst DrawerFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n)\nDrawerFooter.displayName = \"DrawerFooter\"\n\nconst DrawerTitle = React.forwardRef<\n HTMLHeadingElement,\n React.ComponentPropsWithoutRef<typeof Dialog.Title>\n>(({ className, ...props }, ref) => (\n <Dialog.Title\n ref={ref}\n className={cn(\n \"text-lg leading-none font-semibold tracking-tight\",\n className\n )}\n {...props}\n />\n))\nDrawerTitle.displayName = \"DrawerTitle\"\n\nconst DrawerDescription = React.forwardRef<\n HTMLParagraphElement,\n React.ComponentPropsWithoutRef<typeof Dialog.Description>\n>(({ className, ...props }, ref) => (\n <Dialog.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nDrawerDescription.displayName = \"DrawerDescription\"\n\nexport {\n Drawer,\n DrawerPortal,\n DrawerOverlay,\n DrawerTrigger,\n DrawerClose,\n DrawerContent,\n DrawerHeader,\n DrawerFooter,\n DrawerTitle,\n DrawerDescription,\n}\n"
97
+ },
98
+ {
99
+ "path": "registry/example-apps/default/emails/components/ui/dropdown-menu.tsx",
100
+ "type": "registry:ui",
101
+ "target": "components/example-apps/emails/components/ui/dropdown-menu.tsx",
102
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { IconCheck, IconChevronRight } from \"@tabler/icons-react\"\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n align = \"start\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n align={align}\n className={cn(\n \"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) w-(--radix-dropdown-menu-trigger-width) min-w-32 origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[state=closed]:overflow-hidden\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"group/dropdown-menu-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute right-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-checkbox-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <IconCheck />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute right-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-radio-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <IconCheck />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-xs font-medium text-muted-foreground data-[inset]:pl-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-open:bg-accent data-open:text-accent-foreground data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <IconChevronRight className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[96px] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n"
103
+ },
104
+ {
105
+ "path": "registry/example-apps/default/emails/components/ui/field.tsx",
106
+ "type": "registry:ui",
107
+ "target": "components/example-apps/emails/components/ui/field.tsx",
108
+ "content": "\"use client\"\n\nimport { useMemo, type ComponentPropsWithoutRef, type ReactNode } from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\nimport { Separator } from \"./separator\"\n\nfunction FieldSet({\n className,\n ...props\n}: ComponentPropsWithoutRef<\"fieldset\">) {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn(\n \"flex flex-col gap-6 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLegend({\n className,\n variant = \"legend\",\n ...props\n}: ComponentPropsWithoutRef<\"legend\"> & { variant?: \"legend\" | \"label\" }) {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn(\n \"mb-3 font-medium data-[variant=label]:text-sm data-[variant=legend]:text-base\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldGroup({ className, ...props }: ComponentPropsWithoutRef<\"div\">) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n \"group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst fieldVariants = cva(\n \"group/field flex w-full gap-3 data-[invalid=true]:text-destructive\",\n {\n variants: {\n orientation: {\n vertical: \"flex-col [&>*]:w-full [&>.sr-only]:w-auto\",\n horizontal:\n \"flex-row items-center has-[>[data-slot=field-content]]:items-start [&>[data-slot=field-label]]:flex-auto has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n responsive:\n \"flex-col @md/field-group:flex-row @md/field-group:items-center @md/field-group:has-[>[data-slot=field-content]]:items-start [&>*]:w-full @md/field-group:[&>*]:w-auto [&>.sr-only]:w-auto @md/field-group:[&>[data-slot=field-label]]:flex-auto @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n },\n }\n)\n\nfunction Field({\n className,\n orientation = \"vertical\",\n ...props\n}: ComponentPropsWithoutRef<\"div\"> & VariantProps<typeof fieldVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"field\"\n data-orientation={orientation}\n className={cn(fieldVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nfunction FieldContent({\n className,\n ...props\n}: ComponentPropsWithoutRef<\"div\">) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn(\n \"group/field-content flex flex-1 flex-col gap-1 leading-snug\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLabel({\n className,\n ...props\n}: ComponentPropsWithoutRef<typeof Label>) {\n return (\n <Label\n data-slot=\"field-label\"\n className={cn(\n \"group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50 has-data-checked:border-primary has-data-checked:bg-primary/5 has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border dark:has-data-checked:bg-primary/10 [&>*]:data-[slot=field]:p-3\",\n \"has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldTitle({ className, ...props }: ComponentPropsWithoutRef<\"div\">) {\n return (\n <div\n data-slot=\"field-label\"\n className={cn(\n \"flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldDescription({\n className,\n ...props\n}: ComponentPropsWithoutRef<\"p\">) {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(\n \"text-left text-sm leading-normal font-normal text-muted-foreground group-has-[[data-orientation=horizontal]]/field:text-balance [[data-variant=legend]+&]:-mt-1.5\",\n \"last:mt-0 nth-last-2:-mt-1\",\n \"[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldSeparator({\n children,\n className,\n ...props\n}: ComponentPropsWithoutRef<\"div\"> & {\n children?: ReactNode\n}) {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn(\n \"relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2\",\n className\n )}\n {...props}\n >\n <Separator className=\"absolute inset-0 top-1/2\" />\n {children && (\n <span\n className=\"relative mx-auto block w-fit bg-background px-2 text-muted-foreground\"\n data-slot=\"field-separator-content\"\n >\n {children}\n </span>\n )}\n </div>\n )\n}\n\nfunction FieldError({\n className,\n children,\n errors,\n ...props\n}: ComponentPropsWithoutRef<\"div\"> & {\n errors?: Array<{ message?: string } | undefined>\n}) {\n const content = useMemo(() => {\n if (children) {\n return children\n }\n\n if (!errors?.length) {\n return null\n }\n\n const uniqueErrors = [\n ...new Map(errors.map((error) => [error?.message, error])).values(),\n ]\n\n if (uniqueErrors?.length == 1) {\n return uniqueErrors[0]?.message\n }\n\n return (\n <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n {uniqueErrors.map(\n (error, index) =>\n error?.message && <li key={index}>{error.message}</li>\n )}\n </ul>\n )\n }, [children, errors])\n\n if (!content) {\n return null\n }\n\n return (\n <div\n role=\"alert\"\n data-slot=\"field-error\"\n className={cn(\"text-sm font-normal text-destructive\", className)}\n {...props}\n >\n {content}\n </div>\n )\n}\n\nexport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n FieldContent,\n FieldTitle,\n}\n"
109
+ },
110
+ {
111
+ "path": "registry/example-apps/default/emails/components/ui/input-group.tsx",
112
+ "type": "registry:ui",
113
+ "target": "components/example-apps/emails/components/ui/input-group.tsx",
114
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Textarea } from \"./textarea\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex h-9 w-full min-w-0 items-center rounded-md border border-input shadow-xs transition-[color,box-shadow] outline-none has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-[3px] has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-[3px] has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5 [[data-slot=combobox-content]_&]:focus-within:border-inherit [[data-slot=combobox-content]_&]:focus-within:ring-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first pl-2 has-[>button]:ml-[-0.25rem] has-[>kbd]:ml-[-0.15rem]\",\n \"inline-end\":\n \"order-last pr-2 has-[>button]:mr-[-0.25rem] has-[>kbd]:mr-[-0.15rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2\",\n \"block-end\":\n \"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n \"flex items-center gap-2 text-sm shadow-none\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"\",\n \"icon-xs\":\n \"size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 aria-invalid:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 aria-invalid:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n"
115
+ },
116
+ {
117
+ "path": "registry/example-apps/default/emails/components/ui/input.tsx",
118
+ "type": "registry:ui",
119
+ "target": "components/example-apps/emails/components/ui/input.tsx",
120
+ "content": "import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-2.5 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n"
121
+ },
122
+ {
123
+ "path": "registry/example-apps/default/emails/components/ui/label.tsx",
124
+ "type": "registry:ui",
125
+ "target": "components/example-apps/emails/components/ui/label.tsx",
126
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Label as LabelPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n"
127
+ },
128
+ {
129
+ "path": "registry/example-apps/default/emails/components/ui/select.tsx",
130
+ "type": "registry:ui",
131
+ "target": "components/example-apps/emails/components/ui/select.tsx",
132
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n IconCheck,\n IconChevronDown,\n IconChevronUp,\n IconSelector,\n} from \"@tabler/icons-react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return (\n <SelectPrimitive.Group\n data-slot=\"select-group\"\n className={cn(\"scroll-my-1 p-1\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"flex w-fit items-center justify-between gap-1.5 rounded-md border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <IconSelector className=\"pointer-events-none size-4 text-muted-foreground\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"item-aligned\",\n align = \"center\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-36 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n data-position={position}\n className={cn(\n \"data-[position=popper]:h-[var(--radix-select-trigger-height)] data-[position=popper]:w-full data-[position=popper]:min-w-[var(--radix-select-trigger-width)]\",\n position === \"popper\" && \"\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"px-2 py-1.5 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <IconCheck className=\"pointer-events-none\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"pointer-events-none -mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <IconChevronUp />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <IconChevronDown />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n"
133
+ },
134
+ {
135
+ "path": "registry/example-apps/default/emails/components/ui/separator.tsx",
136
+ "type": "registry:ui",
137
+ "target": "components/example-apps/emails/components/ui/separator.tsx",
138
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Separator as SeparatorPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:self-stretch\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n"
139
+ },
140
+ {
141
+ "path": "registry/example-apps/default/emails/components/ui/sheet.tsx",
142
+ "type": "registry:ui",
143
+ "target": "components/example-apps/emails/components/ui/sheet.tsx",
144
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog } from \"@base-ui/react/dialog\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Sheet = Dialog.Root\n\nconst SheetTrigger = Dialog.Trigger\n\nconst SheetClose = Dialog.Close\n\nconst SheetPortal = Dialog.Portal\n\nconst SheetOverlay = React.forwardRef<\n HTMLDivElement,\n React.ComponentPropsWithoutRef<typeof Dialog.Backdrop>\n>(({ className, ...props }, ref) => (\n <Dialog.Backdrop\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 transition-opacity duration-300 data-[ending-style]:opacity-0 data-[starting-style]:opacity-0\",\n className\n )}\n {...props}\n />\n))\nSheetOverlay.displayName = \"SheetOverlay\"\n\nconst sheetVariants = cva(\n \"fixed z-50 gap-4 bg-background p-6 shadow-lg transition-transform duration-300 ease-out\",\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 border-b data-[ending-style]:-translate-y-full data-[starting-style]:-translate-y-full\",\n bottom:\n \"inset-x-0 bottom-0 border-t data-[ending-style]:translate-y-full data-[starting-style]:translate-y-full\",\n left: \"inset-y-0 left-0 h-full w-3/4 border-r data-[ending-style]:-translate-x-full data-[starting-style]:-translate-x-full sm:max-w-sm\",\n right:\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[ending-style]:translate-x-full data-[starting-style]:translate-x-full sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n }\n)\n\ninterface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof Dialog.Popup>,\n VariantProps<typeof sheetVariants> {}\n\nconst SheetContent = React.forwardRef<HTMLDivElement, SheetContentProps>(\n ({ side = \"right\", className, children, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay />\n <Dialog.Popup\n ref={ref}\n className={cn(sheetVariants({ side }), className)}\n {...props}\n >\n {children}\n </Dialog.Popup>\n </SheetPortal>\n )\n)\nSheetContent.displayName = \"SheetContent\"\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nSheetHeader.displayName = \"SheetHeader\"\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nSheetFooter.displayName = \"SheetFooter\"\n\nconst SheetTitle = React.forwardRef<\n HTMLHeadingElement,\n React.ComponentPropsWithoutRef<typeof Dialog.Title>\n>(({ className, ...props }, ref) => (\n <Dialog.Title\n ref={ref}\n className={cn(\"text-lg font-semibold text-foreground\", className)}\n {...props}\n />\n))\nSheetTitle.displayName = \"SheetTitle\"\n\nconst SheetDescription = React.forwardRef<\n HTMLParagraphElement,\n React.ComponentPropsWithoutRef<typeof Dialog.Description>\n>(({ className, ...props }, ref) => (\n <Dialog.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nSheetDescription.displayName = \"SheetDescription\"\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n"
145
+ },
146
+ {
147
+ "path": "registry/example-apps/default/emails/components/ui/textarea.tsx",
148
+ "type": "registry:ui",
149
+ "target": "components/example-apps/emails/components/ui/textarea.tsx",
150
+ "content": "import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-2.5 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n"
151
+ },
152
+ {
153
+ "path": "registry/example-apps/default/emails/components/ui/tooltip.tsx",
154
+ "type": "registry:ui",
155
+ "target": "components/example-apps/emails/components/ui/tooltip.tsx",
156
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"@base-ui/react/tooltip\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst TooltipProvider = ({ children }: { children: React.ReactNode }) => {\n return <>{children}</>\n}\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = React.forwardRef<\n HTMLButtonElement,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Trigger> & {\n asChild?: boolean\n }\n>(({ asChild, children, ...props }, ref) => {\n if (asChild && React.isValidElement(children)) {\n return <TooltipPrimitive.Trigger ref={ref} render={children} {...props} />\n }\n return (\n <TooltipPrimitive.Trigger ref={ref} {...props}>\n {children}\n </TooltipPrimitive.Trigger>\n )\n})\nTooltipTrigger.displayName = \"TooltipTrigger\"\n\nconst TooltipContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Popup> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n }\n>(({ className, side = \"top\", ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Positioner side={side} sideOffset={4}>\n <TooltipPrimitive.Popup\n ref={ref}\n className={cn(\n \"animate-in fade-in-0 zoom-in-95 z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground\",\n className\n )}\n {...props}\n />\n </TooltipPrimitive.Positioner>\n </TooltipPrimitive.Portal>\n))\nTooltipContent.displayName = \"TooltipContent\"\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n"
157
+ },
158
+ {
159
+ "path": "registry/example-apps/default/emails/components/ui/verified-icon.tsx",
160
+ "type": "registry:ui",
161
+ "target": "components/example-apps/emails/components/ui/verified-icon.tsx",
162
+ "content": "export function VerifiedIcon({ className }: { className?: string }) {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M14.0879 6.41437C13.8528 6.1686 13.6095 5.91535 13.5178 5.69267C13.433 5.4887 13.428 5.15061 13.423 4.82314C13.4136 4.21434 13.4037 3.52446 12.924 3.04478C12.4443 2.5651 11.7544 2.55512 11.1456 2.54577C10.8181 2.54078 10.4801 2.53579 10.2761 2.45095C10.054 2.35926 9.80015 2.11599 9.55439 1.88083C9.12399 1.46727 8.63496 0.998825 7.98374 0.998825C7.33253 0.998825 6.84412 1.46727 6.4131 1.88083C6.16734 2.11599 5.91409 2.35926 5.6914 2.45095C5.48868 2.53579 5.14935 2.54078 4.82187 2.54577C4.21307 2.55512 3.52319 2.5651 3.04351 3.04478C2.56384 3.52446 2.55697 4.21434 2.5445 4.82314C2.53951 5.15061 2.53452 5.4887 2.44969 5.69267C2.35799 5.91473 2.11472 6.1686 1.87956 6.41437C1.46601 6.84476 0.997559 7.3338 0.997559 7.98501C0.997559 8.63622 1.46601 9.12463 1.87956 9.55565C2.11472 9.80142 2.35799 10.0547 2.44969 10.2774C2.53452 10.4813 2.53951 10.8194 2.5445 11.1469C2.55386 11.7557 2.56384 12.4456 3.04351 12.9252C3.52319 13.4049 4.21307 13.4149 4.82187 13.4243C5.14935 13.4292 5.48743 13.4342 5.6914 13.5191C5.91346 13.6108 6.16734 13.854 6.4131 14.0892C6.8435 14.5027 7.33253 14.9712 7.98374 14.9712C8.63496 14.9712 9.12336 14.5027 9.55439 14.0892C9.80015 13.854 10.0534 13.6108 10.2761 13.5191C10.4801 13.4342 10.8181 13.4292 11.1456 13.4243C11.7544 13.4149 12.4443 13.4049 12.924 12.9252C13.4037 12.4456 13.4136 11.7557 13.423 11.1469C13.428 10.8194 13.433 10.4813 13.5178 10.2774C13.6095 10.0553 13.8528 9.80142 14.0879 9.55565C14.5015 9.12525 14.9699 8.63622 14.9699 7.98501C14.9699 7.3338 14.5015 6.84539 14.0879 6.41437ZM10.8319 6.84102L7.33877 10.3341C7.29242 10.3805 7.23739 10.4173 7.17681 10.4424C7.11623 10.4675 7.05129 10.4805 6.98572 10.4805C6.92014 10.4805 6.8552 10.4675 6.79462 10.4424C6.73405 10.4173 6.67901 10.3805 6.63266 10.3341L5.13563 8.83707C5.04199 8.74344 4.98939 8.61644 4.98939 8.48402C4.98939 8.3516 5.04199 8.22461 5.13563 8.13097C5.22926 8.03734 5.35626 7.98473 5.48868 7.98473C5.6211 7.98473 5.74809 8.03734 5.84173 8.13097L6.98572 9.27558L10.1258 6.13492C10.1721 6.08855 10.2272 6.05178 10.2877 6.02669C10.3483 6.00159 10.4132 5.98868 10.4788 5.98868C10.5444 5.98868 10.6093 6.00159 10.6699 6.02669C10.7305 6.05178 10.7855 6.08855 10.8319 6.13492C10.8782 6.18128 10.915 6.23632 10.9401 6.2969C10.9652 6.35748 10.9781 6.4224 10.9781 6.48797C10.9781 6.55354 10.9652 6.61846 10.9401 6.67904C10.915 6.73962 10.8782 6.79466 10.8319 6.84102Z\"\n fill=\"#38BDF8\"\n />\n </svg>\n )\n}\n"
163
+ },
164
+ {
165
+ "path": "registry/example-apps/default/emails/hooks/use-mobile.ts",
166
+ "type": "registry:hook",
167
+ "target": "components/example-apps/emails/hooks/use-mobile.ts",
168
+ "content": "import * as React from \"react\"\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n mql.addEventListener(\"change\", onChange)\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return isMobile\n}\n"
169
+ },
170
+ {
171
+ "path": "registry/example-apps/default/emails/index.tsx",
172
+ "type": "registry:file",
173
+ "target": "components/example-apps/emails/index.tsx",
174
+ "content": "/**\n * Wrapper export for embedding the app in the docs app\n */\n\"use client\"\n\nimport { useEffect, useRef, useState } from \"react\"\n\nimport { Sheet, SheetContent } from \"@loveui/ui/ui/sheet\"\n\nimport { EmailDetail } from \"./components/emails/email-detail\"\nimport { EmailList } from \"./components/emails/email-list\"\nimport { EmailsHeader } from \"./components/emails/emails-header\"\nimport { EmailsHorizontalNav } from \"./components/emails/emails-horizontal-nav\"\nimport { EmailsVerticalSidebar } from \"./components/emails/emails-vertical-sidebar\"\nimport { EmailsVerticalSidebarMobile } from \"./components/emails/emails-vertical-sidebar-mobile\"\nimport { Drawer, DrawerContent } from \"./components/ui/drawer\"\nimport { TooltipProvider } from \"./components/ui/tooltip\"\nimport { useIsMobile } from \"./hooks/use-mobile\"\nimport { useEmailsStore } from \"./store/emails-store\"\n\nexport default function EmailsWrapper() {\n const { emails, selectedEmailId, selectEmail, clearSelectedEmail } =\n useEmailsStore()\n const isMobile = useIsMobile()\n const [drawerOpen, setDrawerOpen] = useState(false)\n const [sidebarOpen, setSidebarOpen] = useState(false)\n const hasInitializedRef = useRef(false)\n\n useEffect(() => {\n if (\n isMobile !== undefined &&\n !isMobile &&\n emails.length > 0 &&\n !selectedEmailId &&\n !hasInitializedRef.current\n ) {\n selectEmail(emails[0].id)\n hasInitializedRef.current = true\n }\n }, [emails, selectedEmailId, selectEmail, isMobile])\n\n const handleEmailClick = (emailId: string) => {\n if (isMobile) {\n selectEmail(emailId)\n setDrawerOpen(true)\n }\n }\n\n const handleDrawerClose = (open: boolean) => {\n setDrawerOpen(open)\n if (!open) {\n clearSelectedEmail()\n }\n }\n\n return (\n <TooltipProvider>\n <div className=\"flex h-full min-h-0 overflow-hidden bg-background\">\n <div className=\"hidden md:block\">\n <EmailsVerticalSidebar />\n </div>\n\n <Sheet open={sidebarOpen} onOpenChange={setSidebarOpen}>\n <SheetContent\n side=\"left\"\n className=\"w-[240px] border-none p-0 [&>button]:hidden\"\n >\n <EmailsVerticalSidebarMobile\n onItemClick={() => setSidebarOpen(false)}\n />\n </SheetContent>\n </Sheet>\n\n <div className=\"flex flex-1 flex-col overflow-hidden\">\n <EmailsHeader onMobileMenuClick={() => setSidebarOpen(true)} />\n\n <div className=\"hidden md:block\">\n <EmailsHorizontalNav />\n </div>\n\n <div className=\"flex flex-1 overflow-hidden\">\n <div className=\"w-full border-r border-border md:w-[320px]\">\n <EmailList onEmailClick={handleEmailClick} />\n </div>\n\n <div className=\"hidden flex-1 md:block\">\n <EmailDetail />\n </div>\n </div>\n </div>\n\n <Drawer open={drawerOpen} onOpenChange={handleDrawerClose}>\n <DrawerContent className=\"h-[90vh]\">\n <div className=\"f-full flex-1 overflow-hidden\">\n <EmailDetail />\n </div>\n </DrawerContent>\n </Drawer>\n </div>\n </TooltipProvider>\n )\n}\n"
175
+ },
176
+ {
177
+ "path": "registry/example-apps/default/emails/lib/utils.ts",
178
+ "type": "registry:lib",
179
+ "target": "components/example-apps/emails/lib/utils.ts",
180
+ "content": "import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n"
181
+ },
182
+ {
183
+ "path": "registry/example-apps/default/emails/mock-data/emails.ts",
184
+ "type": "registry:lib",
185
+ "target": "components/example-apps/emails/mock-data/emails.ts",
186
+ "content": "import { Label, labels } from \"./labels\"\nimport { User, users } from \"./users\"\n\nexport interface Email {\n id: string\n from: User\n to: User[]\n subject: string\n body: string\n date: Date\n read: boolean\n starred: boolean\n labels: Label[]\n hasAttachments: boolean\n attachments?: {\n id: string\n name: string\n size: string\n type: string\n }[]\n}\n\nexport const emails: Email[] = [\n {\n id: \"1\",\n from: users[1],\n to: [users[0]],\n subject: \"[SEV-1] Checkout API latency above 2.8s\",\n body: `Trigger: p95 latency crossed 2.8s for 7 minutes in us-east-1.\n\nCurrent impact:\n- 14% of requests timing out\n- Retries up 3.2x\n- Cart updates delayed for mobile users\n\nPrimary runbook and dashboards are attached.\nPlease acknowledge within 5 minutes.`,\n date: new Date(\"2026-02-18T09:12:00\"),\n read: false,\n starred: true,\n labels: [labels[2], labels[0]],\n hasAttachments: true,\n attachments: [\n {\n id: \"att1\",\n name: \"checkout-latency-runbook.pdf\",\n size: \"1.1 MB\",\n type: \"application/pdf\",\n },\n {\n id: \"att2\",\n name: \"grafana-snapshot.png\",\n size: \"2.6 MB\",\n type: \"image/png\",\n },\n ],\n },\n {\n id: \"2\",\n from: users[3],\n to: [users[0]],\n subject: \"Mitigation applied: cache warm-up completed\",\n body: `Quick update from SRE:\n\n- Increased edge cache TTL for product metadata\n- Warmed top 5,000 keys\n- Error rate dropped from 5.6% to 1.2%\n\nContinuing to monitor for the next 30 minutes before full resolution call.`,\n date: new Date(\"2026-02-18T09:34:00\"),\n read: false,\n starred: true,\n labels: [labels[0]],\n hasAttachments: false,\n },\n {\n id: \"3\",\n from: users[2],\n to: [users[0]],\n subject: \"CPU anomaly detected on payments-worker-04\",\n body: `CloudWatch detected sustained CPU > 92% on payments-worker-04.\n\nTimeline:\n- Spike began at 08:41 UTC\n- Queue depth currently 11,238 messages\n- No packet loss observed\n\nSuggested action: drain node and shift traffic to warm standby.`,\n date: new Date(\"2026-02-18T08:47:00\"),\n read: true,\n starred: false,\n labels: [labels[1]],\n hasAttachments: true,\n attachments: [\n {\n id: \"att3\",\n name: \"cw-metrics-export.csv\",\n size: \"486 KB\",\n type: \"text/csv\",\n },\n ],\n },\n {\n id: \"4\",\n from: users[5],\n to: [users[0]],\n subject: \"Security watch: suspicious auth bursts blocked\",\n body: `SOC bot blocked 1,842 suspicious auth attempts in 12 minutes.\n\nNotes:\n- Source ASN matches previously flagged botnet\n- No successful account takeover observed\n- Temporary WAF rule auto-deployed\n\nPlease review the incident card for rule expiry timing.`,\n date: new Date(\"2026-02-18T07:58:00\"),\n read: true,\n starred: false,\n labels: [labels[1], labels[0]],\n hasAttachments: true,\n attachments: [\n {\n id: \"att4\",\n name: \"waf-rule-diff.json\",\n size: \"92 KB\",\n type: \"application/json\",\n },\n ],\n },\n {\n id: \"5\",\n from: users[4],\n to: [users[0]],\n subject: \"On-call handoff notes for Feb 18\",\n body: `Good morning team,\n\nHandoff summary:\n- Active: checkout latency (SEV-1) with mitigation in progress\n- Monitoring: auth burst pattern, no customer impact\n- Planned: rotate Redis credentials at 14:00 UTC\n\nEscalation tree and backup contacts attached.`,\n date: new Date(\"2026-02-18T07:15:00\"),\n read: false,\n starred: false,\n labels: [labels[0]],\n hasAttachments: true,\n attachments: [\n {\n id: \"att5\",\n name: \"handoff-sheet-feb18.xlsx\",\n size: \"214 KB\",\n type: \"application/vnd.ms-excel\",\n },\n {\n id: \"att6\",\n name: \"escalation-tree.pdf\",\n size: \"744 KB\",\n type: \"application/pdf\",\n },\n ],\n },\n {\n id: \"6\",\n from: users[0],\n to: [users[3]],\n subject: \"Need confirmation: rollback window at 09:45 UTC\",\n body: `Kim,\n\nPlease confirm if we can safely open a rollback window at 09:45 UTC for checkout-service.\nI need your go/no-go note before I notify leadership.\n\nThanks,\nAva`,\n date: new Date(\"2026-02-18T06:58:00\"),\n read: true,\n starred: false,\n labels: [labels[0]],\n hasAttachments: false,\n },\n {\n id: \"7\",\n from: users[1],\n to: [users[0]],\n subject: \"Resolved: search cluster memory pressure\",\n body: `Incident RES-4821 closed.\n\nRoot cause:\n- Memory leak in query expansion worker after dependency update.\n\nFix:\n- Rolled back worker image to 2.9.14\n- Added guardrail alert on heap delta > 12%\n\nPostmortem scheduled for Friday.`,\n date: new Date(\"2026-02-17T18:20:00\"),\n read: true,\n starred: false,\n labels: [labels[1]],\n hasAttachments: true,\n attachments: [\n {\n id: \"att7\",\n name: \"res-4821-postmortem-draft.docx\",\n size: \"136 KB\",\n type: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n },\n ],\n },\n {\n id: \"8\",\n from: users[5],\n to: [users[0]],\n subject: \"Credential rotation reminder: staging + production\",\n body: `Reminder from Security Response Bot:\n\nQuarterly credential rotation is due this week.\nTargets:\n- staging/api-gateway\n- prod/redis-cache\n- prod/payments-webhook\n\nRunbook includes zero-downtime sequence.`,\n date: new Date(\"2026-02-17T14:05:00\"),\n read: false,\n starred: true,\n labels: [labels[0]],\n hasAttachments: true,\n attachments: [\n {\n id: \"att8\",\n name: \"credential-rotation-runbook.pdf\",\n size: \"928 KB\",\n type: \"application/pdf\",\n },\n ],\n },\n {\n id: \"9\",\n from: users[2],\n to: [users[0]],\n subject: \"Daily uptime digest\",\n body: `24h platform digest:\n\n- API availability: 99.96%\n- Mean incident acknowledgment: 4m 13s\n- Mean incident resolution: 31m 42s\n- Error budget burn: 12.4%\n\nNo unresolved critical alerts at report generation time.`,\n date: new Date(\"2026-02-17T09:00:00\"),\n read: true,\n starred: false,\n labels: [labels[0]],\n hasAttachments: false,\n },\n {\n id: \"10\",\n from: users[3],\n to: [users[0]],\n subject: \"Request: add runbook step for feature flag fallback\",\n body: `During yesterday's incident we lost 6 minutes deciding between rollback and feature flag fallback.\n\nProposal:\n1. Add explicit flag fallback step after cache purge.\n2. Include owner + confirmation checklist.\n3. Add command snippets for both regions.\n\nCan you review by end of day?`,\n date: new Date(\"2026-02-16T17:25:00\"),\n read: false,\n starred: false,\n labels: [labels[1]],\n hasAttachments: false,\n },\n {\n id: \"11\",\n from: users[4],\n to: [users[0]],\n subject: \"Coverage update: weekend on-call swap approved\",\n body: `Coverage update:\n\n- Saturday primary: Kim\n- Saturday backup: Ava\n- Sunday primary: Nora\n- Sunday backup: Theo\n\nCalendar and pager routing are now synced.`,\n date: new Date(\"2026-02-16T12:10:00\"),\n read: true,\n starred: false,\n labels: [labels[0]],\n hasAttachments: true,\n attachments: [\n {\n id: \"att9\",\n name: \"weekend-coverage.ics\",\n size: \"9 KB\",\n type: \"text/calendar\",\n },\n ],\n },\n {\n id: \"12\",\n from: users[0],\n to: [users[1], users[3]],\n subject: \"Post-incident action items approved\",\n body: `Approved action items for checkout latency incident:\n\n1. Add queue depth saturation alert at 8k.\n2. Add canary gate for cache dependency changes.\n3. Document fallback query path in on-call handbook.\n4. Run chaos replay in staging on Wednesday.\n\nPlease confirm owners in the tracker thread.`,\n date: new Date(\"2026-02-16T08:42:00\"),\n read: true,\n starred: true,\n labels: [labels[2], labels[1]],\n hasAttachments: true,\n attachments: [\n {\n id: \"att10\",\n name: \"action-items-checkout.md\",\n size: \"22 KB\",\n type: \"text/markdown\",\n },\n ],\n },\n]\n"
187
+ },
188
+ {
189
+ "path": "registry/example-apps/default/emails/mock-data/labels.ts",
190
+ "type": "registry:lib",
191
+ "target": "components/example-apps/emails/mock-data/labels.ts",
192
+ "content": "export interface Label {\n id: string\n name: string\n color: string\n}\n\nexport const labels: Label[] = [\n {\n id: \"ops\",\n name: \"Ops\",\n color: \"bg-blue-100 text-blue-700 dark:bg-blue-950/50 dark:text-blue-400\",\n },\n {\n id: \"investigation\",\n name: \"Investigation\",\n color:\n \"bg-green-100 text-green-700 dark:bg-green-950/50 dark:text-green-400\",\n },\n {\n id: \"sev1\",\n name: \"SEV-1\",\n color: \"bg-red-100 text-red-700 dark:bg-red-950/50 dark:text-red-400\",\n },\n]\n"
193
+ },
194
+ {
195
+ "path": "registry/example-apps/default/emails/mock-data/users.ts",
196
+ "type": "registry:lib",
197
+ "target": "components/example-apps/emails/mock-data/users.ts",
198
+ "content": "export interface User {\n id: string\n name: string\n email: string\n avatar: string\n verified?: boolean\n}\n\nexport const users: User[] = [\n {\n id: \"1\",\n name: \"Ava Patel\",\n email: \"ava.patel@opsbridge.io\",\n avatar: \"https://api.dicebear.com/9.x/glass/svg?seed=Ava Patel\",\n verified: true,\n },\n {\n id: \"2\",\n name: \"PagerDuty Alerts\",\n email: \"alerts@pagerduty.com\",\n avatar: \"https://api.dicebear.com/9.x/glass/svg?seed=PagerDuty\",\n verified: true,\n },\n {\n id: \"3\",\n name: \"CloudWatch Monitor\",\n email: \"monitor@aws.amazon.com\",\n avatar: \"https://api.dicebear.com/9.x/glass/svg?seed=CloudWatch\",\n verified: false,\n },\n {\n id: \"4\",\n name: \"Kim from SRE\",\n email: \"kim.sre@opsbridge.io\",\n avatar: \"https://api.dicebear.com/9.x/glass/svg?seed=Kim SRE\",\n verified: true,\n },\n {\n id: \"5\",\n name: \"On-Call Scheduler\",\n email: \"schedule@opsbridge.io\",\n avatar: \"https://api.dicebear.com/9.x/glass/svg?seed=On Call Scheduler\",\n verified: true,\n },\n {\n id: \"6\",\n name: \"Security Response Bot\",\n email: \"soc-bot@opsbridge.io\",\n avatar: \"https://api.dicebear.com/9.x/glass/svg?seed=SOC Bot\",\n verified: false,\n },\n]\n\nexport const currentUser = users[0]\n"
199
+ },
200
+ {
201
+ "path": "registry/example-apps/default/emails/store/emails-store.ts",
202
+ "type": "registry:lib",
203
+ "target": "components/example-apps/emails/store/emails-store.ts",
204
+ "content": "import { create } from \"zustand\"\n\nimport { Email, emails } from \"../mock-data/emails\"\n\ninterface EmailsState {\n emails: Email[]\n selectedEmailId: string | null\n currentFolder: string\n selectEmail: (id: string) => void\n markAsRead: (id: string) => void\n markAsUnread: (id: string) => void\n toggleStar: (id: string) => void\n setFolder: (folder: string) => void\n clearSelectedEmail: () => void\n}\n\nexport const useEmailsStore = create<EmailsState>((set) => ({\n emails: emails,\n selectedEmailId: null,\n currentFolder: \"inbox\",\n\n selectEmail: (id) =>\n set((state) => {\n const email = state.emails.find((e) => e.id === id)\n if (email && !email.read) {\n const updatedEmails = state.emails.map((e) =>\n e.id === id ? { ...e, read: true } : e\n )\n return { emails: updatedEmails, selectedEmailId: id }\n }\n return { selectedEmailId: id }\n }),\n\n markAsRead: (id) =>\n set((state) => ({\n emails: state.emails.map((e) => (e.id === id ? { ...e, read: true } : e)),\n })),\n\n markAsUnread: (id) =>\n set((state) => ({\n emails: state.emails.map((e) =>\n e.id === id ? { ...e, read: false } : e\n ),\n })),\n\n toggleStar: (id) =>\n set((state) => ({\n emails: state.emails.map((e) =>\n e.id === id ? { ...e, starred: !e.starred } : e\n ),\n })),\n\n setFolder: (folder) => set({ currentFolder: folder }),\n\n clearSelectedEmail: () => set({ selectedEmailId: null }),\n}))\n"
205
+ }
206
+ ],
207
+ "categories": [
208
+ "example-app",
209
+ "productivity",
210
+ "incident",
211
+ "operations",
212
+ "alerts",
213
+ "inbox"
214
+ ],
215
+ "dependencies": [
216
+ "@base-ui/react",
217
+ "@tabler/icons-react",
218
+ "class-variance-authority",
219
+ "clsx",
220
+ "date-fns",
221
+ "next-themes",
222
+ "radix-ui",
223
+ "tailwind-merge",
224
+ "zustand"
225
+ ],
226
+ "registryDependencies": [
227
+ "https://www.loveui.dev/r/avatar.json",
228
+ "https://www.loveui.dev/r/button.json",
229
+ "https://www.loveui.dev/r/separator.json",
230
+ "https://www.loveui.dev/r/sheet.json"
231
+ ],
232
+ "meta": {
233
+ "source": "example-app",
234
+ "appName": "emails",
235
+ "routes": [
236
+ {
237
+ "path": "/",
238
+ "title": "Active Alerts",
239
+ "description": "Main incident inbox with alert detail"
240
+ }
241
+ ]
242
+ }
243
+ }
@@ -9,7 +9,7 @@
9
9
  "files": [
10
10
  {
11
11
  "path": "registry/default/examples/empty-demo.tsx",
12
- "content": "import { BookIcon, RouteIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport {\n Empty,\n EmptyContent,\n EmptyDescription,\n EmptyHeader,\n EmptyMedia,\n EmptyTitle,\n} from \"@/registry/default/ui/empty\"\n\nexport default function EmptyDemo() {\n return (\n <Empty>\n <EmptyHeader>\n <EmptyMedia variant=\"icon\">\n <RouteIcon />\n </EmptyMedia>\n <EmptyTitle>No upcoming meetings</EmptyTitle>\n <EmptyDescription>Create a meeting to get started.</EmptyDescription>\n </EmptyHeader>\n <EmptyContent>\n <div className=\"flex gap-2\">\n <Button size=\"sm\">Create meeting</Button>\n <Button variant=\"outline\" size=\"sm\">\n <BookIcon className=\"opacity-72\" />\n View docs\n </Button>\n </div>\n </EmptyContent>\n </Empty>\n )\n}\n",
12
+ "content": "import { BookIcon, RouteIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport {\n Empty,\n EmptyContent,\n EmptyDescription,\n EmptyHeader,\n EmptyMedia,\n EmptyTitle,\n} from \"@/registry/default/ui/empty\"\n\nexport default function EmptyDemo() {\n return (\n <Empty>\n <EmptyHeader>\n <EmptyMedia variant=\"icon\">\n <RouteIcon />\n </EmptyMedia>\n <EmptyTitle>Updated No upcoming meetings</EmptyTitle>\n <EmptyDescription>\n Updated Create a meeting to get started.\n </EmptyDescription>\n </EmptyHeader>\n <EmptyContent>\n <div className=\"flex gap-2\">\n <Button size=\"sm\">Updated Create meeting</Button>\n <Button variant=\"outline\" size=\"sm\">\n <BookIcon className=\"opacity-72\" />\n Updated View docs\n </Button>\n </div>\n </EmptyContent>\n </Empty>\n )\n}\n",
13
13
  "type": "registry:example"
14
14
  }
15
15
  ],