@nastechai-research/ui 0.18.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (352) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +21 -0
  3. package/dist/assets/filler-bg0.webp +0 -0
  4. package/dist/assets.d.ts +38 -0
  5. package/dist/fonts/Collapse-Bold.woff2 +0 -0
  6. package/dist/fonts/Collapse-BoldItalic.woff2 +0 -0
  7. package/dist/fonts/Collapse-Italic.woff2 +0 -0
  8. package/dist/fonts/Collapse-Light.woff2 +0 -0
  9. package/dist/fonts/Collapse-LightItalic.woff2 +0 -0
  10. package/dist/fonts/Collapse-Regular.woff2 +0 -0
  11. package/dist/fonts/Collapse-Thin.woff2 +0 -0
  12. package/dist/fonts/Collapse-ThinItalic.woff2 +0 -0
  13. package/dist/fonts/Mondwest-Regular.woff2 +0 -0
  14. package/dist/fonts/Neuebit-Bold.woff2 +0 -0
  15. package/dist/fonts/RulesCompressed-Medium.woff2 +0 -0
  16. package/dist/fonts/RulesCompressed-Regular.woff2 +0 -0
  17. package/dist/fonts/RulesExpanded-Bold.woff2 +0 -0
  18. package/dist/fonts/RulesExpanded-Regular.woff2 +0 -0
  19. package/dist/fonts.d.ts +6 -0
  20. package/dist/fonts.js +6 -0
  21. package/dist/hooks/use-below-breakpoint.d.ts +2 -0
  22. package/dist/hooks/use-below-breakpoint.js +17 -0
  23. package/dist/hooks/use-capped-frame.d.ts +2 -0
  24. package/dist/hooks/use-capped-frame.js +15 -0
  25. package/dist/hooks/use-confirm-delete.d.ts +10 -0
  26. package/dist/hooks/use-confirm-delete.js +35 -0
  27. package/dist/hooks/use-css-var-dims.d.ts +1 -0
  28. package/dist/hooks/use-css-var-dims.js +29 -0
  29. package/dist/hooks/use-gpu-tier.d.ts +34 -0
  30. package/dist/hooks/use-gpu-tier.js +111 -0
  31. package/dist/hooks/use-render-loop.d.ts +41 -0
  32. package/dist/hooks/use-render-loop.js +63 -0
  33. package/dist/hooks/use-smooth-controls.d.ts +16 -0
  34. package/dist/hooks/use-smooth-controls.js +217 -0
  35. package/dist/hooks/use-toast.d.ts +7 -0
  36. package/dist/hooks/use-toast.js +21 -0
  37. package/dist/index.d.ts +79 -0
  38. package/dist/index.js +107 -0
  39. package/dist/ui/basic-page.d.ts +7 -0
  40. package/dist/ui/basic-page.js +18 -0
  41. package/dist/ui/build.css +4 -0
  42. package/dist/ui/components/animated-count.d.ts +10 -0
  43. package/dist/ui/components/animated-count.js +113 -0
  44. package/dist/ui/components/ascii.d.ts +10 -0
  45. package/dist/ui/components/ascii.js +79 -0
  46. package/dist/ui/components/badge.d.ts +6 -0
  47. package/dist/ui/components/badge.js +40 -0
  48. package/dist/ui/components/badges/nous-girl.d.ts +2 -0
  49. package/dist/ui/components/badges/nous-girl.js +83 -0
  50. package/dist/ui/components/blend-mode.d.ts +28 -0
  51. package/dist/ui/components/blend-mode.js +69 -0
  52. package/dist/ui/components/blink.d.ts +6 -0
  53. package/dist/ui/components/blink.js +17 -0
  54. package/dist/ui/components/bottom-sheet.d.ts +15 -0
  55. package/dist/ui/components/bottom-sheet.js +192 -0
  56. package/dist/ui/components/button.d.ts +14 -0
  57. package/dist/ui/components/button.js +147 -0
  58. package/dist/ui/components/card.d.ts +5 -0
  59. package/dist/ui/components/card.js +74 -0
  60. package/dist/ui/components/checkbox.d.ts +2 -0
  61. package/dist/ui/components/checkbox.js +27 -0
  62. package/dist/ui/components/command-block.d.ts +24 -0
  63. package/dist/ui/components/command-block.js +56 -0
  64. package/dist/ui/components/confirm-dialog.d.ts +13 -0
  65. package/dist/ui/components/confirm-dialog.js +113 -0
  66. package/dist/ui/components/cursor.d.ts +3 -0
  67. package/dist/ui/components/cursor.js +97 -0
  68. package/dist/ui/components/dialog.d.ts +15 -0
  69. package/dist/ui/components/dialog.js +171 -0
  70. package/dist/ui/components/dropdown-menu.d.ts +12 -0
  71. package/dist/ui/components/dropdown-menu.js +102 -0
  72. package/dist/ui/components/fit-text/fit-text.css +42 -0
  73. package/dist/ui/components/fit-text/index.d.ts +9 -0
  74. package/dist/ui/components/fit-text/index.js +25 -0
  75. package/dist/ui/components/graphs/bar-chart.d.ts +12 -0
  76. package/dist/ui/components/graphs/bar-chart.js +129 -0
  77. package/dist/ui/components/graphs/index.d.ts +3 -0
  78. package/dist/ui/components/graphs/index.js +4 -0
  79. package/dist/ui/components/graphs/line-chart.d.ts +14 -0
  80. package/dist/ui/components/graphs/line-chart.js +175 -0
  81. package/dist/ui/components/graphs/utils.d.ts +52 -0
  82. package/dist/ui/components/graphs/utils.js +162 -0
  83. package/dist/ui/components/grid/grid.css +79 -0
  84. package/dist/ui/components/grid/index.d.ts +2 -0
  85. package/dist/ui/components/grid/index.js +17 -0
  86. package/dist/ui/components/hover-bg.d.ts +1 -0
  87. package/dist/ui/components/hover-bg.js +14 -0
  88. package/dist/ui/components/icons/arrow.d.ts +6 -0
  89. package/dist/ui/components/icons/arrow.js +44 -0
  90. package/dist/ui/components/icons/check.d.ts +2 -0
  91. package/dist/ui/components/icons/check.js +13 -0
  92. package/dist/ui/components/icons/chevron.d.ts +6 -0
  93. package/dist/ui/components/icons/chevron.js +51 -0
  94. package/dist/ui/components/icons/discord.d.ts +2 -0
  95. package/dist/ui/components/icons/discord.js +15 -0
  96. package/dist/ui/components/icons/eye.d.ts +2 -0
  97. package/dist/ui/components/icons/eye.js +8 -0
  98. package/dist/ui/components/icons/gear.d.ts +6 -0
  99. package/dist/ui/components/icons/gear.js +30 -0
  100. package/dist/ui/components/icons/github.d.ts +2 -0
  101. package/dist/ui/components/icons/github.js +15 -0
  102. package/dist/ui/components/icons/hamburger.d.ts +6 -0
  103. package/dist/ui/components/icons/hamburger.js +56 -0
  104. package/dist/ui/components/icons/heart.d.ts +2 -0
  105. package/dist/ui/components/icons/heart.js +11 -0
  106. package/dist/ui/components/icons/index.d.ts +12 -0
  107. package/dist/ui/components/icons/index.js +13 -0
  108. package/dist/ui/components/icons/link.d.ts +2 -0
  109. package/dist/ui/components/icons/link.js +13 -0
  110. package/dist/ui/components/icons/minus.d.ts +2 -0
  111. package/dist/ui/components/icons/minus.js +13 -0
  112. package/dist/ui/components/icons/search.d.ts +2 -0
  113. package/dist/ui/components/icons/search.js +33 -0
  114. package/dist/ui/components/image-distortion.d.ts +21 -0
  115. package/dist/ui/components/image-distortion.js +398 -0
  116. package/dist/ui/components/input.d.ts +1 -0
  117. package/dist/ui/components/input.js +21 -0
  118. package/dist/ui/components/label.d.ts +1 -0
  119. package/dist/ui/components/label.js +18 -0
  120. package/dist/ui/components/leva-client.d.ts +1 -0
  121. package/dist/ui/components/leva-client.js +12 -0
  122. package/dist/ui/components/list-item.d.ts +6 -0
  123. package/dist/ui/components/list-item.js +27 -0
  124. package/dist/ui/components/overlays/blend-modes.d.ts +1 -0
  125. package/dist/ui/components/overlays/blend-modes.js +14 -0
  126. package/dist/ui/components/overlays/glitch.d.ts +6 -0
  127. package/dist/ui/components/overlays/glitch.js +209 -0
  128. package/dist/ui/components/overlays/greys.d.ts +6 -0
  129. package/dist/ui/components/overlays/greys.js +339 -0
  130. package/dist/ui/components/overlays/index.d.ts +14 -0
  131. package/dist/ui/components/overlays/index.js +34 -0
  132. package/dist/ui/components/overlays/lens-layers.d.ts +14 -0
  133. package/dist/ui/components/overlays/lens-layers.js +95 -0
  134. package/dist/ui/components/overlays/lens.d.ts +44 -0
  135. package/dist/ui/components/overlays/lens.js +60 -0
  136. package/dist/ui/components/overlays/noise.d.ts +6 -0
  137. package/dist/ui/components/overlays/noise.js +136 -0
  138. package/dist/ui/components/overlays/vignette.d.ts +6 -0
  139. package/dist/ui/components/overlays/vignette.js +47 -0
  140. package/dist/ui/components/poster.d.ts +62 -0
  141. package/dist/ui/components/poster.js +256 -0
  142. package/dist/ui/components/progress.d.ts +9 -0
  143. package/dist/ui/components/progress.js +53 -0
  144. package/dist/ui/components/scene-canvas.d.ts +23 -0
  145. package/dist/ui/components/scene-canvas.js +179 -0
  146. package/dist/ui/components/scramble.d.ts +9 -0
  147. package/dist/ui/components/scramble.js +63 -0
  148. package/dist/ui/components/segmented.d.ts +20 -0
  149. package/dist/ui/components/segmented.js +51 -0
  150. package/dist/ui/components/select.d.ts +18 -0
  151. package/dist/ui/components/select.js +215 -0
  152. package/dist/ui/components/selection-switcher.d.ts +1 -0
  153. package/dist/ui/components/selection-switcher.js +34 -0
  154. package/dist/ui/components/separator.d.ts +5 -0
  155. package/dist/ui/components/separator.js +22 -0
  156. package/dist/ui/components/shader.d.ts +7 -0
  157. package/dist/ui/components/shader.js +60 -0
  158. package/dist/ui/components/socials.d.ts +20 -0
  159. package/dist/ui/components/socials.js +21 -0
  160. package/dist/ui/components/spinner.d.ts +20 -0
  161. package/dist/ui/components/spinner.js +38 -0
  162. package/dist/ui/components/stats.d.ts +16 -0
  163. package/dist/ui/components/stats.js +36 -0
  164. package/dist/ui/components/switch.d.ts +7 -0
  165. package/dist/ui/components/switch.js +37 -0
  166. package/dist/ui/components/tabs.d.ts +14 -0
  167. package/dist/ui/components/tabs.js +44 -0
  168. package/dist/ui/components/terminal-demo.d.ts +32 -0
  169. package/dist/ui/components/terminal-demo.js +125 -0
  170. package/dist/ui/components/theme-toggle.d.ts +6 -0
  171. package/dist/ui/components/theme-toggle.js +66 -0
  172. package/dist/ui/components/tier-card.d.ts +53 -0
  173. package/dist/ui/components/tier-card.js +146 -0
  174. package/dist/ui/components/toast.d.ts +8 -0
  175. package/dist/ui/components/toast.js +39 -0
  176. package/dist/ui/components/tv.d.ts +3 -0
  177. package/dist/ui/components/tv.js +239 -0
  178. package/dist/ui/components/typography/h1.d.ts +11 -0
  179. package/dist/ui/components/typography/h1.js +18 -0
  180. package/dist/ui/components/typography/h2.d.ts +11 -0
  181. package/dist/ui/components/typography/h2.js +18 -0
  182. package/dist/ui/components/typography/index.d.ts +15 -0
  183. package/dist/ui/components/typography/index.js +41 -0
  184. package/dist/ui/components/typography/legend.d.ts +6 -0
  185. package/dist/ui/components/typography/legend.js +20 -0
  186. package/dist/ui/components/typography/small.d.ts +2 -0
  187. package/dist/ui/components/typography/small.js +9 -0
  188. package/dist/ui/components/watchlist.d.ts +11 -0
  189. package/dist/ui/components/watchlist.js +80 -0
  190. package/dist/ui/fonts.css +63 -0
  191. package/dist/ui/footer.d.ts +20 -0
  192. package/dist/ui/footer.js +65 -0
  193. package/dist/ui/globals.css +395 -0
  194. package/dist/ui/header.d.ts +41 -0
  195. package/dist/ui/header.js +270 -0
  196. package/dist/ui/layout-wrapper.d.ts +1 -0
  197. package/dist/ui/layout-wrapper.js +7 -0
  198. package/dist/utils/color.d.ts +4 -0
  199. package/dist/utils/color.js +14 -0
  200. package/dist/utils/index.d.ts +15 -0
  201. package/dist/utils/index.js +48 -0
  202. package/dist/utils/poly.d.ts +8 -0
  203. package/dist/utils/poly.js +3 -0
  204. package/package.json +120 -0
  205. package/src/assets/filler-bg0.webp +0 -0
  206. package/src/assets.d.ts +38 -0
  207. package/src/fonts/Collapse-Bold.woff2 +0 -0
  208. package/src/fonts/Collapse-BoldItalic.woff2 +0 -0
  209. package/src/fonts/Collapse-Italic.woff2 +0 -0
  210. package/src/fonts/Collapse-Light.woff2 +0 -0
  211. package/src/fonts/Collapse-LightItalic.woff2 +0 -0
  212. package/src/fonts/Collapse-Regular.woff2 +0 -0
  213. package/src/fonts/Collapse-Thin.woff2 +0 -0
  214. package/src/fonts/Collapse-ThinItalic.woff2 +0 -0
  215. package/src/fonts/Mondwest-Regular.woff2 +0 -0
  216. package/src/fonts/Neuebit-Bold.woff2 +0 -0
  217. package/src/fonts/RulesCompressed-Medium.woff2 +0 -0
  218. package/src/fonts/RulesCompressed-Regular.woff2 +0 -0
  219. package/src/fonts/RulesExpanded-Bold.woff2 +0 -0
  220. package/src/fonts/RulesExpanded-Regular.woff2 +0 -0
  221. package/src/fonts.ts +6 -0
  222. package/src/hooks/use-below-breakpoint.ts +21 -0
  223. package/src/hooks/use-capped-frame.ts +18 -0
  224. package/src/hooks/use-confirm-delete.ts +43 -0
  225. package/src/hooks/use-css-var-dims.ts +39 -0
  226. package/src/hooks/use-gpu-tier.ts +190 -0
  227. package/src/hooks/use-render-loop.ts +121 -0
  228. package/src/hooks/use-smooth-controls.ts +318 -0
  229. package/src/hooks/use-toast.ts +29 -0
  230. package/src/index.ts +130 -0
  231. package/src/ui/basic-page.tsx +34 -0
  232. package/src/ui/build.css +4 -0
  233. package/src/ui/components/animated-count.stories.tsx +67 -0
  234. package/src/ui/components/animated-count.tsx +168 -0
  235. package/src/ui/components/ascii.stories.tsx +30 -0
  236. package/src/ui/components/ascii.tsx +110 -0
  237. package/src/ui/components/badge.stories.tsx +31 -0
  238. package/src/ui/components/badge.tsx +60 -0
  239. package/src/ui/components/badges/nous-girl.tsx +52 -0
  240. package/src/ui/components/blend-mode.stories.tsx +33 -0
  241. package/src/ui/components/blend-mode.tsx +129 -0
  242. package/src/ui/components/blink.stories.tsx +32 -0
  243. package/src/ui/components/blink.tsx +21 -0
  244. package/src/ui/components/bottom-sheet.stories.tsx +43 -0
  245. package/src/ui/components/bottom-sheet.tsx +227 -0
  246. package/src/ui/components/button.stories.tsx +68 -0
  247. package/src/ui/components/button.tsx +170 -0
  248. package/src/ui/components/card.stories.tsx +63 -0
  249. package/src/ui/components/card.tsx +85 -0
  250. package/src/ui/components/checkbox.stories.tsx +113 -0
  251. package/src/ui/components/checkbox.tsx +36 -0
  252. package/src/ui/components/command-block.stories.tsx +52 -0
  253. package/src/ui/components/command-block.tsx +86 -0
  254. package/src/ui/components/confirm-dialog.stories.tsx +91 -0
  255. package/src/ui/components/confirm-dialog.tsx +130 -0
  256. package/src/ui/components/cursor.tsx +115 -0
  257. package/src/ui/components/dialog.stories.tsx +169 -0
  258. package/src/ui/components/dialog.tsx +177 -0
  259. package/src/ui/components/dropdown-menu.stories.tsx +52 -0
  260. package/src/ui/components/dropdown-menu.tsx +117 -0
  261. package/src/ui/components/fit-text/fit-text.css +42 -0
  262. package/src/ui/components/fit-text/index.stories.tsx +33 -0
  263. package/src/ui/components/fit-text/index.tsx +45 -0
  264. package/src/ui/components/forms.stories.tsx +173 -0
  265. package/src/ui/components/graphs/bar-chart.tsx +153 -0
  266. package/src/ui/components/graphs/index.stories.tsx +64 -0
  267. package/src/ui/components/graphs/index.tsx +4 -0
  268. package/src/ui/components/graphs/line-chart.tsx +213 -0
  269. package/src/ui/components/graphs/utils.tsx +265 -0
  270. package/src/ui/components/grid/grid.css +79 -0
  271. package/src/ui/components/grid/index.tsx +19 -0
  272. package/src/ui/components/hover-bg.stories.tsx +29 -0
  273. package/src/ui/components/hover-bg.tsx +15 -0
  274. package/src/ui/components/icons/arrow.tsx +42 -0
  275. package/src/ui/components/icons/check.tsx +14 -0
  276. package/src/ui/components/icons/chevron.tsx +45 -0
  277. package/src/ui/components/icons/discord.tsx +16 -0
  278. package/src/ui/components/icons/eye.tsx +12 -0
  279. package/src/ui/components/icons/gear.tsx +51 -0
  280. package/src/ui/components/icons/github.tsx +16 -0
  281. package/src/ui/components/icons/hamburger.tsx +52 -0
  282. package/src/ui/components/icons/heart.tsx +12 -0
  283. package/src/ui/components/icons/index.ts +12 -0
  284. package/src/ui/components/icons/link.tsx +14 -0
  285. package/src/ui/components/icons/minus.tsx +14 -0
  286. package/src/ui/components/icons/search.tsx +28 -0
  287. package/src/ui/components/image-distortion.stories.tsx +120 -0
  288. package/src/ui/components/image-distortion.tsx +499 -0
  289. package/src/ui/components/input.stories.tsx +39 -0
  290. package/src/ui/components/input.tsx +20 -0
  291. package/src/ui/components/label.stories.tsx +26 -0
  292. package/src/ui/components/label.tsx +16 -0
  293. package/src/ui/components/leva-client.tsx +14 -0
  294. package/src/ui/components/list-item.stories.tsx +83 -0
  295. package/src/ui/components/list-item.tsx +37 -0
  296. package/src/ui/components/overlays/blend-modes.ts +13 -0
  297. package/src/ui/components/overlays/glitch.tsx +243 -0
  298. package/src/ui/components/overlays/greys.tsx +386 -0
  299. package/src/ui/components/overlays/index.tsx +47 -0
  300. package/src/ui/components/overlays/lens-layers.tsx +121 -0
  301. package/src/ui/components/overlays/lens.ts +91 -0
  302. package/src/ui/components/overlays/noise.tsx +174 -0
  303. package/src/ui/components/overlays/vignette.tsx +60 -0
  304. package/src/ui/components/poster.stories.tsx +513 -0
  305. package/src/ui/components/poster.tsx +411 -0
  306. package/src/ui/components/progress.stories.tsx +48 -0
  307. package/src/ui/components/progress.tsx +56 -0
  308. package/src/ui/components/scene-canvas.tsx +254 -0
  309. package/src/ui/components/scramble.stories.tsx +49 -0
  310. package/src/ui/components/scramble.tsx +95 -0
  311. package/src/ui/components/segmented.stories.tsx +101 -0
  312. package/src/ui/components/segmented.tsx +81 -0
  313. package/src/ui/components/select.stories.tsx +88 -0
  314. package/src/ui/components/select.tsx +267 -0
  315. package/src/ui/components/selection-switcher.tsx +44 -0
  316. package/src/ui/components/separator.stories.tsx +33 -0
  317. package/src/ui/components/separator.tsx +24 -0
  318. package/src/ui/components/shader.tsx +83 -0
  319. package/src/ui/components/socials.tsx +42 -0
  320. package/src/ui/components/spinner.stories.tsx +101 -0
  321. package/src/ui/components/spinner.tsx +60 -0
  322. package/src/ui/components/stats.stories.tsx +24 -0
  323. package/src/ui/components/stats.tsx +53 -0
  324. package/src/ui/components/switch.stories.tsx +77 -0
  325. package/src/ui/components/switch.tsx +48 -0
  326. package/src/ui/components/tabs.stories.tsx +101 -0
  327. package/src/ui/components/tabs.tsx +66 -0
  328. package/src/ui/components/terminal-demo.stories.tsx +67 -0
  329. package/src/ui/components/terminal-demo.tsx +189 -0
  330. package/src/ui/components/theme-toggle.stories.tsx +47 -0
  331. package/src/ui/components/theme-toggle.tsx +66 -0
  332. package/src/ui/components/tier-card.stories.tsx +217 -0
  333. package/src/ui/components/tier-card.tsx +190 -0
  334. package/src/ui/components/toast.stories.tsx +55 -0
  335. package/src/ui/components/toast.tsx +49 -0
  336. package/src/ui/components/tv.stories.tsx +37 -0
  337. package/src/ui/components/tv.tsx +257 -0
  338. package/src/ui/components/typography/h1.tsx +18 -0
  339. package/src/ui/components/typography/h2.tsx +18 -0
  340. package/src/ui/components/typography/index.tsx +54 -0
  341. package/src/ui/components/typography/legend.tsx +24 -0
  342. package/src/ui/components/typography/small.tsx +11 -0
  343. package/src/ui/components/watchlist.stories.tsx +33 -0
  344. package/src/ui/components/watchlist.tsx +105 -0
  345. package/src/ui/fonts.css +63 -0
  346. package/src/ui/footer.tsx +111 -0
  347. package/src/ui/globals.css +395 -0
  348. package/src/ui/header.tsx +398 -0
  349. package/src/ui/layout-wrapper.tsx +11 -0
  350. package/src/utils/color.ts +21 -0
  351. package/src/utils/index.ts +62 -0
  352. package/src/utils/poly.ts +26 -0
