@luxfi/ui 7.4.15 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (910) hide show
  1. package/LICENSE.md +21 -0
  2. package/dist/3d-button.cjs +298 -0
  3. package/dist/3d-button.d.ts +52 -0
  4. package/dist/3d-button.d.ts.map +1 -0
  5. package/dist/3d-button.js +273 -0
  6. package/dist/3d-card.cjs +236 -0
  7. package/dist/3d-card.d.ts +29 -0
  8. package/dist/3d-card.d.ts.map +1 -0
  9. package/dist/3d-card.js +209 -0
  10. package/dist/3d-carousel.cjs +375 -0
  11. package/dist/3d-carousel.d.ts +26 -0
  12. package/dist/3d-carousel.d.ts.map +1 -0
  13. package/dist/3d-carousel.js +348 -0
  14. package/dist/3d-grid.cjs +360 -0
  15. package/dist/3d-grid.d.ts +49 -0
  16. package/dist/3d-grid.d.ts.map +1 -0
  17. package/dist/3d-grid.js +335 -0
  18. package/dist/3d-marquee.cjs +8669 -0
  19. package/dist/3d-marquee.d.ts +65 -0
  20. package/dist/3d-marquee.d.ts.map +1 -0
  21. package/dist/3d-marquee.js +8645 -0
  22. package/dist/3d-model-viewer.cjs +909 -0
  23. package/dist/3d-model-viewer.d.ts +45 -0
  24. package/dist/3d-model-viewer.d.ts.map +1 -0
  25. package/dist/3d-model-viewer.js +886 -0
  26. package/dist/3d-pin.cjs +46 -0
  27. package/dist/3d-pin.d.ts +8 -0
  28. package/dist/3d-pin.d.ts.map +1 -0
  29. package/dist/3d-pin.js +24 -0
  30. package/dist/3d-scene.cjs +439 -0
  31. package/dist/3d-scene.d.ts +76 -0
  32. package/dist/3d-scene.d.ts.map +1 -0
  33. package/dist/3d-scene.js +407 -0
  34. package/dist/3d-text.cjs +367 -0
  35. package/dist/3d-text.d.ts +62 -0
  36. package/dist/3d-text.d.ts.map +1 -0
  37. package/dist/3d-text.js +341 -0
  38. package/dist/accordion.d.ts +10 -12
  39. package/dist/accordion.d.ts.map +1 -0
  40. package/dist/advanced-chart.cjs +53 -0
  41. package/dist/advanced-chart.d.ts +6 -0
  42. package/dist/advanced-chart.d.ts.map +1 -0
  43. package/dist/advanced-chart.js +51 -0
  44. package/dist/advanced-navigation-bar.cjs +459 -0
  45. package/dist/advanced-navigation-bar.d.ts +14 -0
  46. package/dist/advanced-navigation-bar.d.ts.map +1 -0
  47. package/dist/advanced-navigation-bar.js +437 -0
  48. package/dist/ai-actions.cjs +57 -0
  49. package/dist/ai-actions.d.ts +14 -0
  50. package/dist/ai-actions.d.ts.map +1 -0
  51. package/dist/ai-actions.js +35 -0
  52. package/dist/ai-agents.cjs +1764 -0
  53. package/dist/ai-agents.d.ts +56 -0
  54. package/dist/ai-agents.d.ts.map +1 -0
  55. package/dist/ai-agents.js +1740 -0
  56. package/dist/ai-assistant.cjs +907 -0
  57. package/dist/ai-assistant.d.ts +28 -0
  58. package/dist/ai-assistant.d.ts.map +1 -0
  59. package/dist/ai-assistant.js +886 -0
  60. package/dist/ai-chat.cjs +1165 -0
  61. package/dist/ai-chat.d.ts +56 -0
  62. package/dist/ai-chat.d.ts.map +1 -0
  63. package/dist/ai-chat.js +1141 -0
  64. package/dist/ai-code.cjs +1866 -0
  65. package/dist/ai-code.d.ts +58 -0
  66. package/dist/ai-code.d.ts.map +1 -0
  67. package/dist/ai-code.js +1841 -0
  68. package/dist/ai-model-selector-navigation-bar.cjs +59 -0
  69. package/dist/ai-model-selector-navigation-bar.d.ts +15 -0
  70. package/dist/ai-model-selector-navigation-bar.d.ts.map +1 -0
  71. package/dist/ai-model-selector-navigation-bar.js +37 -0
  72. package/dist/ai-models.cjs +41 -0
  73. package/dist/ai-models.d.ts +15 -0
  74. package/dist/ai-models.d.ts.map +1 -0
  75. package/dist/ai-models.js +19 -0
  76. package/dist/ai-playground.cjs +1110 -0
  77. package/dist/ai-playground.d.ts +66 -0
  78. package/dist/ai-playground.d.ts.map +1 -0
  79. package/dist/ai-playground.js +1088 -0
  80. package/dist/ai-tools.cjs +1043 -0
  81. package/dist/ai-tools.d.ts +23 -0
  82. package/dist/ai-tools.d.ts.map +1 -0
  83. package/dist/ai-tools.js +1022 -0
  84. package/dist/ai-vision.cjs +1831 -0
  85. package/dist/ai-vision.d.ts +74 -0
  86. package/dist/ai-vision.d.ts.map +1 -0
  87. package/dist/ai-vision.js +1810 -0
  88. package/dist/ai-voice-settings.cjs +1511 -0
  89. package/dist/ai-voice-settings.d.ts +100 -0
  90. package/dist/ai-voice-settings.d.ts.map +1 -0
  91. package/dist/ai-voice-settings.js +1478 -0
  92. package/dist/ai-voice.cjs +1522 -0
  93. package/dist/ai-voice.d.ts +72 -0
  94. package/dist/ai-voice.d.ts.map +1 -0
  95. package/dist/ai-voice.js +1501 -0
  96. package/dist/alert.cjs +14 -147
  97. package/dist/alert.d.ts +4 -5
  98. package/dist/alert.d.ts.map +1 -0
  99. package/dist/alert.js +14 -147
  100. package/dist/android.cjs +127 -0
  101. package/dist/android.d.ts +19 -0
  102. package/dist/android.d.ts.map +1 -0
  103. package/dist/android.js +104 -0
  104. package/dist/animated-background.cjs +8830 -0
  105. package/dist/animated-background.d.ts +103 -0
  106. package/dist/animated-background.d.ts.map +1 -0
  107. package/dist/animated-background.js +8824 -0
  108. package/dist/animated-beam.cjs +8438 -0
  109. package/dist/animated-beam.d.ts +15 -0
  110. package/dist/animated-beam.d.ts.map +1 -0
  111. package/dist/animated-beam.js +8417 -0
  112. package/dist/animated-cursor.cjs +269 -0
  113. package/dist/animated-cursor.d.ts +70 -0
  114. package/dist/animated-cursor.d.ts.map +1 -0
  115. package/dist/animated-cursor.js +264 -0
  116. package/dist/animated-icon.cjs +8927 -0
  117. package/dist/animated-icon.d.ts +119 -0
  118. package/dist/animated-icon.d.ts.map +1 -0
  119. package/dist/animated-icon.js +8902 -0
  120. package/dist/animated-list.cjs +9226 -0
  121. package/dist/animated-list.d.ts +126 -0
  122. package/dist/animated-list.d.ts.map +1 -0
  123. package/dist/animated-list.js +9201 -0
  124. package/dist/animated-number.cjs +8773 -0
  125. package/dist/animated-number.d.ts +127 -0
  126. package/dist/animated-number.d.ts.map +1 -0
  127. package/dist/animated-number.js +8767 -0
  128. package/dist/animated-testimonials.cjs +8653 -0
  129. package/dist/animated-testimonials.d.ts +17 -0
  130. package/dist/animated-testimonials.d.ts.map +1 -0
  131. package/dist/animated-testimonials.js +8632 -0
  132. package/dist/animated-text.cjs +8914 -0
  133. package/dist/animated-text.d.ts +65 -0
  134. package/dist/animated-text.d.ts.map +1 -0
  135. package/dist/animated-text.js +8890 -0
  136. package/dist/animated-tooltip.cjs +8624 -0
  137. package/dist/animated-tooltip.d.ts +9 -0
  138. package/dist/animated-tooltip.d.ts.map +1 -0
  139. package/dist/animated-tooltip.js +8603 -0
  140. package/dist/announcement.cjs +465 -0
  141. package/dist/announcement.d.ts +9 -0
  142. package/dist/announcement.d.ts.map +1 -0
  143. package/dist/announcement.js +443 -0
  144. package/dist/app-switcher-navigation-bar.cjs +470 -0
  145. package/dist/app-switcher-navigation-bar.d.ts +15 -0
  146. package/dist/app-switcher-navigation-bar.d.ts.map +1 -0
  147. package/dist/app-switcher-navigation-bar.js +448 -0
  148. package/dist/apple-cards-carousel.cjs +9356 -0
  149. package/dist/apple-cards-carousel.d.ts +36 -0
  150. package/dist/apple-cards-carousel.d.ts.map +1 -0
  151. package/dist/apple-cards-carousel.js +9334 -0
  152. package/dist/apple-hello-effect.cjs +8380 -0
  153. package/dist/apple-hello-effect.d.ts +8 -0
  154. package/dist/apple-hello-effect.d.ts.map +1 -0
  155. package/dist/apple-hello-effect.js +8359 -0
  156. package/dist/auth.cjs +6 -5
  157. package/dist/auth.d.ts +11 -13
  158. package/dist/auth.d.ts.map +1 -0
  159. package/dist/auth.js +6 -5
  160. package/dist/avatar.d.ts +5 -6
  161. package/dist/avatar.d.ts.map +1 -0
  162. package/dist/badge.cjs +29 -169
  163. package/dist/badge.d.ts +9 -13
  164. package/dist/badge.d.ts.map +1 -0
  165. package/dist/badge.js +29 -169
  166. package/dist/bank.d.ts +42 -47
  167. package/dist/bank.d.ts.map +1 -0
  168. package/dist/banner.cjs +78 -0
  169. package/dist/banner.d.ts +20 -0
  170. package/dist/banner.d.ts.map +1 -0
  171. package/dist/banner.js +55 -0
  172. package/dist/breadcrumb-and-filters-navigation-bar.cjs +51 -0
  173. package/dist/breadcrumb-and-filters-navigation-bar.d.ts +10 -0
  174. package/dist/breadcrumb-and-filters-navigation-bar.d.ts.map +1 -0
  175. package/dist/breadcrumb-and-filters-navigation-bar.js +29 -0
  176. package/dist/breadcrumb-navigation-bar.cjs +37 -0
  177. package/dist/breadcrumb-navigation-bar.d.ts +10 -0
  178. package/dist/breadcrumb-navigation-bar.d.ts.map +1 -0
  179. package/dist/breadcrumb-navigation-bar.js +15 -0
  180. package/dist/button.cjs +21 -154
  181. package/dist/button.d.ts +9 -10
  182. package/dist/button.d.ts.map +1 -0
  183. package/dist/button.js +21 -154
  184. package/dist/calendar.cjs +55 -0
  185. package/dist/calendar.d.ts +9 -0
  186. package/dist/calendar.d.ts.map +1 -0
  187. package/dist/calendar.js +53 -0
  188. package/dist/centered-logo-navigation-bar.cjs +37 -0
  189. package/dist/centered-logo-navigation-bar.d.ts +15 -0
  190. package/dist/centered-logo-navigation-bar.d.ts.map +1 -0
  191. package/dist/centered-logo-navigation-bar.js +15 -0
  192. package/dist/chart.cjs +266 -0
  193. package/dist/chart.d.ts +52 -0
  194. package/dist/chart.d.ts.map +1 -0
  195. package/dist/chart.js +238 -0
  196. package/dist/checkbox.d.ts +6 -7
  197. package/dist/checkbox.d.ts.map +1 -0
  198. package/dist/choicebox.cjs +77 -0
  199. package/dist/choicebox.d.ts +15 -0
  200. package/dist/choicebox.d.ts.map +1 -0
  201. package/dist/choicebox.js +55 -0
  202. package/dist/chrome.cjs +39 -37
  203. package/dist/chrome.d.ts +15 -19
  204. package/dist/chrome.d.ts.map +1 -0
  205. package/dist/chrome.js +37 -35
  206. package/dist/close-button.d.ts +3 -5
  207. package/dist/close-button.d.ts.map +1 -0
  208. package/dist/code-block.cjs +871 -0
  209. package/dist/code-block.d.ts +38 -0
  210. package/dist/code-block.d.ts.map +1 -0
  211. package/dist/code-block.js +849 -0
  212. package/dist/code-compare.cjs +1714 -0
  213. package/dist/code-compare.d.ts +46 -0
  214. package/dist/code-compare.d.ts.map +1 -0
  215. package/dist/code-compare.js +1692 -0
  216. package/dist/code-diff.cjs +1073 -0
  217. package/dist/code-diff.d.ts +42 -0
  218. package/dist/code-diff.d.ts.map +1 -0
  219. package/dist/code-diff.js +1051 -0
  220. package/dist/code-editor.cjs +641 -0
  221. package/dist/code-editor.d.ts +23 -0
  222. package/dist/code-editor.d.ts.map +1 -0
  223. package/dist/code-editor.js +616 -0
  224. package/dist/code-explorer.cjs +729 -0
  225. package/dist/code-explorer.d.ts +41 -0
  226. package/dist/code-explorer.d.ts.map +1 -0
  227. package/dist/code-explorer.js +707 -0
  228. package/dist/code-preview.cjs +1349 -0
  229. package/dist/code-preview.d.ts +38 -0
  230. package/dist/code-preview.d.ts.map +1 -0
  231. package/dist/code-preview.js +1327 -0
  232. package/dist/code-snippet.cjs +920 -0
  233. package/dist/code-snippet.d.ts +48 -0
  234. package/dist/code-snippet.d.ts.map +1 -0
  235. package/dist/code-snippet.js +897 -0
  236. package/dist/code-tabs.cjs +76 -0
  237. package/dist/code-tabs.d.ts +12 -0
  238. package/dist/code-tabs.d.ts.map +1 -0
  239. package/dist/code-tabs.js +54 -0
  240. package/dist/code-terminal.cjs +894 -0
  241. package/dist/code-terminal.d.ts +48 -0
  242. package/dist/code-terminal.d.ts.map +1 -0
  243. package/dist/code-terminal.js +872 -0
  244. package/dist/collaboration-navigation-bar.cjs +49 -0
  245. package/dist/collaboration-navigation-bar.d.ts +11 -0
  246. package/dist/collaboration-navigation-bar.d.ts.map +1 -0
  247. package/dist/collaboration-navigation-bar.js +27 -0
  248. package/dist/collapsible.cjs +45 -170
  249. package/dist/collapsible.d.ts +11 -13
  250. package/dist/collapsible.d.ts.map +1 -0
  251. package/dist/collapsible.js +34 -159
  252. package/dist/color-mode.d.ts +7 -9
  253. package/dist/color-mode.d.ts.map +1 -0
  254. package/dist/color-picker.cjs +516 -0
  255. package/dist/color-picker.d.ts +10 -0
  256. package/dist/color-picker.d.ts.map +1 -0
  257. package/dist/color-picker.js +495 -0
  258. package/dist/combobox.cjs +488 -0
  259. package/dist/combobox.d.ts +13 -0
  260. package/dist/combobox.d.ts.map +1 -0
  261. package/dist/combobox.js +466 -0
  262. package/dist/communication-navigation-bar.cjs +438 -0
  263. package/dist/communication-navigation-bar.d.ts +7 -0
  264. package/dist/communication-navigation-bar.d.ts.map +1 -0
  265. package/dist/communication-navigation-bar.js +416 -0
  266. package/dist/company-profile.cjs +46 -0
  267. package/dist/company-profile.d.ts +10 -0
  268. package/dist/company-profile.d.ts.map +1 -0
  269. package/dist/company-profile.js +44 -0
  270. package/dist/comparison.cjs +60 -0
  271. package/dist/comparison.d.ts +16 -0
  272. package/dist/comparison.d.ts.map +1 -0
  273. package/dist/comparison.js +38 -0
  274. package/dist/context-switcher-navigation-bar.cjs +51 -0
  275. package/dist/context-switcher-navigation-bar.d.ts +10 -0
  276. package/dist/context-switcher-navigation-bar.d.ts.map +1 -0
  277. package/dist/context-switcher-navigation-bar.js +29 -0
  278. package/dist/credit-card.cjs +77 -0
  279. package/dist/credit-card.d.ts +11 -0
  280. package/dist/credit-card.d.ts.map +1 -0
  281. package/dist/credit-card.js +55 -0
  282. package/dist/crypto-screener.cjs +43 -0
  283. package/dist/crypto-screener.d.ts +4 -0
  284. package/dist/crypto-screener.d.ts.map +1 -0
  285. package/dist/crypto-screener.js +41 -0
  286. package/dist/cursor.cjs +71 -0
  287. package/dist/cursor.d.ts +9 -0
  288. package/dist/cursor.d.ts.map +1 -0
  289. package/dist/cursor.js +49 -0
  290. package/dist/dashboard-navigation-bar.cjs +441 -0
  291. package/dist/dashboard-navigation-bar.d.ts +11 -0
  292. package/dist/dashboard-navigation-bar.d.ts.map +1 -0
  293. package/dist/dashboard-navigation-bar.js +419 -0
  294. package/dist/dialog-stack.cjs +460 -0
  295. package/dist/dialog-stack.d.ts +13 -0
  296. package/dist/dialog-stack.d.ts.map +1 -0
  297. package/dist/dialog-stack.js +438 -0
  298. package/dist/dialog.cjs +16 -19
  299. package/dist/dialog.d.ts +49 -53
  300. package/dist/dialog.d.ts.map +1 -0
  301. package/dist/dialog.js +12 -15
  302. package/dist/direction.cjs +26 -0
  303. package/dist/direction.d.ts +20 -0
  304. package/dist/direction.d.ts.map +1 -0
  305. package/dist/direction.js +23 -0
  306. package/dist/dock.cjs +8675 -0
  307. package/dist/dock.d.ts +20 -0
  308. package/dist/dock.d.ts.map +1 -0
  309. package/dist/dock.js +8653 -0
  310. package/dist/drawer.d.ts +33 -38
  311. package/dist/drawer.d.ts.map +1 -0
  312. package/dist/dropzone.cjs +116 -0
  313. package/dist/dropzone.d.ts +11 -0
  314. package/dist/dropzone.d.ts.map +1 -0
  315. package/dist/dropzone.js +94 -0
  316. package/dist/e-commerce-navigation-bar.cjs +442 -0
  317. package/dist/e-commerce-navigation-bar.d.ts +12 -0
  318. package/dist/e-commerce-navigation-bar.d.ts.map +1 -0
  319. package/dist/e-commerce-navigation-bar.js +420 -0
  320. package/dist/editor.cjs +497 -0
  321. package/dist/editor.d.ts +9 -0
  322. package/dist/editor.d.ts.map +1 -0
  323. package/dist/editor.js +475 -0
  324. package/dist/empty-state.d.ts +4 -6
  325. package/dist/empty-state.d.ts.map +1 -0
  326. package/dist/empty.cjs +117 -0
  327. package/dist/empty.d.ts +18 -0
  328. package/dist/empty.d.ts.map +1 -0
  329. package/dist/empty.js +110 -0
  330. package/dist/engine.cjs +91 -0
  331. package/dist/engine.d.ts +35 -0
  332. package/dist/engine.d.ts.map +1 -0
  333. package/dist/engine.js +86 -0
  334. package/dist/expiration-selector.d.ts +4 -6
  335. package/dist/expiration-selector.d.ts.map +1 -0
  336. package/dist/field.cjs +2 -1
  337. package/dist/field.d.ts +5 -7
  338. package/dist/field.d.ts.map +1 -0
  339. package/dist/field.js +3 -2
  340. package/dist/financials.cjs +66 -0
  341. package/dist/financials.d.ts +12 -0
  342. package/dist/financials.d.ts.map +1 -0
  343. package/dist/financials.js +64 -0
  344. package/dist/forex-screener.cjs +44 -0
  345. package/dist/forex-screener.d.ts +4 -0
  346. package/dist/forex-screener.d.ts.map +1 -0
  347. package/dist/forex-screener.js +42 -0
  348. package/dist/gantt.cjs +65 -0
  349. package/dist/gantt.d.ts +13 -0
  350. package/dist/gantt.d.ts.map +1 -0
  351. package/dist/gantt.js +43 -0
  352. package/dist/greeks-display.d.ts +3 -5
  353. package/dist/greeks-display.d.ts.map +1 -0
  354. package/dist/grid-pattern.cjs +327 -0
  355. package/dist/grid-pattern.d.ts +111 -0
  356. package/dist/grid-pattern.d.ts.map +1 -0
  357. package/dist/grid-pattern.js +304 -0
  358. package/dist/gui.d.ts +1 -1
  359. package/dist/gui.d.ts.map +1 -0
  360. package/dist/heading.d.ts +4 -6
  361. package/dist/heading.d.ts.map +1 -0
  362. package/dist/hooks/use-mobile.d.ts +3 -0
  363. package/dist/hooks/use-mobile.d.ts.map +1 -0
  364. package/dist/iam.d.ts +10 -12
  365. package/dist/iam.d.ts.map +1 -0
  366. package/dist/icon-button.cjs +14 -147
  367. package/dist/icon-button.d.ts +4 -5
  368. package/dist/icon-button.d.ts.map +1 -0
  369. package/dist/icon-button.js +14 -147
  370. package/dist/icon-navigation-bar.cjs +48 -0
  371. package/dist/icon-navigation-bar.d.ts +11 -0
  372. package/dist/icon-navigation-bar.d.ts.map +1 -0
  373. package/dist/icon-navigation-bar.js +26 -0
  374. package/dist/icons.d.ts +1 -0
  375. package/dist/icons.d.ts.map +1 -0
  376. package/dist/identity.d.ts +9 -11
  377. package/dist/identity.d.ts.map +1 -0
  378. package/dist/image-crop.cjs +482 -0
  379. package/dist/image-crop.d.ts +9 -0
  380. package/dist/image-crop.d.ts.map +1 -0
  381. package/dist/image-crop.js +460 -0
  382. package/dist/image-zoom.cjs +77 -0
  383. package/dist/image-zoom.d.ts +7 -0
  384. package/dist/image-zoom.d.ts.map +1 -0
  385. package/dist/image-zoom.js +55 -0
  386. package/dist/image.cjs +17 -149
  387. package/dist/image.d.ts +10 -11
  388. package/dist/image.d.ts.map +1 -0
  389. package/dist/image.js +16 -148
  390. package/dist/index.cjs +30299 -1227
  391. package/dist/index.d.ts +207 -60
  392. package/dist/index.d.ts.map +1 -0
  393. package/dist/index.js +30009 -1226
  394. package/dist/ink.cjs +17 -0
  395. package/dist/ink.d.ts +14 -0
  396. package/dist/ink.d.ts.map +1 -0
  397. package/dist/ink.js +15 -0
  398. package/dist/input-group.d.ts +4 -6
  399. package/dist/input-group.d.ts.map +1 -0
  400. package/dist/input-otp.cjs +72 -0
  401. package/dist/input-otp.d.ts +35 -0
  402. package/dist/input-otp.d.ts.map +1 -0
  403. package/dist/input-otp.js +47 -0
  404. package/dist/input.d.ts +8 -9
  405. package/dist/input.d.ts.map +1 -0
  406. package/dist/iphone-15-pro.cjs +61 -0
  407. package/dist/iphone-15-pro.d.ts +9 -0
  408. package/dist/iphone-15-pro.d.ts.map +1 -0
  409. package/dist/iphone-15-pro.js +39 -0
  410. package/dist/item.cjs +215 -0
  411. package/dist/item.d.ts +41 -0
  412. package/dist/item.d.ts.map +1 -0
  413. package/dist/item.js +200 -0
  414. package/dist/kanban.cjs +1354 -0
  415. package/dist/kanban.d.ts +36 -0
  416. package/dist/kanban.d.ts.map +1 -0
  417. package/dist/kanban.js +1330 -0
  418. package/dist/kbd.cjs +40 -0
  419. package/dist/kbd.d.ts +4 -0
  420. package/dist/kbd.d.ts.map +1 -0
  421. package/dist/kbd.js +37 -0
  422. package/dist/limelight-nav-navigation-bar.cjs +51 -0
  423. package/dist/limelight-nav-navigation-bar.d.ts +10 -0
  424. package/dist/limelight-nav-navigation-bar.d.ts.map +1 -0
  425. package/dist/limelight-nav-navigation-bar.js +29 -0
  426. package/dist/limelight-nav.cjs +570 -0
  427. package/dist/limelight-nav.d.ts +10 -0
  428. package/dist/limelight-nav.d.ts.map +1 -0
  429. package/dist/limelight-nav.js +549 -0
  430. package/dist/link.cjs +41 -168
  431. package/dist/link.d.ts +9 -11
  432. package/dist/link.d.ts.map +1 -0
  433. package/dist/link.js +30 -157
  434. package/dist/list.cjs +35 -0
  435. package/dist/list.d.ts +5 -0
  436. package/dist/list.d.ts.map +1 -0
  437. package/dist/list.js +12 -0
  438. package/dist/lux.config.d.ts +521 -524
  439. package/dist/lux.config.d.ts.map +1 -0
  440. package/dist/magnetic.cjs +63 -0
  441. package/dist/magnetic.d.ts +8 -0
  442. package/dist/magnetic.d.ts.map +1 -0
  443. package/dist/magnetic.js +41 -0
  444. package/dist/market-overview.cjs +102 -0
  445. package/dist/market-overview.d.ts +4 -0
  446. package/dist/market-overview.d.ts.map +1 -0
  447. package/dist/market-overview.js +100 -0
  448. package/dist/marquee.cjs +67 -0
  449. package/dist/marquee.d.ts +10 -0
  450. package/dist/marquee.d.ts.map +1 -0
  451. package/dist/marquee.js +45 -0
  452. package/dist/menu-dock.cjs +64 -0
  453. package/dist/menu-dock.d.ts +14 -0
  454. package/dist/menu-dock.d.ts.map +1 -0
  455. package/dist/menu-dock.js +42 -0
  456. package/dist/menu.d.ts +30 -31
  457. package/dist/menu.d.ts.map +1 -0
  458. package/dist/menubar.cjs +116 -0
  459. package/dist/menubar.d.ts +30 -0
  460. package/dist/menubar.d.ts.map +1 -0
  461. package/dist/menubar.js +61 -0
  462. package/dist/message-dock.cjs +480 -0
  463. package/dist/message-dock.d.ts +15 -0
  464. package/dist/message-dock.d.ts.map +1 -0
  465. package/dist/message-dock.js +458 -0
  466. package/dist/mini-calendar.cjs +505 -0
  467. package/dist/mini-calendar.d.ts +10 -0
  468. package/dist/mini-calendar.d.ts.map +1 -0
  469. package/dist/mini-calendar.js +483 -0
  470. package/dist/minimal-tiptap.cjs +48 -0
  471. package/dist/minimal-tiptap.d.ts +8 -0
  472. package/dist/minimal-tiptap.d.ts.map +1 -0
  473. package/dist/minimal-tiptap.js +26 -0
  474. package/dist/motion-highlight.cjs +71 -0
  475. package/dist/motion-highlight.d.ts +7 -0
  476. package/dist/motion-highlight.d.ts.map +1 -0
  477. package/dist/motion-highlight.js +49 -0
  478. package/dist/music-player.cjs +810 -0
  479. package/dist/music-player.d.ts +18 -0
  480. package/dist/music-player.d.ts.map +1 -0
  481. package/dist/music-player.js +788 -0
  482. package/dist/native-select.cjs +82 -0
  483. package/dist/native-select.d.ts +9 -0
  484. package/dist/native-select.d.ts.map +1 -0
  485. package/dist/native-select.js +58 -0
  486. package/dist/news-timeline.cjs +42 -0
  487. package/dist/news-timeline.d.ts +4 -0
  488. package/dist/news-timeline.d.ts.map +1 -0
  489. package/dist/news-timeline.js +40 -0
  490. package/dist/next.d.ts +5 -7
  491. package/dist/next.d.ts.map +1 -0
  492. package/dist/option-chain.d.ts +6 -8
  493. package/dist/option-chain.d.ts.map +1 -0
  494. package/dist/option-position.d.ts +4 -6
  495. package/dist/option-position.d.ts.map +1 -0
  496. package/dist/order-entry.cjs +141 -0
  497. package/dist/order-entry.d.ts +15 -0
  498. package/dist/order-entry.d.ts.map +1 -0
  499. package/dist/order-entry.js +136 -0
  500. package/dist/orders-history.cjs +83 -0
  501. package/dist/orders-history.d.ts +18 -0
  502. package/dist/orders-history.d.ts.map +1 -0
  503. package/dist/orders-history.js +78 -0
  504. package/dist/pagination.cjs +132 -0
  505. package/dist/pagination.d.ts +29 -0
  506. package/dist/pagination.d.ts.map +1 -0
  507. package/dist/pagination.js +104 -0
  508. package/dist/particles-background.cjs +159 -0
  509. package/dist/particles-background.d.ts +18 -0
  510. package/dist/particles-background.d.ts.map +1 -0
  511. package/dist/particles-background.js +157 -0
  512. package/dist/pill.cjs +80 -0
  513. package/dist/pill.d.ts +21 -0
  514. package/dist/pill.d.ts.map +1 -0
  515. package/dist/pill.js +57 -0
  516. package/dist/pin-input.cjs +1 -1
  517. package/dist/pin-input.d.ts +3 -5
  518. package/dist/pin-input.d.ts.map +1 -0
  519. package/dist/pin-input.js +1 -1
  520. package/dist/pixel-image.cjs +71 -0
  521. package/dist/pixel-image.d.ts +8 -0
  522. package/dist/pixel-image.d.ts.map +1 -0
  523. package/dist/pixel-image.js +49 -0
  524. package/dist/pnl-diagram.d.ts +5 -6
  525. package/dist/pnl-diagram.d.ts.map +1 -0
  526. package/dist/popover.cjs +16 -18
  527. package/dist/popover.d.ts +24 -25
  528. package/dist/popover.d.ts.map +1 -0
  529. package/dist/popover.js +11 -13
  530. package/dist/positions-list.cjs +98 -0
  531. package/dist/positions-list.d.ts +13 -0
  532. package/dist/positions-list.d.ts.map +1 -0
  533. package/dist/positions-list.js +93 -0
  534. package/dist/progress-circle.cjs +3 -6
  535. package/dist/progress-circle.d.ts +8 -9
  536. package/dist/progress-circle.d.ts.map +1 -0
  537. package/dist/progress-circle.js +2 -5
  538. package/dist/progress.d.ts +3 -4
  539. package/dist/progress.d.ts.map +1 -0
  540. package/dist/provider.d.ts +8 -10
  541. package/dist/provider.d.ts.map +1 -0
  542. package/dist/pulse-animation.cjs +8741 -0
  543. package/dist/pulse-animation.d.ts +155 -0
  544. package/dist/pulse-animation.d.ts.map +1 -0
  545. package/dist/pulse-animation.js +8732 -0
  546. package/dist/qr-code.cjs +65 -0
  547. package/dist/qr-code.d.ts +21 -0
  548. package/dist/qr-code.d.ts.map +1 -0
  549. package/dist/qr-code.js +43 -0
  550. package/dist/radio.d.ts +6 -7
  551. package/dist/radio.d.ts.map +1 -0
  552. package/dist/rating.d.ts +3 -5
  553. package/dist/rating.d.ts.map +1 -0
  554. package/dist/relative-time.cjs +88 -0
  555. package/dist/relative-time.d.ts +9 -0
  556. package/dist/relative-time.d.ts.map +1 -0
  557. package/dist/relative-time.js +66 -0
  558. package/dist/resizable.cjs +61 -0
  559. package/dist/resizable.d.ts +24 -0
  560. package/dist/resizable.d.ts.map +1 -0
  561. package/dist/resizable.js +37 -0
  562. package/dist/reveal-animation.cjs +8791 -0
  563. package/dist/reveal-animation.d.ts +134 -0
  564. package/dist/reveal-animation.d.ts.map +1 -0
  565. package/dist/reveal-animation.js +8779 -0
  566. package/dist/safari.cjs +90 -0
  567. package/dist/safari.d.ts +9 -0
  568. package/dist/safari.d.ts.map +1 -0
  569. package/dist/safari.js +68 -0
  570. package/dist/sandbox.cjs +94 -0
  571. package/dist/sandbox.d.ts +9 -0
  572. package/dist/sandbox.d.ts.map +1 -0
  573. package/dist/sandbox.js +72 -0
  574. package/dist/search-and-toggle-navigation-bar.cjs +51 -0
  575. package/dist/search-and-toggle-navigation-bar.d.ts +10 -0
  576. package/dist/search-and-toggle-navigation-bar.d.ts.map +1 -0
  577. package/dist/search-and-toggle-navigation-bar.js +29 -0
  578. package/dist/select.cjs +38 -168
  579. package/dist/select.d.ts +38 -41
  580. package/dist/select.d.ts.map +1 -0
  581. package/dist/select.js +34 -164
  582. package/dist/separator.d.ts +5 -6
  583. package/dist/separator.d.ts.map +1 -0
  584. package/dist/sidebar.cjs +1134 -0
  585. package/dist/sidebar.d.ts +80 -0
  586. package/dist/sidebar.d.ts.map +1 -0
  587. package/dist/sidebar.js +1090 -0
  588. package/dist/simple-navigation-bar.cjs +45 -0
  589. package/dist/simple-navigation-bar.d.ts +11 -0
  590. package/dist/simple-navigation-bar.d.ts.map +1 -0
  591. package/dist/simple-navigation-bar.js +23 -0
  592. package/dist/skeleton.cjs +15 -148
  593. package/dist/skeleton.d.ts +11 -53
  594. package/dist/skeleton.d.ts.map +1 -0
  595. package/dist/skeleton.js +15 -148
  596. package/dist/slider.cjs +1 -1
  597. package/dist/slider.d.ts +4 -5
  598. package/dist/slider.d.ts.map +1 -0
  599. package/dist/slider.js +1 -1
  600. package/dist/status-dashboard-navigation-bar.cjs +51 -0
  601. package/dist/status-dashboard-navigation-bar.d.ts +10 -0
  602. package/dist/status-dashboard-navigation-bar.d.ts.map +1 -0
  603. package/dist/status-dashboard-navigation-bar.js +29 -0
  604. package/dist/status.cjs +85 -0
  605. package/dist/status.d.ts +23 -0
  606. package/dist/status.d.ts.map +1 -0
  607. package/dist/status.js +62 -0
  608. package/dist/stock-screener.cjs +44 -0
  609. package/dist/stock-screener.d.ts +4 -0
  610. package/dist/stock-screener.d.ts.map +1 -0
  611. package/dist/stock-screener.js +42 -0
  612. package/dist/strategy-builder.d.ts +6 -8
  613. package/dist/strategy-builder.d.ts.map +1 -0
  614. package/dist/switch.cjs +2 -2
  615. package/dist/switch.d.ts +4 -8
  616. package/dist/switch.d.ts.map +1 -0
  617. package/dist/switch.js +2 -2
  618. package/dist/symbol-info.cjs +44 -0
  619. package/dist/symbol-info.d.ts +9 -0
  620. package/dist/symbol-info.d.ts.map +1 -0
  621. package/dist/symbol-info.js +42 -0
  622. package/dist/table.cjs +74 -192
  623. package/dist/table.d.ts +23 -25
  624. package/dist/table.d.ts.map +1 -0
  625. package/dist/table.js +53 -171
  626. package/dist/tabs.d.ts +12 -13
  627. package/dist/tabs.d.ts.map +1 -0
  628. package/dist/tag.cjs +14 -147
  629. package/dist/tag.d.ts +4 -5
  630. package/dist/tag.d.ts.map +1 -0
  631. package/dist/tag.js +14 -147
  632. package/dist/tags.cjs +385 -0
  633. package/dist/tags.d.ts +13 -0
  634. package/dist/tags.d.ts.map +1 -0
  635. package/dist/tags.js +364 -0
  636. package/dist/team-switcher-navigation-bar.cjs +51 -0
  637. package/dist/team-switcher-navigation-bar.d.ts +10 -0
  638. package/dist/team-switcher-navigation-bar.d.ts.map +1 -0
  639. package/dist/team-switcher-navigation-bar.js +29 -0
  640. package/dist/technical-analysis.cjs +69 -0
  641. package/dist/technical-analysis.d.ts +13 -0
  642. package/dist/technical-analysis.d.ts.map +1 -0
  643. package/dist/technical-analysis.js +67 -0
  644. package/dist/terminal.cjs +372 -0
  645. package/dist/terminal.d.ts +21 -0
  646. package/dist/terminal.d.ts.map +1 -0
  647. package/dist/terminal.js +350 -0
  648. package/dist/textarea.d.ts +5 -6
  649. package/dist/textarea.d.ts.map +1 -0
  650. package/dist/ticker-tape.cjs +54 -0
  651. package/dist/ticker-tape.d.ts +4 -0
  652. package/dist/ticker-tape.d.ts.map +1 -0
  653. package/dist/ticker-tape.js +52 -0
  654. package/dist/ticker.cjs +66 -0
  655. package/dist/ticker.d.ts +10 -0
  656. package/dist/ticker.d.ts.map +1 -0
  657. package/dist/ticker.js +44 -0
  658. package/dist/timeline.cjs +317 -0
  659. package/dist/timeline.d.ts +20 -0
  660. package/dist/timeline.d.ts.map +1 -0
  661. package/dist/timeline.js +295 -0
  662. package/dist/toaster.d.ts +4 -5
  663. package/dist/toaster.d.ts.map +1 -0
  664. package/dist/toggle.cjs +62 -0
  665. package/dist/toggle.d.ts +26 -0
  666. package/dist/toggle.d.ts.map +1 -0
  667. package/dist/toggle.js +57 -0
  668. package/dist/tooltip.d.ts +3 -5
  669. package/dist/tooltip.d.ts.map +1 -0
  670. package/dist/trading-panel.cjs +212 -0
  671. package/dist/trading-panel.d.ts +7 -0
  672. package/dist/trading-panel.d.ts.map +1 -0
  673. package/dist/trading-panel.js +207 -0
  674. package/dist/two-tier-navigation-bar.cjs +51 -0
  675. package/dist/two-tier-navigation-bar.d.ts +10 -0
  676. package/dist/two-tier-navigation-bar.d.ts.map +1 -0
  677. package/dist/two-tier-navigation-bar.js +29 -0
  678. package/dist/underline-navigation-bar.cjs +51 -0
  679. package/dist/underline-navigation-bar.d.ts +10 -0
  680. package/dist/underline-navigation-bar.d.ts.map +1 -0
  681. package/dist/underline-navigation-bar.js +29 -0
  682. package/dist/use-narrow.d.ts +6 -7
  683. package/dist/use-narrow.d.ts.map +1 -0
  684. package/dist/utils/cn.d.ts +2 -0
  685. package/dist/utils/cn.d.ts.map +1 -0
  686. package/dist/utils.cjs +6 -7
  687. package/dist/utils.d.ts +13 -5
  688. package/dist/utils.d.ts.map +1 -0
  689. package/dist/utils.js +1 -9
  690. package/dist/vite.d.ts +3 -3
  691. package/dist/vite.d.ts.map +1 -0
  692. package/dist/white-label.d.ts +12 -12
  693. package/dist/white-label.d.ts.map +1 -0
  694. package/dist/youtube-pip-player.cjs +489 -0
  695. package/dist/youtube-pip-player.d.ts +41 -0
  696. package/dist/youtube-pip-player.d.ts.map +1 -0
  697. package/dist/youtube-pip-player.js +466 -0
  698. package/package.json +769 -66
  699. package/src/3d-button.tsx +346 -0
  700. package/src/3d-card.tsx +271 -0
  701. package/src/3d-carousel.tsx +444 -0
  702. package/src/3d-grid.tsx +448 -0
  703. package/src/3d-marquee.tsx +422 -0
  704. package/src/3d-model-viewer.tsx +659 -0
  705. package/src/3d-pin.tsx +37 -0
  706. package/src/3d-scene.tsx +629 -0
  707. package/src/3d-text.tsx +442 -0
  708. package/src/advanced-chart.tsx +63 -0
  709. package/src/advanced-navigation-bar.tsx +83 -0
  710. package/src/ai-actions.tsx +60 -0
  711. package/src/ai-agents.tsx +1174 -0
  712. package/src/ai-assistant.tsx +227 -0
  713. package/src/ai-chat.tsx +554 -0
  714. package/src/ai-code.tsx +1331 -0
  715. package/src/ai-model-selector-navigation-bar.tsx +78 -0
  716. package/src/ai-models.tsx +58 -0
  717. package/src/ai-playground.tsx +429 -0
  718. package/src/ai-tools.tsx +383 -0
  719. package/src/ai-vision.tsx +1220 -0
  720. package/src/ai-voice-settings.tsx +726 -0
  721. package/src/ai-voice.tsx +735 -0
  722. package/src/android.tsx +92 -0
  723. package/src/animated-background.tsx +625 -0
  724. package/src/animated-beam.tsx +110 -0
  725. package/src/animated-cursor.tsx +406 -0
  726. package/src/animated-icon.tsx +520 -0
  727. package/src/animated-list.tsx +508 -0
  728. package/src/animated-number.tsx +485 -0
  729. package/src/animated-testimonials.tsx +119 -0
  730. package/src/animated-text.tsx +481 -0
  731. package/src/animated-tooltip.tsx +54 -0
  732. package/src/announcement.tsx +55 -0
  733. package/src/app-switcher-navigation-bar.tsx +76 -0
  734. package/src/apple-cards-carousel.tsx +349 -0
  735. package/src/apple-hello-effect.tsx +50 -0
  736. package/src/auth.tsx +9 -8
  737. package/src/avatar.tsx +1 -1
  738. package/src/badge.tsx +27 -30
  739. package/src/banner.tsx +62 -0
  740. package/src/breadcrumb-and-filters-navigation-bar.tsx +40 -0
  741. package/src/breadcrumb-navigation-bar.tsx +43 -0
  742. package/src/button.tsx +10 -9
  743. package/src/calendar.tsx +62 -0
  744. package/src/centered-logo-navigation-bar.tsx +43 -0
  745. package/src/chart.tsx +372 -0
  746. package/src/choicebox.tsx +89 -0
  747. package/src/chrome.tsx +41 -40
  748. package/src/code-block.tsx +278 -0
  749. package/src/code-compare.tsx +551 -0
  750. package/src/code-diff.tsx +573 -0
  751. package/src/code-editor.tsx +250 -0
  752. package/src/code-explorer.tsx +403 -0
  753. package/src/code-preview.tsx +488 -0
  754. package/src/code-snippet.tsx +336 -0
  755. package/src/code-tabs.tsx +78 -0
  756. package/src/code-terminal.tsx +530 -0
  757. package/src/collaboration-navigation-bar.tsx +50 -0
  758. package/src/collapsible.tsx +3 -2
  759. package/src/color-picker.tsx +68 -0
  760. package/src/combobox.tsx +87 -0
  761. package/src/communication-navigation-bar.tsx +42 -0
  762. package/src/company-profile.tsx +67 -0
  763. package/src/comparison.tsx +68 -0
  764. package/src/context-switcher-navigation-bar.tsx +39 -0
  765. package/src/credit-card.tsx +72 -0
  766. package/src/crypto-screener.tsx +57 -0
  767. package/src/cursor.tsx +61 -0
  768. package/src/dashboard-navigation-bar.tsx +49 -0
  769. package/src/dialog-stack.tsx +55 -0
  770. package/src/dialog.tsx +16 -15
  771. package/src/direction.tsx +40 -0
  772. package/src/dock.tsx +172 -0
  773. package/src/dropzone.tsx +106 -0
  774. package/src/e-commerce-navigation-bar.tsx +54 -0
  775. package/src/editor.tsx +85 -0
  776. package/src/empty.tsx +117 -0
  777. package/src/field.tsx +2 -1
  778. package/src/financials.tsx +85 -0
  779. package/src/forex-screener.tsx +58 -0
  780. package/src/gantt.tsx +68 -0
  781. package/src/grid-pattern.tsx +353 -0
  782. package/src/hooks/use-mobile.ts +29 -0
  783. package/src/icon-navigation-bar.tsx +36 -0
  784. package/src/image-crop.tsx +67 -0
  785. package/src/image-zoom.tsx +64 -0
  786. package/src/image.tsx +2 -1
  787. package/src/index.ts +123 -0
  788. package/src/input-otp.tsx +72 -0
  789. package/src/iphone-15-pro.tsx +69 -0
  790. package/src/item.tsx +193 -0
  791. package/src/kanban.tsx +772 -0
  792. package/src/kbd.tsx +32 -0
  793. package/src/limelight-nav-navigation-bar.tsx +39 -0
  794. package/src/limelight-nav.tsx +101 -0
  795. package/src/link.tsx +18 -18
  796. package/src/list.tsx +22 -0
  797. package/src/magnetic.tsx +54 -0
  798. package/src/market-overview.tsx +116 -0
  799. package/src/marquee.tsx +62 -0
  800. package/src/menu-dock.tsx +56 -0
  801. package/src/menubar.tsx +149 -0
  802. package/src/message-dock.tsx +89 -0
  803. package/src/mini-calendar.tsx +121 -0
  804. package/src/minimal-tiptap.tsx +32 -0
  805. package/src/motion-highlight.tsx +55 -0
  806. package/src/music-player.tsx +413 -0
  807. package/src/native-select.tsx +63 -0
  808. package/src/news-timeline.tsx +56 -0
  809. package/src/order-entry.tsx +162 -0
  810. package/src/orders-history.tsx +115 -0
  811. package/src/pagination.tsx +118 -0
  812. package/src/particles-background.tsx +225 -0
  813. package/src/pill.tsx +61 -0
  814. package/src/pin-input.tsx +1 -1
  815. package/src/pixel-image.tsx +64 -0
  816. package/src/popover.tsx +10 -9
  817. package/src/positions-list.tsx +108 -0
  818. package/src/progress-circle.tsx +2 -1
  819. package/src/pulse-animation.tsx +606 -0
  820. package/src/qr-code.tsx +64 -0
  821. package/src/relative-time.tsx +84 -0
  822. package/src/resizable.tsx +46 -0
  823. package/src/reveal-animation.tsx +532 -0
  824. package/src/safari.tsx +115 -0
  825. package/src/sandbox.tsx +83 -0
  826. package/src/search-and-toggle-navigation-bar.tsx +39 -0
  827. package/src/select.tsx +31 -30
  828. package/src/sidebar.tsx +723 -0
  829. package/src/simple-navigation-bar.tsx +39 -0
  830. package/src/skeleton.tsx +20 -168
  831. package/src/slider.tsx +2 -1
  832. package/src/status-dashboard-navigation-bar.tsx +39 -0
  833. package/src/status.tsx +63 -0
  834. package/src/stock-screener.tsx +58 -0
  835. package/src/switch.tsx +3 -3
  836. package/src/symbol-info.tsx +64 -0
  837. package/src/table.tsx +26 -25
  838. package/src/tags.tsx +62 -0
  839. package/src/team-switcher-navigation-bar.tsx +39 -0
  840. package/src/technical-analysis.tsx +99 -0
  841. package/src/terminal.tsx +399 -0
  842. package/src/ticker-tape.tsx +68 -0
  843. package/src/ticker.tsx +52 -0
  844. package/src/timeline.tsx +412 -0
  845. package/src/toggle.tsx +84 -0
  846. package/src/trading-panel.tsx +262 -0
  847. package/src/two-tier-navigation-bar.tsx +39 -0
  848. package/src/underline-navigation-bar.tsx +39 -0
  849. package/src/utils/cn.ts +3 -7
  850. package/src/utils.ts +12 -6
  851. package/src/youtube-pip-player.tsx +606 -0
  852. package/tokens.css +22 -0
  853. package/dist/accordion.d.cts +0 -41
  854. package/dist/alert.d.cts +0 -30
  855. package/dist/auth.d.cts +0 -80
  856. package/dist/avatar.d.cts +0 -25
  857. package/dist/badge.d.cts +0 -19
  858. package/dist/bank.d.cts +0 -83
  859. package/dist/button.d.cts +0 -51
  860. package/dist/checkbox.d.cts +0 -32
  861. package/dist/chrome.d.cts +0 -93
  862. package/dist/close-button.d.cts +0 -9
  863. package/dist/collapsible.d.cts +0 -24
  864. package/dist/color-mode.d.cts +0 -25
  865. package/dist/dialog.d.cts +0 -118
  866. package/dist/drawer.d.cts +0 -69
  867. package/dist/empty-state.d.cts +0 -13
  868. package/dist/expiration-selector.d.cts +0 -16
  869. package/dist/field.d.cts +0 -23
  870. package/dist/greeks-display.d.cts +0 -14
  871. package/dist/gui.d.cts +0 -2
  872. package/dist/heading.d.cts +0 -8
  873. package/dist/iam.d.cts +0 -65
  874. package/dist/icon-button.d.cts +0 -37
  875. package/dist/icons.d.cts +0 -1
  876. package/dist/identity.d.cts +0 -64
  877. package/dist/image.d.cts +0 -57
  878. package/dist/index.d.cts +0 -60
  879. package/dist/input-group.d.cts +0 -17
  880. package/dist/input.d.cts +0 -37
  881. package/dist/link.d.cts +0 -37
  882. package/dist/lux.config.d.cts +0 -981
  883. package/dist/menu.d.cts +0 -68
  884. package/dist/next.d.cts +0 -32
  885. package/dist/option-chain.d.cts +0 -37
  886. package/dist/option-position.d.cts +0 -29
  887. package/dist/pin-input.d.cts +0 -25
  888. package/dist/pnl-diagram.d.cts +0 -11
  889. package/dist/popover.d.cts +0 -73
  890. package/dist/progress-circle.d.cts +0 -47
  891. package/dist/progress.d.cts +0 -28
  892. package/dist/provider.d.cts +0 -25
  893. package/dist/radio.d.cts +0 -53
  894. package/dist/rating.d.cts +0 -14
  895. package/dist/select.d.cts +0 -161
  896. package/dist/separator.d.cts +0 -13
  897. package/dist/skeleton.d.cts +0 -76
  898. package/dist/slider.d.cts +0 -24
  899. package/dist/strategy-builder.d.cts +0 -26
  900. package/dist/switch.d.cts +0 -27
  901. package/dist/table.d.cts +0 -107
  902. package/dist/tabs.d.cts +0 -34
  903. package/dist/tag.d.cts +0 -21
  904. package/dist/textarea.d.cts +0 -13
  905. package/dist/toaster.d.cts +0 -28
  906. package/dist/tooltip.d.cts +0 -38
  907. package/dist/use-narrow.d.cts +0 -12
  908. package/dist/utils.d.cts +0 -5
  909. package/dist/vite.d.cts +0 -29
  910. package/dist/white-label.d.cts +0 -59
