Skip to content

Instantly share code, notes, and snippets.

View souporserious's full-sized avatar

Travis Arnold souporserious

View GitHub Profile
@souporserious
souporserious / useRouterParams.ts
Created May 26, 2022 19:32
NextJS router params for the server and client.
import { useRouter } from 'next/router'
import * as queryString from 'query-string'
/** Converts NextJS router params into an object that is run on both the server and client. */
export function useRouterParams<Params>() {
const router = useRouter()
const query = queryString.parse(router.asPath.split('?')[1])
return Object.fromEntries(
Object.entries(query).map(([key, value]) => [key, parseValue(value)])
@souporserious
souporserious / visitor.ts
Created April 27, 2022 18:18
Documenting Steps
/** step:01 Start with the initial plugin. */
import jsx from '@babel/plugin-syntax-jsx'
export default () => {
return {
inherits: jsx,
visitor: {
/** step:02 Add visitor */
Program() {
this.tree = []
type Step = number | string
/**
* Create a fluid type scale that can be interpolated between a minimum and maximum screen width.
*
* Forked from: https://www.aleksandrhovhannisyan.com/blog/fluid-type-scale-with-css-clamp/
*/
export function createTypeScale<Steps extends ReadonlyArray<Step>>({
baseFontSize,
ratio,
@souporserious
souporserious / build.mjs
Created February 24, 2022 02:48
Build script using esbuild and ts-morph to bundle library code.
import glob from 'fast-glob'
import { build } from 'esbuild'
import { Project } from 'ts-morph'
const project = new Project({
compilerOptions: {
outDir: 'dist',
emitDeclarationOnly: true,
},
tsConfigFilePath: './tsconfig.json',
@souporserious
souporserious / get-files.ts
Created February 1, 2022 21:21
Recursively get files and meta information from a directory of files.
import { promises as fs } from 'fs';
import { basename, extname } from 'path';
type Dirent = {
isFile(): boolean;
isDirectory(): boolean;
isBlockDevice(): boolean;
isCharacterDevice(): boolean;
isSymbolicLink(): boolean;
isFIFO(): boolean;
@souporserious
souporserious / Example.tsx
Last active January 29, 2022 22:44
JSXUI Text Component Example
import { Text } from 'components'
export default function Example() {
return (
<Text scale={{ initial: 1, hover: 1.2 }}>
Hello <Text>World</Text>
</Text>
)
}
@souporserious
souporserious / grid-styles.tsx
Created January 16, 2022 22:33
Example of setting up responsive CSS Grid styles with styled-components and TypeScript
/// <reference types="styled-components/cssprop" />
import * as React from 'react'
import { CSSProp } from 'styled-components';
const gridBreakpoints = {
small: '@media (min-width: 0px)',
medium: '@media (min-width: 720px)',
large: '@media (min-width: 1200px)',
};
@souporserious
souporserious / directories.ts
Last active January 14, 2022 23:40
Grab links from a NextJS pages directory using TS Morph
import { Project } from 'ts-morph';
import { capitalCase } from 'case-anything';
const project = new Project();
project.addSourceFilesAtPaths([
`src/pages/**/*{.tsx,.mdx,.json}`,
`!src/pages/_*.tsx`,
`!src/pages/api/*.ts`,
]);
@souporserious
souporserious / use-param-controls.ts
Last active December 29, 2021 20:50
Sync Leva controls with NextJS query params.
import { useControls } from 'leva'
import { useRouter } from 'next/router'
import * as queryString from 'query-string'
const roundValue = (value) => Math.round(value * 100) / 100
const parseValue = (value) => {
if (typeof value === 'number') {
return roundValue(value)
}
return value
@souporserious
souporserious / Collapse.tsx
Created November 16, 2021 17:51
React Collapse component
import type { TransitionEvent } from 'react'
import { useLayoutEffect, useRef, useState } from 'react'
const transition = 'height 200ms ease-out'
export type CollapseProps = {
children: React.ReactNode
/**
* Controls whether or not children are visible.