SYMBOL INDEX (346 symbols across 81 files) FILE: client/loaders/comic-image-loader.js function processImage (line 5) | async function processImage(inputBuffer) { function downscale (line 48) | function downscale(inputBuffer) { FILE: client/src/api.ts method onResponse (line 12) | async onResponse(res) { FILE: client/src/components/BallPitMechanism.tsx function BallPitMechanism (line 35) | function BallPitMechanism({ FILE: client/src/components/CenteredSlippyMap.tsx type SlippyMapRef (line 13) | interface SlippyMapRef { type CenteredSlippyMapProps (line 21) | interface CenteredSlippyMapProps { FILE: client/src/components/Comic.tsx type MetaMachineLink (line 21) | interface MetaMachineLink { function useHashLink (line 27) | function useHashLink(): { function Comic (line 70) | function Comic() { FILE: client/src/components/ComicBrowseView.tsx function findRandomTile (line 25) | function findRandomTile(metaMachine: MetaMachineInfo) { function ComicBrowseView (line 40) | function ComicBrowseView({ FILE: client/src/components/ComicImage.tsx type ComicImageProps (line 11) | interface ComicImageProps FILE: client/src/components/ComicPuzzleView.tsx function saveSolution (line 21) | function saveSolution(location: { function ComicPuzzleView (line 39) | function ComicPuzzleView({ FILE: client/src/components/DebugOverlay.tsx function DebugOverlay (line 6) | function DebugOverlay({ FILE: client/src/components/EditorTutorials.tsx type TutorialKey (line 17) | type TutorialKey = keyof typeof tutorials type TutorialState (line 18) | type TutorialState = { [K in TutorialKey]: boolean } constant STORE_KEY (line 20) | const STORE_KEY = 'contraptionTips' function loadState (line 22) | function loadState(): TutorialState { function saveState (line 36) | function saveState(state: TutorialState) { function useTutorials (line 40) | function useTutorials() { function EditorTutorials (line 74) | function EditorTutorials({ FILE: client/src/components/FullscreenComicContainer.tsx function useIsFullscreen (line 15) | function useIsFullscreen() { type DisplayContextType (line 34) | type DisplayContextType = { function useDisplayState (line 44) | function useDisplayState() { function FullscreenComicContainer (line 48) | function FullscreenComicContainer({ FILE: client/src/components/InnerComicBorder.tsx function InnerComicBorder (line 4) | function InnerComicBorder({ FILE: client/src/components/LoadingSpinner.tsx function LoadingSpinner (line 34) | function LoadingSpinner({ className }: { className?: string }) { FILE: client/src/components/MachineContext.tsx type BallData (line 23) | interface BallData { type BallDestroyReason (line 31) | type BallDestroyReason = 'expiry' type BallFollowCallback (line 33) | type BallFollowCallback = (x: number, y: number) => void type MachineEvents (line 35) | type MachineEvents = { type ActiveBalls (line 46) | type ActiveBalls = Record< type CreateBallOptions (line 55) | type CreateBallOptions = { type MachineContextType (line 61) | type MachineContextType = { type MachineContextProviderRef (line 91) | interface MachineContextProviderRef { function useMachine (line 319) | function useMachine() { FILE: client/src/components/MachineTileContext.tsx type ActiveBodies (line 33) | type ActiveBodies = Record type MachineTileContextType (line 35) | type MachineTileContextType = { type MachineTileContextProviderRef (line 45) | interface MachineTileContextProviderRef { function useRigidBody (line 197) | function useRigidBody( function useSensorInTile (line 238) | function useSensorInTile( function useMachineTile (line 263) | function useMachineTile() { FILE: client/src/components/MachineTileEditor.tsx constant DEG_TO_RAD (line 43) | const DEG_TO_RAD = Math.PI / 180 type EditableWidget (line 45) | interface EditableWidget { type Selection (line 54) | interface Selection { function useSelectHandlers (line 59) | function useSelectHandlers( type Widgets (line 74) | type Widgets = Record function useWheelSpeed (line 78) | function useWheelSpeed( function MachineTileEditor (line 127) | function MachineTileEditor({ FILE: client/src/components/MachineTilePlaceholder.tsx function MachineTilePlaceholder (line 31) | function MachineTilePlaceholder({ FILE: client/src/components/MetaMachineView.tsx function draw (line 62) | function draw() { type SlippyMetaMachineViewProps (line 98) | interface SlippyMetaMachineViewProps extends MetaMachineInfo { type SlippyMetaMachineRef (line 107) | interface SlippyMetaMachineRef { FILE: client/src/components/NamePrompt.tsx function NamePrompt (line 61) | function NamePrompt({ FILE: client/src/components/PhysicsContext.tsx type LoopEvents (line 27) | type LoopEvents = { constant GRAVITY (line 33) | const GRAVITY = { x: 0.0, y: -9.81 } constant TICK_MS (line 34) | const TICK_MS = 1000 / 60 type PhysicsContextType (line 36) | interface PhysicsContextType { function PhysicsContextProvider (line 46) | function PhysicsContextProvider({ function useRapierEffect (line 188) | function useRapierEffect( function useCollider (line 204) | function useCollider( function useImpulseJoint (line 230) | function useImpulseJoint( function useLoopHandler (line 264) | function useLoopHandler( function useCollisionHandler (line 286) | function useCollisionHandler( function usePhysicsLoaded (line 315) | function usePhysicsLoaded() { function PhysicsLoader (line 319) | function PhysicsLoader({ function deferATick (line 333) | function deferATick(callback: () => void) { FILE: client/src/components/SwooshyDialog.tsx function SwooshyDialog (line 12) | function SwooshyDialog({ FILE: client/src/components/WidgetPalette.tsx function ToolButton (line 14) | function ToolButton({ function WidgetPalette (line 43) | function WidgetPalette({ FILE: client/src/components/constants.tsx constant BALL_RADIUS (line 5) | const BALL_RADIUS = 8 constant INPUT_SPINNER_SIZE (line 6) | const INPUT_SPINNER_SIZE = 42 constant INPUT_SPINNER_SPEED (line 7) | const INPUT_SPINNER_SPEED = 2 constant INPUT_TEETH_COUNT (line 8) | const INPUT_TEETH_COUNT = 8 constant INPUT_WIDTH (line 9) | const INPUT_WIDTH = 2 * INPUT_SPINNER_SIZE + 5 constant MAX_WIDGET_COUNT (line 10) | const MAX_WIDGET_COUNT = 100 constant TRIANGLE_BUMPER_SENSOR_OFFSET (line 11) | const TRIANGLE_BUMPER_SENSOR_OFFSET = 0.2 constant TRIANGLE_BUMPER_RADIUS_RATIO (line 12) | const TRIANGLE_BUMPER_RADIUS_RATIO = 0.14159 constant TRIANGLE_BUMPER_SENSOR_FUDGE (line 13) | const TRIANGLE_BUMPER_SENSOR_FUDGE = 2.2 constant TRIANGLE_BUMPER_STRENGTH (line 14) | const TRIANGLE_BUMPER_STRENGTH = 35 constant ROUND_BUMPER_STRENGTH (line 15) | const ROUND_BUMPER_STRENGTH = 35 constant BONK_ANIMATION_DELAY_MS (line 16) | const BONK_ANIMATION_DELAY_MS = 200 constant TRIANGLE_BUMPER_CONTACT_DISTANCE (line 17) | const TRIANGLE_BUMPER_CONTACT_DISTANCE = 0.1 constant ROAND_BUMPER_RADIUS_RATIO (line 18) | const ROAND_BUMPER_RADIUS_RATIO = 0.49 constant ROUND_BUMPER_FALLBACK_RATIO (line 19) | const ROUND_BUMPER_FALLBACK_RATIO = 0.9 constant BOTTOM_PIT_WIDTH (line 20) | const BOTTOM_PIT_WIDTH = imgBottomPit.width constant BOTTOM_PIT_HEIGHT (line 21) | const BOTTOM_PIT_HEIGHT = imgBottomPit.height constant BOTTOM_PIT_EDGE_WIDTH (line 22) | const BOTTOM_PIT_EDGE_WIDTH = 94 constant BOTTOM_MECHANISM_HEIGHT (line 23) | const BOTTOM_MECHANISM_HEIGHT = 3000 constant BOTTOM_CHUTE_DROP (line 24) | const BOTTOM_CHUTE_DROP = 50 constant BOTTOM_CHUTE_EXIT_OFFSET (line 25) | const BOTTOM_CHUTE_EXIT_OFFSET = 24 constant BOTTOM_CHUTE_HEIGHT (line 26) | const BOTTOM_CHUTE_HEIGHT = imgBottomChute.height constant BOTTOM_TANK_WIDTH (line 27) | const BOTTOM_TANK_WIDTH = imgBottomTank.width constant BOTTOM_TANK_HEIGHT (line 28) | const BOTTOM_TANK_HEIGHT = imgBottomTank.height constant BOTTOM_TANK_SPACING (line 29) | const BOTTOM_TANK_SPACING = 100 constant BOTTOM_TANK_TARGET_TOP (line 30) | const BOTTOM_TANK_TARGET_TOP = 8 FILE: client/src/components/moderation/BlueprintButton.tsx function BlueprintButton (line 8) | function BlueprintButton({ FILE: client/src/components/moderation/ContextGridForMachineAt.tsx constant TILE_WIDTH (line 11) | const TILE_WIDTH = 100 function OOBTile (line 26) | function OOBTile() { function EmptyTile (line 42) | function EmptyTile({ function ContextGridForMachineAt (line 70) | function ContextGridForMachineAt({ FILE: client/src/components/moderation/LiveMachinePreview.tsx constant MIN_SECONDS_TO_MOD (line 33) | const MIN_SECONDS_TO_MOD = 30 function useCountdown (line 35) | function useCountdown(initialSeconds: number) { function ValidationLine (line 58) | function ValidationLine({ function LiveMachinePreview (line 79) | function LiveMachinePreview({ FILE: client/src/components/moderation/ModMachineTileView.tsx function ModMachineTileView (line 8) | function ModMachineTileView({ FILE: client/src/components/moderation/ModTileInputOutputView.tsx function TinyInputOutput (line 32) | function TinyInputOutput({ function ModTileInputOutputView (line 63) | function ModTileInputOutputView({ puzzle }: { puzzle: Puzzle }) { FILE: client/src/components/moderation/Moderator.tsx function useModHashParams (line 22) | function useModHashParams(): { function BlueprintModerator (line 59) | function BlueprintModerator({ function Moderator (line 292) | function Moderator() { FILE: client/src/components/moderation/SelectTileForm.tsx function SelectTileForm (line 3) | function SelectTileForm({ FILE: client/src/components/moderation/modTypes.d.ts type ModLocation (line 3) | type ModLocation = { type ServerBlueprint (line 10) | type ServerBlueprint = components['schemas']['Blueprint'] type CandidateMap (line 12) | type CandidateMap = Map type ModMachine (line 14) | type ModMachine = components['schemas']['VersionedMachine ModData'] FILE: client/src/components/moderation/modUtils.ts function getRandEmptyNearTile (line 13) | function getRandEmptyNearTile( function getEmptyTile (line 38) | function getEmptyTile(modMachine: ModMachine): ModLocation { function calculateInterest (line 60) | function calculateInterest(b: ServerBlueprint): number { function sortCandidateMap (line 69) | function sortCandidateMap( function locFromPosition (line 80) | function locFromPosition( FILE: client/src/components/moderation/moderatorClient.ts function puzzleQueryOptions (line 12) | function puzzleQueryOptions(puzzleId: string | undefined) { function useModeratorMachine (line 32) | function useModeratorMachine() { function useCandidateBlueprints (line 46) | function useCandidateBlueprints({ puzzleId }: { puzzleId: string }) { function useBlueprint (line 67) | function useBlueprint(blueprintId: string | undefined) { function useContextBlueprints (line 71) | function useContextBlueprints(blueprintIds: Array) { function useContextPuzzles (line 77) | function useContextPuzzles(puzzleIds: Array) { function useApproveBlueprint (line 83) | function useApproveBlueprint() { function useBurnBlueprint (line 116) | function useBurnBlueprint() { function useReissuePuzzle (line 141) | function useReissuePuzzle() { FILE: client/src/components/positionStyles.ts function getPositionStyles (line 14) | function getPositionStyles(x: number, y: number, angle: number = 0) { function usePositionedBodyRef (line 23) | function usePositionedBodyRef( FILE: client/src/components/useLocationHashParams.tsx function paramToNumber (line 3) | function paramToNumber(text: string | null | undefined) { function useLocationHashParams (line 16) | function useLocationHashParams() { FILE: client/src/components/useMetaMachineClient.ts type TileData (line 21) | interface TileData { type GetMachineFunction (line 29) | type GetMachineFunction = ( type MetaMachineInfo (line 34) | interface MetaMachineInfo { type MetaMachineClient (line 45) | interface MetaMachineClient { type SavedBlueprintLocation (line 51) | interface SavedBlueprintLocation { type SavedMachine (line 57) | type SavedMachine = SavedBlueprintLocation & TileData function blueprintQueryOptions (line 59) | function blueprintQueryOptions(blueprintid: string | undefined) { function useMetaMachineClient (line 79) | function useMetaMachineClient({ function useGetPuzzles (line 211) | function useGetPuzzles(): PuzzleOrder[] | undefined { function useSubmitBlueprint (line 241) | function useSubmitBlueprint() { FILE: client/src/components/widgets/Anvil.tsx type AnvilWidget (line 9) | interface AnvilWidget extends Vector, Angled { function AnvilPreview (line 13) | function AnvilPreview() { function Anvil (line 17) | function Anvil({ FILE: client/src/components/widgets/AttractorRepulsor.tsx type AttractorWidget (line 12) | interface AttractorWidget extends Vector, Sized { type RepulsorWidget (line 16) | interface RepulsorWidget extends Vector, Sized { function AttractorPreview (line 20) | function AttractorPreview() { function RepulsorPreview (line 24) | function RepulsorPreview() { function AttractorRepulsor (line 30) | function AttractorRepulsor({ function Attractor (line 144) | function Attractor(props: AttractorWidget & EditableWidget) { function Repulsor (line 150) | function Repulsor(props: RepulsorWidget & EditableWidget) { FILE: client/src/components/widgets/BallStand.tsx type BallStandWidget (line 9) | interface BallStandWidget extends Vector, Angled { function BallStandPreview (line 13) | function BallStandPreview() { function BallStand (line 19) | function BallStand({ FILE: client/src/components/widgets/Balls.tsx type BallRecord (line 28) | type BallRecord = BallData & { el: HTMLDivElement } type BallActor (line 30) | interface BallActor { constant BASE_BALL_LIFETIME_TICKS (line 40) | const BASE_BALL_LIFETIME_TICKS = 30 * 60 // 30 seconds at 60tps function runBall (line 68) | function runBall( function BallsRunner (line 209) | function BallsRunner({ function Balls (line 304) | function Balls({ FILE: client/src/components/widgets/Board.tsx type BoardWidget (line 9) | interface BoardWidget extends Vector, Angled { function BoardPreview (line 13) | function BoardPreview() { function Board (line 22) | function Board({ FILE: client/src/components/widgets/Boat.tsx function Boat (line 10) | function Boat({ id, x, y }: Vector & EditableWidget) { FILE: client/src/components/widgets/BottomChute.tsx function BottomChute (line 16) | function BottomChute({ FILE: client/src/components/widgets/BottomPit.tsx function BottomPit (line 13) | function BottomPit({ x, y }: Vector) { FILE: client/src/components/widgets/BottomTank.tsx function BottomTank (line 34) | function BottomTank({ FILE: client/src/components/widgets/Brick.tsx type BrickWidget (line 9) | interface BrickWidget extends Vector, Angled { function BrickPreview (line 13) | function BrickPreview() { function Brick (line 17) | function Brick({ FILE: client/src/components/widgets/CatSwat.tsx type CatSwatWidget (line 17) | interface CatSwatWidget extends Vector, Angled { function CatSwatPreview (line 22) | function CatSwatPreview() { constant CAT_REST_KEY (line 49) | const CAT_REST_KEY = imgs.indexOf(imgCatNoSwat) constant CAT_BONK_KEY (line 50) | const CAT_BONK_KEY = imgs.indexOf(imgCatSwat) constant MAX_CAT_SWAT_ANGLE (line 51) | const MAX_CAT_SWAT_ANGLE = Math.PI / 2.0 constant CAT_PATH (line 58) | const CAT_PATH: RandallPath[] = [ function performSwat (line 75) | function performSwat( function CatSwat (line 139) | function CatSwat({ FILE: client/src/components/widgets/CircleGauge.tsx constant PI_2 (line 4) | const PI_2 = 2 * Math.PI function CircleGauge (line 6) | function CircleGauge({ FILE: client/src/components/widgets/Cup.tsx type CupWidget (line 9) | interface CupWidget extends Vector, Angled { function CupPreview (line 13) | function CupPreview() { function Cup (line 17) | function Cup({ id, onSelect, x, y, angle }: CupWidget & EditableWidget) { FILE: client/src/components/widgets/Cushion.tsx type CushionWidget (line 9) | interface CushionWidget extends Vector, Angled { function CushionPreview (line 13) | function CushionPreview() { function Cushion (line 17) | function Cushion({ FILE: client/src/components/widgets/Fan.tsx type FanWidget (line 13) | interface FanWidget extends Vector, Angled { function FanPreview (line 19) | function FanPreview() { function Fan (line 23) | function Fan({ FILE: client/src/components/widgets/Hammer.tsx type HammerWidget (line 9) | interface HammerWidget extends Vector, Angled { function HammerPreview (line 13) | function HammerPreview() { function Hammer (line 22) | function Hammer({ FILE: client/src/components/widgets/Hook.tsx type HookWidgetBase (line 13) | interface HookWidgetBase extends Vector, Angled { type HookWidget (line 22) | interface HookWidget extends HookWidgetBase { type LeftHookWidget (line 26) | interface LeftHookWidget extends HookWidgetBase { function HookPreview (line 30) | function HookPreview() { function FlippedHookPreview (line 39) | function FlippedHookPreview() { function horizontalMirrorPaths (line 67) | function horizontalMirrorPaths(pathNodes: RandallPath[]): RandallPath[] { function Hook (line 81) | function Hook({ function LeftHook (line 174) | function LeftHook(props: LeftHookWidget & EditableWidget) { FILE: client/src/components/widgets/InputOutput.tsx type InputOutputSide (line 38) | type InputOutputSide = 'left' | 'top' | 'right' | 'bottom' function positionToSide (line 40) | function positionToSide( function Triangle (line 58) | function Triangle({ className }: { className?: string }) { function TypeIndicators (line 67) | function TypeIndicators({ function Roller (line 140) | function Roller({ function InputOutput (line 203) | function InputOutput({ FILE: client/src/components/widgets/LeftBumper.tsx type LeftBumperWidget (line 20) | interface LeftBumperWidget extends Vector, Angled { function LeftBumperPreview (line 26) | function LeftBumperPreview() { function LeftBumper (line 30) | function LeftBumper({ FILE: client/src/components/widgets/MachineFrame.tsx function Line (line 12) | function Line({ function hLinesWithBreaks (line 44) | function hLinesWithBreaks( function vLinesWithBreaks (line 82) | function vLinesWithBreaks( function MachineFrame (line 120) | function MachineFrame({ FILE: client/src/components/widgets/OutputValidator.tsx constant UPDATE_MS (line 16) | const UPDATE_MS = 1000 / 15 constant RATE_WINDOW_MS (line 17) | const RATE_WINDOW_MS = 10 * 1000 function OutputValidator (line 19) | function OutputValidator({ FILE: client/src/components/widgets/Prism.tsx type PrismWidget (line 13) | interface PrismWidget extends Vector, Angled { function PrismPreview (line 17) | function PrismPreview() { function pointToVectorObject (line 21) | function pointToVectorObject( constant MIN_CONTACT_DISTANCE (line 31) | const MIN_CONTACT_DISTANCE = 0.1 constant PRISM_REFRACTION_INDEX (line 32) | const PRISM_REFRACTION_INDEX = 2.0 function setRefractionVector (line 34) | function setRefractionVector( function Prism (line 116) | function Prism({ FILE: client/src/components/widgets/QuantumGate.tsx type QuantumGateSlowWidget (line 13) | interface QuantumGateSlowWidget extends Vector, Sized { type QuantumGateFastWidget (line 17) | interface QuantumGateFastWidget extends Vector, Sized { function QuantumGateSlowPreview (line 148) | function QuantumGateSlowPreview() { function QuantumGateFastPreview (line 166) | function QuantumGateFastPreview() { function QuantumGate (line 183) | function QuantumGate({ function QuantumGateSlow (line 285) | function QuantumGateSlow(props: QuantumGateSlowWidget & EditableWidget) { function QuantumGateFast (line 304) | function QuantumGateFast(props: QuantumGateFastWidget & EditableWidget) { FILE: client/src/components/widgets/RightBumper.tsx type RightBumperWidget (line 20) | interface RightBumperWidget extends Vector, Angled { function RightBumperPreview (line 28) | function RightBumperPreview() { function RightBumper (line 32) | function RightBumper({ FILE: client/src/components/widgets/RoundBumper.tsx type RoundBumperWidget (line 24) | interface RoundBumperWidget extends Vector { function RoundBumperPreview (line 32) | function RoundBumperPreview() { function RoundBumper (line 36) | function RoundBumper({ FILE: client/src/components/widgets/SpawnInput.tsx constant BALL_RATE_VARIANCE (line 14) | const BALL_RATE_VARIANCE = 1 // 50% either direction function BallSpawner (line 16) | function BallSpawner({ function SpawnInput (line 61) | function SpawnInput({ FILE: client/src/components/widgets/Sticker.tsx type StickerName (line 31) | type StickerName = keyof typeof stickers type StickerWidget (line 35) | interface StickerWidget extends Vector, Angled { function StickerPreview (line 40) | function StickerPreview({ sticker }: { sticker: StickerName }) { function Sticker (line 54) | function Sticker({ FILE: client/src/components/widgets/Sword.tsx type SwordWidget (line 9) | interface SwordWidget extends Vector, Angled { function SwordPreview (line 13) | function SwordPreview() { function Sword (line 22) | function Sword({ FILE: client/src/components/widgets/Wheel.tsx type SpokedWheelWidget (line 15) | interface SpokedWheelWidget extends Vector { function SpokedWheelPreview (line 20) | function SpokedWheelPreview() { function getNextWheelSpeed (line 24) | function getNextWheelSpeed(wheel: SpokedWheelWidget, key: string) { constant OUTER_WHEEL_RADIUS (line 44) | const OUTER_WHEEL_RADIUS = 40.0 constant WHEEL_TOP (line 45) | const WHEEL_TOP = 38 constant WHEEL_LEFT (line 46) | const WHEEL_LEFT = 79 constant NUM_SPOKES (line 47) | const NUM_SPOKES = 7 type Description (line 61) | type Description = { type HullDescription (line 64) | type HullDescription = Description function makeConvexHull (line 84) | function makeConvexHull(hullDesc: HullDescription, rotationAngle: number) { function makeSpoke (line 98) | function makeSpoke(index: number, colliderDesc: typeof ColliderDesc) { function SpokedWheel (line 129) | function SpokedWheel({ FILE: client/src/components/widgets/index.tsx type WidgetData (line 51) | type WidgetData = type WidgetType (line 74) | type WidgetType = WidgetData['type'] type PaletteItem (line 76) | interface PaletteItem { function Widget (line 320) | function Widget( function WidgetsUnmemoized (line 376) | function WidgetsUnmemoized({ FILE: client/src/components/widgets/lib/ball.ts type BallFunc (line 5) | type BallFunc = typeof ColliderDesc.ball function Ball (line 13) | function Ball( FILE: client/src/components/widgets/lib/lineCuboid.ts function lineCuboid (line 5) | function lineCuboid( FILE: client/src/custom.d.ts type Window (line 4) | interface Window { type Document (line 8) | interface Document { type HTMLElement (line 12) | interface HTMLElement { FILE: client/src/generated/api-spec.d.ts type paths (line 7) | interface paths { type webhooks (line 320) | type webhooks = Record; type components (line 322) | interface components { type $defs (line 513) | type $defs = Record; type external (line 515) | type external = Record; type operations (line 517) | type operations = Record; FILE: client/src/image.d.ts type ComicImage (line 2) | interface ComicImage { FILE: client/src/index.tsx type ComicGlobal (line 10) | interface ComicGlobal {} function styleContainer (line 12) | function styleContainer(el: HTMLElement) { function init (line 22) | function init() { FILE: client/src/lib/coords.ts constant M_PER_PX (line 5) | const M_PER_PX = 1 / 50 method x (line 9) | x(distance: number) { method y (line 13) | y(distance: number) { method length (line 17) | length(this: void, length: number) { method lengths (line 21) | lengths(...lengths: T): T { method vector (line 25) | vector( method vectorObject (line 33) | vectorObject( method angle (line 44) | angle(angle: number) { method x (line 50) | x(distance: number) { method y (line 54) | y(distance: number) { method length (line 58) | length(this: void, length: number) { method vector (line 62) | vector(x: number, y: number): [number, number] { method angle (line 66) | angle(angle: number) { method vector (line 72) | vector(body: RigidBody | Collider) { method angle (line 77) | angle(body: RigidBody | Collider) { function vectorMagnitude (line 83) | function vectorMagnitude(a: Vector) { function vectorDistance (line 87) | function vectorDistance(a: Vector, b: Vector) { function vectorAngle (line 91) | function vectorAngle(a: Vector, b: Vector) { function vectorDifference (line 95) | function vectorDifference(a: Vector, b: Vector): Vector { function vectorNorm (line 99) | function vectorNorm(a: Vector): Vector { function vectorScale (line 105) | function vectorScale(a: Vector, scale: number): Vector { function vectorRotate (line 109) | function vectorRotate(toRotate: Vector, angleDegrees: number): Vector { FILE: client/src/lib/snapshot.tsx type BodySnapshot (line 4) | interface BodySnapshot extends Vector, Angled { type WidgetSnapshot (line 10) | interface WidgetSnapshot extends BodySnapshot { type BallSnapshot (line 14) | interface BallSnapshot extends BodySnapshot { type MachineSnapshot (line 19) | interface MachineSnapshot { function snapshotBody (line 24) | function snapshotBody(body: RigidBody): BodySnapshot { function applySnapshotToBody (line 34) | function applySnapshotToBody( function offsetSnapshot (line 49) | function offsetSnapshot( FILE: client/src/lib/tiles.tsx type Grid (line 4) | type Grid = T[][] function tileBounds (line 6) | function tileBounds( function gridDimensions (line 38) | function gridDimensions(grid: Grid) { function gridViewBounds (line 44) | function gridViewBounds( function tileKey (line 56) | function tileKey(xt: number, yt: number) { FILE: client/src/lib/utils.ts function useIdGen (line 4) | function useIdGen(getInitial?: () => number) { function px (line 12) | function px(value: number) { function percent (line 16) | function percent(value: number) { function ms (line 20) | function ms(value: number) { function inBounds (line 24) | function inBounds(x: number, y: number, [x1, y1, x2, y2]: Bounds) { function inBoundsOutset (line 28) | function inBoundsOutset( function inBoundsObject (line 39) | function inBoundsObject( function intersectBounds (line 54) | function intersectBounds( function rotate (line 66) | function rotate( type Basis (line 76) | interface Basis { type RandallPath (line 82) | interface RandallPath { FILE: client/src/page/demo-editor.tsx function DemoEditor (line 21) | function DemoEditor() { FILE: client/src/page/demo-map.tsx function DemoMap (line 15) | function DemoMap({ demoPanning }: { demoPanning?: boolean }) { FILE: client/src/page/demo-viewer.tsx function DemoViewer (line 13) | function DemoViewer() { FILE: client/src/types.ts type Sized (line 7) | interface Sized { type Angled (line 12) | interface Angled { type OutputLoc (line 16) | interface OutputLoc { type BallType (line 20) | type BallType = number type BallTypeRate (line 21) | type BallTypeRate = { type: BallType; rate: number } type PuzzlePosition (line 22) | type PuzzlePosition = { balls: BallTypeRate[] } & Vector type Puzzle (line 24) | interface Puzzle { type PuzzleOrder (line 29) | interface PuzzleOrder extends Puzzle { type WidgetCollection (line 34) | type WidgetCollection = Record type Bounds (line 36) | type Bounds = [x1: number, y1: number, x2: number, y2: number] type BallData (line 38) | type BallData = { type UserData (line 44) | type UserData = BallData & { type: unknown } type Ball (line 46) | type Ball = RigidBody & { userData: BallData } function isBall (line 48) | function isBall(body: RigidBody): body is Ball { FILE: client/webpack.config.js function buildComic (line 10) | function buildComic(_env, argv) {