@@ -0,0 +1,1220 @@
1
+ "use client"
2
+
3
+ import { variants } from '@hanzo/ui'
4
+ import * as React from "react"
5
+ import {
6
+ BarChart3,
7
+ Camera,
8
+ Copy,
9
+ Download,
10
+ Eye,
11
+ FileText,
12
+ Link,
13
+ Loader2,
14
+ Move,
15
+ Palette,
16
+ RotateCw,
17
+ Smile,
18
+ Square,
19
+ Tag,
20
+ Target,
21
+ Type,
22
+ Upload,
23
+ X,
24
+ ZoomIn,
25
+ ZoomOut,
26
+ } from "lucide-react"
27
+ import { toast } from "sonner"
28
+
29
+ import { cn } from "./utils"
30
+ import { Badge } from "./badge"
31
+ import { Button } from "./button"
32
+ import { Box, Card, CardContent, CardDescription, CardHeader, CardTitle, css, sx } from '@hanzo/ui'
33
+ import {
34
+ DropdownMenu,
35
+ DropdownMenuContent,
36
+ DropdownMenuItem,
37
+ DropdownMenuSeparator,
38
+ DropdownMenuTrigger,
39
+ } from "@hanzo/ui"
40
+ import { Input } from "./input"
41
+ import { Label } from "@hanzo/ui"
42
+ import { ScrollArea } from "@hanzo/ui"
43
+ import { Separator } from "./separator"
44
+ import { Slider } from "./slider"
45
+ import { Switch } from "./switch"
46
+ import {
47
+ Tabs,
48
+ TabsContent,
49
+ TabsList,
50
+ TabsTrigger,
51
+ } from "@hanzo/ui"
52
+ import { Textarea } from "./textarea"
53
+
54
+ // Types
55
+ export type VisionCapability =
56
+ | "object-detection"
57
+ | "scene-description"
58
+ | "ocr"
59
+ | "color-analysis"
60
+ | "tagging"
61
+ | "face-detection"
62
+ | "sentiment-analysis"
63
+ | "image-generation"
64
+ | "image-editing"
65
+
66
+ export interface BoundingBox {
67
+ x: number
68
+ y: number
69
+ width: number
70
+ height: number
71
+ confidence: number
72
+ label: string
73
+ color?: string
74
+ }
75
+
76
+ export interface DetectedText {
77
+ text: string
78
+ confidence: number
79
+ boundingBox: BoundingBox
80
+ }
81
+
82
+ export interface ColorPalette {
83
+ color: string
84
+ percentage: number
85
+ name?: string
86
+ }
87
+
88
+ export interface FaceDetection {
89
+ boundingBox: BoundingBox
90
+ confidence: number
91
+ age?: number
92
+ gender?: string
93
+ emotion?: string
94
+ landmarks?: { x: number; y: number }[]
95
+ }
96
+
97
+ export interface VisionResults {
98
+ objects?: BoundingBox[]
99
+ description?: string
100
+ text?: DetectedText[]
101
+ colors?: ColorPalette[]
102
+ tags?: { label: string; confidence: number }[]
103
+ faces?: FaceDetection[]
104
+ sentiment?: {
105
+ emotion: string
106
+ confidence: number
107
+ valence: number
108
+ arousal: number
109
+ }
110
+ metadata?: {
111
+ width: number
112
+ height: number
113
+ format: string
114
+ size: number
115
+ exif?: Record<string, any>
116
+ }
117
+ }
118
+
119
+ export interface AIVisionProps extends React.HTMLAttributes<HTMLDivElement> {
120
+ onAnalysis?: (results: VisionResults) => void
121
+ capabilities?: VisionCapability[]
122
+ maxFileSize?: number
123
+ acceptedFormats?: string[]
124
+ apiEndpoint?: string
125
+ apiKey?: string
126
+ defaultImage?: string
127
+ enableCamera?: boolean
128
+ enableUrl?: boolean
129
+ enableGeneration?: boolean
130
+ enableEditing?: boolean
131
+ showConfidence?: boolean
132
+ minConfidence?: number
133
+ }
134
+
135
+ // Canvas overlay component for visualizations
136
+ interface CanvasOverlayProps {
137
+ imageRef: React.RefObject<HTMLImageElement | null>
138
+ results: VisionResults
139
+ showBoundingBoxes: boolean
140
+ showConfidence: boolean
141
+ minConfidence: number
142
+ selectedTypes: string[]
143
+ }
144
+
145
+ const CanvasOverlay: React.FC<CanvasOverlayProps> = ({
146
+ imageRef,
147
+ results,
148
+ showBoundingBoxes,
149
+ showConfidence,
150
+ minConfidence,
151
+ selectedTypes,
152
+ }) => {
153
+ const canvasRef = React.useRef<HTMLCanvasElement>(null)
154
+
155
+ React.useEffect(() => {
156
+ if (!canvasRef.current || !imageRef.current || !results) return
157
+
158
+ const canvas = canvasRef.current
159
+ const ctx = canvas.getContext("2d")
160
+ const image = imageRef.current
161
+
162
+ if (!ctx) return
163
+
164
+ // Set canvas size to match image
165
+ canvas.width = image.naturalWidth
166
+ canvas.height = image.naturalHeight
167
+
168
+ // Clear canvas
169
+ ctx.clearRect(0, 0, canvas.width, canvas.height)
170
+
171
+ // Draw bounding boxes
172
+ if (
173
+ showBoundingBoxes &&
174
+ results.objects &&
175
+ selectedTypes.includes("objects")
176
+ ) {
177
+ results.objects
178
+ .filter((obj) => obj.confidence >= minConfidence)
179
+ .forEach((obj) => {
180
+ ctx.strokeStyle = obj.color || "#3b82f6"
181
+ ctx.lineWidth = 3
182
+ ctx.strokeRect(obj.x, obj.y, obj.width, obj.height)
183
+
184
+ if (showConfidence) {
185
+ ctx.fillStyle = obj.color || "#3b82f6"
186
+ ctx.font = "14px Inter, sans-serif"
187
+ const text = `${obj.label} (${Math.round(obj.confidence * 100)}%)`
188
+ const textWidth = ctx.measureText(text).width
189
+
190
+ ctx.fillRect(obj.x, obj.y - 25, textWidth + 10, 25)
191
+ ctx.fillStyle = "white"
192
+ ctx.fillText(text, obj.x + 5, obj.y - 8)
193
+ }
194
+ })
195
+ }
196
+
197
+ // Draw text regions
198
+ if (showBoundingBoxes && results.text && selectedTypes.includes("text")) {
199
+ results.text
200
+ .filter((text) => text.confidence >= minConfidence)
201
+ .forEach((textItem) => {
202
+ ctx.strokeStyle = "#10b981"
203
+ ctx.lineWidth = 2
204
+ ctx.strokeRect(
205
+ textItem.boundingBox.x,
206
+ textItem.boundingBox.y,
207
+ textItem.boundingBox.width,
208
+ textItem.boundingBox.height
209
+ )
210
+
211
+ if (showConfidence) {
212
+ ctx.fillStyle = "#10b981"
213
+ ctx.font = "12px Inter, sans-serif"
214
+ const text = `OCR (${Math.round(textItem.confidence * 100)}%)`
215
+ ctx.fillRect(
216
+ textItem.boundingBox.x,
217
+ textItem.boundingBox.y - 20,
218
+ 80,
219
+ 20
220
+ )
221
+ ctx.fillStyle = "white"
222
+ ctx.fillText(
223
+ text,
224
+ textItem.boundingBox.x + 5,
225
+ textItem.boundingBox.y - 6
226
+ )
227
+ }
228
+ })
229
+ }
230
+
231
+ // Draw face detection
232
+ if (showBoundingBoxes && results.faces && selectedTypes.includes("faces")) {
233
+ results.faces
234
+ .filter((face) => face.confidence >= minConfidence)
235
+ .forEach((face) => {
236
+ ctx.strokeStyle = "#f59e0b"
237
+ ctx.lineWidth = 3
238
+ ctx.strokeRect(
239
+ face.boundingBox.x,
240
+ face.boundingBox.y,
241
+ face.boundingBox.width,
242
+ face.boundingBox.height
243
+ )
244
+
245
+ if (showConfidence) {
246
+ ctx.fillStyle = "#f59e0b"
247
+ ctx.font = "14px Inter, sans-serif"
248
+ const text = `Face (${Math.round(face.confidence * 100)}%)`
249
+ const textWidth = ctx.measureText(text).width
250
+
251
+ ctx.fillRect(
252
+ face.boundingBox.x,
253
+ face.boundingBox.y - 25,
254
+ textWidth + 10,
255
+ 25
256
+ )
257
+ ctx.fillStyle = "white"
258
+ ctx.fillText(text, face.boundingBox.x + 5, face.boundingBox.y - 8)
259
+ }
260
+
261
+ // Draw landmarks if available
262
+ if (face.landmarks) {
263
+ ctx.fillStyle = "#f59e0b"
264
+ face.landmarks.forEach((landmark) => {
265
+ ctx.beginPath()
266
+ ctx.arc(landmark.x, landmark.y, 2, 0, 2 * Math.PI)
267
+ ctx.fill()
268
+ })
269
+ }
270
+ })
271
+ }
272
+ }, [
273
+ imageRef,
274
+ results,
275
+ showBoundingBoxes,
276
+ showConfidence,
277
+ minConfidence,
278
+ selectedTypes,
279
+ ])
280
+
281
+ return (
282
+ <canvas
283
+ ref={canvasRef}
284
+ className="absolute inset-0 pointer-events-none"
285
+ style={{
286
+ width: imageRef.current?.offsetWidth || "100%",
287
+ height: imageRef.current?.offsetHeight || "100%",
288
+ }}
289
+ />
290
+ )
291
+ }
292
+
293
+ // Results panel component
294
+ interface ResultsPanelProps {
295
+ results: VisionResults | null
296
+ isAnalyzing: boolean
297
+ onExport: (format: "json" | "pdf") => void
298
+ }
299
+
300
+ const ResultsPanel: React.FC<ResultsPanelProps> = ({
301
+ results,
302
+ isAnalyzing,
303
+ onExport,
304
+ }) => {
305
+ const copyToClipboard = (text: string) => {
306
+ navigator.clipboard.writeText(text)
307
+ }
308
+
309
+ const exportResults = (format: "json" | "pdf") => {
310
+ if (!results) return
311
+ onExport(format)
312
+ }
313
+
314
+ if (isAnalyzing) {
315
+ return (
316
+ <Box className="flex items-center justify-center h-64">
317
+ <Box className="text-center">
318
+ <Loader2 style={css('h-8 w-8 animate-spin mx-auto mb-4')} />
319
+ <Box tag="p" className="text-sm text-muted-foreground">Analyzing image...</Box>
320
+ </Box>
321
+ </Box>
322
+ )
323
+ }
324
+
325
+ if (!results) {
326
+ return (
327
+ <Box className="flex items-center justify-center h-64">
328
+ <Box className="text-center">
329
+ <Eye style={css('h-8 w-8 mx-auto mb-4 text-muted-foreground')} />
330
+ <Box tag="p" className="text-sm text-muted-foreground">
331
+ Upload an image to see analysis results
332
+ </Box>
333
+ </Box>
334
+ </Box>
335
+ )
336
+ }
337
+
338
+ return (
339
+ <Box className="space-y-4">
340
+ {/* Export Controls */}
341
+ <Box className="flex items-center justify-between">
342
+ <Box tag="h3" className="text-lg font-semibold">Analysis Results</Box>
343
+ <DropdownMenu>
344
+ <DropdownMenuTrigger asChild>
345
+ <Button variant="outline" size="sm">
346
+ <Download style={css('h-4 w-4 mr-2')} />
347
+ Export
348
+ </Button>
349
+ </DropdownMenuTrigger>
350
+ <DropdownMenuContent>
351
+ <DropdownMenuItem onClick={() => exportResults("json")}>
352
+ <FileText style={css('h-4 w-4 mr-2')} />
353
+ Export as JSON
354
+ </DropdownMenuItem>
355
+ <DropdownMenuItem onClick={() => exportResults("pdf")}>
356
+ <FileText style={css('h-4 w-4 mr-2')} />
357
+ Export as PDF
358
+ </DropdownMenuItem>
359
+ </DropdownMenuContent>
360
+ </DropdownMenu>
361
+ </Box>
362
+
363
+ <Tabs defaultValue="overview" {...sx('w-full')}>
364
+ <TabsList {...sx('grid w-full grid-cols-4')}>
365
+ <TabsTrigger value="overview">Overview</TabsTrigger>
366
+ <TabsTrigger value="objects">Objects</TabsTrigger>
367
+ <TabsTrigger value="text">Text</TabsTrigger>
368
+ <TabsTrigger value="details">Details</TabsTrigger>
369
+ </TabsList>
370
+
371
+ <TabsContent value="overview" {...sx('space-y-4')}>
372
+ {/* Scene Description */}
373
+ {results.description && (
374
+ <Card>
375
+ <CardHeader {...sx('pb-3')}>
376
+ <CardTitle {...sx('text-sm flex items-center')}>
377
+ <Eye style={css('h-4 w-4 mr-2')} />
378
+ Scene Description
379
+ </CardTitle>
380
+ </CardHeader>
381
+ <CardContent>
382
+ <Box tag="p" className="text-sm">{results.description}</Box>
383
+ <Button
384
+ variant="ghost"
385
+ size="sm"
386
+ {...sx('mt-2 h-6 px-2')}
387
+ onClick={() => copyToClipboard(results.description!)}
388
+ >
389
+ <Copy style={css('h-3 w-3')} />
390
+ </Button>
391
+ </CardContent>
392
+ </Card>
393
+ )}
394
+
395
+ {/* Tags */}
396
+ {results.tags && results.tags.length > 0 && (
397
+ <Card>
398
+ <CardHeader {...sx('pb-3')}>
399
+ <CardTitle {...sx('text-sm flex items-center')}>
400
+ <Tag style={css('h-4 w-4 mr-2')} />
401
+ Tags
402
+ </CardTitle>
403
+ </CardHeader>
404
+ <CardContent>
405
+ <Box className="flex flex-wrap gap-2">
406
+ {results.tags.map((tag, index) => (
407
+ <Badge key={index} colorPalette="gray" {...sx('text-xs')}>
408
+ {tag.label} ({Math.round(tag.confidence * 100)}%)
409
+ </Badge>
410
+ ))}
411
+ </Box>
412
+ </CardContent>
413
+ </Card>
414
+ )}
415
+
416
+ {/* Sentiment */}
417
+ {results.sentiment && (
418
+ <Card>
419
+ <CardHeader {...sx('pb-3')}>
420
+ <CardTitle {...sx('text-sm flex items-center')}>
421
+ <Smile style={css('h-4 w-4 mr-2')} />
422
+ Sentiment Analysis
423
+ </CardTitle>
424
+ </CardHeader>
425
+ <CardContent>
426
+ <Box className="space-y-2">
427
+ <Box className="flex items-center justify-between">
428
+ <Box tag="span" className="text-sm">Emotion:</Box>
429
+ <Badge>{results.sentiment.emotion}</Badge>
430
+ </Box>
431
+ <Box className="flex items-center justify-between">
432
+ <Box tag="span" className="text-sm">Confidence:</Box>
433
+ <Box tag="span" className="text-sm">
434
+ {Math.round(results.sentiment.confidence * 100)}%
435
+ </Box>
436
+ </Box>
437
+ </Box>
438
+ </CardContent>
439
+ </Card>
440
+ )}
441
+ </TabsContent>
442
+
443
+ <TabsContent value="objects" {...sx('space-y-4')}>
444
+ {results.objects && results.objects.length > 0 ? (
445
+ <ScrollArea {...sx('h-64')}>
446
+ <Box className="space-y-2">
447
+ {results.objects.map((obj, index) => (
448
+ <Card key={index}>
449
+ <CardContent {...sx('p-3')}>
450
+ <Box className="flex items-center justify-between">
451
+ <Box className="flex items-center space-x-2">
452
+ <Box
453
+ className="w-3 h-3 rounded-sm"
454
+ style={{ backgroundColor: obj.color || "#3b82f6" }}
455
+ />
456
+ <Box tag="span" className="text-sm font-medium">
457
+ {obj.label}
458
+ </Box>
459
+ </Box>
460
+ <Badge variant="outline">
461
+ {Math.round(obj.confidence * 100)}%
462
+ </Badge>
463
+ </Box>
464
+ <Box className="text-xs text-muted-foreground mt-1">
465
+ Position: ({obj.x}, {obj.y}) Size: {obj.width}×
466
+ {obj.height}
467
+ </Box>
468
+ </CardContent>
469
+ </Card>
470
+ ))}
471
+ </Box>
472
+ </ScrollArea>
473
+ ) : (
474
+ <Box className="text-center py-8">
475
+ <Target style={css('h-8 w-8 mx-auto mb-2 text-muted-foreground')} />
476
+ <Box tag="p" className="text-sm text-muted-foreground">
477
+ No objects detected
478
+ </Box>
479
+ </Box>
480
+ )}
481
+ </TabsContent>
482
+
483
+ <TabsContent value="text" {...sx('space-y-4')}>
484
+ {results.text && results.text.length > 0 ? (
485
+ <ScrollArea {...sx('h-64')}>
486
+ <Box className="space-y-2">
487
+ {results.text.map((textItem, index) => (
488
+ <Card key={index}>
489
+ <CardContent {...sx('p-3')}>
490
+ <Box className="flex items-start justify-between">
491
+ <Box className="flex-1">
492
+ <Box tag="p" className="text-sm font-medium">{textItem.text}</Box>
493
+ <Box className="text-xs text-muted-foreground mt-1">
494
+ Confidence: {Math.round(textItem.confidence * 100)}%
495
+ </Box>
496
+ </Box>
497
+ <Button
498
+ variant="ghost"
499
+ size="sm"
500
+ {...sx('h-6 w-6 p-0')}
501
+ onClick={() => copyToClipboard(textItem.text)}
502
+ >
503
+ <Copy style={css('h-3 w-3')} />
504
+ </Button>
505
+ </Box>
506
+ </CardContent>
507
+ </Card>
508
+ ))}
509
+ </Box>
510
+ </ScrollArea>
511
+ ) : (
512
+ <Box className="text-center py-8">
513
+ <Type style={css('h-8 w-8 mx-auto mb-2 text-muted-foreground')} />
514
+ <Box tag="p" className="text-sm text-muted-foreground">No text detected</Box>
515
+ </Box>
516
+ )}
517
+ </TabsContent>
518
+
519
+ <TabsContent value="details" {...sx('space-y-4')}>
520
+ {/* Color Palette */}
521
+ {results.colors && results.colors.length > 0 && (
522
+ <Card>
523
+ <CardHeader {...sx('pb-3')}>
524
+ <CardTitle {...sx('text-sm flex items-center')}>
525
+ <Palette style={css('h-4 w-4 mr-2')} />
526
+ Color Palette
527
+ </CardTitle>
528
+ </CardHeader>
529
+ <CardContent>
530
+ <Box className="space-y-2">
531
+ {results.colors.map((color, index) => (
532
+ <Box key={index} className="flex items-center space-x-3">
533
+ <Box
534
+ className="w-6 h-6 rounded border"
535
+ style={{ backgroundColor: color.color }}
536
+ />
537
+ <Box className="flex-1">
538
+ <Box className="text-sm font-medium">{color.color}</Box>
539
+ {color.name && (
540
+ <Box className="text-xs text-muted-foreground">
541
+ {color.name}
542
+ </Box>
543
+ )}
544
+ </Box>
545
+ <Box className="text-sm">
546
+ {color.percentage.toFixed(1)}%
547
+ </Box>
548
+ </Box>
549
+ ))}
550
+ </Box>
551
+ </CardContent>
552
+ </Card>
553
+ )}
554
+
555
+ {/* Face Detection */}
556
+ {results.faces && results.faces.length > 0 && (
557
+ <Card>
558
+ <CardHeader {...sx('pb-3')}>
559
+ <CardTitle {...sx('text-sm flex items-center')}>
560
+ <Smile style={css('h-4 w-4 mr-2')} />
561
+ Face Detection
562
+ </CardTitle>
563
+ </CardHeader>
564
+ <CardContent>
565
+ <Box className="space-y-3">
566
+ {results.faces.map((face, index) => (
567
+ <Box key={index} className="space-y-2">
568
+ <Box className="flex items-center justify-between">
569
+ <Box tag="span" className="text-sm font-medium">
570
+ Face {index + 1}
571
+ </Box>
572
+ <Badge variant="outline">
573
+ {Math.round(face.confidence * 100)}%
574
+ </Badge>
575
+ </Box>
576
+ {face.age && (
577
+ <Box className="text-sm">
578
+ <Box tag="span" className="text-muted-foreground">Age:</Box> ~
579
+ {face.age}
580
+ </Box>
581
+ )}
582
+ {face.gender && (
583
+ <Box className="text-sm">
584
+ <Box tag="span" className="text-muted-foreground">Gender:</Box>{" "}
585
+ {face.gender}
586
+ </Box>
587
+ )}
588
+ {face.emotion && (
589
+ <Box className="text-sm">
590
+ <Box tag="span" className="text-muted-foreground">
591
+ Emotion:
592
+ </Box>{" "}
593
+ {face.emotion}
594
+ </Box>
595
+ )}
596
+ </Box>
597
+ ))}
598
+ </Box>
599
+ </CardContent>
600
+ </Card>
601
+ )}
602
+
603
+ {/* Metadata */}
604
+ {results.metadata && (
605
+ <Card>
606
+ <CardHeader {...sx('pb-3')}>
607
+ <CardTitle {...sx('text-sm flex items-center')}>
608
+ <BarChart3 style={css('h-4 w-4 mr-2')} />
609
+ Image Metadata
610
+ </CardTitle>
611
+ </CardHeader>
612
+ <CardContent>
613
+ <Box className="space-y-2 text-sm">
614
+ <Box className="flex justify-between">
615
+ <Box tag="span" className="text-muted-foreground">Dimensions:</Box>
616
+ <span>
617
+ {results.metadata.width} × {results.metadata.height}
618
+ </span>
619
+ </Box>
620
+ <Box className="flex justify-between">
621
+ <Box tag="span" className="text-muted-foreground">Format:</Box>
622
+ <span>{results.metadata.format.toUpperCase()}</span>
623
+ </Box>
624
+ <Box className="flex justify-between">
625
+ <Box tag="span" className="text-muted-foreground">Size:</Box>
626
+ <span>
627
+ {(results.metadata.size / 1024 / 1024).toFixed(2)} MB
628
+ </span>
629
+ </Box>
630
+ </Box>
631
+ </CardContent>
632
+ </Card>
633
+ )}
634
+ </TabsContent>
635
+ </Tabs>
636
+ </Box>
637
+ )
638
+ }
639
+
640
+ // Main AI Vision component
641
+ const AIVision = React.forwardRef<HTMLDivElement, AIVisionProps>(
642
+ (
643
+ {
644
+ className,
645
+ onAnalysis,
646
+ capabilities = [
647
+ "object-detection",
648
+ "scene-description",
649
+ "ocr",
650
+ "color-analysis",
651
+ "tagging",
652
+ ],
653
+ maxFileSize = 10 * 1024 * 1024, // 10MB
654
+ acceptedFormats = ["image/jpeg", "image/png", "image/webp", "image/gif"],
655
+ apiEndpoint = "/api/vision",
656
+ apiKey,
657
+ defaultImage,
658
+ enableCamera = true,
659
+ enableUrl = true,
660
+ enableGeneration = false,
661
+ enableEditing = false,
662
+ showConfidence = true,
663
+ minConfidence = 0.5,
664
+ ...props
665
+ },
666
+ ref
667
+ ) => {
668
+ // State
669
+ const [currentImage, setCurrentImage] = React.useState<string | null>(
670
+ defaultImage || null
671
+ )
672
+ const [isAnalyzing, setIsAnalyzing] = React.useState(false)
673
+ const [results, setResults] = React.useState<VisionResults | null>(null)
674
+ const [isDragging, setIsDragging] = React.useState(false)
675
+ const [urlInput, setUrlInput] = React.useState("")
676
+ const [showBoundingBoxes, setShowBoundingBoxes] = React.useState(true)
677
+ const [confidenceThreshold, setConfidenceThreshold] =
678
+ React.useState(minConfidence)
679
+ const [selectedTypes, setSelectedTypes] = React.useState<string[]>([
680
+ "objects",
681
+ "text",
682
+ "faces",
683
+ ])
684
+ const [generationPrompt, setGenerationPrompt] = React.useState("")
685
+ const [isGenerating, setIsGenerating] = React.useState(false)
686
+
687
+ // Refs
688
+ const fileInputRef = React.useRef<HTMLInputElement>(null)
689
+ const imageRef = React.useRef<HTMLImageElement>(null)
690
+ const videoRef = React.useRef<HTMLVideoElement>(null)
691
+ const [isCameraActive, setIsCameraActive] = React.useState(false)
692
+
693
+ // Mock analysis function - replace with actual API call
694
+ const analyzeImage = async (imageData: string): Promise<VisionResults> => {
695
+ setIsAnalyzing(true)
696
+
697
+ // Simulate API delay
698
+ await new Promise((resolve) => setTimeout(resolve, 2000))
699
+
700
+ // Mock results - replace with actual API call
701
+ const mockResults: VisionResults = {
702
+ objects: [
703
+ {
704
+ x: 100,
705
+ y: 150,
706
+ width: 200,
707
+ height: 150,
708
+ confidence: 0.95,
709
+ label: "Person",
710
+ color: "#3b82f6",
711
+ },
712
+ {
713
+ x: 350,
714
+ y: 200,
715
+ width: 120,
716
+ height: 80,
717
+ confidence: 0.87,
718
+ label: "Car",
719
+ color: "#ef4444",
720
+ },
721
+ ],
722
+ description:
723
+ "A street scene with a person walking next to a parked car. The image appears to be taken during daytime with good lighting conditions.",
724
+ text: [
725
+ {
726
+ text: "STOP",
727
+ confidence: 0.96,
728
+ boundingBox: {
729
+ x: 50,
730
+ y: 50,
731
+ width: 80,
732
+ height: 30,
733
+ confidence: 0.96,
734
+ label: "STOP",
735
+ },
736
+ },
737
+ ],
738
+ colors: [
739
+ { color: "#2563eb", percentage: 25.3, name: "Blue" },
740
+ { color: "#dc2626", percentage: 18.7, name: "Red" },
741
+ { color: "#16a34a", percentage: 15.2, name: "Green" },
742
+ { color: "#6b7280", percentage: 41.8, name: "Gray" },
743
+ ],
744
+ tags: [
745
+ { label: "outdoor", confidence: 0.98 },
746
+ { label: "street", confidence: 0.92 },
747
+ { label: "urban", confidence: 0.85 },
748
+ { label: "daytime", confidence: 0.89 },
749
+ ],
750
+ faces: [
751
+ {
752
+ boundingBox: {
753
+ x: 120,
754
+ y: 160,
755
+ width: 60,
756
+ height: 80,
757
+ confidence: 0.94,
758
+ label: "Face",
759
+ },
760
+ confidence: 0.94,
761
+ age: 35,
762
+ gender: "male",
763
+ emotion: "neutral",
764
+ },
765
+ ],
766
+ sentiment: {
767
+ emotion: "neutral",
768
+ confidence: 0.76,
769
+ valence: 0.2,
770
+ arousal: 0.1,
771
+ },
772
+ metadata: {
773
+ width: 800,
774
+ height: 600,
775
+ format: "jpeg",
776
+ size: 1024 * 500, // 500KB
777
+ },
778
+ }
779
+
780
+ setIsAnalyzing(false)
781
+ return mockResults
782
+ }
783
+
784
+ // Handle file upload
785
+ const handleFileUpload = async (files: FileList | null) => {
786
+ if (!files || files.length === 0) return
787
+
788
+ const file = files[0]
789
+
790
+ // Validate file
791
+ if (!acceptedFormats.includes(file.type)) {
792
+ toast.error("Unsupported file format", {
793
+ description: `Please use: ${acceptedFormats.join(", ")}`,
794
+ })
795
+ return
796
+ }
797
+
798
+ if (file.size > maxFileSize) {
799
+ toast.error("File too large", {
800
+ description: `Maximum size: ${maxFileSize / 1024 / 1024}MB`,
801
+ })
802
+ return
803
+ }
804
+
805
+ // Create image URL
806
+ const imageUrl = URL.createObjectURL(file)
807
+ setCurrentImage(imageUrl)
808
+
809
+ // Analyze image
810
+ try {
811
+ const results = await analyzeImage(imageUrl)
812
+ setResults(results)
813
+ onAnalysis?.(results)
814
+ } catch (error) {
815
+ console.error("Analysis failed:", error)
816
+ toast.error("Failed to analyze image", {
817
+ description: "Please try again",
818
+ action: {
819
+ label: "Retry",
820
+ onClick: () => handleFileUpload(files),
821
+ },
822
+ })
823
+ }
824
+ }
825
+
826
+ // Handle URL input
827
+ const handleUrlSubmit = async () => {
828
+ if (!urlInput.trim()) return
829
+
830
+ try {
831
+ // Validate URL
832
+ new URL(urlInput)
833
+ setCurrentImage(urlInput)
834
+
835
+ const results = await analyzeImage(urlInput)
836
+ setResults(results)
837
+ onAnalysis?.(results)
838
+ } catch (error) {
839
+ toast.error("Invalid URL or failed to load image", {
840
+ description: "Please check the URL and try again",
841
+ action: {
842
+ label: "Retry",
843
+ onClick: () => handleUrlSubmit(),
844
+ },
845
+ })
846
+ }
847
+ }
848
+
849
+ // Handle camera capture
850
+ const startCamera = async () => {
851
+ try {
852
+ const stream = await navigator.mediaDevices.getUserMedia({
853
+ video: { width: 640, height: 480 },
854
+ })
855
+ if (videoRef.current) {
856
+ videoRef.current.srcObject = stream
857
+ setIsCameraActive(true)
858
+ }
859
+ } catch (error) {
860
+ toast.error("Failed to access camera", {
861
+ description: "Please check camera permissions",
862
+ })
863
+ }
864
+ }
865
+
866
+ const capturePhoto = () => {
867
+ if (!videoRef.current) return
868
+
869
+ const canvas = document.createElement("canvas")
870
+ const video = videoRef.current
871
+ canvas.width = video.videoWidth
872
+ canvas.height = video.videoHeight
873
+
874
+ const ctx = canvas.getContext("2d")
875
+ ctx?.drawImage(video, 0, 0)
876
+
877
+ const imageData = canvas.toDataURL("image/jpeg")
878
+ setCurrentImage(imageData)
879
+
880
+ // Stop camera
881
+ const stream = video.srcObject as MediaStream
882
+ stream?.getTracks().forEach((track) => track.stop())
883
+ setIsCameraActive(false)
884
+
885
+ // Analyze captured image
886
+ analyzeImage(imageData).then((results) => {
887
+ setResults(results)
888
+ onAnalysis?.(results)
889
+ })
890
+ }
891
+
892
+ // Handle drag and drop
893
+ const handleDragOver = (e: React.DragEvent) => {
894
+ e.preventDefault()
895
+ setIsDragging(true)
896
+ }
897
+
898
+ const handleDragLeave = (e: React.DragEvent) => {
899
+ e.preventDefault()
900
+ setIsDragging(false)
901
+ }
902
+
903
+ const handleDrop = (e: React.DragEvent) => {
904
+ e.preventDefault()
905
+ setIsDragging(false)
906
+ handleFileUpload(e.dataTransfer.files)
907
+ }
908
+
909
+ // Generate image (mock function)
910
+ const generateImage = async () => {
911
+ if (!generationPrompt.trim()) return
912
+
913
+ setIsGenerating(true)
914
+ // Simulate generation delay
915
+ await new Promise((resolve) => setTimeout(resolve, 3000))
916
+
917
+ // Mock generated image URL
918
+ const generatedUrl = `https://picsum.photos/800/600?random=${Date.now()}`
919
+ setCurrentImage(generatedUrl)
920
+ setIsGenerating(false)
921
+
922
+ // Analyze generated image
923
+ const results = await analyzeImage(generatedUrl)
924
+ setResults(results)
925
+ onAnalysis?.(results)
926
+ }
927
+
928
+ // Export results
929
+ const exportResults = (format: "json" | "pdf") => {
930
+ if (!results) return
931
+
932
+ if (format === "json") {
933
+ const dataStr = JSON.stringify(results, null, 2)
934
+ const dataBlob = new Blob([dataStr], { type: "application/json" })
935
+ const url = URL.createObjectURL(dataBlob)
936
+ const link = document.createElement("a")
937
+ link.href = url
938
+ link.download = "vision-analysis.json"
939
+ link.click()
940
+ URL.revokeObjectURL(url)
941
+ toast.success("Analysis exported", {
942
+ description: "JSON file has been downloaded",
943
+ })
944
+ } else if (format === "pdf") {
945
+ // PDF export would require a library like jsPDF
946
+ toast.info("PDF export not available", {
947
+ description: "This feature is not implemented in the demo",
948
+ })
949
+ }
950
+ }
951
+
952
+ return (
953
+ <Box
954
+ ref={ref}
955
+ className={cn("flex flex-col h-full", className)}
956
+ {...props}
957
+ >
958
+ {/* Header */}
959
+ <Box className="border-b p-4">
960
+ <Box className="flex items-center justify-between">
961
+ <div>
962
+ <Box tag="h2" className="text-lg font-semibold">AI Vision</Box>
963
+ <Box tag="p" className="text-sm text-muted-foreground">
964
+ Analyze images with AI-powered computer vision
965
+ </Box>
966
+ </div>
967
+ <Box className="flex items-center space-x-2">
968
+ <Label htmlFor="bounding-boxes" {...sx('text-sm')}>
969
+ Show Overlays
970
+ </Label>
971
+ <Switch
972
+ id="bounding-boxes"
973
+ checked={showBoundingBoxes}
974
+ onCheckedChange={setShowBoundingBoxes}
975
+ />
976
+ </Box>
977
+ </Box>
978
+ </Box>
979
+
980
+ <Box className="flex flex-1 overflow-hidden">
981
+ {/* Main Content */}
982
+ <Box className="flex-1 flex flex-col">
983
+ {/* Input Methods */}
984
+ <Box className="border-b p-4">
985
+ <Tabs defaultValue="upload" {...sx('w-full')}>
986
+ <TabsList {...sx('grid w-full grid-cols-4')}>
987
+ <TabsTrigger value="upload">Upload</TabsTrigger>
988
+ {enableUrl && <TabsTrigger value="url">URL</TabsTrigger>}
989
+ {enableCamera && (
990
+ <TabsTrigger value="camera">Camera</TabsTrigger>
991
+ )}
992
+ {enableGeneration && (
993
+ <TabsTrigger value="generate">Generate</TabsTrigger>
994
+ )}
995
+ </TabsList>
996
+
997
+ <TabsContent value="upload" {...sx('mt-4')}>
998
+ <Box
999
+ className={cn(
1000
+ "border-2 border-dashed rounded-lg p-8 text-center transition-colors",
1001
+ isDragging
1002
+ ? "border-primary bg-primary/10"
1003
+ : "border-muted-foreground/25",
1004
+ "hover:border-primary/50"
1005
+ )}
1006
+ onDragOver={handleDragOver}
1007
+ onDragLeave={handleDragLeave}
1008
+ onDrop={handleDrop}
1009
+ onClick={() => fileInputRef.current?.click()}
1010
+ >
1011
+ <Upload style={css('h-10 w-10 mx-auto mb-4 text-muted-foreground')} />
1012
+ <Box tag="p" className="text-sm font-medium mb-2">
1013
+ Drop an image here or click to upload
1014
+ </Box>
1015
+ <Box tag="p" className="text-xs text-muted-foreground">
1016
+ Supports:{" "}
1017
+ {acceptedFormats.map((f) => f.split("/")[1]).join(", ")}
1018
+ (Max: {maxFileSize / 1024 / 1024}MB)
1019
+ </Box>
1020
+ <Box tag="input"
1021
+ ref={fileInputRef}
1022
+ type="file"
1023
+ accept={acceptedFormats.join(",")}
1024
+ onChange={(e) => handleFileUpload(e.target.files)}
1025
+ className="hidden"
1026
+ />
1027
+ </Box>
1028
+ </TabsContent>
1029
+
1030
+ {enableUrl && (
1031
+ <TabsContent value="url" {...sx('mt-4')}>
1032
+ <Box className="flex space-x-2">
1033
+ <Input
1034
+ placeholder="Enter image URL..."
1035
+ value={urlInput}
1036
+ onChange={(e) => setUrlInput(e.target.value)}
1037
+ onKeyDown={(e) =>
1038
+ e.key === "Enter" && handleUrlSubmit()
1039
+ }
1040
+ />
1041
+ <Button
1042
+ onClick={handleUrlSubmit}
1043
+ disabled={!urlInput.trim()}
1044
+ >
1045
+ <Link style={css('h-4 w-4')} />
1046
+ </Button>
1047
+ </Box>
1048
+ </TabsContent>
1049
+ )}
1050
+
1051
+ {enableCamera && (
1052
+ <TabsContent value="camera" {...sx('mt-4')}>
1053
+ <Box className="space-y-4">
1054
+ {!isCameraActive ? (
1055
+ <Button onClick={startCamera} {...sx('w-full')}>
1056
+ <Camera style={css('h-4 w-4 mr-2')} />
1057
+ Start Camera
1058
+ </Button>
1059
+ ) : (
1060
+ <Box className="space-y-2">
1061
+ <video
1062
+ ref={videoRef}
1063
+ autoPlay
1064
+ playsInline
1065
+ className="w-full rounded-lg border"
1066
+ />
1067
+ <Button onClick={capturePhoto} {...sx('w-full')}>
1068
+ Capture Photo
1069
+ </Button>
1070
+ </Box>
1071
+ )}
1072
+ </Box>
1073
+ </TabsContent>
1074
+ )}
1075
+
1076
+ {enableGeneration && (
1077
+ <TabsContent value="generate" {...sx('mt-4')}>
1078
+ <Box className="space-y-3">
1079
+ <Textarea
1080
+ placeholder="Describe the image you want to generate..."
1081
+ value={generationPrompt}
1082
+ onChange={(e) => setGenerationPrompt(e.target.value)}
1083
+ {...sx('min-h-20')}
1084
+ />
1085
+ <Button
1086
+ onClick={generateImage}
1087
+ disabled={!generationPrompt.trim() || isGenerating}
1088
+ {...sx('w-full')}
1089
+ >
1090
+ {isGenerating ? (
1091
+ <>
1092
+ <Loader2 style={css('h-4 w-4 mr-2 animate-spin')} />
1093
+ Generating...
1094
+ </>
1095
+ ) : (
1096
+ "Generate Image"
1097
+ )}
1098
+ </Button>
1099
+ </Box>
1100
+ </TabsContent>
1101
+ )}
1102
+ </Tabs>
1103
+ </Box>
1104
+
1105
+ {/* Image Display */}
1106
+ <Box className="flex-1 p-4">
1107
+ {currentImage ? (
1108
+ <Box className="relative h-full border rounded-lg overflow-hidden">
1109
+ <Box tag="img"
1110
+ ref={imageRef}
1111
+ src={currentImage}
1112
+ alt="Analysis target"
1113
+ className="w-full h-full object-contain"
1114
+ onLoad={() => {
1115
+ // Trigger canvas redraw when image loads
1116
+ if (results) {
1117
+ // Force re-render of canvas overlay
1118
+ setShowBoundingBoxes((prev) => !prev)
1119
+ setTimeout(() => setShowBoundingBoxes(true), 10)
1120
+ }
1121
+ }}
1122
+ />
1123
+ {results && showBoundingBoxes && (
1124
+ <CanvasOverlay
1125
+ imageRef={imageRef}
1126
+ results={results}
1127
+ showBoundingBoxes={showBoundingBoxes}
1128
+ showConfidence={showConfidence}
1129
+ minConfidence={confidenceThreshold}
1130
+ selectedTypes={selectedTypes}
1131
+ />
1132
+ )}
1133
+ </Box>
1134
+ ) : (
1135
+ <Box className="h-full border-2 border-dashed rounded-lg flex items-center justify-center">
1136
+ <Box className="text-center">
1137
+ <Eye style={css('h-12 w-12 mx-auto mb-4 text-muted-foreground')} />
1138
+ <Box tag="p" className="text-lg font-medium mb-2">
1139
+ No image selected
1140
+ </Box>
1141
+ <Box tag="p" className="text-sm text-muted-foreground">
1142
+ Upload an image to start analysis
1143
+ </Box>
1144
+ </Box>
1145
+ </Box>
1146
+ )}
1147
+ </Box>
1148
+ </Box>
1149
+
1150
+ {/* Results Sidebar */}
1151
+ <Box className="w-96 border-l flex flex-col">
1152
+ <Box className="p-4 border-b">
1153
+ <Box className="space-y-4">
1154
+ {/* Confidence Threshold */}
1155
+ <Box className="space-y-2">
1156
+ <Label {...sx('text-sm')}>
1157
+ Confidence Threshold:{" "}
1158
+ {Math.round(confidenceThreshold * 100)}%
1159
+ </Label>
1160
+ <Slider
1161
+ value={[confidenceThreshold]}
1162
+ onValueChange={([value]) => setConfidenceThreshold(value)}
1163
+ max={1}
1164
+ min={0}
1165
+ step={0.05}
1166
+ {...sx('w-full')}
1167
+ />
1168
+ </Box>
1169
+
1170
+ {/* Detection Types */}
1171
+ <Box className="space-y-2">
1172
+ <Label {...sx('text-sm')}>Show Detection Types</Label>
1173
+ <Box className="flex flex-wrap gap-2">
1174
+ {[
1175
+ { key: "objects", label: "Objects", icon: Target },
1176
+ { key: "text", label: "Text", icon: Type },
1177
+ { key: "faces", label: "Faces", icon: Smile },
1178
+ ].map(({ key, label, icon: Icon }) => (
1179
+ <Button
1180
+ key={key}
1181
+ variant={
1182
+ selectedTypes.includes(key) ? "default" : "outline"
1183
+ }
1184
+ size="sm"
1185
+ onClick={() => {
1186
+ setSelectedTypes((prev) =>
1187
+ prev.includes(key)
1188
+ ? prev.filter((t) => t !== key)
1189
+ : [...prev, key]
1190
+ )
1191
+ }}
1192
+ >
1193
+ <Icon style={css('h-3 w-3 mr-1')} />
1194
+ {label}
1195
+ </Button>
1196
+ ))}
1197
+ </Box>
1198
+ </Box>
1199
+ </Box>
1200
+ </Box>
1201
+
1202
+ <Box className="flex-1 overflow-hidden">
1203
+ <ScrollArea {...sx('h-full p-4')}>
1204
+ <ResultsPanel
1205
+ results={results}
1206
+ isAnalyzing={isAnalyzing}
1207
+ onExport={exportResults}
1208
+ />
1209
+ </ScrollArea>
1210
+ </Box>
1211
+ </Box>
1212
+ </Box>
1213
+ </Box>
1214
+ )
1215
+ }
1216
+ )
1217
+
1218
+ AIVision.displayName = "AIVision"
1219
+
1220
+ export { AIVision }