SYMBOL INDEX (123 symbols across 39 files) FILE: app/(with-layout)/page.client.tsx type ProjectProps (line 7) | interface ProjectProps { FILE: app/(with-layout)/page.tsx function Home (line 93) | function Home() { FILE: app/(without-root-layout)/p/components/figure.tsx type FigureProps (line 3) | interface FigureProps { FILE: app/(without-root-layout)/visitors/actions.ts function validateAndSaveEntry (line 23) | async function validateAndSaveEntry( function sendEmail (line 50) | async function sendEmail(formData: FormData) { FILE: app/(without-root-layout)/visitors/all/page.tsx constant ITEMS_PER_PAGE (line 12) | const ITEMS_PER_PAGE = 50; function Page (line 14) | function Page( function PageContent (line 44) | async function PageContent({ searchParams }: { searchParams: Promise<{ p... function EntriesList (line 55) | async function EntriesList({ currentPage }: { currentPage: number }) { function Pagination (line 84) | function Pagination({ type ButtonProps (line 149) | interface ButtonProps function getGuestbookEntries (line 170) | async function getGuestbookEntries(page: number) { FILE: app/(without-root-layout)/visitors/gang/page.tsx function ProtectedPage (line 8) | function ProtectedPage() { function AuthenticatedContent (line 16) | async function AuthenticatedContent() { function getColor (line 46) | function getColor(id: string) { function GuestbookEntries (line 54) | async function GuestbookEntries() { FILE: app/(without-root-layout)/visitors/login/page.tsx function LoginPage (line 6) | function LoginPage() { FILE: app/actions.ts function saveGuestbookEntry (line 5) | async function saveGuestbookEntry(state: unknown, formData: FormData) { function approveGuestbookEntry (line 24) | async function approveGuestbookEntry(id: string) { function declineGuestbookEntry (line 32) | async function declineGuestbookEntry(id: string) { FILE: app/api/login/route.ts function POST (line 4) | async function POST(request: Request) { FILE: app/api/md/route.ts constant BASE_URL (line 7) | const BASE_URL = "https://mitul.ca"; function getHomeMarkdown (line 9) | function getHomeMarkdown(): string { function getAboutMarkdown (line 62) | function getAboutMarkdown(): string { function getBlogPostMarkdown (line 83) | function getBlogPostMarkdown(slug: string): string | null { function getVisitorsMarkdown (line 137) | function getVisitorsMarkdown(): string { function GET (line 146) | async function GET(request: NextRequest) { FILE: app/api/send/route.ts function POST (line 6) | async function POST(request: Request) { FILE: app/api/spotify/route.ts function GET (line 5) | async function GET() { FILE: app/feed.xml/route.ts constant BASE_URL (line 3) | const BASE_URL = "https://mitul.ca"; function escapeXml (line 5) | function escapeXml(text: string): string { function generateRssFeed (line 14) | function generateRssFeed(): string { function GET (line 47) | function GET() { FILE: app/layout.tsx function RootLayout (line 85) | function RootLayout({ FILE: app/llms.txt/route.ts constant BASE_URL (line 5) | const BASE_URL = "https://mitul.ca"; function getBlogSlugs (line 7) | function getBlogSlugs(): string[] { function generateLlmsTxt (line 18) | function generateLlmsTxt(): string { function GET (line 59) | function GET() { FILE: app/sitemap.ts constant BASE_URL (line 5) | const BASE_URL = "https://mitul.ca"; function getBlogSlugs (line 7) | function getBlogSlugs(): string[] { function sitemap (line 18) | function sitemap(): MetadataRoute.Sitemap { FILE: atoms/guestbook.tsx type Entry (line 4) | type Entry = { FILE: components/collapsible.tsx type ExpandingLinkProps (line 12) | interface ExpandingLinkProps { FILE: components/email-template.tsx type EmailTemplateProps (line 3) | interface EmailTemplateProps { FILE: components/json-ld.tsx function PersonJsonLd (line 1) | function PersonJsonLd() { function WebSiteJsonLd (line 31) | function WebSiteJsonLd() { constant BASE_URL (line 54) | const BASE_URL = "https://mitul.ca"; type BlogPostJsonLdProps (line 56) | interface BlogPostJsonLdProps { function BlogPostJsonLd (line 60) | function BlogPostJsonLd({ slug }: BlogPostJsonLdProps) { FILE: components/morphing-dialog.tsx type MorphingDialogContextType (line 20) | type MorphingDialogContextType = { function useMorphingDialog (line 30) | function useMorphingDialog() { type MorphingDialogProviderProps (line 40) | type MorphingDialogProviderProps = { function MorphingDialogProvider (line 45) | function MorphingDialogProvider({ type MorphingDialogProps (line 70) | type MorphingDialogProps = { function MorphingDialog (line 75) | function MorphingDialog({ children, transition }: MorphingDialogProps) { type MorphingDialogTriggerProps (line 83) | type MorphingDialogTriggerProps = { function MorphingDialogTrigger (line 90) | function MorphingDialogTrigger({ type MorphingDialogContentProps (line 131) | type MorphingDialogContentProps = { function MorphingDialogContent (line 137) | function MorphingDialogContent({ type MorphingDialogContainerProps (line 219) | type MorphingDialogContainerProps = { function MorphingDialogContainer (line 225) | function MorphingDialogContainer({ children }: MorphingDialogContainerPr... type MorphingDialogTitleProps (line 257) | type MorphingDialogTitleProps = { function MorphingDialogTitle (line 263) | function MorphingDialogTitle({ type MorphingDialogSubtitleProps (line 282) | type MorphingDialogSubtitleProps = { function MorphingDialogSubtitle (line 288) | function MorphingDialogSubtitle({ type MorphingDialogDescriptionProps (line 306) | type MorphingDialogDescriptionProps = { function MorphingDialogDescription (line 317) | function MorphingDialogDescription({ type MorphingDialogImageProps (line 345) | type MorphingDialogImageProps = { function MorphingDialogImage (line 354) | function MorphingDialogImage({ type MorphingDialogCloseProps (line 376) | type MorphingDialogCloseProps = { function MorphingDialogClose (line 386) | function MorphingDialogClose({ FILE: components/now-playing-client.tsx function NowPlayingClient (line 10) | function NowPlayingClient({ initial }: { initial: any }) { FILE: components/photo.tsx function MorphingImageDialog (line 13) | function MorphingImageDialog({ FILE: components/scroll-area.tsx function ScrollArea (line 4) | function ScrollArea({ FILE: components/shader.tsx function createShader (line 8) | function createShader(gl: WebGLRenderingContext, type: number, source: s... function createProgram (line 20) | function createProgram( constant VERT (line 42) | const VERT = ` constant FRAG (line 51) | const FRAG = ` constant INK_COLOR (line 98) | const INK_COLOR: [number, number, number] = [2 / 255, 16 / 255, 147 / 255]; function DitherShaderCanvas (line 105) | function DitherShaderCanvas() { FILE: components/tree.tsx type Particle (line 9) | interface Particle { class QuadTree (line 46) | class QuadTree { method constructor (line 56) | constructor( method insert (line 70) | insert(point: Particle) { method subdivide (line 92) | subdivide() { method contains (line 118) | contains(point: Particle) { method query (line 127) | query(range: { x: number; y: number; r: number }, found: Particle[]) { method intersects (line 146) | intersects(range: { x: number; y: number; r: number }) { method inCircle (line 155) | inCircle(range: { x: number; y: number; r: number }, point: Particle) { FILE: components/twitter-x-loop.tsx function TwitterXMotion (line 13) | function TwitterXMotion({ className }: { className: string }) { FILE: components/video-pause-button.tsx function VideoPauseButton (line 6) | function VideoPauseButton() { FILE: components/visitors/cta.tsx function WriteNoteCTA (line 27) | function WriteNoteCTA() { FILE: components/visitors/field.tsx type FieldProps (line 7) | interface FieldProps { FILE: components/visitors/guestbook-entries.tsx function GuestbookEntries (line 13) | function GuestbookEntries() { FILE: hooks/useClickOutside.tsx function useClickOutside (line 3) | function useClickOutside( FILE: lib/blog-posts.ts type BlogPost (line 1) | interface BlogPost { function getBlogPost (line 43) | function getBlogPost(slug: string): BlogPost | undefined { FILE: lib/literal.ts type Book (line 1) | interface Book { constant LITERAL_ENDPOINT (line 8) | const LITERAL_ENDPOINT = "https://api.literal.club/graphql"; FILE: lib/openai.ts function moderateText (line 9) | async function moderateText(text: string) { FILE: lib/spotify.ts constant CLIENT_ID (line 1) | const CLIENT_ID = process.env.SPOTIFY_CLIENT_ID; constant CLIENT_SECRET (line 2) | const CLIENT_SECRET = process.env.SPOTIFY_CLIENT_SECRET; constant REFRESH_TOKEN (line 3) | const REFRESH_TOKEN = process.env.SPOTIFY_REFRESH_TOKEN; constant BASIC (line 5) | const BASIC = Buffer.from(`${CLIENT_ID}:${CLIENT_SECRET}`).toString("bas... constant NOW_PLAYING_ENDPOINT (line 6) | const NOW_PLAYING_ENDPOINT = constant RECENTLY_PLAYED_ENDPOINT (line 8) | const RECENTLY_PLAYED_ENDPOINT = constant TOKEN_ENDPOINT (line 10) | const TOKEN_ENDPOINT = "https://accounts.spotify.com/api/token"; FILE: lib/utils.ts function cn (line 4) | function cn(...inputs: ClassValue[]) { function pick (line 8) | function pick(object: Record, keys: string[]) { function formatDate (line 23) | function formatDate(date: Date) { FILE: mdx-components.tsx type HeadingProps (line 5) | type HeadingProps = ComponentPropsWithoutRef<"h1">; type ParagraphProps (line 6) | type ParagraphProps = ComponentPropsWithoutRef<"p">; type ListProps (line 7) | type ListProps = ComponentPropsWithoutRef<"ul">; type ListItemProps (line 8) | type ListItemProps = ComponentPropsWithoutRef<"li">; type AnchorProps (line 9) | type AnchorProps = ComponentPropsWithoutRef<"a">; type BlockquoteProps (line 10) | type BlockquoteProps = ComponentPropsWithoutRef<"blockquote">; type ImageProps (line 11) | type ImageProps = ComponentPropsWithoutRef<"img">; function useMDXComponents (line 102) | function useMDXComponents( FILE: proxy.ts function parseMediaType (line 4) | function parseMediaType(mt: string): { type: string; quality: number } { function shouldServeMarkdown (line 19) | function shouldServeMarkdown(acceptHeader: string | null): boolean { constant LLM_USER_AGENTS (line 60) | const LLM_USER_AGENTS = [ function isLLMAgent (line 73) | function isLLMAgent(userAgent: string | null): boolean { function proxy (line 80) | function proxy(request: NextRequest) {