add fireworks (#2258)
* add fireworks * fix weird search background color due to canvas overlay * prevent going off small screens
This commit is contained in:
		
							parent
							
								
									de01d9493f
								
							
						
					
					
						commit
						96fd271573
					
				
							
								
								
									
										273
									
								
								components/fireworks.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										273
									
								
								components/fireworks.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,273 @@
 | 
			
		||||
import { useCallback, createContext, useContext, useState, useEffect } from 'react'
 | 
			
		||||
import Particles from 'react-particles'
 | 
			
		||||
import { loadFireworksPreset } from 'tsparticles-preset-fireworks'
 | 
			
		||||
import styles from './fireworks.module.css'
 | 
			
		||||
import {
 | 
			
		||||
  rgbToHsl,
 | 
			
		||||
  setRangeValue,
 | 
			
		||||
  stringToRgb
 | 
			
		||||
} from 'tsparticles-engine'
 | 
			
		||||
import useDarkMode from './dark-mode'
 | 
			
		||||
 | 
			
		||||
export const FireworksContext = createContext({
 | 
			
		||||
  strike: () => {}
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
export const FireworksConsumer = FireworksContext.Consumer
 | 
			
		||||
export function useFireworks () {
 | 
			
		||||
  const { strike } = useContext(FireworksContext)
 | 
			
		||||
  return strike
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function FireworksProvider ({ children }) {
 | 
			
		||||
  const [cont, setCont] = useState()
 | 
			
		||||
  const [context, setContext] = useState({ strike: () => {} })
 | 
			
		||||
  const [darkMode] = useDarkMode()
 | 
			
		||||
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    setContext({
 | 
			
		||||
      strike: () => {
 | 
			
		||||
        cont?.addEmitter(
 | 
			
		||||
          {
 | 
			
		||||
            direction: 'top',
 | 
			
		||||
            life: {
 | 
			
		||||
              count: 1,
 | 
			
		||||
              duration: 0.1,
 | 
			
		||||
              delay: 0.1
 | 
			
		||||
            },
 | 
			
		||||
            rate: {
 | 
			
		||||
              delay: 0,
 | 
			
		||||
              quantity: 1
 | 
			
		||||
            },
 | 
			
		||||
            size: {
 | 
			
		||||
              width: 10,
 | 
			
		||||
              height: 0
 | 
			
		||||
            },
 | 
			
		||||
            position: {
 | 
			
		||||
              y: 100,
 | 
			
		||||
              x: 50
 | 
			
		||||
            }
 | 
			
		||||
          })
 | 
			
		||||
        return true
 | 
			
		||||
      }
 | 
			
		||||
    })
 | 
			
		||||
  }, [cont])
 | 
			
		||||
 | 
			
		||||
  const particlesLoaded = useCallback((container) => {
 | 
			
		||||
    setCont(container)
 | 
			
		||||
  }, [])
 | 
			
		||||
 | 
			
		||||
  const particlesInit = useCallback(async engine => {
 | 
			
		||||
    // you can initiate the tsParticles instance (engine) here, adding custom shapes or presets
 | 
			
		||||
    // this loads the tsparticles package bundle, it's the easiest method for getting everything ready
 | 
			
		||||
    // starting from v2 you can add only the features you need reducing the bundle size
 | 
			
		||||
    await loadFireworksPreset(engine)
 | 
			
		||||
  }, [])
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <FireworksContext.Provider value={context}>
 | 
			
		||||
      <Particles
 | 
			
		||||
        className={styles.fireworks}
 | 
			
		||||
        init={particlesInit}
 | 
			
		||||
        loaded={particlesLoaded}
 | 
			
		||||
        options={darkMode ? darkOptions : lightOptions}
 | 
			
		||||
      />
 | 
			
		||||
      {children}
 | 
			
		||||
    </FireworksContext.Provider>
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const fixRange = (value, min, max) => {
 | 
			
		||||
  const diffSMax = value.max > max ? value.max - max : 0
 | 
			
		||||
  let res = setRangeValue(value)
 | 
			
		||||
 | 
			
		||||
  if (diffSMax) {
 | 
			
		||||
    res = setRangeValue(value.min - diffSMax, max)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const diffSMin = value.min < min ? value.min : 0
 | 
			
		||||
 | 
			
		||||
  if (diffSMin) {
 | 
			
		||||
    res = setRangeValue(0, value.max + diffSMin)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const fireworksOptions = ['#ff595e', '#ffca3a', '#8ac926', '#1982c4', '#6a4c93']
 | 
			
		||||
  .map((color) => {
 | 
			
		||||
    const rgb = stringToRgb(color)
 | 
			
		||||
 | 
			
		||||
    if (!rgb) {
 | 
			
		||||
      return undefined
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const hsl = rgbToHsl(rgb)
 | 
			
		||||
    const sRange = fixRange({ min: hsl.s - 30, max: hsl.s + 30 }, 0, 100)
 | 
			
		||||
    const lRange = fixRange({ min: hsl.l - 30, max: hsl.l + 30 }, 0, 100)
 | 
			
		||||
 | 
			
		||||
    return {
 | 
			
		||||
      color: {
 | 
			
		||||
        value: {
 | 
			
		||||
          h: hsl.h,
 | 
			
		||||
          s: sRange,
 | 
			
		||||
          l: lRange
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      stroke: {
 | 
			
		||||
        width: 0
 | 
			
		||||
      },
 | 
			
		||||
      number: {
 | 
			
		||||
        value: 0
 | 
			
		||||
      },
 | 
			
		||||
      opacity: {
 | 
			
		||||
        value: {
 | 
			
		||||
          min: 0.1,
 | 
			
		||||
          max: 1
 | 
			
		||||
        },
 | 
			
		||||
        animation: {
 | 
			
		||||
          enable: true,
 | 
			
		||||
          speed: 0.7,
 | 
			
		||||
          sync: false,
 | 
			
		||||
          startValue: 'max',
 | 
			
		||||
          destroy: 'min'
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      shape: {
 | 
			
		||||
        type: 'circle'
 | 
			
		||||
      },
 | 
			
		||||
      size: {
 | 
			
		||||
        value: { min: 1, max: 2 },
 | 
			
		||||
        animation: {
 | 
			
		||||
          enable: true,
 | 
			
		||||
          speed: 5,
 | 
			
		||||
          count: 1,
 | 
			
		||||
          sync: false,
 | 
			
		||||
          startValue: 'min',
 | 
			
		||||
          destroy: 'none'
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      life: {
 | 
			
		||||
        count: 1,
 | 
			
		||||
        duration: {
 | 
			
		||||
          value: {
 | 
			
		||||
            min: 1,
 | 
			
		||||
            max: 2
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      move: {
 | 
			
		||||
        decay: { min: 0.075, max: 0.1 },
 | 
			
		||||
        enable: true,
 | 
			
		||||
        gravity: {
 | 
			
		||||
          enable: true,
 | 
			
		||||
          inverse: false,
 | 
			
		||||
          acceleration: 5
 | 
			
		||||
        },
 | 
			
		||||
        speed: { min: 5, max: 15 },
 | 
			
		||||
        direction: 'none',
 | 
			
		||||
        outMode: {
 | 
			
		||||
          top: 'destroy',
 | 
			
		||||
          default: 'bounce'
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  })
 | 
			
		||||
  .filter((t) => t !== undefined)
 | 
			
		||||
 | 
			
		||||
const particlesOptions = (theme) => ({
 | 
			
		||||
  number: {
 | 
			
		||||
    value: 0
 | 
			
		||||
  },
 | 
			
		||||
  destroy: {
 | 
			
		||||
    mode: 'split',
 | 
			
		||||
    bounds: {
 | 
			
		||||
      top: { min: 5, max: 40 }
 | 
			
		||||
    },
 | 
			
		||||
    split: {
 | 
			
		||||
      sizeOffset: false,
 | 
			
		||||
      count: 1,
 | 
			
		||||
      factor: {
 | 
			
		||||
        value: 0.333333
 | 
			
		||||
      },
 | 
			
		||||
      rate: {
 | 
			
		||||
        value: { min: 75, max: 150 }
 | 
			
		||||
      },
 | 
			
		||||
      particles: fireworksOptions
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  life: {
 | 
			
		||||
    count: 1
 | 
			
		||||
  },
 | 
			
		||||
  shape: {
 | 
			
		||||
    type: 'line'
 | 
			
		||||
  },
 | 
			
		||||
  size: {
 | 
			
		||||
    value: {
 | 
			
		||||
      min: 0.1,
 | 
			
		||||
      max: 50
 | 
			
		||||
    },
 | 
			
		||||
    animation: {
 | 
			
		||||
      enable: true,
 | 
			
		||||
      sync: true,
 | 
			
		||||
      speed: 90,
 | 
			
		||||
      startValue: 'max',
 | 
			
		||||
      destroy: 'min'
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  rotate: {
 | 
			
		||||
    path: true
 | 
			
		||||
  },
 | 
			
		||||
  stroke: {
 | 
			
		||||
    color: {
 | 
			
		||||
      value: theme === 'dark' ? '#fff' : '#aaa'
 | 
			
		||||
    },
 | 
			
		||||
    width: 1
 | 
			
		||||
  },
 | 
			
		||||
  move: {
 | 
			
		||||
    enable: true,
 | 
			
		||||
    gravity: {
 | 
			
		||||
      acceleration: 15,
 | 
			
		||||
      enable: true,
 | 
			
		||||
      inverse: true,
 | 
			
		||||
      maxSpeed: 100
 | 
			
		||||
    },
 | 
			
		||||
    speed: {
 | 
			
		||||
      min: 10,
 | 
			
		||||
      max: 20
 | 
			
		||||
    },
 | 
			
		||||
    outModes: {
 | 
			
		||||
      default: 'split',
 | 
			
		||||
      top: 'none'
 | 
			
		||||
    },
 | 
			
		||||
    trail: {
 | 
			
		||||
      fillColor: theme === 'dark' ? '#000' : '#f5f5f7',
 | 
			
		||||
      enable: true,
 | 
			
		||||
      length: 10
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
const darkOptions = {
 | 
			
		||||
  fullScreen: { enable: true, zIndex: -1 },
 | 
			
		||||
  detectRetina: true,
 | 
			
		||||
  background: {
 | 
			
		||||
    color: '#000',
 | 
			
		||||
    opacity: 0
 | 
			
		||||
  },
 | 
			
		||||
  fpsLimit: 120,
 | 
			
		||||
  emitters: [],
 | 
			
		||||
  particles: particlesOptions('dark')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const lightOptions = {
 | 
			
		||||
  fullScreen: { enable: true, zIndex: -1 },
 | 
			
		||||
  detectRetina: true,
 | 
			
		||||
  background: {
 | 
			
		||||
    color: '#fff',
 | 
			
		||||
    opacity: 0
 | 
			
		||||
  },
 | 
			
		||||
  fpsLimit: 120,
 | 
			
		||||
  emitters: [],
 | 
			
		||||
  particles: particlesOptions('light')
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										8
									
								
								components/fireworks.module.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								components/fireworks.module.css
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
			
		||||
.fireworks {
 | 
			
		||||
  z-index: 0;
 | 
			
		||||
  position: fixed;
 | 
			
		||||
  top: 0;
 | 
			
		||||
  left: 0;
 | 
			
		||||
  width: 100vw;
 | 
			
		||||
  height: 100vh;
 | 
			
		||||
}
 | 
			
		||||
@ -6,7 +6,6 @@ import { useMe } from './me'
 | 
			
		||||
import UpBolt from '@/svgs/bolt.svg'
 | 
			
		||||
import { amountSchema, boostSchema } from '@/lib/validate'
 | 
			
		||||
import { useToast } from './toast'
 | 
			
		||||
import { useLightning } from './lightning'
 | 
			
		||||
import { nextTip, defaultTipIncludingRandom } from './upvote'
 | 
			
		||||
import { ZAP_UNDO_DELAY_MS } from '@/lib/constants'
 | 
			
		||||
import { usePaidMutation } from './use-paid-mutation'
 | 
			
		||||
@ -14,6 +13,7 @@ import { ACT_MUTATION } from '@/fragments/paidAction'
 | 
			
		||||
import { meAnonSats } from '@/lib/apollo'
 | 
			
		||||
import { BoostItemInput } from './adv-post-form'
 | 
			
		||||
import { useSendWallets } from '@/wallets/index'
 | 
			
		||||
import { useFireworks } from './fireworks'
 | 
			
		||||
 | 
			
		||||
const defaultTips = [100, 1000, 10_000, 100_000]
 | 
			
		||||
 | 
			
		||||
@ -96,7 +96,7 @@ export default function ItemAct ({ onClose, item, act = 'TIP', step, children, a
 | 
			
		||||
  }, [onClose, item.id])
 | 
			
		||||
 | 
			
		||||
  const actor = useAct()
 | 
			
		||||
  const strike = useLightning()
 | 
			
		||||
  const strike = useFireworks()
 | 
			
		||||
 | 
			
		||||
  const onSubmit = useCallback(async ({ amount }) => {
 | 
			
		||||
    if (abortSignal && zapUndoTrigger({ me, amount })) {
 | 
			
		||||
@ -300,7 +300,7 @@ export function useAct ({ query = ACT_MUTATION, ...options } = {}) {
 | 
			
		||||
export function useZap () {
 | 
			
		||||
  const wallets = useSendWallets()
 | 
			
		||||
  const act = useAct()
 | 
			
		||||
  const strike = useLightning()
 | 
			
		||||
  const strike = useFireworks()
 | 
			
		||||
  const toaster = useToast()
 | 
			
		||||
 | 
			
		||||
  return useCallback(async ({ item, me, abortSignal }) => {
 | 
			
		||||
 | 
			
		||||
@ -5,6 +5,7 @@
 | 
			
		||||
    height: 100%;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    margin: auto;
 | 
			
		||||
    z-index: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.content {
 | 
			
		||||
 | 
			
		||||
@ -15,7 +15,7 @@ import { useServiceWorker } from '../serviceworker'
 | 
			
		||||
import { signOut } from 'next-auth/react'
 | 
			
		||||
import Badges from '../badge'
 | 
			
		||||
import { randInRange } from '../../lib/rand'
 | 
			
		||||
import { useLightning } from '../lightning'
 | 
			
		||||
import { useFireworks } from '../fireworks'
 | 
			
		||||
import LightningIcon from '../../svgs/bolt.svg'
 | 
			
		||||
import SearchIcon from '../../svgs/search-line.svg'
 | 
			
		||||
import classNames from 'classnames'
 | 
			
		||||
@ -400,13 +400,15 @@ export function LoginButtons ({ handleClose }) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function AnonDropdown ({ path }) {
 | 
			
		||||
  const strike = useLightning()
 | 
			
		||||
  const strike = useFireworks()
 | 
			
		||||
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    if (!window.localStorage.getItem('striked')) {
 | 
			
		||||
      const to = setTimeout(() => {
 | 
			
		||||
        strike()
 | 
			
		||||
        window.localStorage.setItem('striked', 'yep')
 | 
			
		||||
        const striked = strike()
 | 
			
		||||
        if (striked) {
 | 
			
		||||
          window.localStorage.setItem('striked', 'yep')
 | 
			
		||||
        }
 | 
			
		||||
      }, randInRange(3000, 10000))
 | 
			
		||||
      return () => clearTimeout(to)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,7 @@ import { numWithUnits } from '@/lib/format'
 | 
			
		||||
import { useShowModal } from './modal'
 | 
			
		||||
import { useRoot } from './root'
 | 
			
		||||
import { ActCanceledError, useAct } from './item-act'
 | 
			
		||||
import { useLightning } from './lightning'
 | 
			
		||||
import { useFireworks } from './fireworks'
 | 
			
		||||
import { useToast } from './toast'
 | 
			
		||||
import { useSendWallets } from '@/wallets/index'
 | 
			
		||||
import { Form, SubmitButton } from './form'
 | 
			
		||||
@ -48,7 +48,7 @@ export default function PayBounty ({ children, item }) {
 | 
			
		||||
  const { me } = useMe()
 | 
			
		||||
  const showModal = useShowModal()
 | 
			
		||||
  const root = useRoot()
 | 
			
		||||
  const strike = useLightning()
 | 
			
		||||
  const strike = useFireworks()
 | 
			
		||||
  const toaster = useToast()
 | 
			
		||||
  const wallets = useSendWallets()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,4 @@
 | 
			
		||||
.searchSection {
 | 
			
		||||
    background-color: var(--bs-body-bg);
 | 
			
		||||
    z-index: 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										228
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										228
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@ -77,6 +77,7 @@
 | 
			
		||||
        "react-dom": "^18.3.1",
 | 
			
		||||
        "react-ios-pwa-prompt": "^1.8.4",
 | 
			
		||||
        "react-markdown": "^9.0.1",
 | 
			
		||||
        "react-particles": "^2.12.2",
 | 
			
		||||
        "react-string-replace": "^1.1.1",
 | 
			
		||||
        "react-syntax-highlighter": "^15.5.0",
 | 
			
		||||
        "react-textarea-autosize": "^8.5.4",
 | 
			
		||||
@ -92,6 +93,8 @@
 | 
			
		||||
        "source-map": "^0.8.0-beta.0",
 | 
			
		||||
        "textarea-caret": "^3.1.0",
 | 
			
		||||
        "tldts": "^6.1.51",
 | 
			
		||||
        "tsparticles-engine": "^2.12.0",
 | 
			
		||||
        "tsparticles-preset-fireworks": "^2.12.0",
 | 
			
		||||
        "tsx": "^4.19.1",
 | 
			
		||||
        "twitter-api-v2": "^1.22.0",
 | 
			
		||||
        "unist-util-visit": "^5.0.0",
 | 
			
		||||
@ -17561,6 +17564,33 @@
 | 
			
		||||
        "@types/unist": "*"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/react-particles": {
 | 
			
		||||
      "version": "2.12.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/react-particles/-/react-particles-2.12.2.tgz",
 | 
			
		||||
      "integrity": "sha512-Bo9DdrBRPFy8uiT7BA8P36Rdmz6GhB/RG9kkWUyZGIsS8AxWyuUjpVxw9Lr23K0LVE2aenAJ0vnqEbbLDpBgQw==",
 | 
			
		||||
      "deprecated": "@tsparticles/react is the new version, please use that",
 | 
			
		||||
      "funding": [
 | 
			
		||||
        {
 | 
			
		||||
          "type": "github",
 | 
			
		||||
          "url": "https://github.com/sponsors/matteobruni"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "type": "github",
 | 
			
		||||
          "url": "https://github.com/sponsors/tsparticles"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "type": "buymeacoffee",
 | 
			
		||||
          "url": "https://www.buymeacoffee.com/matteobruni"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
      "hasInstallScript": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tsparticles-engine": "^2.12.0"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "react": ">=16"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/react-smooth": {
 | 
			
		||||
      "version": "4.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.1.tgz",
 | 
			
		||||
@ -19784,6 +19814,204 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
 | 
			
		||||
      "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tsparticles-basic": {
 | 
			
		||||
      "version": "2.12.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tsparticles-basic/-/tsparticles-basic-2.12.0.tgz",
 | 
			
		||||
      "integrity": "sha512-pN6FBpL0UsIUXjYbiui5+IVsbIItbQGOlwyGV55g6IYJBgdTNXgFX0HRYZGE9ZZ9psEXqzqwLM37zvWnb5AG9g==",
 | 
			
		||||
      "deprecated": "starting from tsparticles v3 the packages are now moved to @tsparticles/package-name instead of tsparticles-package-name",
 | 
			
		||||
      "funding": [
 | 
			
		||||
        {
 | 
			
		||||
          "type": "github",
 | 
			
		||||
          "url": "https://github.com/sponsors/matteobruni"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "type": "github",
 | 
			
		||||
          "url": "https://github.com/sponsors/tsparticles"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "type": "buymeacoffee",
 | 
			
		||||
          "url": "https://www.buymeacoffee.com/matteobruni"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tsparticles-engine": "^2.12.0",
 | 
			
		||||
        "tsparticles-move-base": "^2.12.0",
 | 
			
		||||
        "tsparticles-shape-circle": "^2.12.0",
 | 
			
		||||
        "tsparticles-updater-color": "^2.12.0",
 | 
			
		||||
        "tsparticles-updater-opacity": "^2.12.0",
 | 
			
		||||
        "tsparticles-updater-out-modes": "^2.12.0",
 | 
			
		||||
        "tsparticles-updater-size": "^2.12.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tsparticles-engine": {
 | 
			
		||||
      "version": "2.12.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tsparticles-engine/-/tsparticles-engine-2.12.0.tgz",
 | 
			
		||||
      "integrity": "sha512-ZjDIYex6jBJ4iMc9+z0uPe7SgBnmb6l+EJm83MPIsOny9lPpetMsnw/8YJ3xdxn8hV+S3myTpTN1CkOVmFv0QQ==",
 | 
			
		||||
      "deprecated": "starting from tsparticles v3 the packages are now moved to @tsparticles/package-name instead of tsparticles-package-name",
 | 
			
		||||
      "funding": [
 | 
			
		||||
        {
 | 
			
		||||
          "type": "github",
 | 
			
		||||
          "url": "https://github.com/sponsors/matteobruni"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "type": "github",
 | 
			
		||||
          "url": "https://github.com/sponsors/tsparticles"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "type": "buymeacoffee",
 | 
			
		||||
          "url": "https://www.buymeacoffee.com/matteobruni"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
      "hasInstallScript": true
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tsparticles-move-base": {
 | 
			
		||||
      "version": "2.12.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tsparticles-move-base/-/tsparticles-move-base-2.12.0.tgz",
 | 
			
		||||
      "integrity": "sha512-oSogCDougIImq+iRtIFJD0YFArlorSi8IW3HD2gO3USkH+aNn3ZqZNTqp321uB08K34HpS263DTbhLHa/D6BWw==",
 | 
			
		||||
      "deprecated": "starting from tsparticles v3 the packages are now moved to @tsparticles/package-name instead of tsparticles-package-name",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tsparticles-engine": "^2.12.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tsparticles-plugin-emitters": {
 | 
			
		||||
      "version": "2.12.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tsparticles-plugin-emitters/-/tsparticles-plugin-emitters-2.12.0.tgz",
 | 
			
		||||
      "integrity": "sha512-fbskYnaXWXivBh9KFReVCfqHdhbNQSK2T+fq2qcGEWpwtDdgujcaS1k2Q/xjZnWNMfVesik4IrqspcL51gNdSA==",
 | 
			
		||||
      "deprecated": "starting from tsparticles v3 the packages are now moved to @tsparticles/package-name instead of tsparticles-package-name",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tsparticles-engine": "^2.12.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tsparticles-plugin-sounds": {
 | 
			
		||||
      "version": "2.12.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tsparticles-plugin-sounds/-/tsparticles-plugin-sounds-2.12.0.tgz",
 | 
			
		||||
      "integrity": "sha512-Jm/Mdddq9E9VdHtAbYmv3pgtHQ3nBSbXN+n2axqm6vACgrE/JA4tgLZyuknns0scxibvqh/7zFxkOSa+4ucYuQ==",
 | 
			
		||||
      "deprecated": "starting from tsparticles v3 the packages are now moved to @tsparticles/package-name instead of tsparticles-package-name",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tsparticles-engine": "^2.12.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tsparticles-preset-fireworks": {
 | 
			
		||||
      "version": "2.12.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tsparticles-preset-fireworks/-/tsparticles-preset-fireworks-2.12.0.tgz",
 | 
			
		||||
      "integrity": "sha512-8Y1F2YZH/LkqPVniEmfArHe2qyuJwzTiWmX1of9bClyA+Xz7p219JRednNp0QaAiZeJ+GS9X7hlBa4r3m1kPiw==",
 | 
			
		||||
      "deprecated": "@tsparticles/preset-fireworks is the new package, please use that",
 | 
			
		||||
      "funding": [
 | 
			
		||||
        {
 | 
			
		||||
          "type": "github",
 | 
			
		||||
          "url": "https://github.com/sponsors/matteobruni"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "type": "github",
 | 
			
		||||
          "url": "https://github.com/sponsors/tsparticles"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "type": "buymeacoffee",
 | 
			
		||||
          "url": "https://www.buymeacoffee.com/matteobruni"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tsparticles-basic": "^2.12.0",
 | 
			
		||||
        "tsparticles-engine": "^2.12.0",
 | 
			
		||||
        "tsparticles-plugin-emitters": "^2.12.0",
 | 
			
		||||
        "tsparticles-plugin-sounds": "^2.12.0",
 | 
			
		||||
        "tsparticles-shape-line": "^2.12.0",
 | 
			
		||||
        "tsparticles-updater-destroy": "^2.12.0",
 | 
			
		||||
        "tsparticles-updater-life": "^2.12.0",
 | 
			
		||||
        "tsparticles-updater-rotate": "^2.12.0",
 | 
			
		||||
        "tsparticles-updater-stroke-color": "^2.12.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tsparticles-shape-circle": {
 | 
			
		||||
      "version": "2.12.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tsparticles-shape-circle/-/tsparticles-shape-circle-2.12.0.tgz",
 | 
			
		||||
      "integrity": "sha512-L6OngbAlbadG7b783x16ns3+SZ7i0SSB66M8xGa5/k+YcY7zm8zG0uPt1Hd+xQDR2aNA3RngVM10O23/Lwk65Q==",
 | 
			
		||||
      "deprecated": "starting from tsparticles v3 the packages are now moved to @tsparticles/package-name instead of tsparticles-package-name",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tsparticles-engine": "^2.12.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tsparticles-shape-line": {
 | 
			
		||||
      "version": "2.12.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tsparticles-shape-line/-/tsparticles-shape-line-2.12.0.tgz",
 | 
			
		||||
      "integrity": "sha512-RcpKmmpKlk+R8mM5wA2v64Lv1jvXtU4SrBDv3vbdRodKbKaWGGzymzav1Q0hYyDyUZgplEK/a5ZwrfrOwmgYGA==",
 | 
			
		||||
      "deprecated": "starting from tsparticles v3 the packages are now moved to @tsparticles/package-name instead of tsparticles-package-name",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tsparticles-engine": "^2.12.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tsparticles-updater-color": {
 | 
			
		||||
      "version": "2.12.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tsparticles-updater-color/-/tsparticles-updater-color-2.12.0.tgz",
 | 
			
		||||
      "integrity": "sha512-KcG3a8zd0f8CTiOrylXGChBrjhKcchvDJjx9sp5qpwQK61JlNojNCU35xoaSk2eEHeOvFjh0o3CXWUmYPUcBTQ==",
 | 
			
		||||
      "deprecated": "starting from tsparticles v3 the packages are now moved to @tsparticles/package-name instead of tsparticles-package-name",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tsparticles-engine": "^2.12.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tsparticles-updater-destroy": {
 | 
			
		||||
      "version": "2.12.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tsparticles-updater-destroy/-/tsparticles-updater-destroy-2.12.0.tgz",
 | 
			
		||||
      "integrity": "sha512-6NN3dJhxACvzbIGL4dADbYQSZJmdHfwjujj1uvnxdMbb2x8C/AZzGxiN33smo4jkrZ5VLEWZWCJPJ8aOKjQ2Sg==",
 | 
			
		||||
      "deprecated": "starting from tsparticles v3 the packages are now moved to @tsparticles/package-name instead of tsparticles-package-name",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tsparticles-engine": "^2.12.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tsparticles-updater-life": {
 | 
			
		||||
      "version": "2.12.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tsparticles-updater-life/-/tsparticles-updater-life-2.12.0.tgz",
 | 
			
		||||
      "integrity": "sha512-J7RWGHAZkowBHpcLpmjKsxwnZZJ94oGEL2w+wvW1/+ZLmAiFFF6UgU0rHMC5CbHJT4IPx9cbkYMEHsBkcRJ0Bw==",
 | 
			
		||||
      "deprecated": "starting from tsparticles v3 the packages are now moved to @tsparticles/package-name instead of tsparticles-package-name",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tsparticles-engine": "^2.12.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tsparticles-updater-opacity": {
 | 
			
		||||
      "version": "2.12.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tsparticles-updater-opacity/-/tsparticles-updater-opacity-2.12.0.tgz",
 | 
			
		||||
      "integrity": "sha512-YUjMsgHdaYi4HN89LLogboYcCi1o9VGo21upoqxq19yRy0hRCtx2NhH22iHF/i5WrX6jqshN0iuiiNefC53CsA==",
 | 
			
		||||
      "deprecated": "starting from tsparticles v3 the packages are now moved to @tsparticles/package-name instead of tsparticles-package-name",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tsparticles-engine": "^2.12.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tsparticles-updater-out-modes": {
 | 
			
		||||
      "version": "2.12.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tsparticles-updater-out-modes/-/tsparticles-updater-out-modes-2.12.0.tgz",
 | 
			
		||||
      "integrity": "sha512-owBp4Gk0JNlSrmp12XVEeBroDhLZU+Uq3szbWlHGSfcR88W4c/0bt0FiH5bHUqORIkw+m8O56hCjbqwj69kpOQ==",
 | 
			
		||||
      "deprecated": "starting from tsparticles v3 the packages are now moved to @tsparticles/package-name instead of tsparticles-package-name",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tsparticles-engine": "^2.12.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tsparticles-updater-rotate": {
 | 
			
		||||
      "version": "2.12.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tsparticles-updater-rotate/-/tsparticles-updater-rotate-2.12.0.tgz",
 | 
			
		||||
      "integrity": "sha512-waOFlGFmEZOzsQg4C4VSejNVXGf4dMf3fsnQrEROASGf1FCd8B6WcZau7JtXSTFw0OUGuk8UGz36ETWN72DkCw==",
 | 
			
		||||
      "deprecated": "starting from tsparticles v3 the packages are now moved to @tsparticles/package-name instead of tsparticles-package-name",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tsparticles-engine": "^2.12.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tsparticles-updater-size": {
 | 
			
		||||
      "version": "2.12.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tsparticles-updater-size/-/tsparticles-updater-size-2.12.0.tgz",
 | 
			
		||||
      "integrity": "sha512-B0yRdEDd/qZXCGDL/ussHfx5YJ9UhTqNvmS5X2rR2hiZhBAE2fmsXLeWkdtF2QusjPeEqFDxrkGiLOsh6poqRA==",
 | 
			
		||||
      "deprecated": "starting from tsparticles v3 the packages are now moved to @tsparticles/package-name instead of tsparticles-package-name",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tsparticles-engine": "^2.12.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tsparticles-updater-stroke-color": {
 | 
			
		||||
      "version": "2.12.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tsparticles-updater-stroke-color/-/tsparticles-updater-stroke-color-2.12.0.tgz",
 | 
			
		||||
      "integrity": "sha512-MPou1ZDxsuVq6SN1fbX+aI5yrs6FyP2iPCqqttpNbWyL+R6fik1rL0ab/x02B57liDXqGKYomIbBQVP3zUTW1A==",
 | 
			
		||||
      "deprecated": "starting from tsparticles v3 the packages are now moved to @tsparticles/package-name instead of tsparticles-package-name",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tsparticles-engine": "^2.12.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tstl": {
 | 
			
		||||
      "version": "2.5.16",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tstl/-/tstl-2.5.16.tgz",
 | 
			
		||||
 | 
			
		||||
@ -82,6 +82,7 @@
 | 
			
		||||
    "react-dom": "^18.3.1",
 | 
			
		||||
    "react-ios-pwa-prompt": "^1.8.4",
 | 
			
		||||
    "react-markdown": "^9.0.1",
 | 
			
		||||
    "react-particles": "^2.12.2",
 | 
			
		||||
    "react-string-replace": "^1.1.1",
 | 
			
		||||
    "react-syntax-highlighter": "^15.5.0",
 | 
			
		||||
    "react-textarea-autosize": "^8.5.4",
 | 
			
		||||
@ -97,6 +98,8 @@
 | 
			
		||||
    "source-map": "^0.8.0-beta.0",
 | 
			
		||||
    "textarea-caret": "^3.1.0",
 | 
			
		||||
    "tldts": "^6.1.51",
 | 
			
		||||
    "tsparticles-engine": "^2.12.0",
 | 
			
		||||
    "tsparticles-preset-fireworks": "^2.12.0",
 | 
			
		||||
    "tsx": "^4.19.1",
 | 
			
		||||
    "twitter-api-v2": "^1.22.0",
 | 
			
		||||
    "unist-util-visit": "^5.0.0",
 | 
			
		||||
 | 
			
		||||
@ -10,7 +10,7 @@ import { useRouter } from 'next/dist/client/router'
 | 
			
		||||
import { useCallback, useEffect } from 'react'
 | 
			
		||||
import { ShowModalProvider } from '@/components/modal'
 | 
			
		||||
import ErrorBoundary from '@/components/error-boundary'
 | 
			
		||||
import { LightningProvider } from '@/components/lightning'
 | 
			
		||||
import { FireworksProvider } from '@/components/fireworks'
 | 
			
		||||
import { ToastProvider } from '@/components/toast'
 | 
			
		||||
import { ServiceWorkerProvider } from '@/components/serviceworker'
 | 
			
		||||
import { SSR } from '@/lib/constants'
 | 
			
		||||
@ -118,7 +118,7 @@ export default function MyApp ({ Component, pageProps: { ...props } }) {
 | 
			
		||||
                    <WebLnProvider>
 | 
			
		||||
                      <ServiceWorkerProvider>
 | 
			
		||||
                        <PriceProvider price={price}>
 | 
			
		||||
                          <LightningProvider>
 | 
			
		||||
                          <FireworksProvider>
 | 
			
		||||
                            <ToastProvider>
 | 
			
		||||
                              <ShowModalProvider>
 | 
			
		||||
                                <BlockHeightProvider blockHeight={blockHeight}>
 | 
			
		||||
@ -131,7 +131,7 @@ export default function MyApp ({ Component, pageProps: { ...props } }) {
 | 
			
		||||
                                </BlockHeightProvider>
 | 
			
		||||
                              </ShowModalProvider>
 | 
			
		||||
                            </ToastProvider>
 | 
			
		||||
                          </LightningProvider>
 | 
			
		||||
                          </FireworksProvider>
 | 
			
		||||
                        </PriceProvider>
 | 
			
		||||
                      </ServiceWorkerProvider>
 | 
			
		||||
                    </WebLnProvider>
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@ import { getGetServerSideProps } from '@/api/ssrApollo'
 | 
			
		||||
import CCInfo from '@/components/info/cc'
 | 
			
		||||
import { Form, Input, SubmitButton } from '@/components/form'
 | 
			
		||||
import { CenterLayout } from '@/components/layout'
 | 
			
		||||
import { useLightning } from '@/components/lightning'
 | 
			
		||||
import { useFireworks } from '@/components/fireworks'
 | 
			
		||||
import { useMe } from '@/components/me'
 | 
			
		||||
import { useShowModal } from '@/components/modal'
 | 
			
		||||
import { usePaidMutation } from '@/components/use-paid-mutation'
 | 
			
		||||
@ -76,7 +76,7 @@ function WithdrawButton ({ className }) {
 | 
			
		||||
 | 
			
		||||
export function BuyCreditsButton ({ className }) {
 | 
			
		||||
  const showModal = useShowModal()
 | 
			
		||||
  const strike = useLightning()
 | 
			
		||||
  const strike = useFireworks()
 | 
			
		||||
  const [buyCredits] = usePaidMutation(BUY_CREDITS)
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
 | 
			
		||||
@ -13,7 +13,7 @@ import { useShowModal } from '@/components/modal'
 | 
			
		||||
import dynamic from 'next/dynamic'
 | 
			
		||||
import { FAST_POLL_INTERVAL, SSR } from '@/lib/constants'
 | 
			
		||||
import { useToast } from '@/components/toast'
 | 
			
		||||
import { useLightning } from '@/components/lightning'
 | 
			
		||||
import { useFireworks } from '@/components/fireworks'
 | 
			
		||||
import { Col, Row } from 'react-bootstrap'
 | 
			
		||||
import { useData } from '@/components/use-data'
 | 
			
		||||
import { GrowthPieChartSkeleton } from '@/components/charts-skeletons'
 | 
			
		||||
@ -133,7 +133,7 @@ export default function Rewards ({ ssrData }) {
 | 
			
		||||
export function DonateButton () {
 | 
			
		||||
  const showModal = useShowModal()
 | 
			
		||||
  const toaster = useToast()
 | 
			
		||||
  const strike = useLightning()
 | 
			
		||||
  const strike = useFireworks()
 | 
			
		||||
  const [donateToRewards] = usePaidMutation(DONATE)
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
 | 
			
		||||
@ -220,6 +220,8 @@ $zindex-sticky: 900;
 | 
			
		||||
  scroll-margin-top: 60px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.ms-xs {
 | 
			
		||||
  margin-left: 0.125rem;
 | 
			
		||||
}
 | 
			
		||||
@ -596,6 +598,14 @@ div[contenteditable]:disabled,
 | 
			
		||||
  min-height: 100svh;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#__next > main {
 | 
			
		||||
  z-index: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#__next > footer {
 | 
			
		||||
  z-index: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
footer {
 | 
			
		||||
  margin-top: auto;
 | 
			
		||||
  display: flex;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user