@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.
- package/CHANGELOG.md +5 -0
- package/README.md +21 -0
- package/dist/assets/filler-bg0.webp +0 -0
- package/dist/assets.d.ts +38 -0
- package/dist/fonts/Collapse-Bold.woff2 +0 -0
- package/dist/fonts/Collapse-BoldItalic.woff2 +0 -0
- package/dist/fonts/Collapse-Italic.woff2 +0 -0
- package/dist/fonts/Collapse-Light.woff2 +0 -0
- package/dist/fonts/Collapse-LightItalic.woff2 +0 -0
- package/dist/fonts/Collapse-Regular.woff2 +0 -0
- package/dist/fonts/Collapse-Thin.woff2 +0 -0
- package/dist/fonts/Collapse-ThinItalic.woff2 +0 -0
- package/dist/fonts/Mondwest-Regular.woff2 +0 -0
- package/dist/fonts/Neuebit-Bold.woff2 +0 -0
- package/dist/fonts/RulesCompressed-Medium.woff2 +0 -0
- package/dist/fonts/RulesCompressed-Regular.woff2 +0 -0
- package/dist/fonts/RulesExpanded-Bold.woff2 +0 -0
- package/dist/fonts/RulesExpanded-Regular.woff2 +0 -0
- package/dist/fonts.d.ts +6 -0
- package/dist/fonts.js +6 -0
- package/dist/hooks/use-below-breakpoint.d.ts +2 -0
- package/dist/hooks/use-below-breakpoint.js +17 -0
- package/dist/hooks/use-capped-frame.d.ts +2 -0
- package/dist/hooks/use-capped-frame.js +15 -0
- package/dist/hooks/use-confirm-delete.d.ts +10 -0
- package/dist/hooks/use-confirm-delete.js +35 -0
- package/dist/hooks/use-css-var-dims.d.ts +1 -0
- package/dist/hooks/use-css-var-dims.js +29 -0
- package/dist/hooks/use-gpu-tier.d.ts +34 -0
- package/dist/hooks/use-gpu-tier.js +111 -0
- package/dist/hooks/use-render-loop.d.ts +41 -0
- package/dist/hooks/use-render-loop.js +63 -0
- package/dist/hooks/use-smooth-controls.d.ts +16 -0
- package/dist/hooks/use-smooth-controls.js +217 -0
- package/dist/hooks/use-toast.d.ts +7 -0
- package/dist/hooks/use-toast.js +21 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.js +107 -0
- package/dist/ui/basic-page.d.ts +7 -0
- package/dist/ui/basic-page.js +18 -0
- package/dist/ui/build.css +4 -0
- package/dist/ui/components/animated-count.d.ts +10 -0
- package/dist/ui/components/animated-count.js +113 -0
- package/dist/ui/components/ascii.d.ts +10 -0
- package/dist/ui/components/ascii.js +79 -0
- package/dist/ui/components/badge.d.ts +6 -0
- package/dist/ui/components/badge.js +40 -0
- package/dist/ui/components/badges/nous-girl.d.ts +2 -0
- package/dist/ui/components/badges/nous-girl.js +83 -0
- package/dist/ui/components/blend-mode.d.ts +28 -0
- package/dist/ui/components/blend-mode.js +69 -0
- package/dist/ui/components/blink.d.ts +6 -0
- package/dist/ui/components/blink.js +17 -0
- package/dist/ui/components/bottom-sheet.d.ts +15 -0
- package/dist/ui/components/bottom-sheet.js +192 -0
- package/dist/ui/components/button.d.ts +14 -0
- package/dist/ui/components/button.js +147 -0
- package/dist/ui/components/card.d.ts +5 -0
- package/dist/ui/components/card.js +74 -0
- package/dist/ui/components/checkbox.d.ts +2 -0
- package/dist/ui/components/checkbox.js +27 -0
- package/dist/ui/components/command-block.d.ts +24 -0
- package/dist/ui/components/command-block.js +56 -0
- package/dist/ui/components/confirm-dialog.d.ts +13 -0
- package/dist/ui/components/confirm-dialog.js +113 -0
- package/dist/ui/components/cursor.d.ts +3 -0
- package/dist/ui/components/cursor.js +97 -0
- package/dist/ui/components/dialog.d.ts +15 -0
- package/dist/ui/components/dialog.js +171 -0
- package/dist/ui/components/dropdown-menu.d.ts +12 -0
- package/dist/ui/components/dropdown-menu.js +102 -0
- package/dist/ui/components/fit-text/fit-text.css +42 -0
- package/dist/ui/components/fit-text/index.d.ts +9 -0
- package/dist/ui/components/fit-text/index.js +25 -0
- package/dist/ui/components/graphs/bar-chart.d.ts +12 -0
- package/dist/ui/components/graphs/bar-chart.js +129 -0
- package/dist/ui/components/graphs/index.d.ts +3 -0
- package/dist/ui/components/graphs/index.js +4 -0
- package/dist/ui/components/graphs/line-chart.d.ts +14 -0
- package/dist/ui/components/graphs/line-chart.js +175 -0
- package/dist/ui/components/graphs/utils.d.ts +52 -0
- package/dist/ui/components/graphs/utils.js +162 -0
- package/dist/ui/components/grid/grid.css +79 -0
- package/dist/ui/components/grid/index.d.ts +2 -0
- package/dist/ui/components/grid/index.js +17 -0
- package/dist/ui/components/hover-bg.d.ts +1 -0
- package/dist/ui/components/hover-bg.js +14 -0
- package/dist/ui/components/icons/arrow.d.ts +6 -0
- package/dist/ui/components/icons/arrow.js +44 -0
- package/dist/ui/components/icons/check.d.ts +2 -0
- package/dist/ui/components/icons/check.js +13 -0
- package/dist/ui/components/icons/chevron.d.ts +6 -0
- package/dist/ui/components/icons/chevron.js +51 -0
- package/dist/ui/components/icons/discord.d.ts +2 -0
- package/dist/ui/components/icons/discord.js +15 -0
- package/dist/ui/components/icons/eye.d.ts +2 -0
- package/dist/ui/components/icons/eye.js +8 -0
- package/dist/ui/components/icons/gear.d.ts +6 -0
- package/dist/ui/components/icons/gear.js +30 -0
- package/dist/ui/components/icons/github.d.ts +2 -0
- package/dist/ui/components/icons/github.js +15 -0
- package/dist/ui/components/icons/hamburger.d.ts +6 -0
- package/dist/ui/components/icons/hamburger.js +56 -0
- package/dist/ui/components/icons/heart.d.ts +2 -0
- package/dist/ui/components/icons/heart.js +11 -0
- package/dist/ui/components/icons/index.d.ts +12 -0
- package/dist/ui/components/icons/index.js +13 -0
- package/dist/ui/components/icons/link.d.ts +2 -0
- package/dist/ui/components/icons/link.js +13 -0
- package/dist/ui/components/icons/minus.d.ts +2 -0
- package/dist/ui/components/icons/minus.js +13 -0
- package/dist/ui/components/icons/search.d.ts +2 -0
- package/dist/ui/components/icons/search.js +33 -0
- package/dist/ui/components/image-distortion.d.ts +21 -0
- package/dist/ui/components/image-distortion.js +398 -0
- package/dist/ui/components/input.d.ts +1 -0
- package/dist/ui/components/input.js +21 -0
- package/dist/ui/components/label.d.ts +1 -0
- package/dist/ui/components/label.js +18 -0
- package/dist/ui/components/leva-client.d.ts +1 -0
- package/dist/ui/components/leva-client.js +12 -0
- package/dist/ui/components/list-item.d.ts +6 -0
- package/dist/ui/components/list-item.js +27 -0
- package/dist/ui/components/overlays/blend-modes.d.ts +1 -0
- package/dist/ui/components/overlays/blend-modes.js +14 -0
- package/dist/ui/components/overlays/glitch.d.ts +6 -0
- package/dist/ui/components/overlays/glitch.js +209 -0
- package/dist/ui/components/overlays/greys.d.ts +6 -0
- package/dist/ui/components/overlays/greys.js +339 -0
- package/dist/ui/components/overlays/index.d.ts +14 -0
- package/dist/ui/components/overlays/index.js +34 -0
- package/dist/ui/components/overlays/lens-layers.d.ts +14 -0
- package/dist/ui/components/overlays/lens-layers.js +95 -0
- package/dist/ui/components/overlays/lens.d.ts +44 -0
- package/dist/ui/components/overlays/lens.js +60 -0
- package/dist/ui/components/overlays/noise.d.ts +6 -0
- package/dist/ui/components/overlays/noise.js +136 -0
- package/dist/ui/components/overlays/vignette.d.ts +6 -0
- package/dist/ui/components/overlays/vignette.js +47 -0
- package/dist/ui/components/poster.d.ts +62 -0
- package/dist/ui/components/poster.js +256 -0
- package/dist/ui/components/progress.d.ts +9 -0
- package/dist/ui/components/progress.js +53 -0
- package/dist/ui/components/scene-canvas.d.ts +23 -0
- package/dist/ui/components/scene-canvas.js +179 -0
- package/dist/ui/components/scramble.d.ts +9 -0
- package/dist/ui/components/scramble.js +63 -0
- package/dist/ui/components/segmented.d.ts +20 -0
- package/dist/ui/components/segmented.js +51 -0
- package/dist/ui/components/select.d.ts +18 -0
- package/dist/ui/components/select.js +215 -0
- package/dist/ui/components/selection-switcher.d.ts +1 -0
- package/dist/ui/components/selection-switcher.js +34 -0
- package/dist/ui/components/separator.d.ts +5 -0
- package/dist/ui/components/separator.js +22 -0
- package/dist/ui/components/shader.d.ts +7 -0
- package/dist/ui/components/shader.js +60 -0
- package/dist/ui/components/socials.d.ts +20 -0
- package/dist/ui/components/socials.js +21 -0
- package/dist/ui/components/spinner.d.ts +20 -0
- package/dist/ui/components/spinner.js +38 -0
- package/dist/ui/components/stats.d.ts +16 -0
- package/dist/ui/components/stats.js +36 -0
- package/dist/ui/components/switch.d.ts +7 -0
- package/dist/ui/components/switch.js +37 -0
- package/dist/ui/components/tabs.d.ts +14 -0
- package/dist/ui/components/tabs.js +44 -0
- package/dist/ui/components/terminal-demo.d.ts +32 -0
- package/dist/ui/components/terminal-demo.js +125 -0
- package/dist/ui/components/theme-toggle.d.ts +6 -0
- package/dist/ui/components/theme-toggle.js +66 -0
- package/dist/ui/components/tier-card.d.ts +53 -0
- package/dist/ui/components/tier-card.js +146 -0
- package/dist/ui/components/toast.d.ts +8 -0
- package/dist/ui/components/toast.js +39 -0
- package/dist/ui/components/tv.d.ts +3 -0
- package/dist/ui/components/tv.js +239 -0
- package/dist/ui/components/typography/h1.d.ts +11 -0
- package/dist/ui/components/typography/h1.js +18 -0
- package/dist/ui/components/typography/h2.d.ts +11 -0
- package/dist/ui/components/typography/h2.js +18 -0
- package/dist/ui/components/typography/index.d.ts +15 -0
- package/dist/ui/components/typography/index.js +41 -0
- package/dist/ui/components/typography/legend.d.ts +6 -0
- package/dist/ui/components/typography/legend.js +20 -0
- package/dist/ui/components/typography/small.d.ts +2 -0
- package/dist/ui/components/typography/small.js +9 -0
- package/dist/ui/components/watchlist.d.ts +11 -0
- package/dist/ui/components/watchlist.js +80 -0
- package/dist/ui/fonts.css +63 -0
- package/dist/ui/footer.d.ts +20 -0
- package/dist/ui/footer.js +65 -0
- package/dist/ui/globals.css +395 -0
- package/dist/ui/header.d.ts +41 -0
- package/dist/ui/header.js +270 -0
- package/dist/ui/layout-wrapper.d.ts +1 -0
- package/dist/ui/layout-wrapper.js +7 -0
- package/dist/utils/color.d.ts +4 -0
- package/dist/utils/color.js +14 -0
- package/dist/utils/index.d.ts +15 -0
- package/dist/utils/index.js +48 -0
- package/dist/utils/poly.d.ts +8 -0
- package/dist/utils/poly.js +3 -0
- package/package.json +120 -0
- package/src/assets/filler-bg0.webp +0 -0
- package/src/assets.d.ts +38 -0
- package/src/fonts/Collapse-Bold.woff2 +0 -0
- package/src/fonts/Collapse-BoldItalic.woff2 +0 -0
- package/src/fonts/Collapse-Italic.woff2 +0 -0
- package/src/fonts/Collapse-Light.woff2 +0 -0
- package/src/fonts/Collapse-LightItalic.woff2 +0 -0
- package/src/fonts/Collapse-Regular.woff2 +0 -0
- package/src/fonts/Collapse-Thin.woff2 +0 -0
- package/src/fonts/Collapse-ThinItalic.woff2 +0 -0
- package/src/fonts/Mondwest-Regular.woff2 +0 -0
- package/src/fonts/Neuebit-Bold.woff2 +0 -0
- package/src/fonts/RulesCompressed-Medium.woff2 +0 -0
- package/src/fonts/RulesCompressed-Regular.woff2 +0 -0
- package/src/fonts/RulesExpanded-Bold.woff2 +0 -0
- package/src/fonts/RulesExpanded-Regular.woff2 +0 -0
- package/src/fonts.ts +6 -0
- package/src/hooks/use-below-breakpoint.ts +21 -0
- package/src/hooks/use-capped-frame.ts +18 -0
- package/src/hooks/use-confirm-delete.ts +43 -0
- package/src/hooks/use-css-var-dims.ts +39 -0
- package/src/hooks/use-gpu-tier.ts +190 -0
- package/src/hooks/use-render-loop.ts +121 -0
- package/src/hooks/use-smooth-controls.ts +318 -0
- package/src/hooks/use-toast.ts +29 -0
- package/src/index.ts +130 -0
- package/src/ui/basic-page.tsx +34 -0
- package/src/ui/build.css +4 -0
- package/src/ui/components/animated-count.stories.tsx +67 -0
- package/src/ui/components/animated-count.tsx +168 -0
- package/src/ui/components/ascii.stories.tsx +30 -0
- package/src/ui/components/ascii.tsx +110 -0
- package/src/ui/components/badge.stories.tsx +31 -0
- package/src/ui/components/badge.tsx +60 -0
- package/src/ui/components/badges/nous-girl.tsx +52 -0
- package/src/ui/components/blend-mode.stories.tsx +33 -0
- package/src/ui/components/blend-mode.tsx +129 -0
- package/src/ui/components/blink.stories.tsx +32 -0
- package/src/ui/components/blink.tsx +21 -0
- package/src/ui/components/bottom-sheet.stories.tsx +43 -0
- package/src/ui/components/bottom-sheet.tsx +227 -0
- package/src/ui/components/button.stories.tsx +68 -0
- package/src/ui/components/button.tsx +170 -0
- package/src/ui/components/card.stories.tsx +63 -0
- package/src/ui/components/card.tsx +85 -0
- package/src/ui/components/checkbox.stories.tsx +113 -0
- package/src/ui/components/checkbox.tsx +36 -0
- package/src/ui/components/command-block.stories.tsx +52 -0
- package/src/ui/components/command-block.tsx +86 -0
- package/src/ui/components/confirm-dialog.stories.tsx +91 -0
- package/src/ui/components/confirm-dialog.tsx +130 -0
- package/src/ui/components/cursor.tsx +115 -0
- package/src/ui/components/dialog.stories.tsx +169 -0
- package/src/ui/components/dialog.tsx +177 -0
- package/src/ui/components/dropdown-menu.stories.tsx +52 -0
- package/src/ui/components/dropdown-menu.tsx +117 -0
- package/src/ui/components/fit-text/fit-text.css +42 -0
- package/src/ui/components/fit-text/index.stories.tsx +33 -0
- package/src/ui/components/fit-text/index.tsx +45 -0
- package/src/ui/components/forms.stories.tsx +173 -0
- package/src/ui/components/graphs/bar-chart.tsx +153 -0
- package/src/ui/components/graphs/index.stories.tsx +64 -0
- package/src/ui/components/graphs/index.tsx +4 -0
- package/src/ui/components/graphs/line-chart.tsx +213 -0
- package/src/ui/components/graphs/utils.tsx +265 -0
- package/src/ui/components/grid/grid.css +79 -0
- package/src/ui/components/grid/index.tsx +19 -0
- package/src/ui/components/hover-bg.stories.tsx +29 -0
- package/src/ui/components/hover-bg.tsx +15 -0
- package/src/ui/components/icons/arrow.tsx +42 -0
- package/src/ui/components/icons/check.tsx +14 -0
- package/src/ui/components/icons/chevron.tsx +45 -0
- package/src/ui/components/icons/discord.tsx +16 -0
- package/src/ui/components/icons/eye.tsx +12 -0
- package/src/ui/components/icons/gear.tsx +51 -0
- package/src/ui/components/icons/github.tsx +16 -0
- package/src/ui/components/icons/hamburger.tsx +52 -0
- package/src/ui/components/icons/heart.tsx +12 -0
- package/src/ui/components/icons/index.ts +12 -0
- package/src/ui/components/icons/link.tsx +14 -0
- package/src/ui/components/icons/minus.tsx +14 -0
- package/src/ui/components/icons/search.tsx +28 -0
- package/src/ui/components/image-distortion.stories.tsx +120 -0
- package/src/ui/components/image-distortion.tsx +499 -0
- package/src/ui/components/input.stories.tsx +39 -0
- package/src/ui/components/input.tsx +20 -0
- package/src/ui/components/label.stories.tsx +26 -0
- package/src/ui/components/label.tsx +16 -0
- package/src/ui/components/leva-client.tsx +14 -0
- package/src/ui/components/list-item.stories.tsx +83 -0
- package/src/ui/components/list-item.tsx +37 -0
- package/src/ui/components/overlays/blend-modes.ts +13 -0
- package/src/ui/components/overlays/glitch.tsx +243 -0
- package/src/ui/components/overlays/greys.tsx +386 -0
- package/src/ui/components/overlays/index.tsx +47 -0
- package/src/ui/components/overlays/lens-layers.tsx +121 -0
- package/src/ui/components/overlays/lens.ts +91 -0
- package/src/ui/components/overlays/noise.tsx +174 -0
- package/src/ui/components/overlays/vignette.tsx +60 -0
- package/src/ui/components/poster.stories.tsx +513 -0
- package/src/ui/components/poster.tsx +411 -0
- package/src/ui/components/progress.stories.tsx +48 -0
- package/src/ui/components/progress.tsx +56 -0
- package/src/ui/components/scene-canvas.tsx +254 -0
- package/src/ui/components/scramble.stories.tsx +49 -0
- package/src/ui/components/scramble.tsx +95 -0
- package/src/ui/components/segmented.stories.tsx +101 -0
- package/src/ui/components/segmented.tsx +81 -0
- package/src/ui/components/select.stories.tsx +88 -0
- package/src/ui/components/select.tsx +267 -0
- package/src/ui/components/selection-switcher.tsx +44 -0
- package/src/ui/components/separator.stories.tsx +33 -0
- package/src/ui/components/separator.tsx +24 -0
- package/src/ui/components/shader.tsx +83 -0
- package/src/ui/components/socials.tsx +42 -0
- package/src/ui/components/spinner.stories.tsx +101 -0
- package/src/ui/components/spinner.tsx +60 -0
- package/src/ui/components/stats.stories.tsx +24 -0
- package/src/ui/components/stats.tsx +53 -0
- package/src/ui/components/switch.stories.tsx +77 -0
- package/src/ui/components/switch.tsx +48 -0
- package/src/ui/components/tabs.stories.tsx +101 -0
- package/src/ui/components/tabs.tsx +66 -0
- package/src/ui/components/terminal-demo.stories.tsx +67 -0
- package/src/ui/components/terminal-demo.tsx +189 -0
- package/src/ui/components/theme-toggle.stories.tsx +47 -0
- package/src/ui/components/theme-toggle.tsx +66 -0
- package/src/ui/components/tier-card.stories.tsx +217 -0
- package/src/ui/components/tier-card.tsx +190 -0
- package/src/ui/components/toast.stories.tsx +55 -0
- package/src/ui/components/toast.tsx +49 -0
- package/src/ui/components/tv.stories.tsx +37 -0
- package/src/ui/components/tv.tsx +257 -0
- package/src/ui/components/typography/h1.tsx +18 -0
- package/src/ui/components/typography/h2.tsx +18 -0
- package/src/ui/components/typography/index.tsx +54 -0
- package/src/ui/components/typography/legend.tsx +24 -0
- package/src/ui/components/typography/small.tsx +11 -0
- package/src/ui/components/watchlist.stories.tsx +33 -0
- package/src/ui/components/watchlist.tsx +105 -0
- package/src/ui/fonts.css +63 -0
- package/src/ui/footer.tsx +111 -0
- package/src/ui/globals.css +395 -0
- package/src/ui/header.tsx +398 -0
- package/src/ui/layout-wrapper.tsx +11 -0
- package/src/utils/color.ts +21 -0
- package/src/utils/index.ts +62 -0
- 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
|
+
}
|