- Snagit
- Metabase
- Notion
- Tower
- Dynabase
| const { webpack } = require('@storybook/csf-plugin'); | |
| const withNextra = require('nextra')({ | |
| theme: 'nextra-theme-docs', | |
| themeConfig: './theme.config.tsx' | |
| }); | |
| module.exports = async () => { | |
| const { ReactDocgenTypeScriptPlugin } = await import('@storybook/react-docgen-typescript-plugin'); | |
| return withNextra({ |
| import React, { FC, useMemo, useRef } from 'react'; | |
| import { a, useSpring } from '@react-spring/three'; | |
| import { TextureLoader, LinearFilter, DoubleSide, Color, MathUtils } from 'three'; | |
| import { animationConfig } from '../utils'; | |
| import { useLoader } from '@react-three/fiber'; | |
| import { SVGLoader } from 'three/examples/jsm/loaders/SVGLoader'; | |
| export interface IconProps { | |
| image: string; | |
| opacity?: number; |
| import { animate } from "framer-motion"; | |
| import React, { useEffect, useRef } from "react"; | |
| function Counter({ from, to }) { | |
| const ref = useRef(); | |
| from https://stackoverflow.com/questions/65013742/how-to-animate-number-with-framer-motion | |
| useEffect(() => { | |
| const controls = animate(from, to, { |
| import { useRef, useEffect, useCallback } from 'react'; | |
| export type noop = (...args: any[]) => any; | |
| /** | |
| * Stable callback | |
| * | |
| * References: | |
| * - https://github.com/facebook/react/issues/14099 | |
| * - https://reactjs.org/docs/hooks-faq.html#how-to-read-an-often-changing-value-from-usecallback |
| import panzoom, { PanZoom } from 'panzoom'; | |
| import { useEffect, useRef, useState } from 'react'; | |
| export interface PanZoomProps { | |
| maxZoom?: number; | |
| minZoom?: number; | |
| } | |
| export const usePanZoom = (props?: PanZoomProps) => { | |
| const elmRef = useRef<any | null>(null); |
| import NGraph from 'ngraph.graph'; | |
| const defaultOptions = { | |
| radius: 500, | |
| }; | |
| function rotate(cx, cy, x, y, angle) { | |
| const radians = (Math.PI / 180) * angle; | |
| const cos = Math.cos(radians); | |
| const sin = Math.sin(radians); |
| import { cloneElement, useMemo } from 'react'; | |
| import classNames from 'classnames'; | |
| interface CloneElementProps { | |
| element: any | null; | |
| children?: any; | |
| } | |
| /** | |
| * CloneElement is a wrapper component for createElement function. |
| - run: | |
| name: publish to npm | |
| command: | | |
| echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/.npmrc | |
| npm publish dist/js/* |
| /** | |
| * Space invaders canvas game | |
| * Inspiration: https://codepen.io/amcdaniel2/pen/MdQZpL | |
| */ | |
| export const spaceInvaders = canvas => { | |
| let screen; | |
| let gameSize; | |
| let game; | |
| let invaderCanvas; |