SYMBOL INDEX (198 symbols across 96 files) FILE: packages/francoisbest.com/content/blog/2020/dark-mode-for-excalidraw/status-text.tsx function StatusText (line 1) | function StatusText(props: React.ComponentProps<'svg'>) { FILE: packages/francoisbest.com/content/blog/2020/dark-mode-for-excalidraw/venn.tsx function VennDiagram (line 1) | function VennDiagram(props: React.ComponentProps<'svg'>) { FILE: packages/francoisbest.com/content/blog/2020/mobile-device-frames-for-excalidraw/mobile-mockup.tsx function MobileMockup (line 1) | function MobileMockup(props: React.ComponentProps<'svg'>) { FILE: packages/francoisbest.com/content/blog/2023/storing-react-state-in-the-url-with-nextjs/greetings.tsx constant DEFAULT (line 7) | const DEFAULT = 'anonymous reader' FILE: packages/francoisbest.com/content/blog/2023/storing-react-state-in-the-url-with-nextjs/update-queue.tsx function UpdateQueue (line 1) | function UpdateQueue(props: React.ComponentProps<'svg'>) { FILE: packages/francoisbest.com/content/blog/2023/testing-against-every-nextjs-canary-release/windowing.tsx function Windowing (line 1) | function Windowing(props: React.ComponentProps<'svg'>) { FILE: packages/francoisbest.com/next.config.ts method redirects (line 30) | async redirects() { FILE: packages/francoisbest.com/source.config.ts method onVisitTitle (line 22) | onVisitTitle(element) { method onVisitCaption (line 54) | onVisitCaption(element) { FILE: packages/francoisbest.com/src/app/(dashboards)/layout.tsx function DashboardLayout (line 3) | function DashboardLayout({ FILE: packages/francoisbest.com/src/app/(not-prose)/hashvatar/demo.tsx function HashvatarDemoPage (line 8) | function HashvatarDemoPage() { type VariantButtonProps (line 52) | type VariantButtonProps = { FILE: packages/francoisbest.com/src/app/(not-prose)/hashvatar/page.tsx function HashvatarPage (line 9) | function HashvatarPage() { FILE: packages/francoisbest.com/src/app/(not-prose)/horcrux/page.tsx function HorcruxPage (line 11) | function HorcruxPage() { FILE: packages/francoisbest.com/src/app/(not-prose)/horcrux/recompose.tsx type ShardStateMap (line 10) | type ShardStateMap = { type ShardState (line 16) | type ShardState = { function useShards (line 34) | function useShards() { function useSecret (line 40) | function useSecret(shards: string[]) { FILE: packages/francoisbest.com/src/app/(not-prose)/horcrux/split.tsx type HorcruxSplitProps (line 19) | type HorcruxSplitProps = { type ReadOnlyCodeBlock (line 131) | type ReadOnlyCodeBlock = { FILE: packages/francoisbest.com/src/app/(not-prose)/horcrux/tss.ts function generateRandomBytes (line 4) | function generateRandomBytes(length: number) { function splitSecret (line 17) | function splitSecret( function assembleSecret (line 35) | function assembleSecret(shards: string[]) { function cleanupShard (line 49) | function cleanupShard(shard: string) { FILE: packages/francoisbest.com/src/app/(not-prose)/layout.tsx function PageLayout (line 4) | function PageLayout({ FILE: packages/francoisbest.com/src/app/(not-prose)/woodworking/dovetail-designer/components/dovetail-svg.tsx type DovetailSVGProps (line 4) | type DovetailSVGProps = React.ComponentProps<'section'> & { FILE: packages/francoisbest.com/src/app/(not-prose)/woodworking/dovetail-designer/components/dovetails.ts type DovetailParameters (line 1) | type DovetailParameters = { function getDovetailData (line 10) | function getDovetailData({ type DovetailData (line 43) | type DovetailData = ReturnType function getDovetailPath (line 47) | function getDovetailPath({ function getDovetailMeasurements (line 77) | function getDovetailMeasurements({ a, b, c, c_, b_ }: DovetailData) { FILE: packages/francoisbest.com/src/app/(not-prose)/woodworking/dovetail-designer/page.client.tsx type DovetailDesignerProps (line 22) | interface DovetailDesignerProps {} FILE: packages/francoisbest.com/src/app/(not-prose)/woodworking/dovetail-designer/page.tsx function DovtailDesignerPage (line 13) | function DovtailDesignerPage() { FILE: packages/francoisbest.com/src/app/(pages)/_landing-sections/about-me.tsx function AboutMe (line 8) | function AboutMe() { FILE: packages/francoisbest.com/src/app/(pages)/_landing-sections/career/career.tsx type CareerProps (line 12) | type CareerProps = React.ComponentProps<'div'> & {} FILE: packages/francoisbest.com/src/app/(pages)/_landing-sections/career/experience.tsx type ExperienceProps (line 4) | type ExperienceProps = { type ClientProps (line 40) | type ClientProps = React.ComponentProps<'li'> & { FILE: packages/francoisbest.com/src/app/(pages)/_landing-sections/career/icons/arturia.tsx function ArturiaLogo (line 1) | function ArturiaLogo(props: React.ComponentProps<'svg'>) { FILE: packages/francoisbest.com/src/app/(pages)/_landing-sections/career/icons/gael.tsx function GaelLogo (line 1) | function GaelLogo(props: React.ComponentProps<'svg'>) { FILE: packages/francoisbest.com/src/app/(pages)/_landing-sections/career/icons/heron.tsx function HeronLogo (line 1) | function HeronLogo(props: React.ComponentProps<'svg'>) { FILE: packages/francoisbest.com/src/app/(pages)/_landing-sections/career/icons/lacquereur.tsx function AcquereurLogo (line 1) | function AcquereurLogo(props: React.ComponentProps<'svg'>) { FILE: packages/francoisbest.com/src/app/(pages)/_landing-sections/career/icons/marianne.tsx function MarianneLogo (line 1) | function MarianneLogo(props: React.ComponentProps<'svg'>) { FILE: packages/francoisbest.com/src/app/(pages)/_landing-sections/career/icons/pulsar.tsx function PulsarLogo (line 1) | function PulsarLogo(props: React.ComponentProps<'svg'>) { FILE: packages/francoisbest.com/src/app/(pages)/_landing-sections/career/icons/slate-digital.tsx function SlateLogo (line 1) | function SlateLogo(props: React.ComponentProps<'svg'>) { FILE: packages/francoisbest.com/src/app/(pages)/business-card/page.tsx type PageProps (line 13) | type PageProps = { function BusinessCardPage (line 17) | async function BusinessCardPage({ searchParams }: PageProps) { function loadKey (line 46) | async function loadKey(form: FormData) { function LoadKey (line 57) | function LoadKey() { FILE: packages/francoisbest.com/src/app/(pages)/business-card/qrcode.tsx type QRCodeProps (line 4) | type QRCodeProps = React.ComponentProps<'figure'> & { FILE: packages/francoisbest.com/src/app/(pages)/layout.tsx function PageLayout (line 4) | function PageLayout({ FILE: packages/francoisbest.com/src/app/(pages)/links/page.tsx function Page (line 3) | function Page() { FILE: packages/francoisbest.com/src/app/(pages)/music/page.tsx function MusicPage (line 12) | function MusicPage() { FILE: packages/francoisbest.com/src/app/(pages)/open-source/page.tsx function OpenSourcePage (line 28) | async function OpenSourcePage() { FILE: packages/francoisbest.com/src/app/(pages)/page.tsx function HomePage (line 10) | function HomePage() { FILE: packages/francoisbest.com/src/app/(pages)/posts/[...slug]/page.tsx type PageProps (line 14) | type PageProps = { function generateStaticParams (line 18) | async function generateStaticParams() { function generateMetadata (line 23) | async function generateMetadata({ params }: PageProps): Promise { function BlogPost (line 42) | async function BlogPost({ params }: PageProps) { FILE: packages/francoisbest.com/src/app/(pages)/posts/[year]/page.tsx type PageProps (line 8) | type PageProps = { function generateStaticParams (line 16) | async function generateStaticParams() { function generateMetadata (line 28) | async function generateMetadata({ params }: PageProps) { function YearIndex (line 52) | async function YearIndex({ params }: PageProps) { FILE: packages/francoisbest.com/src/app/(pages)/posts/components/blog-post-preview.tsx type BlogPostPreviewProps (line 6) | type BlogPostPreviewProps = Post & { FILE: packages/francoisbest.com/src/app/(pages)/posts/components/blog-roll-header.tsx type BlogRollHeaderProps (line 3) | type BlogRollHeaderProps = { FILE: packages/francoisbest.com/src/app/(pages)/posts/feed/[format]/route.ts function generateStaticParams (line 6) | async function generateStaticParams() { function GET (line 14) | async function GET( FILE: packages/francoisbest.com/src/app/(pages)/posts/og/[...slug]/route.ts constant CONTENT_DIR (line 5) | const CONTENT_DIR = path.join(process.cwd(), 'content/blog') function generateStaticParams (line 7) | async function generateStaticParams() { function GET (line 14) | async function GET( FILE: packages/francoisbest.com/src/app/(pages)/posts/page.tsx function BlogIndex (line 10) | async function BlogIndex() { FILE: packages/francoisbest.com/src/app/(pages)/posts/tags/[tag]/page.tsx type PageProps (line 9) | type PageProps = { function generateMetadata (line 15) | async function generateMetadata({ params }: PageProps) { function TagPage (line 23) | async function TagPage({ params }: PageProps) { function generateStaticParams (line 54) | async function generateStaticParams() { FILE: packages/francoisbest.com/src/app/(pages)/posts/tags/page.tsx function TagsIndex (line 10) | async function TagsIndex() { FILE: packages/francoisbest.com/src/app/(pages)/public-keys/page.tsx function PublicKeysPage (line 11) | function PublicKeysPage() { FILE: packages/francoisbest.com/src/app/(pages)/safari-speedrun/page.tsx function SafariSpeedrunPage (line 10) | function SafariSpeedrunPage() { FILE: packages/francoisbest.com/src/app/(pages)/sitemap/page.tsx function SitemapPage (line 12) | function SitemapPage() { FILE: packages/francoisbest.com/src/app/(pages)/uses/page.tsx function UsesPage (line 8) | function UsesPage() { FILE: packages/francoisbest.com/src/app/.well-known/webfinger/route.ts function GET (line 3) | async function GET() { FILE: packages/francoisbest.com/src/app/api/isr/route.ts constant ACCEPTED_TAGS (line 4) | const ACCEPTED_TAGS = ['npm', 'github'] function GET (line 6) | async function GET(req: NextRequest) { FILE: packages/francoisbest.com/src/app/layout.tsx function RootLayout (line 15) | function RootLayout({ FILE: packages/francoisbest.com/src/app/not-found.tsx function NotFound (line 4) | function NotFound() { FILE: packages/francoisbest.com/src/app/robots.ts function robots (line 6) | function robots(): MetadataRoute.Robots { FILE: packages/francoisbest.com/src/app/sitemap.ts function sitemap (line 5) | async function sitemap(): Promise { FILE: packages/francoisbest.com/src/app/vcard/route.ts function GET (line 6) | function GET(req: NextRequest) { FILE: packages/francoisbest.com/src/app/vcard/vcard.ts function decryptPhoneNumber (line 18) | function decryptPhoneNumber(key: string) { FILE: packages/francoisbest.com/src/lib/blog/defs.ts type PostMetadata (line 1) | type PostMetadata = { FILE: packages/francoisbest.com/src/lib/blog/engine.ts constant CONTENT_DIR (line 8) | const CONTENT_DIR = path.join(process.cwd(), 'content/blog') type OgImageExtension (line 10) | type OgImageExtension = 'jpg' | 'png' type Post (line 12) | type Post = { function getAllPosts (line 20) | async function getAllPosts(): Promise { function getPost (line 33) | async function getPost(slug: string[]): Promise { type FumadocsPage (line 39) | type FumadocsPage = ReturnType[number] function pageToPost (line 41) | async function pageToPost(page: FumadocsPage): Promise { function detectOgImage (line 60) | async function detectOgImage( FILE: packages/francoisbest.com/src/lib/blog/reading-time.ts constant CONTENT_DIR (line 5) | const CONTENT_DIR = path.join(process.cwd(), 'content/blog') function computeReadingTime (line 7) | async function computeReadingTime(slug: string[]): Promise { FILE: packages/francoisbest.com/src/lib/mdx-components.tsx function getMdxComponents (line 10) | function getMdxComponents(): MDXComponents { FILE: packages/francoisbest.com/src/lib/paths.ts function resolve (line 9) | function resolve(importMetaUrl: string, ...paths: string[]) { function url (line 20) | function url(routePath: string) { function gitHubUrl (line 28) | function gitHubUrl( FILE: packages/francoisbest.com/src/lib/services/chiffre.ts type ChiffreConfig (line 1) | type ChiffreConfig = FILE: packages/francoisbest.com/src/lib/services/github.ts type GitHubRepositoryData (line 4) | type GitHubRepositoryData = { function fetchRepository (line 46) | async function fetchRepository( FILE: packages/francoisbest.com/src/lib/services/hacker-news.ts type HackerNewsItem (line 26) | type HackerNewsItem = z.infer function getHackerNewsItem (line 30) | async function getHackerNewsItem(url: string) { FILE: packages/francoisbest.com/src/lib/services/html-sanitizer.ts function sanitizeHTML (line 7) | function sanitizeHTML(unsafeHTML: string) { FILE: packages/francoisbest.com/src/lib/services/npm.ts constant NPM_API_URL (line 4) | const NPM_API_URL = process.env.NPM_API_URL || 'https://api.npmjs.org' type NpmPackageStatsData (line 6) | type NpmPackageStatsData = { type RangeResponse (line 16) | type RangeResponse = { function getLastNDays (line 23) | async function getLastNDays( type PointResponse (line 38) | type PointResponse = { function getAllTime (line 42) | async function getAllTime(pkg: string): Promise { function getVersions (line 58) | async function getVersions(pkg: string): Promise> { function fetchNpmPackage (line 69) | async function fetchNpmPackage( type BulkPointResponse (line 86) | type BulkPointResponse = Record type BulkRangeResponse (line 87) | type BulkRangeResponse = Record function getAllTimeBulk (line 89) | async function getAllTimeBulk( function getLastNDaysBulk (line 114) | async function getLastNDaysBulk( function fetchAllNpmPackages (line 135) | async function fetchAllNpmPackages( function get (line 200) | async function get( FILE: packages/francoisbest.com/src/ui/components/browser-window-frame.tsx type BrowserWindowFrameProps (line 4) | type BrowserWindowFrameProps = React.ComponentProps<'figure'> & { FILE: packages/francoisbest.com/src/ui/components/buttons/button.tsx type ButtonSize (line 10) | type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' type ButtonVariant (line 11) | type ButtonVariant = 'solid' | 'outline' | 'ghost' | 'link' type ButtonColor (line 12) | type ButtonColor = 'gray' | 'green' | 'blue' | 'red' type ButtonProps (line 13) | type ButtonProps = React.ComponentProps<'button'> & { function Button (line 25) | function Button({ type ButtonStyle (line 104) | type ButtonStyle = `${ButtonVariant}_${ButtonColor}` FILE: packages/francoisbest.com/src/ui/components/buttons/icon-button.tsx type IconButtonProps (line 5) | type IconButtonProps = Omit< FILE: packages/francoisbest.com/src/ui/components/forms/inputs.tsx type InputProps (line 5) | type InputProps = React.ComponentProps<'input'> & {} type NumberInputProps (line 26) | type NumberInputProps = InputProps & {} type TextareaProps (line 46) | type TextareaProps = React.ComponentProps<'textarea'> & {} FILE: packages/francoisbest.com/src/ui/components/forms/radio.tsx type RadioStateContext (line 5) | type RadioStateContext = { type RadioGroupProps (line 10) | type RadioGroupProps = React.ComponentProps<'fieldset'> & type RadioProps (line 38) | type RadioProps = React.ComponentProps<'input'> & { FILE: packages/francoisbest.com/src/ui/components/forms/slider.tsx type SliderProps (line 4) | type SliderProps = Omit, 'onChange'> & { FILE: packages/francoisbest.com/src/ui/components/forms/structure.tsx type FormControlContext (line 4) | type FormControlContext = { type FormControlProps (line 8) | type FormControlProps = React.ComponentProps<'div'> & function useFormControlContext (line 15) | function useFormControlContext() { FILE: packages/francoisbest.com/src/ui/components/graphs/svg-curve-graph.tsx type SvgCurveGraphProps (line 9) | type SvgCurveGraphProps = React.ComponentProps<'svg'> & { type Point (line 18) | type Point = [number, number] type CommandFn (line 20) | type CommandFn = (point: Point, index: number, array: Point[]) => string constant FLOAT_DECIMALS (line 22) | const FLOAT_DECIMALS = 4 function formatGraphData (line 26) | function formatGraphData( FILE: packages/francoisbest.com/src/ui/components/hashvatar.client.tsx function useHash (line 8) | function useHash( FILE: packages/francoisbest.com/src/ui/components/hashvatar.server.tsx function sha256 (line 4) | async function sha256(message: string) { type Variants (line 16) | type Variants = 'normal' | 'stagger' | 'spider' | 'flower' | 'gem' type ColorMapper (line 18) | type ColorMapper = (args: { type SHA256AvatarProps (line 25) | type SHA256AvatarProps = { type Point (line 36) | interface Point { function polarPoint (line 41) | function polarPoint(radius: number, angle: number): Point { function moveTo (line 51) | function moveTo({ x, y }: Point) { function lineTo (line 55) | function lineTo({ x, y }: Point) { function arcTo (line 59) | function arcTo({ x, y }: Point, radius: number, invert = false) { type GenerateSectionArgs (line 63) | interface GenerateSectionArgs { function generateSection (line 82) | function generateSection({ function getHashSoul (line 133) | function getHashSoul(bytes: string[]) { FILE: packages/francoisbest.com/src/ui/components/hire-me.tsx constant AVAILABLE (line 4) | const AVAILABLE = undefined // eg: 'January 2026' type HireMeProps (line 6) | type HireMeProps = Omit FILE: packages/francoisbest.com/src/ui/components/local-time.tsx type Props (line 7) | type Props = React.ComponentProps<'time'> & { function LocalDate (line 12) | function LocalDate({ date, hydratedSuffix = null, ...props }: Props) { function LocalTime (line 25) | function LocalTime({ date, hydratedSuffix = null, ...props }: Props) { function LocalDateTime (line 38) | function LocalDateTime({ FILE: packages/francoisbest.com/src/ui/components/logo.tsx type LogoProps (line 10) | type LogoProps = React.ComponentProps<'svg'> & { FILE: packages/francoisbest.com/src/ui/components/note.tsx type NoteStatus (line 10) | type NoteStatus = 'default' | 'info' | 'success' | 'warning' | 'error' type NoteConfig (line 11) | type NoteConfig = { type NoteProps (line 52) | type NoteProps = React.ComponentProps<'aside'> & { FILE: packages/francoisbest.com/src/ui/components/tag.tsx type StaticTagProps (line 7) | type StaticTagProps = React.ComponentProps<'span'> & { type LinkedTagProps (line 10) | type LinkedTagProps = LinkProps & { type TagsNavProps (line 27) | type TagsNavProps = React.ComponentProps<'nav'> & { FILE: packages/francoisbest.com/src/ui/components/theme-controls.tsx type ThemeControlsProps (line 11) | type ThemeControlsProps = Omit FILE: packages/francoisbest.com/src/ui/embeds/blog-post-embed.tsx type BlogPostEmbedProps (line 6) | type BlogPostEmbedProps = Omit & { FILE: packages/francoisbest.com/src/ui/embeds/embed-frame.tsx type EmbedFrameProps (line 3) | type EmbedFrameProps = React.ComponentProps<'section'> & { FILE: packages/francoisbest.com/src/ui/embeds/github-repo.tsx type GitHubRepoProps (line 13) | type GitHubRepoProps = React.ComponentProps<'section'> & { type MetaListItemProps (line 88) | type MetaListItemProps = { FILE: packages/francoisbest.com/src/ui/embeds/hacker-news.tsx type HackerNewsCommentProps (line 5) | type HackerNewsCommentProps = { function HackerNewsComment (line 9) | async function HackerNewsComment({ url }: HackerNewsCommentProps) { FILE: packages/francoisbest.com/src/ui/embeds/npm-package.tsx type NpmPackageProps (line 19) | type NpmPackageProps = Omit & { type VersionRolloutProps (line 204) | type VersionRolloutProps = { FILE: packages/francoisbest.com/src/ui/embeds/spotify-album.tsx type SpotifyAlbumProps (line 20) | type SpotifyAlbumProps = Partial & { function SpotifyAlbum (line 24) | function SpotifyAlbum({ url, ...props }: SpotifyAlbumProps) { type EmptyAlbumViewProps (line 37) | type EmptyAlbumViewProps = { FILE: packages/francoisbest.com/src/ui/embeds/spotify-artist.tsx type SpotifyArtistProps (line 17) | type SpotifyArtistProps = Partial & { function SpotifyArtist (line 21) | function SpotifyArtist({ url, ...props }: SpotifyArtistProps) { FILE: packages/francoisbest.com/src/ui/embeds/spotify-loader.tsx type SpotifyData (line 18) | type SpotifyData = z.infer type SpotifyLoaderProps (line 20) | type SpotifyLoaderProps = OtherProps & { function SpotifyLoader (line 27) | async function SpotifyLoader({ function loadSpotifyData (line 46) | function loadSpotifyData(url: string): Promise { FILE: packages/francoisbest.com/src/ui/format.ts constant LOCALE (line 1) | const LOCALE = 'en-GB' function formatDate (line 6) | function formatDate( function formatTime (line 23) | function formatTime(date: Date | string | number) { function formatNumber (line 33) | function formatNumber(value: number) { function formatStatNumber (line 37) | function formatStatNumber( FILE: packages/francoisbest.com/src/ui/hooks/useClipboard.ts function useClipboard (line 3) | function useClipboard(value: string, timeout = 1500) { FILE: packages/francoisbest.com/src/ui/hooks/useHydration.ts function useHydration (line 5) | function useHydration() { FILE: packages/francoisbest.com/src/ui/layouts/nav-link.tsx type NavLinkProps (line 7) | type NavLinkProps = LinkProps & {