@nastechai-research/ui 0.13.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,339 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useEffect, useRef, useState } from "react";
4
+ import * as THREE from "three";
5
+ import { $gpuTier, useGpuTier } from "../../../hooks/use-gpu-tier.js";
6
+ import { runRenderLoop } from "../../../hooks/use-render-loop.js";
7
+ import { useSmoothControls } from "../../../hooks/use-smooth-controls.js";
8
+ import { cn } from "../../../utils/index.js";
9
+ import { BLEND_MODES } from "./blend-modes.js";
10
+ const vert = (
11
+ /*glsl*/
12
+ `
13
+ varying vec2 vUv;
14
+ void main() {
15
+ vUv = uv;
16
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
17
+ }
18
+ `
19
+ );
20
+ const sourceFrag = (
21
+ /*glsl*/
22
+ `
23
+ uniform sampler2D uTex0, uTex1, uTex2, uTex3;
24
+ uniform float uTime, uZoom, uSpeed, uRotate, uFolds, uDrift;
25
+ varying vec2 vUv;
26
+
27
+ vec3 gray(vec3 c) { return vec3(dot(c, vec3(.299, .587, .114))); }
28
+ vec2 rot(vec2 p, float a) { return vec2(p.x * cos(a) - p.y * sin(a), p.x * sin(a) + p.y * cos(a)); }
29
+
30
+ vec2 kaleid(vec2 p, float n) {
31
+ float a = mod(atan(p.y, p.x), 6.28318 / n) - 3.14159 / n;
32
+ return length(p) * vec2(cos(a), sin(a));
33
+ }
34
+
35
+ vec4 tex(int i, vec2 uv) {
36
+ if (i == 0) return texture2D(uTex0, uv);
37
+ if (i == 1) return texture2D(uTex1, uv);
38
+ if (i == 2) return texture2D(uTex2, uv);
39
+ return texture2D(uTex3, uv);
40
+ }
41
+
42
+ void main() {
43
+ vec2 uv = rot(vUv - .5, uTime * uRotate * .05);
44
+ if (uFolds > 1.) uv = kaleid(uv, uFolds);
45
+
46
+ float dt = uTime * uDrift * .1;
47
+ uv = uv / uZoom + .5 + vec2(sin(dt * .7) * cos(dt * .3), cos(dt * .5) * sin(dt * .9)) * .15 * uDrift;
48
+
49
+ float cycle = mod(uTime * uSpeed * .01, 4.);
50
+ int i0 = int(floor(cycle)), i1 = int(mod(float(i0) + 1., 4.));
51
+ float t = smoothstep(0., 1., fract(cycle));
52
+
53
+ vec3 base = mix(gray(vec3(1.) - tex(i0, uv).rgb), gray(vec3(1.) - tex(i1, uv).rgb), t);
54
+ vec2 uvF = vec2(1. - uv.x, uv.y);
55
+ vec3 flip = mix(gray(vec3(1.) - tex(i0, uvF).rgb), gray(vec3(1.) - tex(i1, uvF).rgb), t);
56
+
57
+ gl_FragColor = vec4(mix(base, flip, .3 + sin(uTime * .2) * .2), 1.);
58
+ }
59
+ `
60
+ );
61
+ const moshFrag = (
62
+ /*glsl*/
63
+ `
64
+ uniform sampler2D uCurrent, uPrev, uTex0, uTex1, uTex2, uTex3;
65
+ uniform float uTime, uIntensity, uMotion, uZoom, uSpeed;
66
+ uniform vec2 uRes;
67
+ varying vec2 vUv;
68
+
69
+ float hash(vec2 p) { return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453); }
70
+ vec2 hash2(vec2 p) { return fract(sin(vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3)))) * 43758.5453); }
71
+
72
+ float noise(vec2 p) {
73
+ vec2 i = floor(p), f = fract(p) * fract(p) * (3. - 2. * fract(p));
74
+ return mix(mix(hash(i), hash(i + vec2(1., 0.)), f.x), mix(hash(i + vec2(0., 1.)), hash(i + vec2(1., 1.)), f.x), f.y);
75
+ }
76
+
77
+ vec3 gray(vec3 c) { return vec3(dot(c, vec3(.299, .587, .114))); }
78
+
79
+ vec2 distort(vec2 uv, float k, float t) {
80
+ float n1 = noise(uv * 8. + t * .5), n2 = noise(uv * 12. + t * .7), flow = noise(uv * 4. + t * .3);
81
+ return uv + vec2(cos(n1 * 6.28 + t * 1.2), sin(n2 * 6.28 + t * .9)) * .02 * k
82
+ + vec2(cos(flow * 6.28 + uv.y * 10.), sin(flow * 6.28 + uv.x * 10.)) * .015 * k;
83
+ }
84
+
85
+ vec3 tex(int i, vec2 uv) {
86
+ vec2 zuv = (uv - .5) / uZoom + .5;
87
+ if (i == 0) return gray(vec3(1.) - texture2D(uTex0, zuv).rgb);
88
+ if (i == 1) return gray(vec3(1.) - texture2D(uTex1, zuv).rgb);
89
+ if (i == 2) return gray(vec3(1.) - texture2D(uTex2, zuv).rgb);
90
+ return gray(vec3(1.) - texture2D(uTex3, zuv).rgb);
91
+ }
92
+
93
+ void main() {
94
+ vec2 uv = vUv;
95
+ float t = uTime * uSpeed, tS = floor(t * .1), pS = 80.;
96
+ float amt = uIntensity * uMotion * .8 * (.7 + (sin(t * .5) * .5 + .5) * .3);
97
+
98
+ vec2 mUV = distort(uv, uIntensity * .4, t);
99
+
100
+ float hS = floor(uv.y * pS), hA = smoothstep(0., .8, hash(vec2(hS, tS)));
101
+ float hO = (hash(vec2(hS, tS + 50.)) - .5) * .25 * hA * amt;
102
+ float vS = floor(uv.x * pS), vA = smoothstep(0., .8, hash(vec2(vS, tS + 100.)));
103
+ float vO = (hash(vec2(vS, tS + 150.)) - .5) * .25 * vA * amt;
104
+ mUV += vec2(hO, vO);
105
+
106
+ float bS = pS * .25;
107
+ float hBA = step(.5, hash(vec2(floor(uv.y * bS), tS + 200.)));
108
+ float hBO = (hash(vec2(floor(uv.y * bS), 200.)) - .5) * .35 * hBA * amt;
109
+ float vBA = step(.5, hash(vec2(floor(uv.x * bS), tS + 300.)));
110
+ float vBO = (hash(vec2(floor(uv.x * bS), 250.)) - .5) * .35 * vBA * amt;
111
+ mUV += vec2(hBO, vBO);
112
+
113
+ vec2 blk = floor(uv * pS * .15);
114
+ mUV += (hash2(vec2(blk.x, blk.y + 500.)) - .5) * .4 * step(.7, hash(vec2(blk.x, blk.y + tS))) * amt;
115
+ mUV = clamp(mUV, 0., 1.);
116
+
117
+ vec3 prev = texture2D(uPrev, mUV).rgb;
118
+ prev = mix(prev, texture2D(uPrev, clamp(uv + vec2(hBO, vBO), 0., 1.)).rgb, max(hBA, vBA) * .9);
119
+
120
+ float tY = floor(uv.y * pS * .4);
121
+ if (hash(vec2(tY, tS + 400.)) > .75) {
122
+ prev = mix(prev, texture2D(uPrev, clamp(vec2(uv.x + (hash(vec2(tY, 400.)) - .5) * .5 * amt, uv.y), 0., 1.)).rgb, .85);
123
+ }
124
+
125
+ if (hA > 0. && amt > .01) {
126
+ prev = mix(prev, gray(texture2D(uPrev, clamp(vec2(uv.x + (gray(prev).r - uv.x) * amt + hO, uv.y), 0., 1.)).rgb), hA);
127
+ }
128
+
129
+ float d = mix(mix(.97, .99, noise(uv * 8. + t * .2)), 0., step(.994, hash(vec2(tS, 0.))));
130
+ gl_FragColor = vec4(mix(texture2D(uCurrent, uv).rgb, prev, d), 1.);
131
+ }
132
+ `
133
+ );
134
+ const outputFrag = (
135
+ /*glsl*/
136
+ `
137
+ uniform sampler2D uInput;
138
+ uniform float uTime, uAlpha, uHue;
139
+ uniform vec3 uColor;
140
+ varying vec2 vUv;
141
+
142
+ float hash(vec2 p) { return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); }
143
+
144
+ vec3 hueShift(vec3 c, float h) {
145
+ float a = h * 6.28318, s = sin(a), co = cos(a);
146
+ vec3 w = vec3(.299, .587, .114);
147
+ return clamp(vec3(
148
+ dot(c, w) + dot(c, vec3(.701, -.587, -.114) * co + vec3(.168, .330, -.497) * s),
149
+ dot(c, w) + dot(c, vec3(-.299, .413, -.114) * co + vec3(.328, .035, -.363) * s),
150
+ dot(c, w) + dot(c, vec3(-.299, -.587, .886) * co + vec3(-.497, .330, .168) * s)
151
+ ), 0., 1.);
152
+ }
153
+
154
+ void main() {
155
+ vec3 m = texture2D(uInput, vUv).rgb;
156
+ m *= 1. - step(.5, fract(vUv.y * 200.)) * .06 * step(.97, hash(vec2(floor(vUv.y * 30.), floor(uTime * .5))));
157
+
158
+ float lum = dot(m, vec3(.299, .587, .114));
159
+ gl_FragColor = vec4(hueShift(mix(vec3(lum), uColor * lum * 2., length(uColor)), uHue) * uAlpha, smoothstep(.08, .18, lum * uAlpha));
160
+ }
161
+ `
162
+ );
163
+ const TEXTURES = [
164
+ "/anatomy/grays-0.jpg",
165
+ "/anatomy/grays-3.jpg",
166
+ "/anatomy/grays-6.jpg",
167
+ "/anatomy/grays-9.jpg"
168
+ ];
169
+ export function Greys({ className, style }) {
170
+ const gpuTier = useGpuTier();
171
+ const [blendOverride, setBlendOverride] = useState(null);
172
+ const canvasRef = useRef(null);
173
+ const c = useSmoothControls(
174
+ "Effects/Greys",
175
+ {
176
+ alpha: { max: 1, min: 0, step: 0.01, value: 0.19 },
177
+ blend: { options: BLEND_MODES, value: "color-burn" },
178
+ color: { value: "#ffac02" },
179
+ drift: { max: 2, min: 0, step: 0.1, value: 0.5 },
180
+ enabled: { value: false },
181
+ folds: { max: 12, min: 1, step: 1, value: 1 },
182
+ hue: { max: 1, min: 0, step: 0.01, value: 0.37 },
183
+ intensity: { max: 3, min: 0, step: 0.1, value: 0.1 },
184
+ motion: { max: 2, min: 0, step: 0.1, value: 0.1 },
185
+ rotate: { max: 2, min: -2, step: 0.1, value: 0.3 },
186
+ speed: { max: 1, min: 0.01, step: 0.01, value: 0.21 },
187
+ zoom: { max: 4, min: 0.5, step: 0.1, value: 0.7 }
188
+ },
189
+ { collapsed: true }
190
+ );
191
+ const cRef = useRef(c);
192
+ cRef.current = c;
193
+ useEffect(() => {
194
+ const onKey = (e) => e.key.toLowerCase() === "x" && setBlendOverride((p) => p === "screen" ? null : "screen");
195
+ window.addEventListener("keydown", onKey);
196
+ return () => window.removeEventListener("keydown", onKey);
197
+ }, []);
198
+ const enabled = c.enabled && gpuTier === 2;
199
+ useEffect(() => {
200
+ if (!canvasRef.current || !enabled) {
201
+ return;
202
+ }
203
+ let renderer;
204
+ try {
205
+ renderer = new THREE.WebGLRenderer({
206
+ alpha: true,
207
+ canvas: canvasRef.current
208
+ });
209
+ } catch {
210
+ $gpuTier.set(0);
211
+ return;
212
+ }
213
+ const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);
214
+ const geo = new THREE.PlaneGeometry(2, 2);
215
+ const [rtSource, rtA, rtB] = [0, 1, 2].map(
216
+ () => new THREE.WebGLRenderTarget(innerWidth, innerHeight, {
217
+ magFilter: THREE.NearestFilter,
218
+ minFilter: THREE.NearestFilter
219
+ })
220
+ );
221
+ const textures = TEXTURES.map((p) => {
222
+ const t = new THREE.TextureLoader().load(p);
223
+ t.wrapS = t.wrapT = THREE.ClampToEdgeWrapping;
224
+ t.minFilter = t.magFilter = THREE.LinearFilter;
225
+ return t;
226
+ });
227
+ const texU = Object.fromEntries(
228
+ textures.map((t, i) => [`uTex${i}`, { value: t }])
229
+ );
230
+ const srcU = {
231
+ ...texU,
232
+ uDrift: { value: 0 },
233
+ uFolds: { value: 0 },
234
+ uRotate: { value: 0 },
235
+ uSpeed: { value: 0 },
236
+ uTime: { value: 0 },
237
+ uZoom: { value: 0 }
238
+ };
239
+ const moshU = {
240
+ ...texU,
241
+ uCurrent: { value: rtSource.texture },
242
+ uIntensity: { value: 0 },
243
+ uMotion: { value: 0 },
244
+ uPrev: { value: rtA.texture },
245
+ uRes: { value: new THREE.Vector2(innerWidth, innerHeight) },
246
+ uSpeed: { value: 0 },
247
+ uTime: { value: 0 },
248
+ uZoom: { value: 0 }
249
+ };
250
+ const outU = {
251
+ uAlpha: { value: 0 },
252
+ uColor: { value: new THREE.Color() },
253
+ uHue: { value: 0 },
254
+ uInput: { value: rtB.texture },
255
+ uTime: { value: 0 }
256
+ };
257
+ const mkScene = (frag, uniforms, transparent = false) => {
258
+ const s = new THREE.Scene();
259
+ s.add(
260
+ new THREE.Mesh(
261
+ geo.clone(),
262
+ new THREE.ShaderMaterial({
263
+ fragmentShader: frag,
264
+ transparent,
265
+ uniforms,
266
+ vertexShader: vert
267
+ })
268
+ )
269
+ );
270
+ return s;
271
+ };
272
+ const srcScene = mkScene(sourceFrag, srcU);
273
+ const moshScene = mkScene(moshFrag, moshU);
274
+ const outScene = mkScene(outputFrag, outU, true);
275
+ const resize = () => {
276
+ renderer.setSize(innerWidth, innerHeight);
277
+ renderer.setPixelRatio(Math.min(devicePixelRatio, 1.5));
278
+ [rtSource, rtA, rtB].forEach((rt) => rt.setSize(innerWidth, innerHeight));
279
+ moshU.uRes.value.set(innerWidth, innerHeight);
280
+ };
281
+ resize();
282
+ window.addEventListener("resize", resize);
283
+ let ping = true, time = 0;
284
+ const dispose = runRenderLoop({
285
+ el: canvasRef.current,
286
+ minIntervalMs: 33,
287
+ onFrame: (deltaSeconds) => {
288
+ time += deltaSeconds;
289
+ const v = cRef.current;
290
+ srcU.uTime.value = time;
291
+ srcU.uSpeed.value = v.speed;
292
+ srcU.uZoom.value = v.zoom;
293
+ srcU.uRotate.value = v.rotate;
294
+ srcU.uFolds.value = v.folds;
295
+ srcU.uDrift.value = v.drift;
296
+ moshU.uTime.value = time;
297
+ moshU.uIntensity.value = v.intensity;
298
+ moshU.uMotion.value = v.motion;
299
+ moshU.uSpeed.value = v.speed;
300
+ moshU.uZoom.value = v.zoom;
301
+ outU.uTime.value = time;
302
+ outU.uAlpha.value = v.alpha;
303
+ outU.uHue.value = v.hue;
304
+ outU.uColor.value.set(typeof v.color === "string" ? v.color : "#fff");
305
+ renderer.setRenderTarget(rtSource);
306
+ renderer.render(srcScene, camera);
307
+ const [read, write] = ping ? [rtA, rtB] : [rtB, rtA];
308
+ moshU.uPrev.value = read.texture;
309
+ renderer.setRenderTarget(write);
310
+ renderer.render(moshScene, camera);
311
+ outU.uInput.value = write.texture;
312
+ renderer.setRenderTarget(null);
313
+ renderer.render(outScene, camera);
314
+ ping = !ping;
315
+ }
316
+ });
317
+ return () => {
318
+ window.removeEventListener("resize", resize);
319
+ dispose();
320
+ textures.forEach((t) => t.dispose());
321
+ [geo, rtSource, rtA, rtB, renderer].forEach((x) => x.dispose());
322
+ };
323
+ }, [enabled]);
324
+ if (!enabled) {
325
+ return null;
326
+ }
327
+ return /* @__PURE__ */ jsx(
328
+ "canvas",
329
+ {
330
+ className: cn("h-full w-full", className),
331
+ ref: canvasRef,
332
+ style: {
333
+ mixBlendMode: blendOverride ?? c.blend,
334
+ ...style
335
+ }
336
+ }
337
+ );
338
+ }
339
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnXG5cbmltcG9ydCB7ICRncHVUaWVyLCB1c2VHcHVUaWVyIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlLWdwdS10aWVyJ1xuaW1wb3J0IHsgcnVuUmVuZGVyTG9vcCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZS1yZW5kZXItbG9vcCdcbmltcG9ydCB7IHVzZVNtb290aENvbnRyb2xzIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlLXNtb290aC1jb250cm9scydcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnXG5cbmltcG9ydCB7IEJMRU5EX01PREVTIH0gZnJvbSAnLi9ibGVuZC1tb2RlcydcblxuY29uc3QgdmVydCA9IC8qZ2xzbCovIGBcbiAgdmFyeWluZyB2ZWMyIHZVdjtcbiAgdm9pZCBtYWluKCkge1xuICAgIHZVdiA9IHV2O1xuICAgIGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XG4gIH1cbmBcblxuY29uc3Qgc291cmNlRnJhZyA9IC8qZ2xzbCovIGBcbiAgdW5pZm9ybSBzYW1wbGVyMkQgdVRleDAsIHVUZXgxLCB1VGV4MiwgdVRleDM7XG4gIHVuaWZvcm0gZmxvYXQgdVRpbWUsIHVab29tLCB1U3BlZWQsIHVSb3RhdGUsIHVGb2xkcywgdURyaWZ0O1xuICB2YXJ5aW5nIHZlYzIgdlV2O1xuXG4gIHZlYzMgZ3JheSh2ZWMzIGMpIHsgcmV0dXJuIHZlYzMoZG90KGMsIHZlYzMoLjI5OSwgLjU4NywgLjExNCkpKTsgfVxuICB2ZWMyIHJvdCh2ZWMyIHAsIGZsb2F0IGEpIHsgcmV0dXJuIHZlYzIocC54ICogY29zKGEpIC0gcC55ICogc2luKGEpLCBwLnggKiBzaW4oYSkgKyBwLnkgKiBjb3MoYSkpOyB9XG5cbiAgdmVjMiBrYWxlaWQodmVjMiBwLCBmbG9hdCBuKSB7XG4gICAgZmxvYXQgYSA9IG1vZChhdGFuKHAueSwgcC54KSwgNi4yODMxOCAvIG4pIC0gMy4xNDE1OSAvIG47XG4gICAgcmV0dXJuIGxlbmd0aChwKSAqIHZlYzIoY29zKGEpLCBzaW4oYSkpO1xuICB9XG5cbiAgdmVjNCB0ZXgoaW50IGksIHZlYzIgdXYpIHtcbiAgICBpZiAoaSA9PSAwKSByZXR1cm4gdGV4dHVyZTJEKHVUZXgwLCB1dik7XG4gICAgaWYgKGkgPT0gMSkgcmV0dXJuIHRleHR1cmUyRCh1VGV4MSwgdXYpO1xuICAgIGlmIChpID09IDIpIHJldHVybiB0ZXh0dXJlMkQodVRleDIsIHV2KTtcbiAgICByZXR1cm4gdGV4dHVyZTJEKHVUZXgzLCB1dik7XG4gIH1cblxuICB2b2lkIG1haW4oKSB7XG4gICAgdmVjMiB1diA9IHJvdCh2VXYgLSAuNSwgdVRpbWUgKiB1Um90YXRlICogLjA1KTtcbiAgICBpZiAodUZvbGRzID4gMS4pIHV2ID0ga2FsZWlkKHV2LCB1Rm9sZHMpO1xuXG4gICAgZmxvYXQgZHQgPSB1VGltZSAqIHVEcmlmdCAqIC4xO1xuICAgIHV2ID0gdXYgLyB1Wm9vbSArIC41ICsgdmVjMihzaW4oZHQgKiAuNykgKiBjb3MoZHQgKiAuMyksIGNvcyhkdCAqIC41KSAqIHNpbihkdCAqIC45KSkgKiAuMTUgKiB1RHJpZnQ7XG5cbiAgICBmbG9hdCBjeWNsZSA9IG1vZCh1VGltZSAqIHVTcGVlZCAqIC4wMSwgNC4pO1xuICAgIGludCBpMCA9IGludChmbG9vcihjeWNsZSkpLCBpMSA9IGludChtb2QoZmxvYXQoaTApICsgMS4sIDQuKSk7XG4gICAgZmxvYXQgdCA9IHNtb290aHN0ZXAoMC4sIDEuLCBmcmFjdChjeWNsZSkpO1xuXG4gICAgdmVjMyBiYXNlID0gbWl4KGdyYXkodmVjMygxLikgLSB0ZXgoaTAsIHV2KS5yZ2IpLCBncmF5KHZlYzMoMS4pIC0gdGV4KGkxLCB1dikucmdiKSwgdCk7XG4gICAgdmVjMiB1dkYgPSB2ZWMyKDEuIC0gdXYueCwgdXYueSk7XG4gICAgdmVjMyBmbGlwID0gbWl4KGdyYXkodmVjMygxLikgLSB0ZXgoaTAsIHV2RikucmdiKSwgZ3JheSh2ZWMzKDEuKSAtIHRleChpMSwgdXZGKS5yZ2IpLCB0KTtcblxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQobWl4KGJhc2UsIGZsaXAsIC4zICsgc2luKHVUaW1lICogLjIpICogLjIpLCAxLik7XG4gIH1cbmBcblxuY29uc3QgbW9zaEZyYWcgPSAvKmdsc2wqLyBgXG4gIHVuaWZvcm0gc2FtcGxlcjJEIHVDdXJyZW50LCB1UHJldiwgdVRleDAsIHVUZXgxLCB1VGV4MiwgdVRleDM7XG4gIHVuaWZvcm0gZmxvYXQgdVRpbWUsIHVJbnRlbnNpdHksIHVNb3Rpb24sIHVab29tLCB1U3BlZWQ7XG4gIHVuaWZvcm0gdmVjMiB1UmVzO1xuICB2YXJ5aW5nIHZlYzIgdlV2O1xuXG4gIGZsb2F0IGhhc2godmVjMiBwKSB7IHJldHVybiBmcmFjdChzaW4oZG90KHAsIHZlYzIoMTIuOTg5OCwgNzguMjMzKSkpICogNDM3NTguNTQ1Myk7IH1cbiAgdmVjMiBoYXNoMih2ZWMyIHApIHsgcmV0dXJuIGZyYWN0KHNpbih2ZWMyKGRvdChwLCB2ZWMyKDEyNy4xLCAzMTEuNykpLCBkb3QocCwgdmVjMigyNjkuNSwgMTgzLjMpKSkpICogNDM3NTguNTQ1Myk7IH1cblxuICBmbG9hdCBub2lzZSh2ZWMyIHApIHtcbiAgICB2ZWMyIGkgPSBmbG9vcihwKSwgZiA9IGZyYWN0KHApICogZnJhY3QocCkgKiAoMy4gLSAyLiAqIGZyYWN0KHApKTtcbiAgICByZXR1cm4gbWl4KG1peChoYXNoKGkpLCBoYXNoKGkgKyB2ZWMyKDEuLCAwLikpLCBmLngpLCBtaXgoaGFzaChpICsgdmVjMigwLiwgMS4pKSwgaGFzaChpICsgdmVjMigxLiwgMS4pKSwgZi54KSwgZi55KTtcbiAgfVxuXG4gIHZlYzMgZ3JheSh2ZWMzIGMpIHsgcmV0dXJuIHZlYzMoZG90KGMsIHZlYzMoLjI5OSwgLjU4NywgLjExNCkpKTsgfVxuXG4gIHZlYzIgZGlzdG9ydCh2ZWMyIHV2LCBmbG9hdCBrLCBmbG9hdCB0KSB7XG4gICAgZmxvYXQgbjEgPSBub2lzZSh1diAqIDguICsgdCAqIC41KSwgbjIgPSBub2lzZSh1diAqIDEyLiArIHQgKiAuNyksIGZsb3cgPSBub2lzZSh1diAqIDQuICsgdCAqIC4zKTtcbiAgICByZXR1cm4gdXYgKyB2ZWMyKGNvcyhuMSAqIDYuMjggKyB0ICogMS4yKSwgc2luKG4yICogNi4yOCArIHQgKiAuOSkpICogLjAyICoga1xuICAgICAgICAgICAgICsgdmVjMihjb3MoZmxvdyAqIDYuMjggKyB1di55ICogMTAuKSwgc2luKGZsb3cgKiA2LjI4ICsgdXYueCAqIDEwLikpICogLjAxNSAqIGs7XG4gIH1cblxuICB2ZWMzIHRleChpbnQgaSwgdmVjMiB1dikge1xuICAgIHZlYzIgenV2ID0gKHV2IC0gLjUpIC8gdVpvb20gKyAuNTtcbiAgICBpZiAoaSA9PSAwKSByZXR1cm4gZ3JheSh2ZWMzKDEuKSAtIHRleHR1cmUyRCh1VGV4MCwgenV2KS5yZ2IpO1xuICAgIGlmIChpID09IDEpIHJldHVybiBncmF5KHZlYzMoMS4pIC0gdGV4dHVyZTJEKHVUZXgxLCB6dXYpLnJnYik7XG4gICAgaWYgKGkgPT0gMikgcmV0dXJuIGdyYXkodmVjMygxLikgLSB0ZXh0dXJlMkQodVRleDIsIHp1dikucmdiKTtcbiAgICByZXR1cm4gZ3JheSh2ZWMzKDEuKSAtIHRleHR1cmUyRCh1VGV4MywgenV2KS5yZ2IpO1xuICB9XG5cbiAgdm9pZCBtYWluKCkge1xuICAgIHZlYzIgdXYgPSB2VXY7XG4gICAgZmxvYXQgdCA9IHVUaW1lICogdVNwZWVkLCB0UyA9IGZsb29yKHQgKiAuMSksIHBTID0gODAuO1xuICAgIGZsb2F0IGFtdCA9IHVJbnRlbnNpdHkgKiB1TW90aW9uICogLjggKiAoLjcgKyAoc2luKHQgKiAuNSkgKiAuNSArIC41KSAqIC4zKTtcblxuICAgIHZlYzIgbVVWID0gZGlzdG9ydCh1diwgdUludGVuc2l0eSAqIC40LCB0KTtcblxuICAgIGZsb2F0IGhTID0gZmxvb3IodXYueSAqIHBTKSwgaEEgPSBzbW9vdGhzdGVwKDAuLCAuOCwgaGFzaCh2ZWMyKGhTLCB0UykpKTtcbiAgICBmbG9hdCBoTyA9IChoYXNoKHZlYzIoaFMsIHRTICsgNTAuKSkgLSAuNSkgKiAuMjUgKiBoQSAqIGFtdDtcbiAgICBmbG9hdCB2UyA9IGZsb29yKHV2LnggKiBwUyksIHZBID0gc21vb3Roc3RlcCgwLiwgLjgsIGhhc2godmVjMih2UywgdFMgKyAxMDAuKSkpO1xuICAgIGZsb2F0IHZPID0gKGhhc2godmVjMih2UywgdFMgKyAxNTAuKSkgLSAuNSkgKiAuMjUgKiB2QSAqIGFtdDtcbiAgICBtVVYgKz0gdmVjMihoTywgdk8pO1xuXG4gICAgZmxvYXQgYlMgPSBwUyAqIC4yNTtcbiAgICBmbG9hdCBoQkEgPSBzdGVwKC41LCBoYXNoKHZlYzIoZmxvb3IodXYueSAqIGJTKSwgdFMgKyAyMDAuKSkpO1xuICAgIGZsb2F0IGhCTyA9IChoYXNoKHZlYzIoZmxvb3IodXYueSAqIGJTKSwgMjAwLikpIC0gLjUpICogLjM1ICogaEJBICogYW10O1xuICAgIGZsb2F0IHZCQSA9IHN0ZXAoLjUsIGhhc2godmVjMihmbG9vcih1di54ICogYlMpLCB0UyArIDMwMC4pKSk7XG4gICAgZmxvYXQgdkJPID0gKGhhc2godmVjMihmbG9vcih1di54ICogYlMpLCAyNTAuKSkgLSAuNSkgKiAuMzUgKiB2QkEgKiBhbXQ7XG4gICAgbVVWICs9IHZlYzIoaEJPLCB2Qk8pO1xuXG4gICAgdmVjMiBibGsgPSBmbG9vcih1diAqIHBTICogLjE1KTtcbiAgICBtVVYgKz0gKGhhc2gyKHZlYzIoYmxrLngsIGJsay55ICsgNTAwLikpIC0gLjUpICogLjQgKiBzdGVwKC43LCBoYXNoKHZlYzIoYmxrLngsIGJsay55ICsgdFMpKSkgKiBhbXQ7XG4gICAgbVVWID0gY2xhbXAobVVWLCAwLiwgMS4pO1xuXG4gICAgdmVjMyBwcmV2ID0gdGV4dHVyZTJEKHVQcmV2LCBtVVYpLnJnYjtcbiAgICBwcmV2ID0gbWl4KHByZXYsIHRleHR1cmUyRCh1UHJldiwgY2xhbXAodXYgKyB2ZWMyKGhCTywgdkJPKSwgMC4sIDEuKSkucmdiLCBtYXgoaEJBLCB2QkEpICogLjkpO1xuXG4gICAgZmxvYXQgdFkgPSBmbG9vcih1di55ICogcFMgKiAuNCk7XG4gICAgaWYgKGhhc2godmVjMih0WSwgdFMgKyA0MDAuKSkgPiAuNzUpIHtcbiAgICAgIHByZXYgPSBtaXgocHJldiwgdGV4dHVyZTJEKHVQcmV2LCBjbGFtcCh2ZWMyKHV2LnggKyAoaGFzaCh2ZWMyKHRZLCA0MDAuKSkgLSAuNSkgKiAuNSAqIGFtdCwgdXYueSksIDAuLCAxLikpLnJnYiwgLjg1KTtcbiAgICB9XG5cbiAgICBpZiAoaEEgPiAwLiAmJiBhbXQgPiAuMDEpIHtcbiAgICAgIHByZXYgPSBtaXgocHJldiwgZ3JheSh0ZXh0dXJlMkQodVByZXYsIGNsYW1wKHZlYzIodXYueCArIChncmF5KHByZXYpLnIgLSB1di54KSAqIGFtdCArIGhPLCB1di55KSwgMC4sIDEuKSkucmdiKSwgaEEpO1xuICAgIH1cblxuICAgIGZsb2F0IGQgPSBtaXgobWl4KC45NywgLjk5LCBub2lzZSh1diAqIDguICsgdCAqIC4yKSksIDAuLCBzdGVwKC45OTQsIGhhc2godmVjMih0UywgMC4pKSkpO1xuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQobWl4KHRleHR1cmUyRCh1Q3VycmVudCwgdXYpLnJnYiwgcHJldiwgZCksIDEuKTtcbiAgfVxuYFxuXG5jb25zdCBvdXRwdXRGcmFnID0gLypnbHNsKi8gYFxuICB1bmlmb3JtIHNhbXBsZXIyRCB1SW5wdXQ7XG4gIHVuaWZvcm0gZmxvYXQgdVRpbWUsIHVBbHBoYSwgdUh1ZTtcbiAgdW5pZm9ybSB2ZWMzIHVDb2xvcjtcbiAgdmFyeWluZyB2ZWMyIHZVdjtcblxuICBmbG9hdCBoYXNoKHZlYzIgcCkgeyByZXR1cm4gZnJhY3Qoc2luKGRvdChwLCB2ZWMyKDEyNy4xLCAzMTEuNykpKSAqIDQzNzU4LjU0NTMpOyB9XG5cbiAgdmVjMyBodWVTaGlmdCh2ZWMzIGMsIGZsb2F0IGgpIHtcbiAgICBmbG9hdCBhID0gaCAqIDYuMjgzMTgsIHMgPSBzaW4oYSksIGNvID0gY29zKGEpO1xuICAgIHZlYzMgdyA9IHZlYzMoLjI5OSwgLjU4NywgLjExNCk7XG4gICAgcmV0dXJuIGNsYW1wKHZlYzMoXG4gICAgICBkb3QoYywgdykgKyBkb3QoYywgdmVjMyguNzAxLCAtLjU4NywgLS4xMTQpICogY28gKyB2ZWMzKC4xNjgsIC4zMzAsIC0uNDk3KSAqIHMpLFxuICAgICAgZG90KGMsIHcpICsgZG90KGMsIHZlYzMoLS4yOTksIC40MTMsIC0uMTE0KSAqIGNvICsgdmVjMyguMzI4LCAuMDM1LCAtLjM2MykgKiBzKSxcbiAgICAgIGRvdChjLCB3KSArIGRvdChjLCB2ZWMzKC0uMjk5LCAtLjU4NywgLjg4NikgKiBjbyArIHZlYzMoLS40OTcsIC4zMzAsIC4xNjgpICogcylcbiAgICApLCAwLiwgMS4pO1xuICB9XG5cbiAgdm9pZCBtYWluKCkge1xuICAgIHZlYzMgbSA9IHRleHR1cmUyRCh1SW5wdXQsIHZVdikucmdiO1xuICAgIG0gKj0gMS4gLSBzdGVwKC41LCBmcmFjdCh2VXYueSAqIDIwMC4pKSAqIC4wNiAqIHN0ZXAoLjk3LCBoYXNoKHZlYzIoZmxvb3IodlV2LnkgKiAzMC4pLCBmbG9vcih1VGltZSAqIC41KSkpKTtcblxuICAgIGZsb2F0IGx1bSA9IGRvdChtLCB2ZWMzKC4yOTksIC41ODcsIC4xMTQpKTtcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGh1ZVNoaWZ0KG1peCh2ZWMzKGx1bSksIHVDb2xvciAqIGx1bSAqIDIuLCBsZW5ndGgodUNvbG9yKSksIHVIdWUpICogdUFscGhhLCBzbW9vdGhzdGVwKC4wOCwgLjE4LCBsdW0gKiB1QWxwaGEpKTtcbiAgfVxuYFxuXG5jb25zdCBURVhUVVJFUyA9IFtcbiAgJy9hbmF0b215L2dyYXlzLTAuanBnJyxcbiAgJy9hbmF0b215L2dyYXlzLTMuanBnJyxcbiAgJy9hbmF0b215L2dyYXlzLTYuanBnJyxcbiAgJy9hbmF0b215L2dyYXlzLTkuanBnJ1xuXVxuXG5leHBvcnQgZnVuY3Rpb24gR3JleXMoeyBjbGFzc05hbWUsIHN0eWxlIH06IEdyZXlzUHJvcHMpIHtcbiAgY29uc3QgZ3B1VGllciA9IHVzZUdwdVRpZXIoKVxuICBjb25zdCBbYmxlbmRPdmVycmlkZSwgc2V0QmxlbmRPdmVycmlkZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBjYW52YXNSZWYgPSB1c2VSZWY8SFRNTENhbnZhc0VsZW1lbnQ+KG51bGwpXG5cbiAgY29uc3QgYyA9IHVzZVNtb290aENvbnRyb2xzKFxuICAgICdFZmZlY3RzL0dyZXlzJyxcbiAgICB7XG4gICAgICBhbHBoYTogeyBtYXg6IDEsIG1pbjogMCwgc3RlcDogMC4wMSwgdmFsdWU6IDAuMTkgfSxcbiAgICAgIGJsZW5kOiB7IG9wdGlvbnM6IEJMRU5EX01PREVTLCB2YWx1ZTogJ2NvbG9yLWJ1cm4nIH0sXG4gICAgICBjb2xvcjogeyB2YWx1ZTogJyNmZmFjMDInIH0sXG4gICAgICBkcmlmdDogeyBtYXg6IDIsIG1pbjogMCwgc3RlcDogMC4xLCB2YWx1ZTogMC41IH0sXG4gICAgICBlbmFibGVkOiB7IHZhbHVlOiBmYWxzZSB9LFxuICAgICAgZm9sZHM6IHsgbWF4OiAxMiwgbWluOiAxLCBzdGVwOiAxLCB2YWx1ZTogMSB9LFxuICAgICAgaHVlOiB7IG1heDogMSwgbWluOiAwLCBzdGVwOiAwLjAxLCB2YWx1ZTogMC4zNyB9LFxuICAgICAgaW50ZW5zaXR5OiB7IG1heDogMywgbWluOiAwLCBzdGVwOiAwLjEsIHZhbHVlOiAwLjEgfSxcbiAgICAgIG1vdGlvbjogeyBtYXg6IDIsIG1pbjogMCwgc3RlcDogMC4xLCB2YWx1ZTogMC4xIH0sXG4gICAgICByb3RhdGU6IHsgbWF4OiAyLCBtaW46IC0yLCBzdGVwOiAwLjEsIHZhbHVlOiAwLjMgfSxcbiAgICAgIHNwZWVkOiB7IG1heDogMSwgbWluOiAwLjAxLCBzdGVwOiAwLjAxLCB2YWx1ZTogMC4yMSB9LFxuICAgICAgem9vbTogeyBtYXg6IDQsIG1pbjogMC41LCBzdGVwOiAwLjEsIHZhbHVlOiAwLjcgfVxuICAgIH0sXG4gICAgeyBjb2xsYXBzZWQ6IHRydWUgfVxuICApXG5cbiAgY29uc3QgY1JlZiA9IHVzZVJlZihjKVxuICBjUmVmLmN1cnJlbnQgPSBjXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvbktleSA9IChlOiBLZXlib2FyZEV2ZW50KSA9PlxuICAgICAgZS5rZXkudG9Mb3dlckNhc2UoKSA9PT0gJ3gnICYmXG4gICAgICBzZXRCbGVuZE92ZXJyaWRlKHAgPT4gKHAgPT09ICdzY3JlZW4nID8gbnVsbCA6ICdzY3JlZW4nKSlcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXkpXG5cbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleSlcbiAgfSwgW10pXG5cbiAgY29uc3QgZW5hYmxlZCA9IGMuZW5hYmxlZCAmJiBncHVUaWVyID09PSAyXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNhbnZhc1JlZi5jdXJyZW50IHx8ICFlbmFibGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsZXQgcmVuZGVyZXI6IFRIUkVFLldlYkdMUmVuZGVyZXJcblxuICAgIHRyeSB7XG4gICAgICByZW5kZXJlciA9IG5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyKHtcbiAgICAgICAgYWxwaGE6IHRydWUsXG4gICAgICAgIGNhbnZhczogY2FudmFzUmVmLmN1cnJlbnRcbiAgICAgIH0pXG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTZWUgbm90ZSBpbiBub2lzZS50c3ggXHUyMDE0IGVhZ2VyIGdwdS10aWVyIGRldGVjdGlvbiBzaG91bGQga2VlcCB1c1xuICAgICAgLy8gb3V0IG9mIGhlcmUsIGJ1dCBpZiB0aGUgZHJpdmVyIGZhaWxzIHRoZSByZW5kZXJlciBjb25zdHJ1Y3RvclxuICAgICAgLy8gYW55d2F5LCBkb3duZ3JhZGUgc28gb3RoZXIgb3ZlcmxheXMgc3RvcCB0cnlpbmcgdG9vLlxuICAgICAgJGdwdVRpZXIuc2V0KDApXG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNhbWVyYSA9IG5ldyBUSFJFRS5PcnRob2dyYXBoaWNDYW1lcmEoLTEsIDEsIDEsIC0xLCAwLCAxKVxuICAgIGNvbnN0IGdlbyA9IG5ldyBUSFJFRS5QbGFuZUdlb21ldHJ5KDIsIDIpXG5cbiAgICBjb25zdCBbcnRTb3VyY2UsIHJ0QSwgcnRCXSA9IFswLCAxLCAyXS5tYXAoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQoaW5uZXJXaWR0aCwgaW5uZXJIZWlnaHQsIHtcbiAgICAgICAgICBtYWdGaWx0ZXI6IFRIUkVFLk5lYXJlc3RGaWx0ZXIsXG4gICAgICAgICAgbWluRmlsdGVyOiBUSFJFRS5OZWFyZXN0RmlsdGVyXG4gICAgICAgIH0pXG4gICAgKVxuXG4gICAgY29uc3QgdGV4dHVyZXMgPSBURVhUVVJFUy5tYXAocCA9PiB7XG4gICAgICBjb25zdCB0ID0gbmV3IFRIUkVFLlRleHR1cmVMb2FkZXIoKS5sb2FkKHApXG4gICAgICB0LndyYXBTID0gdC53cmFwVCA9IFRIUkVFLkNsYW1wVG9FZGdlV3JhcHBpbmdcbiAgICAgIHQubWluRmlsdGVyID0gdC5tYWdGaWx0ZXIgPSBUSFJFRS5MaW5lYXJGaWx0ZXJcblxuICAgICAgcmV0dXJuIHRcbiAgICB9KVxuXG4gICAgY29uc3QgdGV4VSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIHRleHR1cmVzLm1hcCgodCwgaSkgPT4gW2B1VGV4JHtpfWAsIHsgdmFsdWU6IHQgfV0pXG4gICAgKVxuXG4gICAgY29uc3Qgc3JjVSA9IHtcbiAgICAgIC4uLnRleFUsXG4gICAgICB1RHJpZnQ6IHsgdmFsdWU6IDAgfSxcbiAgICAgIHVGb2xkczogeyB2YWx1ZTogMCB9LFxuICAgICAgdVJvdGF0ZTogeyB2YWx1ZTogMCB9LFxuICAgICAgdVNwZWVkOiB7IHZhbHVlOiAwIH0sXG4gICAgICB1VGltZTogeyB2YWx1ZTogMCB9LFxuICAgICAgdVpvb206IHsgdmFsdWU6IDAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1vc2hVID0ge1xuICAgICAgLi4udGV4VSxcbiAgICAgIHVDdXJyZW50OiB7IHZhbHVlOiBydFNvdXJjZS50ZXh0dXJlIH0sXG4gICAgICB1SW50ZW5zaXR5OiB7IHZhbHVlOiAwIH0sXG4gICAgICB1TW90aW9uOiB7IHZhbHVlOiAwIH0sXG4gICAgICB1UHJldjogeyB2YWx1ZTogcnRBLnRleHR1cmUgfSxcbiAgICAgIHVSZXM6IHsgdmFsdWU6IG5ldyBUSFJFRS5WZWN0b3IyKGlubmVyV2lkdGgsIGlubmVySGVpZ2h0KSB9LFxuICAgICAgdVNwZWVkOiB7IHZhbHVlOiAwIH0sXG4gICAgICB1VGltZTogeyB2YWx1ZTogMCB9LFxuICAgICAgdVpvb206IHsgdmFsdWU6IDAgfVxuICAgIH1cblxuICAgIGNvbnN0IG91dFUgPSB7XG4gICAgICB1QWxwaGE6IHsgdmFsdWU6IDAgfSxcbiAgICAgIHVDb2xvcjogeyB2YWx1ZTogbmV3IFRIUkVFLkNvbG9yKCkgfSxcbiAgICAgIHVIdWU6IHsgdmFsdWU6IDAgfSxcbiAgICAgIHVJbnB1dDogeyB2YWx1ZTogcnRCLnRleHR1cmUgfSxcbiAgICAgIHVUaW1lOiB7IHZhbHVlOiAwIH1cbiAgICB9XG5cbiAgICBjb25zdCBta1NjZW5lID0gKGZyYWc6IHN0cmluZywgdW5pZm9ybXM6IG9iamVjdCwgdHJhbnNwYXJlbnQgPSBmYWxzZSkgPT4ge1xuICAgICAgY29uc3QgcyA9IG5ldyBUSFJFRS5TY2VuZSgpXG4gICAgICBzLmFkZChcbiAgICAgICAgbmV3IFRIUkVFLk1lc2goXG4gICAgICAgICAgZ2VvLmNsb25lKCksXG4gICAgICAgICAgbmV3IFRIUkVFLlNoYWRlck1hdGVyaWFsKHtcbiAgICAgICAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnLFxuICAgICAgICAgICAgdHJhbnNwYXJlbnQsXG4gICAgICAgICAgICB1bmlmb3JtczogdW5pZm9ybXMgYXMgUmVjb3JkPHN0cmluZywgVEhSRUUuSVVuaWZvcm08YW55Pj4sXG4gICAgICAgICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG5cbiAgICAgIHJldHVybiBzXG4gICAgfVxuXG4gICAgY29uc3Qgc3JjU2NlbmUgPSBta1NjZW5lKHNvdXJjZUZyYWcsIHNyY1UpXG4gICAgY29uc3QgbW9zaFNjZW5lID0gbWtTY2VuZShtb3NoRnJhZywgbW9zaFUpXG4gICAgY29uc3Qgb3V0U2NlbmUgPSBta1NjZW5lKG91dHB1dEZyYWcsIG91dFUsIHRydWUpXG5cbiAgICBjb25zdCByZXNpemUgPSAoKSA9PiB7XG4gICAgICByZW5kZXJlci5zZXRTaXplKGlubmVyV2lkdGgsIGlubmVySGVpZ2h0KVxuICAgICAgLy8gQ2FwIGF0IDEuNXggXHUyMDE0IEdyZXlzIGRvZXMgdHJpcGxlLWJ1ZmZlcmVkIHBpbmctcG9uZyByZW5kZXJpbmcgYXRcbiAgICAgIC8vIGV2ZXJ5IGZyYW1lLCBzbyByZXRpbmEgeDIgaXMgYnJ1dGFsIG9uIGZpbGxyYXRlLlxuICAgICAgcmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyhNYXRoLm1pbihkZXZpY2VQaXhlbFJhdGlvLCAxLjUpKVxuICAgICAgO1tydFNvdXJjZSwgcnRBLCBydEJdLmZvckVhY2gocnQgPT4gcnQuc2V0U2l6ZShpbm5lcldpZHRoLCBpbm5lckhlaWdodCkpXG4gICAgICBtb3NoVS51UmVzLnZhbHVlLnNldChpbm5lcldpZHRoLCBpbm5lckhlaWdodClcbiAgICB9XG5cbiAgICByZXNpemUoKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCByZXNpemUpXG5cbiAgICBsZXQgcGluZyA9IHRydWUsXG4gICAgICB0aW1lID0gMFxuXG4gICAgLy8gMzBmcHMgY2FwIFx1MjAxNCBmZWVkYmFjayBlZmZlY3QsIG5vIHBlcmNlcHR1YWwgbG9zcyB2cyA2MGZwcyBidXRcbiAgICAvLyBoYWx2ZXMgdGhlIGNvc3Qgb2YgdGhlIGhlYXZpZXN0IG92ZXJsYXkgd2Ugc2hpcC5cbiAgICBjb25zdCBkaXNwb3NlID0gcnVuUmVuZGVyTG9vcCh7XG4gICAgICBlbDogY2FudmFzUmVmLmN1cnJlbnQsXG4gICAgICBtaW5JbnRlcnZhbE1zOiAzMyxcbiAgICAgIG9uRnJhbWU6IGRlbHRhU2Vjb25kcyA9PiB7XG4gICAgICAgIHRpbWUgKz0gZGVsdGFTZWNvbmRzXG5cbiAgICAgICAgY29uc3QgdiA9IGNSZWYuY3VycmVudFxuXG4gICAgICAgIHNyY1UudVRpbWUudmFsdWUgPSB0aW1lXG4gICAgICAgIHNyY1UudVNwZWVkLnZhbHVlID0gdi5zcGVlZFxuICAgICAgICBzcmNVLnVab29tLnZhbHVlID0gdi56b29tXG4gICAgICAgIHNyY1UudVJvdGF0ZS52YWx1ZSA9IHYucm90YXRlXG4gICAgICAgIHNyY1UudUZvbGRzLnZhbHVlID0gdi5mb2xkc1xuICAgICAgICBzcmNVLnVEcmlmdC52YWx1ZSA9IHYuZHJpZnRcblxuICAgICAgICBtb3NoVS51VGltZS52YWx1ZSA9IHRpbWVcbiAgICAgICAgbW9zaFUudUludGVuc2l0eS52YWx1ZSA9IHYuaW50ZW5zaXR5XG4gICAgICAgIG1vc2hVLnVNb3Rpb24udmFsdWUgPSB2Lm1vdGlvblxuICAgICAgICBtb3NoVS51U3BlZWQudmFsdWUgPSB2LnNwZWVkXG4gICAgICAgIG1vc2hVLnVab29tLnZhbHVlID0gdi56b29tXG5cbiAgICAgICAgb3V0VS51VGltZS52YWx1ZSA9IHRpbWVcbiAgICAgICAgb3V0VS51QWxwaGEudmFsdWUgPSB2LmFscGhhXG4gICAgICAgIG91dFUudUh1ZS52YWx1ZSA9IHYuaHVlXG4gICAgICAgIG91dFUudUNvbG9yLnZhbHVlLnNldCh0eXBlb2Ygdi5jb2xvciA9PT0gJ3N0cmluZycgPyB2LmNvbG9yIDogJyNmZmYnKVxuXG4gICAgICAgIHJlbmRlcmVyLnNldFJlbmRlclRhcmdldChydFNvdXJjZSlcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNyY1NjZW5lLCBjYW1lcmEpXG5cbiAgICAgICAgY29uc3QgW3JlYWQsIHdyaXRlXSA9IHBpbmcgPyBbcnRBLCBydEJdIDogW3J0QiwgcnRBXVxuICAgICAgICBtb3NoVS51UHJldi52YWx1ZSA9IHJlYWQudGV4dHVyZVxuICAgICAgICByZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQod3JpdGUpXG4gICAgICAgIHJlbmRlcmVyLnJlbmRlcihtb3NoU2NlbmUsIGNhbWVyYSlcblxuICAgICAgICBvdXRVLnVJbnB1dC52YWx1ZSA9IHdyaXRlLnRleHR1cmVcbiAgICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KG51bGwpXG4gICAgICAgIHJlbmRlcmVyLnJlbmRlcihvdXRTY2VuZSwgY2FtZXJhKVxuXG4gICAgICAgIHBpbmcgPSAhcGluZ1xuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHJlc2l6ZSlcbiAgICAgIGRpc3Bvc2UoKVxuICAgICAgdGV4dHVyZXMuZm9yRWFjaCh0ID0+IHQuZGlzcG9zZSgpKVxuICAgICAgO1tnZW8sIHJ0U291cmNlLCBydEEsIHJ0QiwgcmVuZGVyZXJdLmZvckVhY2goeCA9PiB4LmRpc3Bvc2UoKSlcbiAgICB9XG4gIH0sIFtlbmFibGVkXSlcblxuICBpZiAoIWVuYWJsZWQpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8Y2FudmFzXG4gICAgICBjbGFzc05hbWU9e2NuKCdoLWZ1bGwgdy1mdWxsJywgY2xhc3NOYW1lKX1cbiAgICAgIHJlZj17Y2FudmFzUmVmfVxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgbWl4QmxlbmRNb2RlOiAoYmxlbmRPdmVycmlkZSA/P1xuICAgICAgICAgIGMuYmxlbmQpIGFzIFJlYWN0LkNTU1Byb3BlcnRpZXNbJ21peEJsZW5kTW9kZSddLFxuICAgICAgICAuLi5zdHlsZVxuICAgICAgfX1cbiAgICAvPlxuICApXG59XG5cbmludGVyZmFjZSBHcmV5c1Byb3BzIHtcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIHN0eWxlPzogUmVhY3QuQ1NTUHJvcGVydGllc1xufSJdLAogICJtYXBwaW5ncyI6ICI7QUFrWEk7QUFoWEosU0FBUyxXQUFXLFFBQVEsZ0JBQWdCO0FBQzVDLFlBQVksV0FBVztBQUV2QixTQUFTLFVBQVUsa0JBQWtCO0FBQ3JDLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsVUFBVTtBQUVuQixTQUFTLG1CQUFtQjtBQUU1QixNQUFNO0FBQUE7QUFBQSxFQUFnQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBUXRCLE1BQU07QUFBQTtBQUFBLEVBQXNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXVDNUIsTUFBTTtBQUFBO0FBQUEsRUFBb0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFB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
@@ -0,0 +1,14 @@
1
+ import type { LensPreset } from './lens';
2
+ export { BLEND_MODES } from './blend-modes';
3
+ export { Glitch } from './glitch';
4
+ export { Greys } from './greys';
5
+ export { Lens } from './lens-layers';
6
+ export { Noise } from './noise';
7
+ export { Vignette } from './vignette';
8
+ export { $lightMode, applyLens, lens0, lens5i, LENS_0, LENS_5I, LENSES, toggleLens } from './lens';
9
+ export type { LensPreset } from './lens';
10
+ export declare function Overlays({ dark, initial }: OverlaysProps): import("react").JSX.Element;
11
+ interface OverlaysProps {
12
+ dark?: boolean;
13
+ initial?: LensPreset;
14
+ }
@@ -0,0 +1,34 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { Glitch } from "./glitch.js";
4
+ import { Greys } from "./greys.js";
5
+ import { Lens } from "./lens-layers.js";
6
+ import { Noise } from "./noise.js";
7
+ import { Vignette } from "./vignette.js";
8
+ export { BLEND_MODES } from "./blend-modes.js";
9
+ export { Glitch } from "./glitch.js";
10
+ export { Greys } from "./greys.js";
11
+ export { Lens } from "./lens-layers.js";
12
+ export { Noise } from "./noise.js";
13
+ export { Vignette } from "./vignette.js";
14
+ export {
15
+ $lightMode,
16
+ applyLens,
17
+ lens0,
18
+ lens5i,
19
+ LENS_0,
20
+ LENS_5I,
21
+ LENSES,
22
+ toggleLens
23
+ } from "./lens";
24
+ const LAYER = "pointer-events-none fixed inset-0";
25
+ export function Overlays({ dark, initial }) {
26
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
27
+ /* @__PURE__ */ jsx(Lens, { dark, initial }),
28
+ /* @__PURE__ */ jsx(Noise, { className: LAYER, style: { zIndex: 101 } }),
29
+ /* @__PURE__ */ jsx(Vignette, { className: LAYER, style: { zIndex: 99 } }),
30
+ /* @__PURE__ */ jsx(Greys, { className: LAYER, style: { zIndex: 200 } }),
31
+ /* @__PURE__ */ jsx(Glitch, { className: LAYER, style: { zIndex: 201 } })
32
+ ] });
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7IEdsaXRjaCB9IGZyb20gJy4vZ2xpdGNoJ1xuaW1wb3J0IHsgR3JleXMgfSBmcm9tICcuL2dyZXlzJ1xuaW1wb3J0IHsgTGVucyB9IGZyb20gJy4vbGVucy1sYXllcnMnXG5pbXBvcnQgeyBOb2lzZSB9IGZyb20gJy4vbm9pc2UnXG5pbXBvcnQgeyBWaWduZXR0ZSB9IGZyb20gJy4vdmlnbmV0dGUnXG5cbmltcG9ydCB0eXBlIHsgTGVuc1ByZXNldCB9IGZyb20gJy4vbGVucydcblxuZXhwb3J0IHsgQkxFTkRfTU9ERVMgfSBmcm9tICcuL2JsZW5kLW1vZGVzJ1xuZXhwb3J0IHsgR2xpdGNoIH0gZnJvbSAnLi9nbGl0Y2gnXG5leHBvcnQgeyBHcmV5cyB9IGZyb20gJy4vZ3JleXMnXG5leHBvcnQgeyBMZW5zIH0gZnJvbSAnLi9sZW5zLWxheWVycydcbmV4cG9ydCB7IE5vaXNlIH0gZnJvbSAnLi9ub2lzZSdcbmV4cG9ydCB7IFZpZ25ldHRlIH0gZnJvbSAnLi92aWduZXR0ZSdcbmV4cG9ydCB7XG4gICRsaWdodE1vZGUsXG4gIGFwcGx5TGVucyxcbiAgbGVuczAsXG4gIGxlbnM1aSxcbiAgTEVOU18wLFxuICBMRU5TXzVJLFxuICBMRU5TRVMsXG4gIHRvZ2dsZUxlbnNcbn0gZnJvbSAnLi9sZW5zJ1xuZXhwb3J0IHR5cGUgeyBMZW5zUHJlc2V0IH0gZnJvbSAnLi9sZW5zJ1xuXG5jb25zdCBMQVlFUiA9ICdwb2ludGVyLWV2ZW50cy1ub25lIGZpeGVkIGluc2V0LTAnXG5cbmV4cG9ydCBmdW5jdGlvbiBPdmVybGF5cyh7IGRhcmssIGluaXRpYWwgfTogT3ZlcmxheXNQcm9wcykge1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8TGVucyBkYXJrPXtkYXJrfSBpbml0aWFsPXtpbml0aWFsfSAvPlxuXG4gICAgICA8Tm9pc2UgY2xhc3NOYW1lPXtMQVlFUn0gc3R5bGU9e3sgekluZGV4OiAxMDEgfX0gLz5cbiAgICAgIDxWaWduZXR0ZSBjbGFzc05hbWU9e0xBWUVSfSBzdHlsZT17eyB6SW5kZXg6IDk5IH19IC8+XG4gICAgICA8R3JleXMgY2xhc3NOYW1lPXtMQVlFUn0gc3R5bGU9e3sgekluZGV4OiAyMDAgfX0gLz5cbiAgICAgIDxHbGl0Y2ggY2xhc3NOYW1lPXtMQVlFUn0gc3R5bGU9e3sgekluZGV4OiAyMDEgfX0gLz5cbiAgICA8Lz5cbiAgKVxufVxuXG5pbnRlcmZhY2UgT3ZlcmxheXNQcm9wcyB7XG4gIGRhcms/OiBib29sZWFuXG4gIGluaXRpYWw/OiBMZW5zUHJlc2V0XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBZ0NJLG1CQUNFLEtBREY7QUE5QkosU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsYUFBYTtBQUN0QixTQUFTLFlBQVk7QUFDckIsU0FBUyxhQUFhO0FBQ3RCLFNBQVMsZ0JBQWdCO0FBSXpCLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsY0FBYztBQUN2QixTQUFTLGFBQWE7QUFDdEIsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsYUFBYTtBQUN0QixTQUFTLGdCQUFnQjtBQUN6QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUdQLE1BQU0sUUFBUTtBQUVQLGdCQUFTLFNBQVMsRUFBRSxNQUFNLFFBQVEsR0FBa0I7QUFDekQsU0FDRSxpQ0FDRTtBQUFBLHdCQUFDLFFBQUssTUFBWSxTQUFrQjtBQUFBLElBRXBDLG9CQUFDLFNBQU0sV0FBVyxPQUFPLE9BQU8sRUFBRSxRQUFRLElBQUksR0FBRztBQUFBLElBQ2pELG9CQUFDLFlBQVMsV0FBVyxPQUFPLE9BQU8sRUFBRSxRQUFRLEdBQUcsR0FBRztBQUFBLElBQ25ELG9CQUFDLFNBQU0sV0FBVyxPQUFPLE9BQU8sRUFBRSxRQUFRLElBQUksR0FBRztBQUFBLElBQ2pELG9CQUFDLFVBQU8sV0FBVyxPQUFPLE9BQU8sRUFBRSxRQUFRLElBQUksR0FBRztBQUFBLEtBQ3BEO0FBRUo7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,14 @@
1
+ import { type LensPreset } from './lens';
2
+ export declare function Lens({ dark, initial }: LensProps): import("react").JSX.Element;
3
+ interface LensProps {
4
+ dark?: boolean;
5
+ /**
6
+ * Exact preset to seed the internal Leva controls with. When omitted the
7
+ * component falls back to `LENS_0` / `LENS_5I` based on `dark`. Pass the
8
+ * actual preset from a host (e.g. Storybook toolbar) to guarantee the
9
+ * first-paint colors match the selected lens without needing a followup
10
+ * `applyLens` that can be lost in useSmoothControls' startup window.
11
+ */
12
+ initial?: LensPreset;
13
+ }
14
+ export {};
@@ -0,0 +1,95 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useEffect } from "react";
4
+ import { useSmoothControls } from "../../../hooks/use-smooth-controls.js";
5
+ import { colorMix } from "../../../utils/color.js";
6
+ import fillerBg from "../../../assets/filler-bg0.webp";
7
+ import { BLEND_MODES } from "./blend-modes.js";
8
+ import { $lightMode, LENS_0, LENS_5I, toggleLens } from "./lens.js";
9
+ const LAYER = "pointer-events-none fixed inset-0";
10
+ export function Lens({ dark, initial }) {
11
+ const base = initial?.Lens ?? (dark ? LENS_0.Lens : LENS_5I.Lens);
12
+ const lens = useSmoothControls(
13
+ "Lens",
14
+ {
15
+ bgBlend: { options: BLEND_MODES, value: base.bgBlend },
16
+ bgColor: { value: base.bgColor },
17
+ bgOpacity: { max: 1, min: 0, step: 0.01, value: base.bgOpacity },
18
+ fgBlend: { options: BLEND_MODES, value: "difference" },
19
+ fgColor: { value: base.fgColor },
20
+ fgOpacity: { max: 1, min: 0, step: 0.01, value: base.fgOpacity },
21
+ fillerBlend: { options: BLEND_MODES, value: "difference" },
22
+ fillerOpacity: { max: 1, min: 0, step: 0.01, value: base.fillerOpacity },
23
+ mgColor: { value: base.mgColor },
24
+ mgOpacity: { max: 1, min: 0, step: 0.01, value: base.mgOpacity }
25
+ },
26
+ { collapsed: false }
27
+ );
28
+ useEffect(() => {
29
+ $lightMode.set(!dark);
30
+ }, [dark]);
31
+ useEffect(() => {
32
+ const s = document.documentElement.style;
33
+ for (const [name, color, alpha] of [
34
+ ["foreground", lens.fgColor, lens.fgOpacity],
35
+ ["midground", lens.mgColor, lens.mgOpacity],
36
+ ["background", lens.bgColor, lens.bgOpacity]
37
+ ]) {
38
+ s.setProperty(`--${name}`, colorMix(color, alpha));
39
+ s.setProperty(`--${name}-base`, color);
40
+ s.setProperty(`--${name}-alpha`, `${alpha}`);
41
+ }
42
+ }, [lens]);
43
+ useEffect(() => {
44
+ const handle = (e) => e.key === "x" && toggleLens();
45
+ window.addEventListener("keydown", handle);
46
+ return () => window.removeEventListener("keydown", handle);
47
+ }, []);
48
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
49
+ /* @__PURE__ */ jsx(
50
+ "div",
51
+ {
52
+ className: LAYER,
53
+ style: {
54
+ backgroundColor: colorMix(lens.fgColor, lens.fgOpacity),
55
+ mixBlendMode: lens.fgBlend,
56
+ zIndex: 100
57
+ }
58
+ }
59
+ ),
60
+ /* @__PURE__ */ jsx(
61
+ "div",
62
+ {
63
+ className: LAYER,
64
+ style: {
65
+ mixBlendMode: lens.fillerBlend,
66
+ opacity: lens.fillerOpacity,
67
+ zIndex: 2
68
+ },
69
+ children: /* @__PURE__ */ jsx(
70
+ "img",
71
+ {
72
+ alt: "",
73
+ className: "h-[150dvh] w-auto min-w-dvw object-cover object-top-left invert",
74
+ fetchPriority: "low",
75
+ height: 1024,
76
+ src: fillerBg.src,
77
+ width: 1024
78
+ }
79
+ )
80
+ }
81
+ ),
82
+ /* @__PURE__ */ jsx(
83
+ "div",
84
+ {
85
+ className: LAYER,
86
+ style: {
87
+ backgroundColor: colorMix(lens.bgColor, lens.bgOpacity),
88
+ mixBlendMode: lens.bgBlend,
89
+ zIndex: 1
90
+ }
91
+ }
92
+ )
93
+ ] });
94
+ }
95
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0J1xuXG5pbXBvcnQgeyB1c2VTbW9vdGhDb250cm9scyB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZS1zbW9vdGgtY29udHJvbHMnXG5pbXBvcnQgeyBjb2xvck1peCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2NvbG9yJ1xuXG5pbXBvcnQgZmlsbGVyQmcgZnJvbSAnLi4vLi4vLi4vYXNzZXRzL2ZpbGxlci1iZzAud2VicCdcblxuaW1wb3J0IHsgQkxFTkRfTU9ERVMgfSBmcm9tICcuL2JsZW5kLW1vZGVzJ1xuaW1wb3J0IHsgJGxpZ2h0TW9kZSwgTEVOU18wLCBMRU5TXzVJLCB0eXBlIExlbnNQcmVzZXQsIHRvZ2dsZUxlbnMgfSBmcm9tICcuL2xlbnMnXG5cbmNvbnN0IExBWUVSID0gJ3BvaW50ZXItZXZlbnRzLW5vbmUgZml4ZWQgaW5zZXQtMCdcblxuZXhwb3J0IGZ1bmN0aW9uIExlbnMoeyBkYXJrLCBpbml0aWFsIH06IExlbnNQcm9wcykge1xuICAvLyBgaW5pdGlhbGAgbGV0cyB0aGUgaG9zdCAoZS5nLiBTdG9yeWJvb2spIHNlZWQgdGhlIExldmEvYXRvbSBzdGF0ZSB3aXRoXG4gIC8vIHRoZSAqZXhhY3QqIGxlbnMgcHJlc2V0IHRoZSB1c2VyIHNlbGVjdGVkLCBhdm9pZGluZyBhIG9uZS1jeWNsZSBsYWdcbiAgLy8gd2hlcmUgdXNlU21vb3RoQ29udHJvbHMgZW1pdHMgb2xkIGNvbG9ycyBmb3IgdGhlIGZpcnN0IHBhaW50IChhbmQsIG9uXG4gIC8vIFN0b3J5Ym9vaydzIGZhc3QgaWZyYW1lIHJlbG9hZCwgc29tZXRpbWVzIG5ldmVyIGNhdGNoZXMgdXAgYmVjYXVzZVxuICAvLyB1c2VDb250cm9scycgcmVhZHktZ2F0ZSBzd2FsbG93cyB0aGUgaW5zdGFudCBjb2xvciB3cml0ZXMpLlxuICBjb25zdCBiYXNlID0gaW5pdGlhbD8uTGVucyA/PyAoZGFyayA/IExFTlNfMC5MZW5zIDogTEVOU181SS5MZW5zKVxuXG4gIGNvbnN0IGxlbnMgPSB1c2VTbW9vdGhDb250cm9scyhcbiAgICAnTGVucycsXG4gICAge1xuICAgICAgYmdCbGVuZDogeyBvcHRpb25zOiBCTEVORF9NT0RFUywgdmFsdWU6IGJhc2UuYmdCbGVuZCBhcyAnbXVsdGlwbHknIH0sXG4gICAgICBiZ0NvbG9yOiB7IHZhbHVlOiBiYXNlLmJnQ29sb3IgfSxcbiAgICAgIGJnT3BhY2l0eTogeyBtYXg6IDEsIG1pbjogMCwgc3RlcDogMC4wMSwgdmFsdWU6IGJhc2UuYmdPcGFjaXR5IH0sXG4gICAgICBmZ0JsZW5kOiB7IG9wdGlvbnM6IEJMRU5EX01PREVTLCB2YWx1ZTogJ2RpZmZlcmVuY2UnIGFzIGNvbnN0IH0sXG4gICAgICBmZ0NvbG9yOiB7IHZhbHVlOiBiYXNlLmZnQ29sb3IgfSxcbiAgICAgIGZnT3BhY2l0eTogeyBtYXg6IDEsIG1pbjogMCwgc3RlcDogMC4wMSwgdmFsdWU6IGJhc2UuZmdPcGFjaXR5IH0sXG4gICAgICBmaWxsZXJCbGVuZDogeyBvcHRpb25zOiBCTEVORF9NT0RFUywgdmFsdWU6ICdkaWZmZXJlbmNlJyBhcyBjb25zdCB9LFxuICAgICAgZmlsbGVyT3BhY2l0eTogeyBtYXg6IDEsIG1pbjogMCwgc3RlcDogMC4wMSwgdmFsdWU6IGJhc2UuZmlsbGVyT3BhY2l0eSB9LFxuICAgICAgbWdDb2xvcjogeyB2YWx1ZTogYmFzZS5tZ0NvbG9yIH0sXG4gICAgICBtZ09wYWNpdHk6IHsgbWF4OiAxLCBtaW46IDAsIHN0ZXA6IDAuMDEsIHZhbHVlOiBiYXNlLm1nT3BhY2l0eSB9XG4gICAgfSxcbiAgICB7IGNvbGxhcHNlZDogZmFsc2UgfVxuICApXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAkbGlnaHRNb2RlLnNldCghZGFyaylcbiAgfSwgW2RhcmtdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgcyA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZVxuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgY29sb3IsIGFscGhhXSBvZiBbXG4gICAgICBbJ2ZvcmVncm91bmQnLCBsZW5zLmZnQ29sb3IsIGxlbnMuZmdPcGFjaXR5XSxcbiAgICAgIFsnbWlkZ3JvdW5kJywgbGVucy5tZ0NvbG9yLCBsZW5zLm1nT3BhY2l0eV0sXG4gICAgICBbJ2JhY2tncm91bmQnLCBsZW5zLmJnQ29sb3IsIGxlbnMuYmdPcGFjaXR5XVxuICAgIF0gYXMgW3N0cmluZywgc3RyaW5nLCBudW1iZXJdW10pIHtcbiAgICAgIHMuc2V0UHJvcGVydHkoYC0tJHtuYW1lfWAsIGNvbG9yTWl4KGNvbG9yLCBhbHBoYSkpXG4gICAgICBzLnNldFByb3BlcnR5KGAtLSR7bmFtZX0tYmFzZWAsIGNvbG9yKVxuICAgICAgcy5zZXRQcm9wZXJ0eShgLS0ke25hbWV9LWFscGhhYCwgYCR7YWxwaGF9YClcbiAgICB9XG4gIH0sIFtsZW5zXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZSA9IChlOiBLZXlib2FyZEV2ZW50KSA9PiBlLmtleSA9PT0gJ3gnICYmIHRvZ2dsZUxlbnMoKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlKVxuICAgIHJldHVybiAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZSlcbiAgfSwgW10pXG5cbiAgLy8gTk9URTogei1pbmRleCBpcyBpbmxpbmVkIGJlY2F1c2UgVGFpbHdpbmQncyBKSVQgc29tZXRpbWVzIGRvZXNuJ3QgZW1pdFxuICAvLyB0aGVzZSBub24tZGVmYXVsdCB1dGlsaXRpZXMgKGUuZy4gaW4gU3Rvcnlib29rJ3MgaXNvbGF0ZWQgY29udGVudFxuICAvLyBzY2FuKSwgd2hpY2ggc2lsZW50bHkgY29sbGFwc2VzIHRoZSBvdmVybGF5IHN0YWNrIHRvIERPTSBvcmRlciBhbmRcbiAgLy8gYnJlYWtzIHRoZSBtaXgtYmxlbmQtbW9kZSBpbnZlcnNpb24gXHUyMDE0IHByb2R1Y2luZyBhIG11ZGR5IHdhcm0gd2FzaFxuICAvLyBpbnN0ZWFkIG9mIHRoZSBpbnRlbmRlZCBjbGVhbiBibGFjay93aGl0ZSBpbnZlcnNpb24uXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtMQVlFUn1cbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yTWl4KGxlbnMuZmdDb2xvciwgbGVucy5mZ09wYWNpdHkpLFxuICAgICAgICAgIG1peEJsZW5kTW9kZTogbGVucy5mZ0JsZW5kLFxuICAgICAgICAgIHpJbmRleDogMTAwXG4gICAgICAgIH19XG4gICAgICAvPlxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17TEFZRVJ9XG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgbWl4QmxlbmRNb2RlOiBsZW5zLmZpbGxlckJsZW5kLFxuICAgICAgICAgIG9wYWNpdHk6IGxlbnMuZmlsbGVyT3BhY2l0eSxcbiAgICAgICAgICB6SW5kZXg6IDJcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgey8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAbmV4dC9uZXh0L25vLWltZy1lbGVtZW50ICovfVxuICAgICAgICA8aW1nXG4gICAgICAgICAgYWx0PVwiXCJcbiAgICAgICAgICBjbGFzc05hbWU9XCJoLVsxNTBkdmhdIHctYXV0byBtaW4tdy1kdncgb2JqZWN0LWNvdmVyIG9iamVjdC10b3AtbGVmdCBpbnZlcnRcIlxuICAgICAgICAgIGZldGNoUHJpb3JpdHk9XCJsb3dcIlxuICAgICAgICAgIGhlaWdodD17MTAyNH1cbiAgICAgICAgICBzcmM9e2ZpbGxlckJnLnNyY31cbiAgICAgICAgICB3aWR0aD17MTAyNH1cbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17TEFZRVJ9XG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBjb2xvck1peChsZW5zLmJnQ29sb3IsIGxlbnMuYmdPcGFjaXR5KSxcbiAgICAgICAgICBtaXhCbGVuZE1vZGU6IGxlbnMuYmdCbGVuZCxcbiAgICAgICAgICB6SW5kZXg6IDFcbiAgICAgICAgfX1cbiAgICAgIC8+XG4gICAgPC8+XG4gIClcbn1cblxuaW50ZXJmYWNlIExlbnNQcm9wcyB7XG4gIGRhcms/OiBib29sZWFuXG4gIC8qKlxuICAgKiBFeGFjdCBwcmVzZXQgdG8gc2VlZCB0aGUgaW50ZXJuYWwgTGV2YSBjb250cm9scyB3aXRoLiBXaGVuIG9taXR0ZWQgdGhlXG4gICAqIGNvbXBvbmVudCBmYWxscyBiYWNrIHRvIGBMRU5TXzBgIC8gYExFTlNfNUlgIGJhc2VkIG9uIGBkYXJrYC4gUGFzcyB0aGVcbiAgICogYWN0dWFsIHByZXNldCBmcm9tIGEgaG9zdCAoZS5nLiBTdG9yeWJvb2sgdG9vbGJhcikgdG8gZ3VhcmFudGVlIHRoZVxuICAgKiBmaXJzdC1wYWludCBjb2xvcnMgbWF0Y2ggdGhlIHNlbGVjdGVkIGxlbnMgd2l0aG91dCBuZWVkaW5nIGEgZm9sbG93dXBcbiAgICogYGFwcGx5TGVuc2AgdGhhdCBjYW4gYmUgbG9zdCBpbiB1c2VTbW9vdGhDb250cm9scycgc3RhcnR1cCB3aW5kb3cuXG4gICAqL1xuICBpbml0aWFsPzogTGVuc1ByZXNldFxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQXFFSSxtQkFDRSxLQURGO0FBbkVKLFNBQVMsaUJBQWlCO0FBRTFCLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsZ0JBQWdCO0FBRXpCLE9BQU8sY0FBYztBQUVyQixTQUFTLG1CQUFtQjtBQUM1QixTQUFTLFlBQVksUUFBUSxTQUEwQixrQkFBa0I7QUFFekUsTUFBTSxRQUFRO0FBRVAsZ0JBQVMsS0FBSyxFQUFFLE1BQU0sUUFBUSxHQUFjO0FBTWpELFFBQU0sT0FBTyxT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
@@ -0,0 +1,44 @@
1
+ export declare const LENS_0: {
2
+ Globe: {
3
+ innerColor: string;
4
+ innerOpacity: number;
5
+ outerColor: string;
6
+ };
7
+ Lens: {
8
+ bgBlend: string;
9
+ bgColor: string;
10
+ bgOpacity: number;
11
+ fgColor: string;
12
+ fgOpacity: number;
13
+ fillerOpacity: number;
14
+ mgColor: string;
15
+ mgOpacity: number;
16
+ };
17
+ };
18
+ export declare const LENS_5I: {
19
+ Globe: {
20
+ innerColor: string;
21
+ innerOpacity: number;
22
+ outerColor: string;
23
+ };
24
+ Lens: {
25
+ bgBlend: string;
26
+ bgColor: string;
27
+ bgOpacity: number;
28
+ fgColor: string;
29
+ fgOpacity: number;
30
+ fillerOpacity: number;
31
+ mgColor: string;
32
+ mgOpacity: number;
33
+ };
34
+ };
35
+ export declare const lens0: (l?: Partial<typeof LENS_0.Lens>, g?: Partial<typeof LENS_0.Globe>) => LensPreset;
36
+ export declare const lens5i: (l?: Partial<typeof LENS_5I.Lens>, g?: Partial<typeof LENS_5I.Globe>) => LensPreset;
37
+ export declare const LENSES: [string, LensPreset][];
38
+ export declare const applyLens: (preset: LensPreset, animate?: boolean) => void;
39
+ export declare const $lightMode: import("nanostores").PreinitializedWritableAtom<boolean> & object;
40
+ export declare const toggleLens: () => void;
41
+ export interface LensPreset {
42
+ Globe: typeof LENS_0.Globe;
43
+ Lens: typeof LENS_0.Lens;
44
+ }