@@ -0,0 +1,11 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ export function HeartIcon(props) {
3
+ return /* @__PURE__ */ jsx("svg", { fill: "none", viewBox: "0 0 14 12", ...props, children: /* @__PURE__ */ jsx(
4
+ "path",
5
+ {
6
+ d: "M13.2 0v5.65714h-1.8857v1.88572H9.42857v1.88571H7.54286v1.88573H5.65714V9.42857H3.77143V7.54286H1.88571V5.65714H0V0h5.65714v1.88571h1.88572V0z",
7
+ fill: "currentColor"
8
+ }
9
+ ) });
10
+ }
11
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHR5cGUgeyBTVkdQcm9wcyB9IGZyb20gJ3JlYWN0J1xuXG5leHBvcnQgZnVuY3Rpb24gSGVhcnRJY29uKHByb3BzOiBTVkdQcm9wczxTVkdTVkdFbGVtZW50Pikge1xuICByZXR1cm4gKFxuICAgIDxzdmcgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDE0IDEyXCIgey4uLnByb3BzfT5cbiAgICAgIDxwYXRoXG4gICAgICAgIGQ9XCJNMTMuMiAwdjUuNjU3MTRoLTEuODg1N3YxLjg4NTcySDkuNDI4NTd2MS44ODU3MUg3LjU0Mjg2djEuODg1NzNINS42NTcxNFY5LjQyODU3SDMuNzcxNDNWNy41NDI4NkgxLjg4NTcxVjUuNjU3MTRIMFYwaDUuNjU3MTR2MS44ODU3MWgxLjg4NTcyVjB6XCJcbiAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAvPlxuICAgIDwvc3ZnPlxuICApXG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFLTTtBQUhDLGdCQUFTLFVBQVUsT0FBZ0M7QUFDeEQsU0FDRSxvQkFBQyxTQUFJLE1BQUssUUFBTyxTQUFRLGFBQWEsR0FBRyxPQUN2QztBQUFBLElBQUM7QUFBQTtBQUFBLE1BQ0MsR0FBRTtBQUFBLE1BQ0YsTUFBSztBQUFBO0FBQUEsRUFDUCxHQUNGO0FBRUo7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,12 @@
1
+ export * from './arrow';
2
+ export * from './check';
3
+ export * from './chevron';
4
+ export * from './discord';
5
+ export * from './eye';
6
+ export * from './gear';
7
+ export * from './github';
8
+ export * from './hamburger';
9
+ export * from './heart';
10
+ export * from './link';
11
+ export * from './minus';
12
+ export * from './search';
@@ -0,0 +1,13 @@
1
+ export * from "./arrow.js";
2
+ export * from "./check.js";
3
+ export * from "./chevron.js";
4
+ export * from "./discord.js";
5
+ export * from "./eye.js";
6
+ export * from "./gear.js";
7
+ export * from "./github.js";
8
+ export * from "./hamburger.js";
9
+ export * from "./heart.js";
10
+ export * from "./link.js";
11
+ export * from "./minus.js";
12
+ export * from "./search.js";
13
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0ICogZnJvbSAnLi9hcnJvdydcbmV4cG9ydCAqIGZyb20gJy4vY2hlY2snXG5leHBvcnQgKiBmcm9tICcuL2NoZXZyb24nXG5leHBvcnQgKiBmcm9tICcuL2Rpc2NvcmQnXG5leHBvcnQgKiBmcm9tICcuL2V5ZSdcbmV4cG9ydCAqIGZyb20gJy4vZ2VhcidcbmV4cG9ydCAqIGZyb20gJy4vZ2l0aHViJ1xuZXhwb3J0ICogZnJvbSAnLi9oYW1idXJnZXInXG5leHBvcnQgKiBmcm9tICcuL2hlYXJ0J1xuZXhwb3J0ICogZnJvbSAnLi9saW5rJ1xuZXhwb3J0ICogZnJvbSAnLi9taW51cydcbmV4cG9ydCAqIGZyb20gJy4vc2VhcmNoJ1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBQUEsY0FBYztBQUNkLGNBQWM7QUFDZCxjQUFjO0FBQ2QsY0FBYztBQUNkLGNBQWM7QUFDZCxjQUFjO0FBQ2QsY0FBYztBQUNkLGNBQWM7QUFDZCxjQUFjO0FBQ2QsY0FBYztBQUNkLGNBQWM7QUFDZCxjQUFjOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,2 @@
1
+ import type { SVGProps } from 'react';
2
+ export declare function LinkIcon(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
@@ -0,0 +1,13 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ export function LinkIcon(props) {
3
+ return /* @__PURE__ */ jsx("svg", { fill: "none", viewBox: "0 0 17 7", ...props, children: /* @__PURE__ */ jsx(
4
+ "path",
5
+ {
6
+ d: "M.264191.25061 6.27068.265071V2.26334h3.96512v1.99578l4.0238.00091.043-2.06986-4.0381.07302-.0142-2.01254L16.271.250649l-.0144 6.006381h-5.992l-.0287-1.9981-3.96528-.0002v1.99826l-6.02085-.0001zM6.24063 2.26197l-3.97944-.01436v1.99827l3.97954.01446z",
7
+ fill: "currentColor",
8
+ stroke: "currentColor",
9
+ strokeWidth: ".5"
10
+ }
11
+ ) });
12
+ }
13
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHR5cGUgeyBTVkdQcm9wcyB9IGZyb20gJ3JlYWN0J1xuXG5leHBvcnQgZnVuY3Rpb24gTGlua0ljb24ocHJvcHM6IFNWR1Byb3BzPFNWR1NWR0VsZW1lbnQ+KSB7XG4gIHJldHVybiAoXG4gICAgPHN2ZyBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMTcgN1wiIHsuLi5wcm9wc30+XG4gICAgICA8cGF0aFxuICAgICAgICBkPVwiTS4yNjQxOTEuMjUwNjEgNi4yNzA2OC4yNjUwNzFWMi4yNjMzNGgzLjk2NTEydjEuOTk1NzhsNC4wMjM4LjAwMDkxLjA0My0yLjA2OTg2LTQuMDM4MS4wNzMwMi0uMDE0Mi0yLjAxMjU0TDE2LjI3MS4yNTA2NDlsLS4wMTQ0IDYuMDA2MzgxaC01Ljk5MmwtLjAyODctMS45OTgxLTMuOTY1MjgtLjAwMDJ2MS45OTgyNmwtNi4wMjA4NS0uMDAwMXpNNi4yNDA2MyAyLjI2MTk3bC0zLjk3OTQ0LS4wMTQzNnYxLjk5ODI3bDMuOTc5NTQuMDE0NDZ6XCJcbiAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgIHN0cm9rZVdpZHRoPVwiLjVcIlxuICAgICAgLz5cbiAgICA8L3N2Zz5cbiAgKVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBS007QUFIQyxnQkFBUyxTQUFTLE9BQWdDO0FBQ3ZELFNBQ0Usb0JBQUMsU0FBSSxNQUFLLFFBQU8sU0FBUSxZQUFZLEdBQUcsT0FDdEM7QUFBQSxJQUFDO0FBQUE7QUFBQSxNQUNDLEdBQUU7QUFBQSxNQUNGLE1BQUs7QUFBQSxNQUNMLFFBQU87QUFBQSxNQUNQLGFBQVk7QUFBQTtBQUFBLEVBQ2QsR0FDRjtBQUVKOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,2 @@
1
+ import type { SVGProps } from 'react';
2
+ export declare function MinusIcon(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
@@ -0,0 +1,13 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ export function MinusIcon(props) {
3
+ return /* @__PURE__ */ jsx("svg", { fill: "none", viewBox: "0 0 12 3", ...props, children: /* @__PURE__ */ jsx(
4
+ "path",
5
+ {
6
+ clipRule: "evenodd",
7
+ d: "M12 0 0-5.2e-7-1e-7 2.50075H12z",
8
+ fill: "currentColor",
9
+ fillRule: "evenodd"
10
+ }
11
+ ) });
12
+ }
13
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHR5cGUgeyBTVkdQcm9wcyB9IGZyb20gJ3JlYWN0J1xuXG5leHBvcnQgZnVuY3Rpb24gTWludXNJY29uKHByb3BzOiBTVkdQcm9wczxTVkdTVkdFbGVtZW50Pikge1xuICByZXR1cm4gKFxuICAgIDxzdmcgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDEyIDNcIiB7Li4ucHJvcHN9PlxuICAgICAgPHBhdGhcbiAgICAgICAgY2xpcFJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgZD1cIk0xMiAwIDAtNS4yZS03LTFlLTcgMi41MDA3NUgxMnpcIlxuICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgZmlsbFJ1bGU9XCJldmVub2RkXCJcbiAgICAgIC8+XG4gICAgPC9zdmc+XG4gIClcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQUtNO0FBSEMsZ0JBQVMsVUFBVSxPQUFnQztBQUN4RCxTQUNFLG9CQUFDLFNBQUksTUFBSyxRQUFPLFNBQVEsWUFBWSxHQUFHLE9BQ3RDO0FBQUEsSUFBQztBQUFBO0FBQUEsTUFDQyxVQUFTO0FBQUEsTUFDVCxHQUFFO0FBQUEsTUFDRixNQUFLO0FBQUEsTUFDTCxVQUFTO0FBQUE7QUFBQSxFQUNYLEdBQ0Y7QUFFSjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,2 @@
1
+ import type { SVGProps } from 'react';
2
+ export declare function SearchIcon(props: SVGProps<SVGSVGElement>): import("react").JSX.Element;
@@ -0,0 +1,33 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ export function SearchIcon(props) {
3
+ return /* @__PURE__ */ jsxs("svg", { fill: "none", viewBox: "0 0 20 21", ...props, children: [
4
+ /* @__PURE__ */ jsx(
5
+ "path",
6
+ {
7
+ clipRule: "evenodd",
8
+ d: "M7.49773 1.6664h6.66637V0H7.49773zM14.1641 15.0001H7.49773v1.6664h6.66637z",
9
+ fill: "currentColor",
10
+ fillRule: "evenodd"
11
+ }
12
+ ),
13
+ /* @__PURE__ */ jsx(
14
+ "path",
15
+ {
16
+ clipRule: "evenodd",
17
+ d: "M5.8336 3.33278H7.5v-1.6664H5.8336zM15.8359 13.3329h-1.6671v1.6672h1.6671zM4.16877 5.00017h1.66717V3.33301H4.16877zM17.5 11.6665h-1.6664v1.6664H17.5zM4.16406 11.6665V5.00012h-1.6664v6.66638zM17.4977 5.00012v6.66638h1.6664V5.00012z",
18
+ fill: "currentColor",
19
+ fillRule: "evenodd"
20
+ }
21
+ ),
22
+ /* @__PURE__ */ jsx(
23
+ "path",
24
+ {
25
+ clipRule: "evenodd",
26
+ d: "M17.5 5.00017V3.33301h-1.6664v1.66716zM15.8359 3.33278v-1.6664h-1.6671v1.6664zM15.8359 10.0002V6.6665h-1.6671v3.3337zM14.1641 6.6664V5h-1.6664v1.6664zM5.8335 13.3328v-1.6664H4.16633V15H7.5v-1.6671zM4.16406 16.6664V15h-1.6664v1.6664zM2.5 18.3331v-1.6664H.8336v1.6664z",
27
+ fill: "currentColor",
28
+ fillRule: "evenodd"
29
+ }
30
+ )
31
+ ] });
32
+ }
33
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHR5cGUgeyBTVkdQcm9wcyB9IGZyb20gJ3JlYWN0J1xuXG5leHBvcnQgZnVuY3Rpb24gU2VhcmNoSWNvbihwcm9wczogU1ZHUHJvcHM8U1ZHU1ZHRWxlbWVudD4pIHtcbiAgcmV0dXJuIChcbiAgICA8c3ZnIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyMCAyMVwiIHsuLi5wcm9wc30+XG4gICAgICA8cGF0aFxuICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICBkPVwiTTcuNDk3NzMgMS42NjY0aDYuNjY2MzdWMEg3LjQ5Nzczek0xNC4xNjQxIDE1LjAwMDFINy40OTc3M3YxLjY2NjRoNi42NjYzN3pcIlxuICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgZmlsbFJ1bGU9XCJldmVub2RkXCJcbiAgICAgIC8+XG5cbiAgICAgIDxwYXRoXG4gICAgICAgIGNsaXBSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgIGQ9XCJNNS44MzM2IDMuMzMyNzhINy41di0xLjY2NjRINS44MzM2ek0xNS44MzU5IDEzLjMzMjloLTEuNjY3MXYxLjY2NzJoMS42Njcxek00LjE2ODc3IDUuMDAwMTdoMS42NjcxN1YzLjMzMzAxSDQuMTY4Nzd6TTE3LjUgMTEuNjY2NWgtMS42NjY0djEuNjY2NEgxNy41ek00LjE2NDA2IDExLjY2NjVWNS4wMDAxMmgtMS42NjY0djYuNjY2Mzh6TTE3LjQ5NzcgNS4wMDAxMnY2LjY2NjM4aDEuNjY2NFY1LjAwMDEyelwiXG4gICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICBmaWxsUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgLz5cblxuICAgICAgPHBhdGhcbiAgICAgICAgY2xpcFJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgZD1cIk0xNy41IDUuMDAwMTdWMy4zMzMwMWgtMS42NjY0djEuNjY3MTZ6TTE1LjgzNTkgMy4zMzI3OHYtMS42NjY0aC0xLjY2NzF2MS42NjY0ek0xNS44MzU5IDEwLjAwMDJWNi42NjY1aC0xLjY2NzF2My4zMzM3ek0xNC4xNjQxIDYuNjY2NFY1aC0xLjY2NjR2MS42NjY0ek01LjgzMzUgMTMuMzMyOHYtMS42NjY0SDQuMTY2MzNWMTVINy41di0xLjY2NzF6TTQuMTY0MDYgMTYuNjY2NFYxNWgtMS42NjY0djEuNjY2NHpNMi41IDE4LjMzMzF2LTEuNjY2NEguODMzNnYxLjY2NjR6XCJcbiAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgIGZpbGxSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAvPlxuICAgIDwvc3ZnPlxuICApXG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFJSSxTQUNFLEtBREY7QUFGRyxnQkFBUyxXQUFXLE9BQWdDO0FBQ3pELFNBQ0UscUJBQUMsU0FBSSxNQUFLLFFBQU8sU0FBUSxhQUFhLEdBQUcsT0FDdkM7QUFBQTtBQUFBLE1BQUM7QUFBQTtBQUFBLFFBQ0MsVUFBUztBQUFBLFFBQ1QsR0FBRTtBQUFBLFFBQ0YsTUFBSztBQUFBLFFBQ0wsVUFBUztBQUFBO0FBQUEsSUFDWDtBQUFBLElBRUE7QUFBQSxNQUFDO0FBQUE7QUFBQSxRQUNDLFVBQVM7QUFBQSxRQUNULEdBQUU7QUFBQSxRQUNGLE1BQUs7QUFBQSxRQUNMLFVBQVM7QUFBQTtBQUFBLElBQ1g7QUFBQSxJQUVBO0FBQUEsTUFBQztBQUFBO0FBQUEsUUFDQyxVQUFTO0FBQUEsUUFDVCxHQUFFO0FBQUEsUUFDRixNQUFLO0FBQUEsUUFDTCxVQUFTO0FBQUE7QUFBQSxJQUNYO0FBQUEsS0FDRjtBQUVKOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,21 @@
1
+ export declare function ImageDistortion({ active, autoPlay, className, fallbackClassName, src, style, tint, tintStrength }: ImageDistortionProps): import("react").JSX.Element;
2
+ export type AutoPlayPattern = 'aggressive' | 'gentle' | 'slash';
3
+ interface ImageDistortionProps {
4
+ active?: boolean;
5
+ /**
6
+ * Drive the distortion with a choreographed motion pattern instead of
7
+ * waiting for a real pointer. Useful for posters, social clips, and any
8
+ * context where the image needs to feel alive on its own.
9
+ */
10
+ autoPlay?: AutoPlayPattern;
11
+ className?: string;
12
+ fallbackClassName?: string;
13
+ src: string;
14
+ style?: React.CSSProperties;
15
+ tint?: string;
16
+ tintStrength?: {
17
+ active: number;
18
+ inactive: number;
19
+ };
20
+ }
21
+ export {};
@@ -0,0 +1,398 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useEffect, useRef, useState } from "react";
4
+ import { useGpuTier } from "../../hooks/use-gpu-tier.js";
5
+ import { cn, hexToRgb } from "../../utils/index.js";
6
+ const NUM_BANDS = 12;
7
+ const VERT = `attribute vec2 a;varying vec2 vUv;void main(){vUv=vec2(a.x*.5+.5,.5-a.y*.5);gl_Position=vec4(a,0,1);}`;
8
+ const FRAG = `precision highp float;
9
+ uniform float t;
10
+ uniform vec2 r,imgSize,vel;
11
+ uniform sampler2D tex;
12
+ uniform float bands[${NUM_BANDS}];
13
+ uniform vec3 tint;
14
+ uniform float tintStrength;
15
+ varying vec2 vUv;
16
+
17
+ float h(vec2 p){return fract(sin(dot(p,vec2(127.1,311.7)))*43758.5453);}
18
+
19
+ // cover-style UV: crops the image to fill the canvas, centered
20
+ vec2 coverUV(vec2 uv){
21
+ float canvasAspect=r.x/r.y;
22
+ float imgAspect=imgSize.x/imgSize.y;
23
+ vec2 scale=canvasAspect>imgAspect
24
+ ?vec2(1.0,imgAspect/canvasAspect)
25
+ :vec2(canvasAspect/imgAspect,1.0);
26
+ return(uv-0.5)*scale+0.5;
27
+ }
28
+
29
+ void main(){
30
+ vec2 uv=coverUV(vUv);
31
+ float scanY=floor(vUv.y*r.y);
32
+
33
+ float bandF=vUv.y*${NUM_BANDS}.0;
34
+ int bandIdx=int(floor(bandF));
35
+ float bandFrac=fract(bandF);
36
+
37
+ float strength=0.0;
38
+ for(int i=0;i<${NUM_BANDS};i++){
39
+ if(i==bandIdx) strength=bands[i];
40
+ }
41
+
42
+ float neighborStr=0.0;
43
+ int neighborIdx=bandFrac>.5?bandIdx+1:bandIdx-1;
44
+ for(int i=0;i<${NUM_BANDS};i++){
45
+ if(i==neighborIdx) neighborStr=bands[i];
46
+ }
47
+ float edgeBlend=abs(bandFrac-.5)*2.0;
48
+ edgeBlend*=edgeBlend;
49
+ strength=mix(strength,neighborStr,edgeBlend*.3);
50
+
51
+ float speed=length(vel);
52
+ float dirBlend=smoothstep(0.0,0.02,speed);
53
+ vec2 dir=speed>.0001?vel/speed:vec2(0);
54
+ dir*=dirBlend;
55
+
56
+ float rowSeed=h(vec2(scanY,floor(t*3.)+float(bandIdx)*7.));
57
+ float rowVar=mix(.4,1.0,rowSeed);
58
+
59
+ float ySmooth=vUv.y*6.0+t*0.7;
60
+ float yNoise=mix(h(vec2(floor(ySmooth),13.)),h(vec2(floor(ySmooth)+1.0,13.)),smoothstep(0.0,1.0,fract(ySmooth)));
61
+ float colVar=mix(.4,1.0,yNoise);
62
+
63
+ float tearShiftX=dir.x*strength*rowVar*0.15;
64
+ float tearShiftY=dir.y*strength*colVar*0.10;
65
+
66
+ float bandSeed=h(vec2(float(bandIdx),42.));
67
+ tearShiftX+=strength*(.5-bandSeed)*0.05;
68
+
69
+ float yJitter=mix(h(vec2(floor(ySmooth),73.)),h(vec2(floor(ySmooth)+1.0,73.)),smoothstep(0.0,1.0,fract(ySmooth)));
70
+ tearShiftY+=strength*(.5-yJitter)*0.035;
71
+
72
+ uv.x+=tearShiftX;
73
+ uv.y+=tearShiftY;
74
+
75
+ float sortGate=step(.5,strength)*step(.4,rowSeed);
76
+ uv.x+=dir.x*sortGate*strength*0.03;
77
+ uv.y+=dir.y*sortGate*strength*0.02;
78
+
79
+ float caX=abs(tearShiftX)*2.5+sortGate*strength*0.01;
80
+ float caY=abs(tearShiftY)*2.5+sortGate*strength*0.01;
81
+ float cr=texture2D(tex,vec2(uv.x+caX,uv.y+caY)).r;
82
+ float cg=texture2D(tex,uv).g;
83
+ float cb=texture2D(tex,vec2(uv.x-caX,uv.y-caY)).b;
84
+
85
+ vec3 col=vec3(cr,cg,cb);
86
+
87
+ col*=.97+.03*sin(vUv.y*r.y*3.14159);
88
+
89
+ float bandEdge=smoothstep(.02,.0,min(bandFrac,1.0-bandFrac));
90
+ col+=vec3(bandEdge*strength*.1);
91
+
92
+ col=mix(col,col*tint,tintStrength);
93
+
94
+ gl_FragColor=vec4(col,1.0);
95
+ }`;
96
+ const AUTOPLAY_PATTERNS = {
97
+ aggressive: (t) => {
98
+ const cycle = 1.4;
99
+ const phase = t % cycle / cycle;
100
+ const stab = Math.exp(-((phase - 0.15) ** 2) * 260);
101
+ const angle = Math.floor(t / cycle) * 1.37;
102
+ const mx = 0.5 + Math.cos(angle) * 0.42 * (stab + 0.15);
103
+ const my = 0.5 + Math.sin(angle) * 0.38 * (stab + 0.15);
104
+ return { hover: 0.55 + stab * 0.45, mx, my };
105
+ },
106
+ gentle: (t) => ({
107
+ hover: 0.45 + Math.sin(t * 0.9) * 0.1,
108
+ mx: 0.5 + Math.sin(t * 0.5) * 0.28,
109
+ my: 0.5 + Math.cos(t * 0.37) * 0.22
110
+ }),
111
+ slash: (t) => {
112
+ const cycle = 3.6;
113
+ const phase = t % cycle / cycle;
114
+ const slash = Math.exp(-((phase - 0.28) ** 2) * 180);
115
+ const micro = Math.exp(-((phase - 0.7) ** 2) * 340);
116
+ const driftX = 0.5 + Math.sin(t * 0.7) * 0.16;
117
+ const driftY = 0.55 + Math.cos(t * 0.5) * 0.14;
118
+ const slashX = -0.15 + phase * 1.55;
119
+ const slashY = 0.95 - phase * 1.35;
120
+ const mx = driftX * (1 - slash) + slashX * slash;
121
+ const my = driftY * (1 - slash) + slashY * slash;
122
+ return { hover: 0.5 + slash * 0.5 + micro * 0.35, mx, my };
123
+ }
124
+ };
125
+ export function ImageDistortion({
126
+ active = true,
127
+ autoPlay,
128
+ className,
129
+ fallbackClassName,
130
+ src,
131
+ style,
132
+ tint,
133
+ tintStrength
134
+ }) {
135
+ const canvasRef = useRef(null);
136
+ const tier = useGpuTier();
137
+ const [loaded, setLoaded] = useState(false);
138
+ const activeRef = useRef(active);
139
+ activeRef.current = active;
140
+ const tintStrengthRef = useRef(tintStrength);
141
+ tintStrengthRef.current = tintStrength;
142
+ const autoPlayRef = useRef(autoPlay);
143
+ autoPlayRef.current = autoPlay;
144
+ const state = useRef({
145
+ bandTargets: new Float32Array(NUM_BANDS),
146
+ bands: new Float32Array(NUM_BANDS),
147
+ hoverTarget: 0,
148
+ imgH: 1,
149
+ imgW: 1,
150
+ mx: 0.5,
151
+ my: 0.5,
152
+ prevMx: 0.5,
153
+ prevMy: 0.5,
154
+ vx: 0,
155
+ vy: 0
156
+ });
157
+ useEffect(() => {
158
+ if (tier === 0) {
159
+ return;
160
+ }
161
+ const c = canvasRef.current;
162
+ if (!c) {
163
+ return;
164
+ }
165
+ const gl = c.getContext("webgl");
166
+ if (!gl) {
167
+ return;
168
+ }
169
+ const compile = (type, source) => {
170
+ const s = gl.createShader(type);
171
+ gl.shaderSource(s, source);
172
+ gl.compileShader(s);
173
+ return s;
174
+ };
175
+ const prog = gl.createProgram();
176
+ gl.attachShader(prog, compile(gl.VERTEX_SHADER, VERT));
177
+ gl.attachShader(prog, compile(gl.FRAGMENT_SHADER, FRAG));
178
+ gl.linkProgram(prog);
179
+ gl.useProgram(prog);
180
+ gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer());
181
+ gl.bufferData(
182
+ gl.ARRAY_BUFFER,
183
+ new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]),
184
+ gl.STATIC_DRAW
185
+ );
186
+ const a = gl.getAttribLocation(prog, "a");
187
+ gl.enableVertexAttribArray(a);
188
+ gl.vertexAttribPointer(a, 2, gl.FLOAT, false, 0, 0);
189
+ const uT = gl.getUniformLocation(prog, "t");
190
+ const uR = gl.getUniformLocation(prog, "r");
191
+ const uImgSize = gl.getUniformLocation(prog, "imgSize");
192
+ const uVel = gl.getUniformLocation(prog, "vel");
193
+ const uTex = gl.getUniformLocation(prog, "tex");
194
+ const uTint = gl.getUniformLocation(prog, "tint");
195
+ const uTintStrength = gl.getUniformLocation(prog, "tintStrength");
196
+ const uBands = [];
197
+ for (let i = 0; i < NUM_BANDS; i++) {
198
+ uBands.push(gl.getUniformLocation(prog, `bands[${i}]`));
199
+ }
200
+ const texture = gl.createTexture();
201
+ gl.bindTexture(gl.TEXTURE_2D, texture);
202
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
203
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
204
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
205
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
206
+ gl.texImage2D(
207
+ gl.TEXTURE_2D,
208
+ 0,
209
+ gl.RGBA,
210
+ 1,
211
+ 1,
212
+ 0,
213
+ gl.RGBA,
214
+ gl.UNSIGNED_BYTE,
215
+ new Uint8Array([0, 0, 0, 255])
216
+ );
217
+ const img = new Image();
218
+ img.crossOrigin = "anonymous";
219
+ img.onload = () => {
220
+ state.current.imgW = img.naturalWidth;
221
+ state.current.imgH = img.naturalHeight;
222
+ gl.bindTexture(gl.TEXTURE_2D, texture);
223
+ gl.texImage2D(
224
+ gl.TEXTURE_2D,
225
+ 0,
226
+ gl.RGBA,
227
+ gl.RGBA,
228
+ gl.UNSIGNED_BYTE,
229
+ img
230
+ );
231
+ setLoaded(true);
232
+ };
233
+ img.src = src;
234
+ gl.activeTexture(gl.TEXTURE0);
235
+ gl.bindTexture(gl.TEXTURE_2D, texture);
236
+ gl.uniform1i(uTex, 0);
237
+ const resize = () => {
238
+ const rect = c.getBoundingClientRect();
239
+ const dpr = Math.min(devicePixelRatio, 2);
240
+ c.width = rect.width * dpr;
241
+ c.height = rect.height * dpr;
242
+ gl.viewport(0, 0, c.width, c.height);
243
+ };
244
+ resize();
245
+ const ro = new ResizeObserver(resize);
246
+ ro.observe(c);
247
+ const onMove = (e) => {
248
+ const rect = c.getBoundingClientRect();
249
+ state.current.mx = (e.clientX - rect.left) / rect.width;
250
+ state.current.my = (e.clientY - rect.top) / rect.height;
251
+ };
252
+ const onEnter = () => {
253
+ state.current.hoverTarget = 1;
254
+ };
255
+ const onLeave = () => {
256
+ state.current.hoverTarget = 0;
257
+ };
258
+ if (!autoPlayRef.current) {
259
+ c.addEventListener("pointermove", onMove);
260
+ c.addEventListener("pointerenter", onEnter);
261
+ c.addEventListener("pointerleave", onLeave);
262
+ }
263
+ const bandEaseRates = new Float32Array(NUM_BANDS);
264
+ for (let i = 0; i < NUM_BANDS; i++) {
265
+ bandEaseRates[i] = 0.02 + Math.random() * 0.06;
266
+ }
267
+ const tintVec = tint ? (() => {
268
+ const [tr, tg, tb] = hexToRgb(tint);
269
+ return [tr / 255, tg / 255, tb / 255];
270
+ })() : [1, 1, 1];
271
+ const t0 = performance.now();
272
+ let raf = 0;
273
+ let visible = !document.hidden;
274
+ let inView = true;
275
+ const loop = () => {
276
+ raf = requestAnimationFrame(loop);
277
+ const s = state.current;
278
+ const pattern = autoPlayRef.current ? AUTOPLAY_PATTERNS[autoPlayRef.current] : null;
279
+ if (pattern) {
280
+ const driven = pattern((performance.now() - t0) / 1e3);
281
+ s.mx = driven.mx;
282
+ s.my = driven.my;
283
+ s.hoverTarget = driven.hover;
284
+ }
285
+ const dvx = s.mx - s.prevMx;
286
+ const dvy = s.my - s.prevMy;
287
+ s.vx += (dvx * 8 - s.vx) * 0.1;
288
+ s.vy += (dvy * 8 - s.vy) * 0.1;
289
+ s.prevMx = s.mx;
290
+ s.prevMy = s.my;
291
+ const speed = Math.sqrt(s.vx * s.vx + s.vy * s.vy);
292
+ for (let i = 0; i < NUM_BANDS; i++) {
293
+ const bandCenter = (i + 0.5) / NUM_BANDS;
294
+ const dist = Math.abs(s.my - bandCenter);
295
+ const proximity = Math.max(0, 1 - dist / 0.3);
296
+ const activation = s.hoverTarget * proximity * (0.4 + Math.min(speed, 1) * 0.6);
297
+ s.bandTargets[i] = activation;
298
+ }
299
+ for (let i = 0; i < NUM_BANDS; i++) {
300
+ const rate = bandEaseRates[i];
301
+ const current = s.bands[i] ?? 0;
302
+ const target = s.bandTargets[i] ?? 0;
303
+ s.bands[i] = current + (target - current) * rate;
304
+ if (s.bands[i] < 1e-3) {
305
+ s.bands[i] = 0;
306
+ }
307
+ }
308
+ gl.uniform1f(uT, (performance.now() - t0) / 1e3);
309
+ gl.uniform2f(uR, c.width, c.height);
310
+ gl.uniform2f(uImgSize, s.imgW, s.imgH);
311
+ gl.uniform2f(uVel, s.vx, s.vy);
312
+ gl.uniform3f(uTint, tintVec[0], tintVec[1], tintVec[2]);
313
+ const ts = tintStrengthRef.current;
314
+ const defaultStrength = tint ? 0.35 : 0;
315
+ const defaultInactive = tint ? 0.15 : 0;
316
+ gl.uniform1f(
317
+ uTintStrength,
318
+ activeRef.current ? ts?.active ?? defaultStrength : ts?.inactive ?? defaultInactive
319
+ );
320
+ for (let i = 0; i < NUM_BANDS; i++) {
321
+ gl.uniform1f(uBands[i], s.bands[i]);
322
+ }
323
+ gl.bindTexture(gl.TEXTURE_2D, texture);
324
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
325
+ };
326
+ const start = () => {
327
+ if (visible && inView && !raf) {
328
+ raf = requestAnimationFrame(loop);
329
+ }
330
+ };
331
+ const stop = () => {
332
+ if (raf) {
333
+ cancelAnimationFrame(raf);
334
+ raf = 0;
335
+ }
336
+ };
337
+ const onVisibility = () => {
338
+ visible = !document.hidden;
339
+ visible ? start() : stop();
340
+ };
341
+ const io = new IntersectionObserver(
342
+ (entries) => {
343
+ inView = entries.some((e) => e.isIntersecting);
344
+ inView ? start() : stop();
345
+ },
346
+ { threshold: 0 }
347
+ );
348
+ io.observe(c);
349
+ document.addEventListener("visibilitychange", onVisibility);
350
+ start();
351
+ return () => {
352
+ stop();
353
+ io.disconnect();
354
+ document.removeEventListener("visibilitychange", onVisibility);
355
+ ro.disconnect();
356
+ c.removeEventListener("pointermove", onMove);
357
+ c.removeEventListener("pointerenter", onEnter);
358
+ c.removeEventListener("pointerleave", onLeave);
359
+ gl.deleteTexture(texture);
360
+ gl.deleteProgram(prog);
361
+ setLoaded(false);
362
+ };
363
+ }, [src, tier, tint]);
364
+ if (tier === 0) {
365
+ return (
366
+ // eslint-disable-next-line @next/next/no-img-element
367
+ /* @__PURE__ */ jsx(
368
+ "img",
369
+ {
370
+ alt: "",
371
+ className: cn(
372
+ "absolute inset-0 h-full w-full object-cover",
373
+ fallbackClassName ?? className
374
+ ),
375
+ fetchPriority: "high",
376
+ src,
377
+ style: { mixBlendMode: "overlay", ...style }
378
+ }
379
+ )
380
+ );
381
+ }
382
+ return /* @__PURE__ */ jsx(
383
+ "canvas",
384
+ {
385
+ className: cn(
386
+ "absolute inset-0 h-full w-full transition-opacity duration-500",
387
+ className
388
+ ),
389
+ ref: canvasRef,
390
+ style: {
391
+ mixBlendMode: "overlay",
392
+ opacity: loaded ? 1 : 0,
393
+ ...style
394
+ }
395
+ }
396
+ );
397
+ }
398
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuXG5pbXBvcnQgeyB1c2VHcHVUaWVyIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlLWdwdS10aWVyJ1xuaW1wb3J0IHsgY24sIGhleFRvUmdiIH0gZnJvbSAnLi4vLi4vdXRpbHMnXG5cbmNvbnN0IE5VTV9CQU5EUyA9IDEyXG5cbmNvbnN0IFZFUlQgPSBgYXR0cmlidXRlIHZlYzIgYTt2YXJ5aW5nIHZlYzIgdlV2O3ZvaWQgbWFpbigpe3ZVdj12ZWMyKGEueCouNSsuNSwuNS1hLnkqLjUpO2dsX1Bvc2l0aW9uPXZlYzQoYSwwLDEpO31gXG5cbmNvbnN0IEZSQUcgPSBgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xudW5pZm9ybSBmbG9hdCB0O1xudW5pZm9ybSB2ZWMyIHIsaW1nU2l6ZSx2ZWw7XG51bmlmb3JtIHNhbXBsZXIyRCB0ZXg7XG51bmlmb3JtIGZsb2F0IGJhbmRzWyR7TlVNX0JBTkRTfV07XG51bmlmb3JtIHZlYzMgdGludDtcbnVuaWZvcm0gZmxvYXQgdGludFN0cmVuZ3RoO1xudmFyeWluZyB2ZWMyIHZVdjtcblxuZmxvYXQgaCh2ZWMyIHApe3JldHVybiBmcmFjdChzaW4oZG90KHAsdmVjMigxMjcuMSwzMTEuNykpKSo0Mzc1OC41NDUzKTt9XG5cbi8vIGNvdmVyLXN0eWxlIFVWOiBjcm9wcyB0aGUgaW1hZ2UgdG8gZmlsbCB0aGUgY2FudmFzLCBjZW50ZXJlZFxudmVjMiBjb3ZlclVWKHZlYzIgdXYpe1xuICBmbG9hdCBjYW52YXNBc3BlY3Q9ci54L3IueTtcbiAgZmxvYXQgaW1nQXNwZWN0PWltZ1NpemUueC9pbWdTaXplLnk7XG4gIHZlYzIgc2NhbGU9Y2FudmFzQXNwZWN0PmltZ0FzcGVjdFxuICAgID92ZWMyKDEuMCxpbWdBc3BlY3QvY2FudmFzQXNwZWN0KVxuICAgIDp2ZWMyKGNhbnZhc0FzcGVjdC9pbWdBc3BlY3QsMS4wKTtcbiAgcmV0dXJuKHV2LTAuNSkqc2NhbGUrMC41O1xufVxuXG52b2lkIG1haW4oKXtcbiAgdmVjMiB1dj1jb3ZlclVWKHZVdik7XG4gIGZsb2F0IHNjYW5ZPWZsb29yKHZVdi55KnIueSk7XG5cbiAgZmxvYXQgYmFuZEY9dlV2LnkqJHtOVU1fQkFORFN9LjA7XG4gIGludCBiYW5kSWR4PWludChmbG9vcihiYW5kRikpO1xuICBmbG9hdCBiYW5kRnJhYz1mcmFjdChiYW5kRik7XG5cbiAgZmxvYXQgc3RyZW5ndGg9MC4wO1xuICBmb3IoaW50IGk9MDtpPCR7TlVNX0JBTkRTfTtpKyspe1xuICAgIGlmKGk9PWJhbmRJZHgpIHN0cmVuZ3RoPWJhbmRzW2ldO1xuICB9XG5cbiAgZmxvYXQgbmVpZ2hib3JTdHI9MC4wO1xuICBpbnQgbmVpZ2hib3JJZHg9YmFuZEZyYWM+LjU/YmFuZElkeCsxOmJhbmRJZHgtMTtcbiAgZm9yKGludCBpPTA7aTwke05VTV9CQU5EU307aSsrKXtcbiAgICBpZihpPT1uZWlnaGJvcklkeCkgbmVpZ2hib3JTdHI9YmFuZHNbaV07XG4gIH1cbiAgZmxvYXQgZWRnZUJsZW5kPWFicyhiYW5kRnJhYy0uNSkqMi4wO1xuICBlZGdlQmxlbmQqPWVkZ2VCbGVuZDtcbiAgc3RyZW5ndGg9bWl4KHN0cmVuZ3RoLG5laWdoYm9yU3RyLGVkZ2VCbGVuZCouMyk7XG5cbiAgZmxvYXQgc3BlZWQ9bGVuZ3RoKHZlbCk7XG4gIGZsb2F0IGRpckJsZW5kPXNtb290aHN0ZXAoMC4wLDAuMDIsc3BlZWQpO1xuICB2ZWMyIGRpcj1zcGVlZD4uMDAwMT92ZWwvc3BlZWQ6dmVjMigwKTtcbiAgZGlyKj1kaXJCbGVuZDtcblxuICBmbG9hdCByb3dTZWVkPWgodmVjMihzY2FuWSxmbG9vcih0KjMuKStmbG9hdChiYW5kSWR4KSo3LikpO1xuICBmbG9hdCByb3dWYXI9bWl4KC40LDEuMCxyb3dTZWVkKTtcblxuICBmbG9hdCB5U21vb3RoPXZVdi55KjYuMCt0KjAuNztcbiAgZmxvYXQgeU5vaXNlPW1peChoKHZlYzIoZmxvb3IoeVNtb290aCksMTMuKSksaCh2ZWMyKGZsb29yKHlTbW9vdGgpKzEuMCwxMy4pKSxzbW9vdGhzdGVwKDAuMCwxLjAsZnJhY3QoeVNtb290aCkpKTtcbiAgZmxvYXQgY29sVmFyPW1peCguNCwxLjAseU5vaXNlKTtcblxuICBmbG9hdCB0ZWFyU2hpZnRYPWRpci54KnN0cmVuZ3RoKnJvd1ZhciowLjE1O1xuICBmbG9hdCB0ZWFyU2hpZnRZPWRpci55KnN0cmVuZ3RoKmNvbFZhciowLjEwO1xuXG4gIGZsb2F0IGJhbmRTZWVkPWgodmVjMihmbG9hdChiYW5kSWR4KSw0Mi4pKTtcbiAgdGVhclNoaWZ0WCs9c3RyZW5ndGgqKC41LWJhbmRTZWVkKSowLjA1O1xuXG4gIGZsb2F0IHlKaXR0ZXI9bWl4KGgodmVjMihmbG9vcih5U21vb3RoKSw3My4pKSxoKHZlYzIoZmxvb3IoeVNtb290aCkrMS4wLDczLikpLHNtb290aHN0ZXAoMC4wLDEuMCxmcmFjdCh5U21vb3RoKSkpO1xuICB0ZWFyU2hpZnRZKz1zdHJlbmd0aCooLjUteUppdHRlcikqMC4wMzU7XG5cbiAgdXYueCs9dGVhclNoaWZ0WDtcbiAgdXYueSs9dGVhclNoaWZ0WTtcblxuICBmbG9hdCBzb3J0R2F0ZT1zdGVwKC41LHN0cmVuZ3RoKSpzdGVwKC40LHJvd1NlZWQpO1xuICB1di54Kz1kaXIueCpzb3J0R2F0ZSpzdHJlbmd0aCowLjAzO1xuICB1di55Kz1kaXIueSpzb3J0R2F0ZSpzdHJlbmd0aCowLjAyO1xuXG4gIGZsb2F0IGNhWD1hYnModGVhclNoaWZ0WCkqMi41K3NvcnRHYXRlKnN0cmVuZ3RoKjAuMDE7XG4gIGZsb2F0IGNhWT1hYnModGVhclNoaWZ0WSkqMi41K3NvcnRHYXRlKnN0cmVuZ3RoKjAuMDE7XG4gIGZsb2F0IGNyPXRleHR1cmUyRCh0ZXgsdmVjMih1di54K2NhWCx1di55K2NhWSkpLnI7XG4gIGZsb2F0IGNnPXRleHR1cmUyRCh0ZXgsdXYpLmc7XG4gIGZsb2F0IGNiPXRleHR1cmUyRCh0ZXgsdmVjMih1di54LWNhWCx1di55LWNhWSkpLmI7XG5cbiAgdmVjMyBjb2w9dmVjMyhjcixjZyxjYik7XG5cbiAgY29sKj0uOTcrLjAzKnNpbih2VXYueSpyLnkqMy4xNDE1OSk7XG5cbiAgZmxvYXQgYmFuZEVkZ2U9c21vb3Roc3RlcCguMDIsLjAsbWluKGJhbmRGcmFjLDEuMC1iYW5kRnJhYykpO1xuICBjb2wrPXZlYzMoYmFuZEVkZ2Uqc3RyZW5ndGgqLjEpO1xuXG4gIGNvbD1taXgoY29sLGNvbCp0aW50LHRpbnRTdHJlbmd0aCk7XG5cbiAgZ2xfRnJhZ0NvbG9yPXZlYzQoY29sLDEuMCk7XG59YFxuXG4vKipcbiAqIENob3Jlb2dyYXBoZWQgbW90aW9uIHBhdHRlcm5zIHVzZWQgd2hlbiBgYXV0b1BsYXlgIGlzIHNldC4gRWFjaCBwYXR0ZXJuXG4gKiByZXR1cm5zIGEgc3ludGhldGljIHBvaW50ZXIgcG9zaXRpb24gaW4gWzAsMV0gYW5kIGEgaG92ZXIgaW50ZW5zaXR5IGluXG4gKiBbMCwxXSBmb3IgdGhlIGN1cnJlbnQgdGltZSAoc2Vjb25kcykuIFRoZXkgZHJpdmUgdGhlIHNoYWRlciB3aXRob3V0XG4gKiByZXF1aXJpbmcgYSByZWFsIHBvaW50ZXIsIHdoaWNoIGlzIHdoYXQgbGV0cyB1cyByZWNvcmQgdGhlIGRpc3RvcnRpb25cbiAqIGFzIGEgR0lGIC8gc2NyZWVuc2hvdCAvIHBvc3Rlci5cbiAqL1xuY29uc3QgQVVUT1BMQVlfUEFUVEVSTlM6IFJlY29yZDxcbiAgQXV0b1BsYXlQYXR0ZXJuLFxuICAodDogbnVtYmVyKSA9PiB7IGhvdmVyOiBudW1iZXI7IG14OiBudW1iZXI7IG15OiBudW1iZXIgfVxuPiA9IHtcbiAgYWdncmVzc2l2ZTogdCA9PiB7XG4gICAgY29uc3QgY3ljbGUgPSAxLjRcbiAgICBjb25zdCBwaGFzZSA9ICh0ICUgY3ljbGUpIC8gY3ljbGVcbiAgICBjb25zdCBzdGFiID0gTWF0aC5leHAoLSgocGhhc2UgLSAwLjE1KSAqKiAyKSAqIDI2MClcbiAgICBjb25zdCBhbmdsZSA9IE1hdGguZmxvb3IodCAvIGN5Y2xlKSAqIDEuMzdcbiAgICBjb25zdCBteCA9IDAuNSArIE1hdGguY29zKGFuZ2xlKSAqIDAuNDIgKiAoc3RhYiArIDAuMTUpXG4gICAgY29uc3QgbXkgPSAwLjUgKyBNYXRoLnNpbihhbmdsZSkgKiAwLjM4ICogKHN0YWIgKyAwLjE1KVxuXG4gICAgcmV0dXJuIHsgaG92ZXI6IDAuNTUgKyBzdGFiICogMC40NSwgbXgsIG15IH1cbiAgfSxcbiAgZ2VudGxlOiB0ID0+ICh7XG4gICAgaG92ZXI6IDAuNDUgKyBNYXRoLnNpbih0ICogMC45KSAqIDAuMSxcbiAgICBteDogMC41ICsgTWF0aC5zaW4odCAqIDAuNSkgKiAwLjI4LFxuICAgIG15OiAwLjUgKyBNYXRoLmNvcyh0ICogMC4zNykgKiAwLjIyXG4gIH0pLFxuICBzbGFzaDogdCA9PiB7XG4gICAgLy8gTG9uZyBicmVhdGggLT4gc3dvcmQgc2xhc2ggLT4gcmVjb2lsIHR3aXRjaCwgcmVwZWF0aW5nLlxuICAgIGNvbnN0IGN5Y2xlID0gMy42XG4gICAgY29uc3QgcGhhc2UgPSAodCAlIGN5Y2xlKSAvIGN5Y2xlXG4gICAgY29uc3Qgc2xhc2ggPSBNYXRoLmV4cCgtKChwaGFzZSAtIDAuMjgpICoqIDIpICogMTgwKVxuICAgIGNvbnN0IG1pY3JvID0gTWF0aC5leHAoLSgocGhhc2UgLSAwLjcpICoqIDIpICogMzQwKVxuXG4gICAgY29uc3QgZHJpZnRYID0gMC41ICsgTWF0aC5zaW4odCAqIDAuNykgKiAwLjE2XG4gICAgY29uc3QgZHJpZnRZID0gMC41NSArIE1hdGguY29zKHQgKiAwLjUpICogMC4xNFxuXG4gICAgLy8gU2xhc2ggdHJhamVjdG9yeTogYm90dG9tLWxlZnQgdXAgaW50byB0aGUgZ2lhbnQncyBjaGVzdCAodG9wLXJpZ2h0KS5cbiAgICBjb25zdCBzbGFzaFggPSAtMC4xNSArIHBoYXNlICogMS41NVxuICAgIGNvbnN0IHNsYXNoWSA9IDAuOTUgLSBwaGFzZSAqIDEuMzVcblxuICAgIGNvbnN0IG14ID0gZHJpZnRYICogKDEgLSBzbGFzaCkgKyBzbGFzaFggKiBzbGFzaFxuICAgIGNvbnN0IG15ID0gZHJpZnRZICogKDEgLSBzbGFzaCkgKyBzbGFzaFkgKiBzbGFzaFxuXG4gICAgcmV0dXJuIHsgaG92ZXI6IDAuNSArIHNsYXNoICogMC41ICsgbWljcm8gKiAwLjM1LCBteCwgbXkgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBJbWFnZURpc3RvcnRpb24oe1xuICBhY3RpdmUgPSB0cnVlLFxuICBhdXRvUGxheSxcbiAgY2xhc3NOYW1lLFxuICBmYWxsYmFja0NsYXNzTmFtZSxcbiAgc3JjLFxuICBzdHlsZSxcbiAgdGludCxcbiAgdGludFN0cmVuZ3RoXG59OiBJbWFnZURpc3RvcnRpb25Qcm9wcykge1xuICBjb25zdCBjYW52YXNSZWYgPSB1c2VSZWY8SFRNTENhbnZhc0VsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IHRpZXIgPSB1c2VHcHVUaWVyKClcbiAgY29uc3QgW2xvYWRlZCwgc2V0TG9hZGVkXSA9IHVzZVN0YXRlKGZhbHNlKVxuXG4gIGNvbnN0IGFjdGl2ZVJlZiA9IHVzZVJlZihhY3RpdmUpXG4gIGFjdGl2ZVJlZi5jdXJyZW50ID0gYWN0aXZlXG4gIGNvbnN0IHRpbnRTdHJlbmd0aFJlZiA9IHVzZVJlZih0aW50U3RyZW5ndGgpXG4gIHRpbnRTdHJlbmd0aFJlZi5jdXJyZW50ID0gdGludFN0cmVuZ3RoXG4gIGNvbnN0IGF1dG9QbGF5UmVmID0gdXNlUmVmKGF1dG9QbGF5KVxuICBhdXRvUGxheVJlZi5jdXJyZW50ID0gYXV0b1BsYXlcblxuICBjb25zdCBzdGF0ZSA9IHVzZVJlZih7XG4gICAgYmFuZFRhcmdldHM6IG5ldyBGbG9hdDMyQXJyYXkoTlVNX0JBTkRTKSxcbiAgICBiYW5kczogbmV3IEZsb2F0MzJBcnJheShOVU1fQkFORFMpLFxuICAgIGhvdmVyVGFyZ2V0OiAwLFxuICAgIGltZ0g6IDEsXG4gICAgaW1nVzogMSxcbiAgICBteDogMC41LFxuICAgIG15OiAwLjUsXG4gICAgcHJldk14OiAwLjUsXG4gICAgcHJldk15OiAwLjUsXG4gICAgdng6IDAsXG4gICAgdnk6IDBcbiAgfSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0aWVyID09PSAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjID0gY2FudmFzUmVmLmN1cnJlbnRcblxuICAgIGlmICghYykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZ2wgPSBjLmdldENvbnRleHQoJ3dlYmdsJylcblxuICAgIGlmICghZ2wpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNvbXBpbGUgPSAodHlwZTogbnVtYmVyLCBzb3VyY2U6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgcyA9IGdsLmNyZWF0ZVNoYWRlcih0eXBlKSFcbiAgICAgIGdsLnNoYWRlclNvdXJjZShzLCBzb3VyY2UpXG4gICAgICBnbC5jb21waWxlU2hhZGVyKHMpXG5cbiAgICAgIHJldHVybiBzXG4gICAgfVxuXG4gICAgY29uc3QgcHJvZyA9IGdsLmNyZWF0ZVByb2dyYW0oKSFcbiAgICBnbC5hdHRhY2hTaGFkZXIocHJvZywgY29tcGlsZShnbC5WRVJURVhfU0hBREVSLCBWRVJUKSlcbiAgICBnbC5hdHRhY2hTaGFkZXIocHJvZywgY29tcGlsZShnbC5GUkFHTUVOVF9TSEFERVIsIEZSQUcpKVxuICAgIGdsLmxpbmtQcm9ncmFtKHByb2cpXG4gICAgZ2wudXNlUHJvZ3JhbShwcm9nKVxuXG4gICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGdsLmNyZWF0ZUJ1ZmZlcigpKVxuICAgIGdsLmJ1ZmZlckRhdGEoXG4gICAgICBnbC5BUlJBWV9CVUZGRVIsXG4gICAgICBuZXcgRmxvYXQzMkFycmF5KFstMSwgLTEsIDEsIC0xLCAtMSwgMSwgMSwgMV0pLFxuICAgICAgZ2wuU1RBVElDX0RSQVdcbiAgICApXG5cbiAgICBjb25zdCBhID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZywgJ2EnKVxuICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGEpXG4gICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihhLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApXG5cbiAgICBjb25zdCB1VCA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9nLCAndCcpXG4gICAgY29uc3QgdVIgPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZywgJ3InKVxuICAgIGNvbnN0IHVJbWdTaXplID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2csICdpbWdTaXplJylcbiAgICBjb25zdCB1VmVsID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2csICd2ZWwnKVxuICAgIGNvbnN0IHVUZXggPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZywgJ3RleCcpXG4gICAgY29uc3QgdVRpbnQgPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZywgJ3RpbnQnKVxuICAgIGNvbnN0IHVUaW50U3RyZW5ndGggPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZywgJ3RpbnRTdHJlbmd0aCcpXG4gICAgY29uc3QgdUJhbmRzOiAobnVsbCB8IFdlYkdMVW5pZm9ybUxvY2F0aW9uKVtdID0gW11cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTlVNX0JBTkRTOyBpKyspIHtcbiAgICAgIHVCYW5kcy5wdXNoKGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9nLCBgYmFuZHNbJHtpfV1gKSlcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpIVxuICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpXG4gICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSlcbiAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKVxuICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVIpXG4gICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUilcbiAgICBnbC50ZXhJbWFnZTJEKFxuICAgICAgZ2wuVEVYVFVSRV8yRCxcbiAgICAgIDAsXG4gICAgICBnbC5SR0JBLFxuICAgICAgMSxcbiAgICAgIDEsXG4gICAgICAwLFxuICAgICAgZ2wuUkdCQSxcbiAgICAgIGdsLlVOU0lHTkVEX0JZVEUsXG4gICAgICBuZXcgVWludDhBcnJheShbMCwgMCwgMCwgMjU1XSlcbiAgICApXG5cbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKVxuICAgIGltZy5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnXG5cbiAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgc3RhdGUuY3VycmVudC5pbWdXID0gaW1nLm5hdHVyYWxXaWR0aFxuICAgICAgc3RhdGUuY3VycmVudC5pbWdIID0gaW1nLm5hdHVyYWxIZWlnaHRcbiAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpXG4gICAgICBnbC50ZXhJbWFnZTJEKFxuICAgICAgICBnbC5URVhUVVJFXzJELFxuICAgICAgICAwLFxuICAgICAgICBnbC5SR0JBLFxuICAgICAgICBnbC5SR0JBLFxuICAgICAgICBnbC5VTlNJR05FRF9CWVRFLFxuICAgICAgICBpbWdcbiAgICAgIClcbiAgICAgIHNldExvYWRlZCh0cnVlKVxuICAgIH1cblxuICAgIGltZy5zcmMgPSBzcmNcblxuICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTApXG4gICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSlcbiAgICBnbC51bmlmb3JtMWkodVRleCwgMClcblxuICAgIGNvbnN0IHJlc2l6ZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHJlY3QgPSBjLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICBjb25zdCBkcHIgPSBNYXRoLm1pbihkZXZpY2VQaXhlbFJhdGlvLCAyKVxuICAgICAgYy53aWR0aCA9IHJlY3Qud2lkdGggKiBkcHJcbiAgICAgIGMuaGVpZ2h0ID0gcmVjdC5oZWlnaHQgKiBkcHJcbiAgICAgIGdsLnZpZXdwb3J0KDAsIDAsIGMud2lkdGgsIGMuaGVpZ2h0KVxuICAgIH1cblxuICAgIHJlc2l6ZSgpXG4gICAgY29uc3Qgcm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIocmVzaXplKVxuICAgIHJvLm9ic2VydmUoYylcblxuICAgIGNvbnN0IG9uTW92ZSA9IChlOiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHJlY3QgPSBjLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICBzdGF0ZS5jdXJyZW50Lm14ID0gKGUuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoXG4gICAgICBzdGF0ZS5jdXJyZW50Lm15ID0gKGUuY2xpZW50WSAtIHJlY3QudG9wKSAvIHJlY3QuaGVpZ2h0XG4gICAgfVxuXG4gICAgY29uc3Qgb25FbnRlciA9ICgpID0+IHtcbiAgICAgIHN0YXRlLmN1cnJlbnQuaG92ZXJUYXJnZXQgPSAxXG4gICAgfVxuXG4gICAgY29uc3Qgb25MZWF2ZSA9ICgpID0+IHtcbiAgICAgIHN0YXRlLmN1cnJlbnQuaG92ZXJUYXJnZXQgPSAwXG4gICAgfVxuXG4gICAgLy8gV2hlbiBhdXRvUGxheSBkcml2ZXMgdGhlIGRpc3RvcnRpb24gd2Ugd2FudCB0aGUgcG9zdGVyIHRvIGxvb2tcbiAgICAvLyBhbGl2ZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYSBwb2ludGVyIGlzIG5lYXIgdGhlIGNhbnZhcywgc28gd2VcbiAgICAvLyBza2lwIHRoZSByZWFsIHBvaW50ZXIgbGlzdGVuZXJzIGVudGlyZWx5LlxuICAgIGlmICghYXV0b1BsYXlSZWYuY3VycmVudCkge1xuICAgICAgYy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG9uTW92ZSlcbiAgICAgIGMuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmVudGVyJywgb25FbnRlcilcbiAgICAgIGMuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJywgb25MZWF2ZSlcbiAgICB9XG5cbiAgICBjb25zdCBiYW5kRWFzZVJhdGVzID0gbmV3IEZsb2F0MzJBcnJheShOVU1fQkFORFMpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE5VTV9CQU5EUzsgaSsrKSB7XG4gICAgICBiYW5kRWFzZVJhdGVzW2ldID0gMC4wMiArIE1hdGgucmFuZG9tKCkgKiAwLjA2XG4gICAgfVxuXG4gICAgY29uc3QgdGludFZlYzogcmVhZG9ubHkgW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gdGludFxuICAgICAgPyAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFt0ciwgdGcsIHRiXSA9IGhleFRvUmdiKHRpbnQpXG5cbiAgICAgICAgICByZXR1cm4gW3RyIC8gMjU1LCB0ZyAvIDI1NSwgdGIgLyAyNTVdIGFzIGNvbnN0XG4gICAgICAgIH0pKClcbiAgICAgIDogKFsxLCAxLCAxXSBhcyBjb25zdClcblxuICAgIGNvbnN0IHQwID0gcGVyZm9ybWFuY2Uubm93KClcbiAgICBsZXQgcmFmID0gMFxuICAgIGxldCB2aXNpYmxlID0gIWRvY3VtZW50LmhpZGRlblxuICAgIGxldCBpblZpZXcgPSB0cnVlXG5cbiAgICBjb25zdCBsb29wID0gKCkgPT4ge1xuICAgICAgcmFmID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApXG4gICAgICBjb25zdCBzID0gc3RhdGUuY3VycmVudFxuXG4gICAgICBjb25zdCBwYXR0ZXJuID0gYXV0b1BsYXlSZWYuY3VycmVudFxuICAgICAgICA/IEFVVE9QTEFZX1BBVFRFUk5TW2F1dG9QbGF5UmVmLmN1cnJlbnRdXG4gICAgICAgIDogbnVsbFxuXG4gICAgICBpZiAocGF0dGVybikge1xuICAgICAgICBjb25zdCBkcml2ZW4gPSBwYXR0ZXJuKChwZXJmb3JtYW5jZS5ub3coKSAtIHQwKSAvIDFlMylcbiAgICAgICAgcy5teCA9IGRyaXZlbi5teFxuICAgICAgICBzLm15ID0gZHJpdmVuLm15XG4gICAgICAgIHMuaG92ZXJUYXJnZXQgPSBkcml2ZW4uaG92ZXJcbiAgICAgIH1cblxuICAgICAgY29uc3QgZHZ4ID0gcy5teCAtIHMucHJldk14XG4gICAgICBjb25zdCBkdnkgPSBzLm15IC0gcy5wcmV2TXlcbiAgICAgIHMudnggKz0gKGR2eCAqIDggLSBzLnZ4KSAqIDAuMVxuICAgICAgcy52eSArPSAoZHZ5ICogOCAtIHMudnkpICogMC4xXG4gICAgICBzLnByZXZNeCA9IHMubXhcbiAgICAgIHMucHJldk15ID0gcy5teVxuXG4gICAgICBjb25zdCBzcGVlZCA9IE1hdGguc3FydChzLnZ4ICogcy52eCArIHMudnkgKiBzLnZ5KVxuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE5VTV9CQU5EUzsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGJhbmRDZW50ZXIgPSAoaSArIDAuNSkgLyBOVU1fQkFORFNcbiAgICAgICAgY29uc3QgZGlzdCA9IE1hdGguYWJzKHMubXkgLSBiYW5kQ2VudGVyKVxuICAgICAgICBjb25zdCBwcm94aW1pdHkgPSBNYXRoLm1heCgwLCAxIC0gZGlzdCAvIDAuMylcbiAgICAgICAgY29uc3QgYWN0aXZhdGlvbiA9XG4gICAgICAgICAgcy5ob3ZlclRhcmdldCAqIHByb3hpbWl0eSAqICgwLjQgKyBNYXRoLm1pbihzcGVlZCwgMSkgKiAwLjYpXG4gICAgICAgIHMuYmFuZFRhcmdldHNbaV0gPSBhY3RpdmF0aW9uXG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTlVNX0JBTkRTOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmF0ZSA9IGJhbmRFYXNlUmF0ZXNbaV0hXG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBzLmJhbmRzW2ldID8/IDBcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcy5iYW5kVGFyZ2V0c1tpXSA/PyAwXG4gICAgICAgIHMuYmFuZHNbaV0gPSBjdXJyZW50ICsgKHRhcmdldCAtIGN1cnJlbnQpICogcmF0ZVxuXG4gICAgICAgIGlmIChzLmJhbmRzW2ldISA8IDAuMDAxKSB7XG4gICAgICAgICAgcy5iYW5kc1tpXSA9IDBcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBnbC51bmlmb3JtMWYodVQsIChwZXJmb3JtYW5jZS5ub3coKSAtIHQwKSAvIDFlMylcbiAgICAgIGdsLnVuaWZvcm0yZih1UiwgYy53aWR0aCwgYy5oZWlnaHQpXG4gICAgICBnbC51bmlmb3JtMmYodUltZ1NpemUsIHMuaW1nVywgcy5pbWdIKVxuICAgICAgZ2wudW5pZm9ybTJmKHVWZWwsIHMudngsIHMudnkpXG4gICAgICBnbC51bmlmb3JtM2YodVRpbnQsIHRpbnRWZWNbMF0sIHRpbnRWZWNbMV0sIHRpbnRWZWNbMl0pXG5cbiAgICAgIGNvbnN0IHRzID0gdGludFN0cmVuZ3RoUmVmLmN1cnJlbnRcbiAgICAgIGNvbnN0IGRlZmF1bHRTdHJlbmd0aCA9IHRpbnQgPyAwLjM1IDogMFxuICAgICAgY29uc3QgZGVmYXVsdEluYWN0aXZlID0gdGludCA/IDAuMTUgOiAwXG4gICAgICBnbC51bmlmb3JtMWYoXG4gICAgICAgIHVUaW50U3RyZW5ndGgsXG4gICAgICAgIGFjdGl2ZVJlZi5jdXJyZW50XG4gICAgICAgICAgPyAodHM/LmFjdGl2ZSA/PyBkZWZhdWx0U3RyZW5ndGgpXG4gICAgICAgICAgOiAodHM/LmluYWN0aXZlID8/IGRlZmF1bHRJbmFjdGl2ZSlcbiAgICAgIClcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOVU1fQkFORFM7IGkrKykge1xuICAgICAgICBnbC51bmlmb3JtMWYodUJhbmRzW2ldISwgcy5iYW5kc1tpXSEpXG4gICAgICB9XG5cbiAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpXG4gICAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFX1NUUklQLCAwLCA0KVxuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ID0gKCkgPT4ge1xuICAgICAgaWYgKHZpc2libGUgJiYgaW5WaWV3ICYmICFyYWYpIHtcbiAgICAgICAgcmFmID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGxvb3ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcCA9ICgpID0+IHtcbiAgICAgIGlmIChyYWYpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmKVxuICAgICAgICByYWYgPSAwXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb25WaXNpYmlsaXR5ID0gKCkgPT4ge1xuICAgICAgdmlzaWJsZSA9ICFkb2N1bWVudC5oaWRkZW5cbiAgICAgIHZpc2libGUgPyBzdGFydCgpIDogc3RvcCgpXG4gICAgfVxuXG4gICAgY29uc3QgaW8gPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoXG4gICAgICBlbnRyaWVzID0+IHtcbiAgICAgICAgaW5WaWV3ID0gZW50cmllcy5zb21lKGUgPT4gZS5pc0ludGVyc2VjdGluZylcbiAgICAgICAgaW5WaWV3ID8gc3RhcnQoKSA6IHN0b3AoKVxuICAgICAgfSxcbiAgICAgIHsgdGhyZXNob2xkOiAwIH1cbiAgICApXG5cbiAgICBpby5vYnNlcnZlKGMpXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIG9uVmlzaWJpbGl0eSlcblxuICAgIHN0YXJ0KClcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBzdG9wKClcbiAgICAgIGlvLmRpc2Nvbm5lY3QoKVxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIG9uVmlzaWJpbGl0eSlcbiAgICAgIHJvLmRpc2Nvbm5lY3QoKVxuICAgICAgYy5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG9uTW92ZSlcbiAgICAgIGMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmVudGVyJywgb25FbnRlcilcbiAgICAgIGMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJywgb25MZWF2ZSlcbiAgICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZSlcbiAgICAgIGdsLmRlbGV0ZVByb2dyYW0ocHJvZylcbiAgICAgIHNldExvYWRlZChmYWxzZSlcbiAgICB9XG4gICAgLy8gYXV0b1BsYXkgaXMgaW50ZW50aW9uYWxseSBvbWl0dGVkIHNvIHRvZ2dsaW5nIGl0IGF0IHJ1bnRpbWUgZG9lc24ndFxuICAgIC8vIHRlYXIgZG93biB0aGUgc2hhZGVyIHBpcGVsaW5lLiBUaGUgcmVmLWRyaXZlbiBsb29wIHJlYWRzIHRoZSBsaXZlXG4gICAgLy8gdmFsdWUgZWFjaCBmcmFtZSwgc28gbGlzdGVuZXIgYXR0YWNoL2RldGFjaCBpcyBoYW5kbGVkIG9uY2Ugb24gbW91bnQuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbc3JjLCB0aWVyLCB0aW50XSlcblxuICBpZiAodGllciA9PT0gMCkge1xuICAgIHJldHVybiAoXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQG5leHQvbmV4dC9uby1pbWctZWxlbWVudFxuICAgICAgPGltZ1xuICAgICAgICBhbHQ9XCJcIlxuICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICdhYnNvbHV0ZSBpbnNldC0wIGgtZnVsbCB3LWZ1bGwgb2JqZWN0LWNvdmVyJyxcbiAgICAgICAgICBmYWxsYmFja0NsYXNzTmFtZSA/PyBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgZmV0Y2hQcmlvcml0eT1cImhpZ2hcIlxuICAgICAgICBzcmM9e3NyY31cbiAgICAgICAgc3R5bGU9e3sgbWl4QmxlbmRNb2RlOiAnb3ZlcmxheScsIC4uLnN0eWxlIH19XG4gICAgICAvPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGNhbnZhc1xuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2Fic29sdXRlIGluc2V0LTAgaC1mdWxsIHctZnVsbCB0cmFuc2l0aW9uLW9wYWNpdHkgZHVyYXRpb24tNTAwJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgcmVmPXtjYW52YXNSZWZ9XG4gICAgICBzdHlsZT17e1xuICAgICAgICBtaXhCbGVuZE1vZGU6ICdvdmVybGF5JyxcbiAgICAgICAgb3BhY2l0eTogbG9hZGVkID8gMSA6IDAsXG4gICAgICAgIC4uLnN0eWxlXG4gICAgICB9fVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IHR5cGUgQXV0b1BsYXlQYXR0ZXJuID0gJ2FnZ3Jlc3NpdmUnIHwgJ2dlbnRsZScgfCAnc2xhc2gnXG5cbmludGVyZmFjZSBJbWFnZURpc3RvcnRpb25Qcm9wcyB7XG4gIGFjdGl2ZT86IGJvb2xlYW5cbiAgLyoqXG4gICAqIERyaXZlIHRoZSBkaXN0b3J0aW9uIHdpdGggYSBjaG9yZW9ncmFwaGVkIG1vdGlvbiBwYXR0ZXJuIGluc3RlYWQgb2ZcbiAgICogd2FpdGluZyBmb3IgYSByZWFsIHBvaW50ZXIuIFVzZWZ1bCBmb3IgcG9zdGVycywgc29jaWFsIGNsaXBzLCBhbmQgYW55XG4gICAqIGNvbnRleHQgd2hlcmUgdGhlIGltYWdlIG5lZWRzIHRvIGZlZWwgYWxpdmUgb24gaXRzIG93bi5cbiAgICovXG4gIGF1dG9QbGF5PzogQXV0b1BsYXlQYXR0ZXJuXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICBmYWxsYmFja0NsYXNzTmFtZT86IHN0cmluZ1xuICBzcmM6IHN0cmluZ1xuICBzdHlsZT86IFJlYWN0LkNTU1Byb3BlcnRpZXNcbiAgdGludD86IHN0cmluZ1xuICB0aW50U3RyZW5ndGg/OiB7IGFjdGl2ZTogbnVtYmVyOyBpbmFjdGl2ZTogbnVtYmVyIH1cbn1cbiJd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
@@ -0,0 +1 @@
1
+ export declare function Input({ className, ...props }: React.InputHTMLAttributes<HTMLInputElement>): import("react").JSX.Element;
@@ -0,0 +1,21 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { cn } from "../../utils/index.js";
3
+ export function Input({
4
+ className,
5
+ ...props
6
+ }) {
7
+ return /* @__PURE__ */ jsx(
8
+ "input",
9
+ {
10
+ className: cn(
11
+ "flex h-9 w-full border border-midground/15 bg-background/40 px-3 py-1 font-courier text-sm transition-colors",
12
+ "placeholder:text-midground/50",
13
+ "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-midground/30 focus-visible:border-midground/25",
14
+ "disabled:cursor-not-allowed disabled:opacity-50",
15
+ className
16
+ ),
17
+ ...props
18
+ }
19
+ );
20
+ }
21
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIElucHV0KHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuSW5wdXRIVE1MQXR0cmlidXRlczxIVE1MSW5wdXRFbGVtZW50Pikge1xuICByZXR1cm4gKFxuICAgIDxpbnB1dFxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2ZsZXggaC05IHctZnVsbCBib3JkZXIgYm9yZGVyLW1pZGdyb3VuZC8xNSBiZy1iYWNrZ3JvdW5kLzQwIHB4LTMgcHktMSBmb250LWNvdXJpZXIgdGV4dC1zbSB0cmFuc2l0aW9uLWNvbG9ycycsXG4gICAgICAgICdwbGFjZWhvbGRlcjp0ZXh0LW1pZGdyb3VuZC81MCcsXG4gICAgICAgICdmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMSBmb2N1cy12aXNpYmxlOnJpbmctbWlkZ3JvdW5kLzMwIGZvY3VzLXZpc2libGU6Ym9yZGVyLW1pZGdyb3VuZC8yNScsXG4gICAgICAgICdkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6b3BhY2l0eS01MCcsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbiJdLAogICJtYXBwaW5ncyI6ICJBQU9JO0FBUEosU0FBUyxVQUFVO0FBRVosZ0JBQVMsTUFBTTtBQUFBLEVBQ3BCO0FBQUEsRUFDQSxHQUFHO0FBQ0wsR0FBZ0Q7QUFDOUMsU0FDRTtBQUFBLElBQUM7QUFBQTtBQUFBLE1BQ0MsV0FBVztBQUFBLFFBQ1Q7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFDRjtBQUFBLE1BQ0MsR0FBRztBQUFBO0FBQUEsRUFDTjtBQUVKOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1 @@
1
+ export declare function Label({ className, ...props }: React.LabelHTMLAttributes<HTMLLabelElement>): import("react").JSX.Element;
@@ -0,0 +1,18 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { cn } from "../../utils/index.js";
3
+ export function Label({
4
+ className,
5
+ ...props
6
+ }) {
7
+ return /* @__PURE__ */ jsx(
8
+ "label",
9
+ {
10
+ className: cn(
11
+ "font-mondwest text-xs tracking-[0.1em] uppercase leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
12
+ className
13
+ ),
14
+ ...props
15
+ }
16
+ );
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIExhYmVsKHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuTGFiZWxIVE1MQXR0cmlidXRlczxIVE1MTGFiZWxFbGVtZW50Pikge1xuICByZXR1cm4gKFxuICAgIDxsYWJlbFxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2ZvbnQtbW9uZHdlc3QgdGV4dC14cyB0cmFja2luZy1bMC4xZW1dIHVwcGVyY2FzZSBsZWFkaW5nLW5vbmUgcGVlci1kaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgcGVlci1kaXNhYmxlZDpvcGFjaXR5LTcwJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQU9JO0FBUEosU0FBUyxVQUFVO0FBRVosZ0JBQVMsTUFBTTtBQUFBLEVBQ3BCO0FBQUEsRUFDQSxHQUFHO0FBQ0wsR0FBZ0Q7QUFDOUMsU0FDRTtBQUFBLElBQUM7QUFBQTtBQUFBLE1BQ0MsV0FBVztBQUFBLFFBQ1Q7QUFBQSxRQUNBO0FBQUEsTUFDRjtBQUFBLE1BQ0MsR0FBRztBQUFBO0FBQUEsRUFDTjtBQUVKOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1 @@
1
+ export declare function LevaClient(): import("react").JSX.Element;