Standard.site landing page built in Next.js

Write documentation + add Link Cards and Markdown button + llm.txt

brookie.blog f5582344 fd9307dd

verified
+3054 -133
+50
app/api/docs/markdown/[...slug]/route.ts
··· 1 + import { NextResponse } from 'next/server' 2 + import { readFile } from 'node:fs/promises' 3 + import { join, resolve } from 'node:path' 4 + 5 + // Map of slugs to their file paths 6 + const docsFiles: Record<string, string> = { 7 + 'introduction': 'introduction.mdx', 8 + 'quick-start': 'quick-start.mdx', 9 + 'permissions': 'permissions.mdx', 10 + 'verification': 'verification.mdx', 11 + 'lexicons/publication': 'lexicons/publication.mdx', 12 + 'lexicons/document': 'lexicons/document.mdx', 13 + 'lexicons/subscription': 'lexicons/subscription.mdx', 14 + 'lexicons/theme': 'lexicons/theme.mdx', 15 + 'implementations': 'implementations.mdx', 16 + 'faq': 'faq.mdx', 17 + } 18 + 19 + export async function generateStaticParams() { 20 + return Object.keys(docsFiles).map((slug) => ({ 21 + slug: slug.split('/'), 22 + })) 23 + } 24 + 25 + export async function GET( 26 + request: Request, 27 + { params }: { params: Promise<{ slug: string[] }> } 28 + ) { 29 + try { 30 + const { slug } = await params 31 + const slugPath = slug.join('/') 32 + const fileName = docsFiles[slugPath] 33 + 34 + if (!fileName) { 35 + return new NextResponse('Not found', { status: 404 }) 36 + } 37 + 38 + const filePath = resolve(process.cwd(), 'content', 'docs', fileName) 39 + const markdown = await readFile(filePath, 'utf-8') 40 + 41 + return new NextResponse(markdown, { 42 + headers: { 43 + 'Content-Type': 'text/plain; charset=utf-8', 44 + }, 45 + }) 46 + } catch (error) { 47 + console.error('API Markdown Error:', error) 48 + return new NextResponse('Internal server error', { status: 500 }) 49 + } 50 + }
+10 -6
app/components/Footer.tsx
··· 1 - import { BlueskyLogo, PdslsLogo, StandardSiteLogo, TangledLogo } from '@/app/components' 1 + import { BlueskyLogo, PdslsLogo, StandardSiteLogo, TangledLogo, MarkdownButton } from '@/app/components' 2 2 3 3 export function Footer() { 4 4 return ( 5 - <div className="flex gap-x-8 lg:gap-x-16 xl:gap-x-24 justify-center border-t border-border bg-base-200 px-8 pt-12 pb-24 sm:py-32"> 5 + <div className="relative flex gap-x-8 lg:gap-x-16 xl:gap-x-24 justify-center border-t border-border bg-base-200 px-8 pt-12 pb-24 sm:py-32"> 6 6 <section className="hidden md:flex shrink-0 w-32"></section> 7 7 8 8 <footer className="flex gap-4 flex-col items-center text-center sm:text-left sm:flex-row sm:items-end sm:justify-between w-xl min-w-0"> ··· 13 13 Standard.site 14 14 </span> 15 15 <span className="font-medium sm:text-sm tracking-tight text-muted-content"> 16 - &copy; { new Date().getFullYear() } 16 + &copy; {new Date().getFullYear()} 17 17 </span> 18 18 </div> 19 19 </div> ··· 21 21 <div className="flex flex-col gap-4 items-center sm:items-end sm:gap-8"> 22 22 <div className="order-last sm:order-first w-fit flex justify-end items-center gap-4"> 23 23 <a href="https://bsky.app/profile/standard.site" target="_blank"> 24 - <BlueskyLogo className="h-5 w-auto text-muted-content hover:text-muted transition-colors"/> 24 + <BlueskyLogo className="h-5 w-auto text-muted-content hover:text-muted transition-colors" /> 25 25 </a> 26 26 <a href="https://tangled.org/standard.site" target="_blank"> 27 - <TangledLogo className="h-5 w-auto text-muted-content hover:text-muted transition-colors"/> 27 + <TangledLogo className="h-5 w-auto text-muted-content hover:text-muted transition-colors" /> 28 28 </a> 29 29 <a href="https://pdsls.dev/at://did:plc:re3ebnp5v7ffagz6rb6xfei4/com.atproto.lexicon.schema" target="_blank"> 30 - <PdslsLogo className="h-5 w-auto text-muted-content hover:text-muted transition-colors"/> 30 + <PdslsLogo className="h-5 w-auto text-muted-content hover:text-muted transition-colors" /> 31 31 </a> 32 32 </div> 33 33 <div className="flex flex-col sm:items-end"> ··· 42 42 </footer> 43 43 44 44 <section className="hidden md:flex shrink-0 w-32"></section> 45 + 46 + <div className="absolute bottom-8 right-8"> 47 + <MarkdownButton /> 48 + </div> 45 49 </div> 46 50 ) 47 51 }
+70
app/components/docs/ClickableHeading.tsx
··· 1 + 'use client' 2 + 3 + import { useState } from 'react' 4 + import { generateSlug } from '@/app/lib/slug' 5 + 6 + interface ClickableHeadingProps { 7 + level: 1 | 2 | 3 | 4 8 + children: React.ReactNode 9 + } 10 + 11 + export function ClickableHeading({ level, children }: ClickableHeadingProps) { 12 + const [copied, setCopied] = useState(false) 13 + 14 + const text = typeof children === 'string' ? children : extractText(children) 15 + const id = generateSlug(text) 16 + 17 + const handleClick = async () => { 18 + const url = `${window.location.origin}${window.location.pathname}#${id}` 19 + await navigator.clipboard.writeText(url) 20 + setCopied(true) 21 + 22 + // Update URL without scrolling 23 + window.history.pushState({}, '', `#${id}`) 24 + 25 + setTimeout(() => setCopied(false), 2000) 26 + } 27 + 28 + const Tag = `h${level}` as keyof JSX.IntrinsicElements 29 + 30 + const baseClasses = "font-display font-semibold leading-tight tracking-tighter text-base-content group cursor-pointer hover:text-muted transition-colors relative scroll-mt-32" 31 + const levelClasses = { 32 + 1: "text-3xl sm:text-4xl mb-8", 33 + 2: "text-2xl sm:text-3xl mt-12 mb-4", 34 + 3: "text-xl sm:text-2xl tracking-tight mt-8 mb-3", 35 + 4: "text-lg sm:text-xl tracking-tight mt-6 mb-2" 36 + } 37 + 38 + return ( 39 + <Tag 40 + id={id} 41 + className={`${baseClasses} ${levelClasses[level]}`} 42 + onClick={handleClick} 43 + > 44 + <span className="inline-flex items-center gap-2"> 45 + {children} 46 + <span className="opacity-0 group-hover:opacity-100 transition-opacity text-muted"> 47 + {copied ? ( 48 + <svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor"> 49 + <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" /> 50 + </svg> 51 + ) : ( 52 + <svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor"> 53 + <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1" /> 54 + </svg> 55 + )} 56 + </span> 57 + </span> 58 + </Tag> 59 + ) 60 + } 61 + 62 + function extractText(node: React.ReactNode): string { 63 + if (typeof node === 'string') return node 64 + if (typeof node === 'number') return String(node) 65 + if (Array.isArray(node)) return node.map(extractText).join('') 66 + if (node && typeof node === 'object' && 'props' in node) { 67 + return extractText(node.props.children) 68 + } 69 + return '' 70 + }
+104
app/components/docs/LinkCard.tsx
··· 1 + 2 + interface LinkCardProps { 3 + title?: string 4 + description?: string 5 + url: string 6 + image?: string 7 + } 8 + 9 + async function fetchOGMetadata(url: string) { 10 + try { 11 + const response = await fetch(url, { 12 + next: { revalidate: 86400 }, // Cache for 24 hours 13 + headers: { 14 + 'User-Agent': 'Mozilla/5.0 (compatible; Standard.site/1.0; +https://standard.site)' 15 + } 16 + }) 17 + 18 + if (!response.ok) { 19 + console.warn(`Failed to fetch ${url}: ${response.status}`) 20 + return null 21 + } 22 + 23 + const html = await response.text() 24 + const urlObj = new URL(url) 25 + 26 + // Extract OG metadata - try both property and name attributes 27 + let ogImage = 28 + html.match(/<meta[^>]*property=["']og:image["'][^>]*content=["']([^"']*)["']/i)?.[1] || 29 + html.match(/<meta[^>]*content=["']([^"']*)["'][^>]*property=["']og:image["']/i)?.[1] 30 + 31 + const ogTitle = 32 + html.match(/<meta[^>]*property=["']og:title["'][^>]*content=["']([^"']*)["']/i)?.[1] || 33 + html.match(/<meta[^>]*content=["']([^"']*)["'][^>]*property=["']og:title["']/i)?.[1] 34 + 35 + const ogDescription = 36 + html.match(/<meta[^>]*property=["']og:description["'][^>]*content=["']([^"']*)["']/i)?.[1] || 37 + html.match(/<meta[^>]*content=["']([^"']*)["'][^>]*property=["']og:description["']/i)?.[1] 38 + 39 + // Resolve relative image URLs to absolute 40 + if (ogImage && !ogImage.startsWith('http')) { 41 + if (ogImage.startsWith('//')) { 42 + ogImage = `${urlObj.protocol}${ogImage}` 43 + } else if (ogImage.startsWith('/')) { 44 + ogImage = `${urlObj.protocol}//${urlObj.host}${ogImage}` 45 + } else { 46 + ogImage = `${urlObj.protocol}//${urlObj.host}/${ogImage}` 47 + } 48 + } 49 + 50 + return { 51 + image: ogImage || null, 52 + title: ogTitle || null, 53 + description: ogDescription || null 54 + } 55 + } catch (error) { 56 + console.error('Failed to fetch OG metadata from', url, error) 57 + return null 58 + } 59 + } 60 + 61 + export async function LinkCard({ title, description, url, image }: LinkCardProps) { 62 + const hostname = new URL(url).hostname.replace('www.', '') 63 + 64 + // Fetch OG metadata if not provided 65 + const metadata = await fetchOGMetadata(url) 66 + 67 + const finalTitle = title || metadata?.title || hostname 68 + const finalDescription = description || metadata?.description || '' 69 + const finalImage = image || metadata?.image 70 + 71 + return ( 72 + <a 73 + href={url} 74 + target="_blank" 75 + rel="noopener noreferrer" 76 + className="group flex gap-4 rounded-2xl border border-border bg-gradient-to-br from-base-200/50 to-base-200 p-4 transition-all hover:border-border/60 hover:shadow-lg not-prose mb-4" 77 + > 78 + <div className="flex min-w-0 flex-1 flex-col gap-2"> 79 + <h3 className="font-mono text-lg font-medium tracking-tight text-base-content group-hover:underline"> 80 + {finalTitle} 81 + </h3> 82 + {finalDescription && ( 83 + <p className="text-sm leading-relaxed tracking-tight text-muted-content"> 84 + {finalDescription} 85 + </p> 86 + )} 87 + <div className="mt-auto text-xs font-medium text-muted-content"> 88 + <span className="font-mono">{hostname}</span> 89 + </div> 90 + </div> 91 + {finalImage && ( 92 + <div className="shrink-0"> 93 + <div className="h-24 w-40 overflow-hidden rounded-xl bg-base-100"> 94 + <img 95 + src={finalImage} 96 + alt={finalTitle} 97 + className="h-full w-full object-cover" 98 + /> 99 + </div> 100 + </div> 101 + )} 102 + </a> 103 + ) 104 + }
+37
app/components/docs/MarkdownButton.tsx
··· 1 + 'use client' 2 + 3 + import { usePathname } from 'next/navigation' 4 + 5 + interface MarkdownButtonProps { 6 + slug?: string 7 + } 8 + 9 + export function MarkdownButton({ slug: providedSlug }: MarkdownButtonProps) { 10 + const pathname = usePathname() 11 + 12 + // Detect slug from pathname if not provided 13 + const slug = providedSlug || (() => { 14 + const path = pathname.split(/[?#]/)[0] // Remove query and hash 15 + if (!path.startsWith('/docs/')) return null 16 + const parts = path.split('/').filter(Boolean) 17 + if (parts.length <= 1) return null // Only /docs/ with no slug 18 + return parts.slice(1).join('/') 19 + })() 20 + 21 + if (!slug) return null 22 + 23 + return ( 24 + <a 25 + href={`/api/docs/markdown/${slug}`} 26 + target="_blank" 27 + rel="noopener noreferrer" 28 + className="bg-base-100 text-muted hover:text-base-content hover:bg-base-300 px-3 py-2 rounded-lg border border-border transition-all flex items-center gap-2 text-xs h-fit" 29 + title="View raw markdown" 30 + > 31 + <svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor"> 32 + <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" /> 33 + </svg> 34 + Markdown 35 + </a> 36 + ) 37 + }
+3
app/components/docs/StandardSite.tsx
··· 1 + export function StandardSite() { 2 + return <span className="text-base-content">Standard.site</span> 3 + }
+24 -2
app/components/docs/Table.tsx
··· 4 4 } 5 5 6 6 export function Table({ headers, rows }: TableProps) { 7 + const columnCount = headers.length 8 + 7 9 return ( 8 10 <div className="overflow-x-auto mb-6"> 9 - <table className="w-full text-base border-collapse"> 11 + <table className="w-full text-base border-collapse table-fixed"> 12 + <colgroup> 13 + {columnCount === 3 ? ( 14 + <> 15 + <col className="w-1/4" /> 16 + <col className="w-1/5" /> 17 + <col /> 18 + </> 19 + ) : columnCount === 4 ? ( 20 + <> 21 + <col className="w-1/4" /> 22 + <col className="w-1/6" /> 23 + <col className="w-1/6" /> 24 + <col /> 25 + </> 26 + ) : ( 27 + headers.map((_, i) => <col key={i} />) 28 + )} 29 + </colgroup> 10 30 <thead> 11 31 <tr> 12 32 {headers.map((header, i) => ( ··· 25 45 {row.map((cell, j) => ( 26 46 <td 27 47 key={j} 28 - className="text-muted border-b border-border px-3 py-2" 48 + className={`text-muted border-b border-border px-3 py-2 ${ 49 + j === 0 ? 'font-mono text-sm break-all' : '' 50 + }`} 29 51 > 30 52 {cell} 31 53 </td>
+4
app/components/docs/index.ts
··· 1 1 export { DocsSidebar } from './DocsSidebar' 2 2 export { DocsNav } from './DocsNav' 3 3 export { Table } from './Table' 4 + export { LinkCard } from './LinkCard' 5 + export { StandardSite } from './StandardSite' 6 + export { MarkdownButton } from './MarkdownButton' 7 + export { ClickableHeading } from './ClickableHeading'
+3 -3
app/components/sections/DefinitionsSection.tsx
··· 38 38 </h2> 39 39 40 40 <p className="text-base sm:text-xl leading-snug tracking-tight text-muted"> 41 - We currently define two main lexicons that cover the core building 42 - blocks of long-form platforms: where content lives, and what it 43 - contains. 41 + We currently define three main lexicons that cover the core building 42 + blocks of long-form platforms: where content lives, what it 43 + contains, and how users connect with publications. 44 44 </p> 45 45 46 46 <TabbedLexiconViewer tabs={ tabs } allSchemas={ allSchemas } />
+1
app/data/content.ts
··· 76 76 export const LEXICON_TABS = [ 77 77 'site.standard.publication', 78 78 'site.standard.document', 79 + 'site.standard.graph.subscription', 79 80 ]
+5
app/data/docs-nav.ts
··· 14 14 items: [ 15 15 { label: 'Introduction', href: '/docs/introduction' }, 16 16 { label: 'Quick Start', href: '/docs/quick-start' }, 17 + { label: 'Permissions', href: '/docs/permissions' }, 18 + { label: 'Verification', href: '/docs/verification' }, 17 19 ], 18 20 }, 19 21 { ··· 21 23 items: [ 22 24 { label: 'Publication', href: '/docs/lexicons/publication' }, 23 25 { label: 'Document', href: '/docs/lexicons/document' }, 26 + { label: 'Subscription', href: '/docs/lexicons/subscription' }, 27 + { label: 'Theme', href: '/docs/lexicons/theme' }, 24 28 ], 25 29 }, 26 30 { 27 31 title: 'Resources', 28 32 items: [ 33 + { label: 'Implementations', href: '/docs/implementations' }, 29 34 { label: 'FAQ', href: '/docs/faq' }, 30 35 ], 31 36 },
+8 -1
app/docs/[...slug]/page.tsx
··· 5 5 const docsContent: Record<string, () => Promise<{ default: React.ComponentType }>> = { 6 6 'introduction': () => import('@/content/docs/introduction.mdx'), 7 7 'quick-start': () => import('@/content/docs/quick-start.mdx'), 8 + 'permissions': () => import('@/content/docs/permissions.mdx'), 9 + 'verification': () => import('@/content/docs/verification.mdx'), 8 10 'lexicons/publication': () => import('@/content/docs/lexicons/publication.mdx'), 9 11 'lexicons/document': () => import('@/content/docs/lexicons/document.mdx'), 12 + 'lexicons/subscription': () => import('@/content/docs/lexicons/subscription.mdx'), 13 + 'lexicons/theme': () => import('@/content/docs/lexicons/theme.mdx'), 14 + 'implementations': () => import('@/content/docs/implementations.mdx'), 10 15 'faq': () => import('@/content/docs/faq.mdx'), 11 16 } 12 17 ··· 30 35 31 36 const { default: Content } = await loader() 32 37 33 - return <Content /> 38 + return ( 39 + <Content /> 40 + ) 34 41 }
+9
app/globals.css
··· 45 45 body { 46 46 font-family : var(--font-inter), var(--font-geist-sans), Arial, Helvetica, sans-serif; 47 47 } 48 + 49 + /* Softer link underlines */ 50 + a { 51 + text-decoration-color: var(--border); 52 + } 53 + 54 + a:hover { 55 + text-decoration-color: var(--muted-content); 56 + }
+2
app/lib/lexicon.ts
··· 1 1 import publicationLexicon from "../data/lexicons/publication.json"; 2 2 import documentLexicon from "../data/lexicons/document.json"; 3 + import subscriptionLexicon from "../data/lexicons/graph.subscription.json"; 3 4 import themeBasicLexicon from "../data/lexicons/theme.basic.json"; 4 5 import themeColorLexicon from "../data/lexicons/theme.color.json"; 5 6 import { getDescriptionOverride, getPropertyOrder } from "../data/lexicon-overrides"; ··· 48 49 const lexiconCache: Record<string, LexiconSchema> = { 49 50 "site.standard.publication": publicationLexicon as LexiconSchema, 50 51 "site.standard.document": documentLexicon as LexiconSchema, 52 + "site.standard.graph.subscription": subscriptionLexicon as LexiconSchema, 51 53 "site.standard.theme.basic": themeBasicLexicon as LexiconSchema, 52 54 "site.standard.theme.color": themeColorLexicon as LexiconSchema, 53 55 };
+9
app/lib/slug.ts
··· 1 + export function generateSlug(text: string): string { 2 + return text 3 + .toString() 4 + .toLowerCase() 5 + .trim() 6 + .replace(/\s+/g, '-') 7 + .replace(/[^\w\-]+/g, '') 8 + .replace(/\-\-+/g, '-') 9 + }
+8 -14
content/docs/faq.mdx
··· 1 + import { StandardSite } from '@/app/components/docs' 2 + 1 3 # Frequently Asked Questions 2 4 3 - Common questions about Standard.site and implementing the lexicons. 5 + Common questions about <StandardSite /> and implementing the lexicons. 4 6 5 7 ## General 6 8 7 9 ### What is Standard.site? 8 10 9 - Standard.site is a community-driven initiative to create shared lexicon schemas for long-form publishing on AT Protocol. It enables interoperability between different publishing platforms. 11 + <StandardSite /> is a community-driven initiative to create shared lexicon schemas for long-form publishing on AT Protocol. It enables interoperability between different publishing platforms. 10 12 11 13 ### Who created Standard.site? 12 14 13 - Standard.site emerged from conversations between developers building long-form platforms on AT Protocol. It's maintained by the community and grows as builders identify shared needs. 14 - 15 - ### Is Standard.site official? 16 - 17 - Standard.site is a community standard, not an official Bluesky or AT Protocol specification. However, it's designed to work seamlessly with the AT Protocol ecosystem. 15 + <StandardSite /> emerged from conversations between developers building long-form platforms on AT Protocol. It's maintained by the community and grows as builders identify shared needs. 18 16 19 17 ## Technical 20 18 21 19 ### Do I need to use all the lexicons? 22 20 23 - No. You can implement just the lexicons that make sense for your application. The schemas are designed to work independently while supporting richer integrations when combined. 21 + No. Applications can implement just the lexicons that make sense for their use case. The schemas are designed to work independently while supporting richer integrations when combined. 24 22 25 23 ### Can I extend the schemas? 26 24 27 - The standard focuses on shared metadata fields. You're free to add additional fields in your application, though they may not be understood by other platforms. 28 - 29 - ### How do I validate records? 30 - 31 - Use AT Protocol's standard validation mechanisms. The lexicon schemas define the expected structure, and records are validated against these schemas by the PDS. 25 + The standard focuses on shared metadata properties. Applications are free to add additional properties, though they may not be understood by other platforms. 32 26 33 27 ## Contributing 34 28 35 29 ### How can I contribute? 36 30 37 - Standard.site is developed in the open. Join the conversation on Bluesky, Tangled, or check the project on GitHub to propose changes or additions. 31 + <StandardSite /> is developed in the open. Join the conversation on Bluesky or [Tangled](https://tangled.org/standard.site) to propose changes or additions. 38 32 39 33 ### How are changes decided? 40 34
+43
content/docs/implementations.mdx
··· 1 + import { LinkCard } from '@/app/components/docs' 2 + 3 + import { StandardSite } from '@/app/components/docs' 4 + 5 + # Implementations 6 + 7 + Projects and tools using <StandardSite /> lexicons to build interoperable platforms on AT Protocol. 8 + 9 + ## Development Tools 10 + 11 + <LinkCard url="https://site-validator.fly.dev" /> 12 + 13 + ## Migration Tools 14 + 15 + <LinkCard url="https://sequoia.pub/blog/introducing-sequoia/" /> 16 + 17 + ## Indexes & Discovery 18 + 19 + <LinkCard url="https://read.pckt.blog" /> 20 + 21 + <LinkCard url="https://docs.surf" /> 22 + 23 + <LinkCard url="https://standard-search.octet-stream.net/" /> 24 + 25 + ## Building Your Own 26 + 27 + Building a tool or platform using <StandardSite /> lexicons? We'd love to hear about it! <StandardSite /> is a community-driven initiative, and new implementations help grow the ecosystem. 28 + 29 + ### What to Build 30 + 31 + Some ideas for new implementations: 32 + 33 + - **RSS bridges**: Convert <StandardSite /> records to RSS/Atom feeds 34 + - **Static site generators**: Export <StandardSite /> content to static HTML 35 + - **Mobile readers**: Native mobile apps for reading <StandardSite /> content 36 + - **Import tools**: Import content from existing platforms to <StandardSite /> 37 + - **Content management**: Editors for creating <StandardSite /> records 38 + 39 + ## Related 40 + 41 + - [Quick Start](/docs/quick-start) - Start implementing <StandardSite /> 42 + - [Publication lexicon](/docs/lexicons/publication) - Understand publication schemas 43 + - [Document lexicon](/docs/lexicons/document) - Understand document schemas
+17 -12
content/docs/introduction.mdx
··· 1 + import { StandardSite } from '@/app/components/docs' 2 + 1 3 # Introduction 2 4 3 - **Standard.site** provides shared lexicons for long-form publishing on AT Protocol. 5 + <StandardSite /> lexicons bring long-form writing into the social web by linking blog posts and articles to the AT Protocol. This integration helps make published work easier to share and find, while ensuring authors maintain ownership of their writing in the form of records stored on their Personal Data Server (PDS). 4 6 5 7 ## What is Standard.site? 6 8 7 - Standard.site is a set of lexicon schemas that enable interoperability between long-form publishing platforms built on AT Protocol. By using shared schemas, content created on one platform can be understood and displayed by any other compatible platform. 9 + Our lexicons are built with discovery and connectivity in mind. <StandardSite /> lexicons bridge the gap between writers and the communities they intend to reach. 8 10 9 - ## Why use shared lexicons? 11 + We have two main lexicons that are used to create and manage publications and written documents. In addition to these base lexicons, we maintain a handful of supporting lexicons for social features and utility. 10 12 11 - - **Interoperability**: Your content works across multiple platforms 12 - - **Portability**: Move your content without losing structure 13 - - **Consistency**: Shared vocabulary for publications, documents, and subscriptions 14 - 15 - ## Core concepts 13 + ## Core Lexicons 16 14 17 15 ### Publications 18 16 19 - A publication is a container for documents. Think of it as a blog, magazine, or newsletter. Each publication has metadata like a title, description, and avatar. 17 + The [`site.standard.publication`](/docs/lexicons/publication) lexicon is a representation of a collection of documents published to the web. It includes important information about a publication including its location on the web, theming information, user preferences, and more. 20 18 21 19 ### Documents 22 20 23 - Documents are individual pieces of content within a publication. They contain the actual written content, along with metadata like title, publish date, and status. 21 + The [`site.standard.document`](/docs/lexicons/document) lexicon provides metadata for individual documents. Including the document's relation to a publication if applicable, a path to the document, and more information like a document's complete contents. 24 22 25 23 ### Subscriptions 26 24 27 - Subscriptions track relationships between users and publications, enabling follow functionality. 25 + The [`site.standard.graph.subscription`](/docs/lexicons/subscription) lexicon tracks relationships between users and publications, enabling follow functionality and personalized content feeds across the AT Protocol network. 26 + 27 + ## Design Philosophy 28 + 29 + There are minimal requirements to use these lexicons, ensuring adoptability is as straightforward as possible. As long as the minimum required properties are included in published records, they will be available for other AT Protocol platforms to consume. 30 + 31 + While <StandardSite /> lexicons are lightweight on their own, they can be expanded to fit individual needs if necessary. The existing properties should not be seen as constraints, but rather as starting points. 28 32 29 33 ## Next steps 30 34 31 35 - Read the [Quick Start](/docs/quick-start) guide to begin implementing 32 36 - Explore the [Publication lexicon](/docs/lexicons/publication) schema 33 - - Check out the [FAQ](/docs/faq) for common questions 37 + - Learn about [Verification](/docs/verification) to link records to a domain 38 + - Check out [Implementations](/docs/implementations) to see tools and platforms using <StandardSite />
+47 -32
content/docs/lexicons/document.mdx
··· 2 2 3 3 # Document Lexicon 4 4 5 - The `site.standard.document` lexicon defines the schema for documents within publications. 5 + The `site.standard.document` lexicon provides metadata for documents published on the web. 6 6 7 7 ## Overview 8 8 9 - A document represents an individual piece of content, such as a blog post or article. Documents belong to a publication and contain the actual written content along with metadata. 9 + Documents may be standalone or associated with a publication. This lexicon can be used to store a document's content and its associated metadata. 10 10 11 11 ## Schema 12 12 13 + ### Required Properties 14 + 13 15 <Table 14 - headers={['Field', 'Type', 'Required', 'Description']} 16 + headers={['Property', 'Type', 'Description']} 15 17 rows={[ 16 - ['publication', 'at-uri', 'Yes', 'Reference to parent publication'], 17 - ['title', 'string', 'Yes', 'Document title'], 18 - ['content', 'string', 'Yes', 'The document content'], 19 - ['status', 'string', 'Yes', 'One of: draft, published, archived'], 20 - ['visibility', 'string', 'No', 'One of: public, subscribers, private'], 21 - ['createdAt', 'datetime', 'Yes', 'When the document was created'], 22 - ['publishedAt', 'datetime', 'No', 'When the document was published'], 18 + ['site', 'string', 'Points to a publication record (at://) or publication URL (https://). Avoid trailing slashes.'], 19 + ['title', 'string', 'Title of the document'], 20 + ['publishedAt', 'datetime', 'Timestamp of the document\'s publish time'], 23 21 ]} 24 22 /> 25 23 26 - ## Status values 24 + ### Optional Properties 27 25 28 - - **draft**: Work in progress, not publicly visible 29 - - **published**: Live and visible according to visibility settings 30 - - **archived**: No longer actively displayed but still accessible 26 + <Table 27 + headers={['Property', 'Type', 'Description']} 28 + rows={[ 29 + ['path', 'string', 'Combined with site/publication URL to construct canonical URL. Should start with a slash.'], 30 + ['description', 'string', 'Brief description or excerpt from the document'], 31 + ['coverImage', 'blob', 'Image for thumbnail or cover. Less than 1MB in size.'], 32 + ['content', 'union', 'Open union used to define the record\'s content. Each entry must specify a $type.'], 33 + ['textContent', 'string', 'Plaintext representation of the document. Should not contain markdown or formatting.'], 34 + ['bskyPostRef', 'ref', 'Strong reference to a Bluesky post. Useful to track comments off-platform.'], 35 + ['tags', 'array', 'Array of strings to tag or categorize the document. Avoid prepending with hashtags.'], 36 + ['updatedAt', 'datetime', 'Timestamp of the document\'s last edit'], 37 + ]} 38 + /> 31 39 32 40 ## Example 33 41 34 - ```typescript 35 - const document = { 36 - $type: 'site.standard.document', 37 - publication: 'at://did:plc:abc.../site.standard.publication/main', 38 - title: 'Getting Started with AT Protocol', 39 - content: '...', // Your content here 40 - status: 'published', 41 - visibility: 'public', 42 - createdAt: '2024-01-20T14:00:00.000Z', 43 - publishedAt: '2024-01-20T14:30:00.000Z', 42 + ```json 43 + { 44 + "$type": "site.standard.document", 45 + "site": "at://did:plc:abc123/site.standard.publication/3lwafzkjqm25s", 46 + "path": "/blog/getting-started", 47 + "title": "Getting Started with Standard.site", 48 + "description": "Learn how to use Standard.site lexicons in your project", 49 + "coverImage": { 50 + "$type": "blob", 51 + "ref": { 52 + "$link": "bafkreiexample123456789" 53 + }, 54 + "mimeType": "image/jpeg", 55 + "size": 245678 56 + }, 57 + "textContent": "Full text of the article...", 58 + "tags": ["tutorial", "atproto"], 59 + "publishedAt": "2024-01-20T14:30:00.000Z" 44 60 } 45 61 ``` 46 62 47 - ## Content format 63 + ## Content Format 48 64 49 - The content field is intentionally flexible. Standard.site does not prescribe a specific content format, allowing platforms to use: 65 + The content property is an open union, allowing for extensibility. Each entry must specify a `$type` and may be extended with other lexicons to support additional content formats like Markdown, blocks, or other rich text. 50 66 51 - - Markdown 52 - - HTML 53 - - JSON-based rich text 54 - - Custom formats 67 + ## View the Lexicon 55 68 56 - This flexibility enables each platform to optimize for their use case while maintaining interoperability at the metadata level. 69 + - [View full lexicon schema](https://pdsls.dev/at://did:plc:re3ebnp5v7ffagz6rb6xfei4/com.atproto.lexicon.schema/site.standard.document) 70 + - [Example record](https://pdsls.dev/at://did:plc:revjuqmkvrw6fnkxppqtszpv/site.standard.document/3mbfqhezge25u) 57 71 58 72 ## Related 59 73 60 - - [Publication lexicon](/docs/lexicons/publication) - Parent container for documents 74 + - [Publication lexicon](/docs/lexicons/publication) - Collections of documents 75 + - [Verification](/docs/verification) - Link documents to web pages 61 76 - [Quick Start](/docs/quick-start) - Implementation guide
+78 -14
content/docs/lexicons/publication.mdx
··· 2 2 3 3 # Publication Lexicon 4 4 5 - The `site.standard.publication` lexicon defines the schema for publications. 5 + The `site.standard.publication` lexicon is used to describe information about a particular publication. 6 6 7 7 ## Overview 8 8 9 - A publication represents a container for documents, similar to a blog, magazine, or newsletter. Each user can have multiple publications. 9 + A publication represents a collection of documents published to the web. It includes important information about a publication including its location on the web, theming information, user preferences, and more. 10 + 11 + The publication lexicon is not a requirement, but is recommended when publishing collections of related documents. 10 12 11 13 ## Schema 12 14 15 + ### Required Properties 16 + 13 17 <Table 14 - headers={['Field', 'Type', 'Required', 'Description']} 18 + headers={['Property', 'Type', 'Description']} 15 19 rows={[ 16 - ['title', 'string', 'Yes', 'The publication title'], 17 - ['description', 'string', 'No', 'A brief description'], 18 - ['avatar', 'blob', 'No', 'Publication avatar image'], 19 - ['createdAt', 'datetime', 'Yes', 'When the publication was created'], 20 + ['url', 'string', 'Base URL for the publication (ex: https://standard.site). Combined with document path to construct full URLs. Avoid trailing slashes.'], 21 + ['name', 'string', 'The name of the publication'], 22 + ]} 23 + /> 24 + 25 + ### Optional Properties 26 + 27 + <Table 28 + headers={['Property', 'Type', 'Description']} 29 + rows={[ 30 + ['icon', 'blob', 'Square image to identify publication'], 31 + ['description', 'string', 'Description of the publication'], 32 + ['basicTheme', 'ref', 'Simplified publication theme (ref → [site.standard.theme.basic](/docs/lexicons/theme))'], 33 + ['preferences', 'object', 'Platform-specific preferences for the publication'], 34 + ['preferences.showInDiscover', 'boolean', 'Whether the publication should appear in discovery feeds'], 20 35 ]} 21 36 /> 22 37 23 38 ## Example 24 39 25 - ```typescript 26 - const publication = { 27 - $type: 'site.standard.publication', 28 - title: 'Tech Insights', 29 - description: 'Weekly thoughts on technology and software development', 30 - createdAt: '2024-01-15T10:30:00.000Z', 40 + ```json 41 + { 42 + "$type": "site.standard.publication", 43 + "url": "https://standard.site", 44 + "icon": { 45 + "$type": "blob", 46 + "ref": { 47 + "$link": "bafkreiexample123456789" 48 + }, 49 + "mimeType": "image/png", 50 + "size": 12345 51 + }, 52 + "name": "Standard.site Blog", 53 + "description": "Documentation and updates about Standard.site lexicons", 54 + "basicTheme": { 55 + "$type": "site.standard.theme.basic", 56 + "background": { 57 + "$type": "site.standard.theme.color#rgb", 58 + "r": 255, 59 + "g": 255, 60 + "b": 255 61 + }, 62 + "foreground": { 63 + "$type": "site.standard.theme.color#rgb", 64 + "r": 31, 65 + "g": 41, 66 + "b": 55 67 + }, 68 + "accent": { 69 + "$type": "site.standard.theme.color#rgb", 70 + "r": 59, 71 + "g": 130, 72 + "b": 246 73 + }, 74 + "accentForeground": { 75 + "$type": "site.standard.theme.color#rgb", 76 + "r": 255, 77 + "g": 255, 78 + "b": 255 79 + } 80 + }, 81 + "preferences": { 82 + "showInDiscover": true 83 + } 31 84 } 32 85 ``` 33 86 87 + ## View the Lexicon 88 + 89 + - [View full lexicon schema](https://pdsls.dev/at://did:plc:re3ebnp5v7ffagz6rb6xfei4/com.atproto.lexicon.schema/site.standard.publication) 90 + - [Example record](https://pdsls.dev/at://did:plc:revjuqmkvrw6fnkxppqtszpv/site.standard.publication/3lwafzkjqm25s) 91 + 92 + ## Extensibility 93 + 94 + Lexicons are extendable. Additional properties may be added to better suit the needs of a project. 95 + 34 96 ## Related 35 97 36 - - [Document lexicon](/docs/lexicons/document) - Content within publications 98 + - [Document lexicon](/docs/lexicons/document) - Individual documents within publications 99 + - [Theme lexicon](/docs/lexicons/theme) - Publication theming 100 + - [Verification](/docs/verification) - Link publications to a domain 37 101 - [Quick Start](/docs/quick-start) - Implementation guide
+40
content/docs/lexicons/subscription.mdx
··· 1 + import { Table } from '@/app/components/docs' 2 + 3 + # Subscription Lexicon 4 + 5 + The `site.standard.graph.subscription` lexicon tracks relationships between users and publications. 6 + 7 + ## Overview 8 + 9 + Subscriptions enable users to follow publications and receive updates about new content. They represent the social connection between readers and the publications they're interested in. 10 + 11 + ## Schema 12 + 13 + ### Required Properties 14 + 15 + <Table 16 + headers={['Property', 'Type', 'Description']} 17 + rows={[ 18 + ['publication', 'at-uri', 'AT-URI reference to the publication record being subscribed to (ex: at://did:plc:abc123/site.standard.publication/xyz789)'], 19 + ]} 20 + /> 21 + 22 + ## Example 23 + 24 + ```json 25 + { 26 + "$type": "site.standard.graph.subscription", 27 + "publication": "at://did:plc:abc123/site.standard.publication/3lwafzkjqm25s" 28 + } 29 + ``` 30 + 31 + ## View the Lexicon 32 + 33 + - [View full lexicon schema](https://pdsls.dev/at://did:plc:re3ebnp5v7ffagz6rb6xfei4/com.atproto.lexicon.schema/site.standard.graph.subscription) 34 + - [Example record](https://pdsls.dev/at://did:plc:revjuqmkvrw6fnkxppqtszpv/site.standard.graph.subscription/3lz4ynejb4225) 35 + 36 + ## Related 37 + 38 + - [Publication lexicon](/docs/lexicons/publication) - Publications that can be subscribed to 39 + - [Document lexicon](/docs/lexicons/document) - Content from subscribed publications 40 + - [Quick Start](/docs/quick-start) - Implementation guide
+182
content/docs/lexicons/theme.mdx
··· 1 + import { Table } from '@/app/components/docs' 2 + 3 + # Theme Lexicon 4 + 5 + The `site.standard.theme.basic` lexicon provides a simplified theme definition for publications, enabling basic color customization for content display across different platforms and applications. 6 + 7 + ## Overview 8 + 9 + This lexicon ensures publications maintain their visual identity across different reading applications and platforms by defining core colors for content display. 10 + 11 + ## Schema 12 + 13 + ### Required Properties 14 + 15 + <Table 16 + headers={['Property', 'Type', 'Description']} 17 + rows={[ 18 + ['background', 'ref', 'Color used for content background (ref → site.standard.theme.color#rgb)'], 19 + ['foreground', 'ref', 'Color used for content text (ref → site.standard.theme.color#rgb)'], 20 + ['accent', 'ref', 'Color used for links and button backgrounds (ref → site.standard.theme.color#rgb)'], 21 + ['accentForeground', 'ref', 'Color used for button text (ref → site.standard.theme.color#rgb)'], 22 + ]} 23 + /> 24 + 25 + ## Color Format 26 + 27 + Colors are defined using the `site.standard.theme.color#rgb` type from the `site.standard.theme.color` lexicon. 28 + 29 + ### RGB Color Type 30 + 31 + Each color is an object with three required integer properties: 32 + 33 + <Table 34 + headers={['Property', 'Type', 'Range', 'Description']} 35 + rows={[ 36 + ['r', 'integer', '0-255', 'Red channel value'], 37 + ['g', 'integer', '0-255', 'Green channel value'], 38 + ['b', 'integer', '0-255', 'Blue channel value'], 39 + ]} 40 + /> 41 + 42 + ### RGBA Color Type 43 + 44 + The `site.standard.theme.color` lexicon also defines an `rgba` type for colors with transparency: 45 + 46 + <Table 47 + headers={['Property', 'Type', 'Range', 'Description']} 48 + rows={[ 49 + ['r', 'integer', '0-255', 'Red channel value'], 50 + ['g', 'integer', '0-255', 'Green channel value'], 51 + ['b', 'integer', '0-255', 'Blue channel value'], 52 + ['a', 'integer', '0-100', 'Alpha (opacity) value, where 0 is transparent and 100 is opaque'], 53 + ]} 54 + /> 55 + 56 + ### Color Roles 57 + 58 + - **background**: Main surface color for content areas 59 + - **foreground**: Default color for body text and content 60 + - **accent**: Color for interactive elements like links and button backgrounds 61 + - **accentForeground**: Text color used on accent-colored backgrounds (ex: button text) 62 + 63 + ## Accessibility 64 + 65 + When defining theme colors, ensure sufficient contrast ratios: 66 + 67 + - **Normal text** (foreground/background): Minimum contrast ratio of 4.5:1 68 + - **Large text** (18pt+): Minimum contrast ratio of 3:1 69 + - **Interactive elements** (accent/accentForeground): Minimum contrast ratio of 4.5:1 70 + 71 + Test color combinations to ensure readability across different devices and lighting conditions. 72 + 73 + ## Usage in Publications 74 + 75 + Include the basic theme in your publication record: 76 + 77 + ```json 78 + { 79 + "$type": "site.standard.publication", 80 + "url": "https://myblog.com", 81 + "name": "My Blog", 82 + "basicTheme": { 83 + "$type": "site.standard.theme.basic", 84 + "background": { 85 + "$type": "site.standard.theme.color#rgb", 86 + "r": 255, 87 + "g": 255, 88 + "b": 255 89 + }, 90 + "foreground": { 91 + "$type": "site.standard.theme.color#rgb", 92 + "r": 31, 93 + "g": 41, 94 + "b": 55 95 + }, 96 + "accent": { 97 + "$type": "site.standard.theme.color#rgb", 98 + "r": 59, 99 + "g": 130, 100 + "b": 246 101 + }, 102 + "accentForeground": { 103 + "$type": "site.standard.theme.color#rgb", 104 + "r": 255, 105 + "g": 255, 106 + "b": 255 107 + } 108 + } 109 + } 110 + ``` 111 + 112 + ### Converting from Hex to RGB 113 + 114 + Convert hex color codes to RGB objects: 115 + 116 + ```typescript 117 + function hexToRgb(hex: string): { r: number; g: number; b: number } { 118 + const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex) 119 + return result ? { 120 + r: parseInt(result[1], 16), 121 + g: parseInt(result[2], 16), 122 + b: parseInt(result[3], 16) 123 + } : { r: 0, g: 0, b: 0 } 124 + } 125 + 126 + // Example: Convert #3B82F6 to { r: 59, g: 130, b: 246 } 127 + const accentColor = hexToRgb('#3B82F6') 128 + ``` 129 + 130 + ## Platform Implementation 131 + 132 + ### Rendering Content 133 + 134 + Platforms should: 135 + 1. Read the `basicTheme` from the publication record 136 + 2. Convert RGB values to usable color formats (hex, CSS rgb(), etc.) 137 + 3. Apply theme colors to their UI components 138 + 4. Respect user preferences to override publication themes 139 + 140 + ### Example Implementation 141 + 142 + ```typescript 143 + function rgbToHex(color: { r: number; g: number; b: number }): string { 144 + return `#${color.r.toString(16).padStart(2, '0')}${color.g.toString(16).padStart(2, '0')}${color.b.toString(16).padStart(2, '0')}` 145 + } 146 + 147 + function applyPublicationTheme(theme: BasicTheme) { 148 + document.documentElement.style.setProperty( 149 + '--publication-bg', 150 + rgbToHex(theme.background) 151 + ) 152 + 153 + document.documentElement.style.setProperty( 154 + '--publication-fg', 155 + rgbToHex(theme.foreground) 156 + ) 157 + 158 + document.documentElement.style.setProperty( 159 + '--publication-accent', 160 + rgbToHex(theme.accent) 161 + ) 162 + 163 + document.documentElement.style.setProperty( 164 + '--publication-accent-fg', 165 + rgbToHex(theme.accentForeground) 166 + ) 167 + } 168 + ``` 169 + 170 + ## Best Practices 171 + 172 + 1. **Test accessibility**: Always verify color contrast ratios meet WCAG guidelines 173 + 2. **Consider readability**: Ensure foreground/background combinations are legible 174 + 3. **Test button colors**: Verify accent/accentForeground pairs have sufficient contrast 175 + 4. **Respect user preferences**: Allow users to override publication themes if desired 176 + 5. **Provide all required properties**: All four color properties are required for a valid theme 177 + 178 + ## Related 179 + 180 + - [Publication lexicon](/docs/lexicons/publication) - Publications can include basicTheme 181 + - [Quick Start](/docs/quick-start) - Implementation guide 182 + - [Implementations](/docs/implementations) - See how platforms use theming
+42
content/docs/permissions.mdx
··· 1 + import { Table } from '@/app/components/docs' 2 + import { StandardSite } from '@/app/components/docs' 3 + 4 + # Permissions 5 + 6 + <StandardSite /> provides a permission set for applications to access publications, documents, and subscriptions. 7 + 8 + ## Overview 9 + 10 + Applications that interact with <StandardSite /> records on a user's Personal Data Server (PDS) must request appropriate permissions. Our permission set defines which collections an application can read from and write to. 11 + 12 + ## Full <StandardSite /> Access 13 + 14 + The `site.standard.authFull` permission set provides complete access to all <StandardSite /> features. 15 + 16 + ### Requesting Permissions 17 + 18 + Include `site.standard.authFull` in the OAuth scope when requesting user authorization: 19 + 20 + ``` 21 + include:site.standard.authFull 22 + ``` 23 + 24 + ### Granted Permissions 25 + 26 + This permission set grants access to the following collections: 27 + 28 + <Table 29 + headers={['Collection', 'Description']} 30 + rows={[ 31 + ['site.standard.publication', 'Read and write access to publication records'], 32 + ['site.standard.document', 'Read and write access to document records'], 33 + ['site.standard.graph.subscription', 'Read and write access to subscription records'], 34 + ]} 35 + /> 36 + 37 + ## Related 38 + 39 + - [Quick Start](/docs/quick-start) - Get started implementing <StandardSite /> 40 + - [Publication lexicon](/docs/lexicons/publication) - Understanding publication records 41 + - [Document lexicon](/docs/lexicons/document) - Understanding document records 42 + - [Subscription lexicon](/docs/lexicons/subscription) - Understanding subscription records
+71 -29
content/docs/quick-start.mdx
··· 1 + import { StandardSite } from '@/app/components/docs' 2 + 1 3 # Quick Start 2 4 3 - Get started with Standard.site lexicons in your AT Protocol application. 5 + Get started with <StandardSite /> lexicons. 4 6 5 - ## Prerequisites 7 + ## What You Need 6 8 7 - - An AT Protocol application or PDS 8 - - Familiarity with AT Protocol lexicons and records 9 + - An AT Protocol [Identity](https://atproto.com/guides/identity) 10 + - A website or blog (any domain works) 9 11 10 - ## Basic implementation 12 + ## Basic Implementation 11 13 12 - ### 1. Reference the lexicons 14 + ### 1. Reference the Lexicons 13 15 14 - Standard.site lexicons are published under the `site.standard` namespace. The main lexicons are: 16 + <StandardSite /> lexicons are published under the `site.standard` namespace. The main lexicons are: 15 17 16 - - `site.standard.publication` - Publication metadata 17 - - `site.standard.document` - Document content and metadata 18 - - `site.standard.subscription` - User-publication relationships 18 + - [`site.standard.publication`](/docs/lexicons/publication) - Publication metadata 19 + - [`site.standard.document`](/docs/lexicons/document) - Document content and metadata 20 + - [`site.standard.graph.subscription`](/docs/lexicons/subscription) - User-publication relationships 19 21 20 - ### 2. Create a publication 22 + ### 2. Create a Publication Record 21 23 22 - ```typescript 23 - const publication = { 24 - $type: 'site.standard.publication', 25 - title: 'My Blog', 26 - description: 'A personal blog about technology', 27 - createdAt: new Date().toISOString(), 24 + A publication requires a `url` and `name`: 25 + 26 + ```json 27 + { 28 + "$type": "site.standard.publication", 29 + "url": "https://myblog.com", 30 + "name": "My Blog", 31 + "description": "A personal blog about technology", 32 + "preferences": { 33 + "showInDiscover": true 34 + } 28 35 } 29 36 ``` 30 37 31 - ### 3. Create a document 38 + ### 3. Verify the Publication 32 39 33 - ```typescript 34 - const document = { 35 - $type: 'site.standard.document', 36 - publication: 'at://did:plc:.../site.standard.publication/...', 37 - title: 'My First Post', 38 - content: '...', // Your content format 39 - status: 'published', 40 - createdAt: new Date().toISOString(), 40 + Add a `.well-known` endpoint to the domain: 41 + 42 + ``` 43 + https://myblog.com/.well-known/site.standard.publication 44 + ``` 45 + 46 + This should return the publication's AT-URI: 47 + 48 + ``` 49 + at://did:plc:yourDID/site.standard.publication/rkey 50 + ``` 51 + 52 + ### 4. Create a Document Record 53 + 54 + Documents require `site`, `title`, and `publishedAt`: 55 + 56 + ```json 57 + { 58 + "$type": "site.standard.document", 59 + "site": "at://did:plc:abc123/site.standard.publication/3lwafzkjqm25s", 60 + "title": "My First Post", 61 + "path": "/posts/my-first-post", 62 + "description": "An introduction to my blog", 63 + "publishedAt": "2024-01-20T14:30:00.000Z", 64 + "tags": ["introduction", "blog"], 65 + "textContent": "Full text content here..." 41 66 } 42 67 ``` 43 68 44 - ## Next steps 69 + ### 5. Verify the Document 70 + 71 + Add a `<link>` tag to the document's HTML: 72 + 73 + ```html 74 + <link 75 + rel="site.standard.document" 76 + href="at://did:plc:yourDID/site.standard.document/rkey" 77 + /> 78 + ``` 79 + 80 + ## Extensibility 45 81 46 - - Learn about the [Publication](/docs/lexicons/publication) schema in detail 47 - - Explore [Document](/docs/lexicons/document) fields and options 82 + While the minimum required properties are straightforward, additional properties can be added as needed. The lexicons are designed to be starting points, not constraints. 83 + 84 + ## Next Steps 85 + 86 + - Learn about [Verification](/docs/verification) in detail 87 + - Explore the [Publication](/docs/lexicons/publication) schema 88 + - Review [Document](/docs/lexicons/document) properties and options 89 + - Check out [Implementations](/docs/implementations) for tools and examples
+71
content/docs/verification.mdx
··· 1 + import { StandardSite } from '@/app/components/docs' 2 + 3 + # Verification 4 + 5 + Since <StandardSite /> records reference domains and web pages, a verifiable way for these resources to point back to their corresponding records is needed. 6 + 7 + ## Overview 8 + 9 + Verification is accomplished using a `.well-known` endpoint for publications, and an HTML `<link>` tag for documents. 10 + 11 + When an application needs to verify a record, it fetches the appropriate verification endpoint and checks that the returned value matches the record's AT-URI. 12 + 13 + A <StandardSite /> record should only be considered "valid" if the author of the material provides an accurate verification endpoint pointing to the record. 14 + 15 + ## Publication Verification 16 + 17 + To verify a publication, add a `.well-known` endpoint to the domain: 18 + 19 + ``` 20 + /.well-known/site.standard.publication 21 + ``` 22 + 23 + The endpoint should return the AT-URI of the publication record: 24 + 25 + ``` 26 + at://did:plc:abc123/site.standard.publication/rkey 27 + ``` 28 + 29 + ### Non-root Publications 30 + 31 + If the publication does not live at the domain root, append the publication path to the endpoint: 32 + 33 + ``` 34 + /.well-known/site.standard.publication/path/to/publication 35 + ``` 36 + 37 + ## Document Verification 38 + 39 + To verify an individual document, include a `<link>` tag in the document's `<head>` that references its AT-URI. 40 + 41 + ### HTML Example 42 + 43 + ```html 44 + <link 45 + rel="site.standard.document" 46 + href="at://did:plc:xyz789/site.standard.document/rkey" 47 + /> 48 + ``` 49 + 50 + This confirms the association between the rendered document and its `site.standard.document` record. 51 + 52 + ## Verification Flow 53 + 54 + 1. An application discovers a <StandardSite /> record 55 + 2. The record contains a `url` (for publications) or `site` + `path` (for documents) 56 + 3. The application fetches the verification endpoint from that URL 57 + 4. The application checks if the returned AT-URI matches the record 58 + 5. If they match, the record is verified 59 + 60 + ## Best Practices 61 + 62 + - Always implement verification for production records 63 + - Use HTTPS for all publication and document URLs 64 + - Keep AT-URIs consistent across records and verification endpoints 65 + - Update verification endpoints when migrating records to a new DID 66 + 67 + ## Related 68 + 69 + - [Publication lexicon](/docs/lexicons/publication) - Understanding publication records 70 + - [Document lexicon](/docs/lexicons/document) - Understanding document records 71 + - [Quick Start](/docs/quick-start) - Implementation guide
+5 -12
mdx-components.tsx
··· 1 1 import type { MDXComponents } from 'mdx/types' 2 + import { ClickableHeading } from '@/app/components/docs/ClickableHeading' 2 3 3 4 export function useMDXComponents(components: MDXComponents): MDXComponents { 4 5 return { 5 6 h1: ({ children }) => ( 6 - <h1 className="font-display font-semibold text-3xl sm:text-4xl leading-tight tracking-tighter text-base-content mb-8"> 7 - {children} 8 - </h1> 7 + <ClickableHeading level={1}>{children}</ClickableHeading> 9 8 ), 10 9 h2: ({ children }) => ( 11 - <h2 className="font-display font-semibold text-2xl sm:text-3xl leading-tight tracking-tighter text-base-content mt-12 mb-4"> 12 - {children} 13 - </h2> 10 + <ClickableHeading level={2}>{children}</ClickableHeading> 14 11 ), 15 12 h3: ({ children }) => ( 16 - <h3 className="font-display font-semibold text-xl sm:text-2xl leading-tight tracking-tight text-base-content mt-8 mb-3"> 17 - {children} 18 - </h3> 13 + <ClickableHeading level={3}>{children}</ClickableHeading> 19 14 ), 20 15 h4: ({ children }) => ( 21 - <h4 className="font-display font-semibold text-lg sm:text-xl leading-tight tracking-tight text-base-content mt-6 mb-2"> 22 - {children} 23 - </h4> 16 + <ClickableHeading level={4}>{children}</ClickableHeading> 24 17 ), 25 18 p: ({ children }) => ( 26 19 <p className="text-base sm:text-lg leading-relaxed tracking-tight text-muted mb-4">
+2050 -8
package-lock.json
··· 9 9 "version": "0.1.0", 10 10 "dependencies": { 11 11 "@atproto/api": "^0.18.8", 12 + "@mdx-js/loader": "^3.1.1", 13 + "@mdx-js/react": "^3.1.1", 14 + "@next/mdx": "^16.1.1", 12 15 "lucide-react": "^0.562.0", 13 16 "motion": "^12.23.26", 14 17 "next": "16.1.0", 15 18 "react": "19.2.3", 16 19 "react-dom": "19.2.3", 17 - "react-progressive-blur": "^1.0.6" 20 + "react-progressive-blur": "^1.0.6", 21 + "rehype-slug": "^6.0.0", 22 + "remark-gfm": "^4.0.1" 18 23 }, 19 24 "devDependencies": { 20 25 "@tailwindcss/postcss": "^4", 26 + "@types/mdx": "^2.0.13", 21 27 "@types/node": "^20", 22 28 "@types/react": "^19", 23 29 "@types/react-dom": "^19", ··· 1104 1110 "@jridgewell/sourcemap-codec": "^1.4.14" 1105 1111 } 1106 1112 }, 1113 + "node_modules/@mdx-js/loader": { 1114 + "version": "3.1.1", 1115 + "resolved": "https://registry.npmjs.org/@mdx-js/loader/-/loader-3.1.1.tgz", 1116 + "integrity": "sha512-0TTacJyZ9mDmY+VefuthVshaNIyCGZHJG2fMnGaDttCt8HmjUF7SizlHJpaCDoGnN635nK1wpzfpx/Xx5S4WnQ==", 1117 + "license": "MIT", 1118 + "dependencies": { 1119 + "@mdx-js/mdx": "^3.0.0", 1120 + "source-map": "^0.7.0" 1121 + }, 1122 + "funding": { 1123 + "type": "opencollective", 1124 + "url": "https://opencollective.com/unified" 1125 + }, 1126 + "peerDependencies": { 1127 + "webpack": ">=5" 1128 + }, 1129 + "peerDependenciesMeta": { 1130 + "webpack": { 1131 + "optional": true 1132 + } 1133 + } 1134 + }, 1135 + "node_modules/@mdx-js/mdx": { 1136 + "version": "3.1.1", 1137 + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", 1138 + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", 1139 + "license": "MIT", 1140 + "dependencies": { 1141 + "@types/estree": "^1.0.0", 1142 + "@types/estree-jsx": "^1.0.0", 1143 + "@types/hast": "^3.0.0", 1144 + "@types/mdx": "^2.0.0", 1145 + "acorn": "^8.0.0", 1146 + "collapse-white-space": "^2.0.0", 1147 + "devlop": "^1.0.0", 1148 + "estree-util-is-identifier-name": "^3.0.0", 1149 + "estree-util-scope": "^1.0.0", 1150 + "estree-walker": "^3.0.0", 1151 + "hast-util-to-jsx-runtime": "^2.0.0", 1152 + "markdown-extensions": "^2.0.0", 1153 + "recma-build-jsx": "^1.0.0", 1154 + "recma-jsx": "^1.0.0", 1155 + "recma-stringify": "^1.0.0", 1156 + "rehype-recma": "^1.0.0", 1157 + "remark-mdx": "^3.0.0", 1158 + "remark-parse": "^11.0.0", 1159 + "remark-rehype": "^11.0.0", 1160 + "source-map": "^0.7.0", 1161 + "unified": "^11.0.0", 1162 + "unist-util-position-from-estree": "^2.0.0", 1163 + "unist-util-stringify-position": "^4.0.0", 1164 + "unist-util-visit": "^5.0.0", 1165 + "vfile": "^6.0.0" 1166 + }, 1167 + "funding": { 1168 + "type": "opencollective", 1169 + "url": "https://opencollective.com/unified" 1170 + } 1171 + }, 1172 + "node_modules/@mdx-js/react": { 1173 + "version": "3.1.1", 1174 + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", 1175 + "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", 1176 + "license": "MIT", 1177 + "dependencies": { 1178 + "@types/mdx": "^2.0.0" 1179 + }, 1180 + "funding": { 1181 + "type": "opencollective", 1182 + "url": "https://opencollective.com/unified" 1183 + }, 1184 + "peerDependencies": { 1185 + "@types/react": ">=16", 1186 + "react": ">=16" 1187 + } 1188 + }, 1107 1189 "node_modules/@napi-rs/wasm-runtime": { 1108 1190 "version": "0.2.12", 1109 1191 "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", ··· 1131 1213 "license": "MIT", 1132 1214 "dependencies": { 1133 1215 "fast-glob": "3.3.1" 1216 + } 1217 + }, 1218 + "node_modules/@next/mdx": { 1219 + "version": "16.1.6", 1220 + "resolved": "https://registry.npmjs.org/@next/mdx/-/mdx-16.1.6.tgz", 1221 + "integrity": "sha512-PT5JR4WPPYOls7WD6xEqUVVI9HDY8kY7XLQsNYB2lSZk5eJSXWu3ECtIYmfR0hZpx8Sg7BKZYKi2+u5OTSEx0w==", 1222 + "license": "MIT", 1223 + "dependencies": { 1224 + "source-map": "^0.7.0" 1225 + }, 1226 + "peerDependencies": { 1227 + "@mdx-js/loader": ">=0.15.0", 1228 + "@mdx-js/react": ">=0.15.0" 1229 + }, 1230 + "peerDependenciesMeta": { 1231 + "@mdx-js/loader": { 1232 + "optional": true 1233 + }, 1234 + "@mdx-js/react": { 1235 + "optional": true 1236 + } 1134 1237 } 1135 1238 }, 1136 1239 "node_modules/@next/swc-darwin-arm64": { ··· 1607 1710 "tslib": "^2.4.0" 1608 1711 } 1609 1712 }, 1713 + "node_modules/@types/debug": { 1714 + "version": "4.1.12", 1715 + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", 1716 + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", 1717 + "license": "MIT", 1718 + "dependencies": { 1719 + "@types/ms": "*" 1720 + } 1721 + }, 1610 1722 "node_modules/@types/estree": { 1611 1723 "version": "1.0.8", 1612 1724 "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", 1613 1725 "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", 1614 - "dev": true, 1615 1726 "license": "MIT" 1616 1727 }, 1728 + "node_modules/@types/estree-jsx": { 1729 + "version": "1.0.5", 1730 + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", 1731 + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", 1732 + "license": "MIT", 1733 + "dependencies": { 1734 + "@types/estree": "*" 1735 + } 1736 + }, 1737 + "node_modules/@types/hast": { 1738 + "version": "3.0.4", 1739 + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", 1740 + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", 1741 + "license": "MIT", 1742 + "dependencies": { 1743 + "@types/unist": "*" 1744 + } 1745 + }, 1617 1746 "node_modules/@types/json-schema": { 1618 1747 "version": "7.0.15", 1619 1748 "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", ··· 1628 1757 "dev": true, 1629 1758 "license": "MIT" 1630 1759 }, 1760 + "node_modules/@types/mdast": { 1761 + "version": "4.0.4", 1762 + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", 1763 + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", 1764 + "license": "MIT", 1765 + "dependencies": { 1766 + "@types/unist": "*" 1767 + } 1768 + }, 1769 + "node_modules/@types/mdx": { 1770 + "version": "2.0.13", 1771 + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", 1772 + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", 1773 + "license": "MIT" 1774 + }, 1775 + "node_modules/@types/ms": { 1776 + "version": "2.1.0", 1777 + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", 1778 + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", 1779 + "license": "MIT" 1780 + }, 1631 1781 "node_modules/@types/node": { 1632 1782 "version": "20.19.27", 1633 1783 "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.27.tgz", ··· 1642 1792 "version": "19.2.7", 1643 1793 "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", 1644 1794 "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", 1645 - "dev": true, 1646 1795 "license": "MIT", 1647 1796 "dependencies": { 1648 1797 "csstype": "^3.2.2" ··· 1657 1806 "peerDependencies": { 1658 1807 "@types/react": "^19.2.0" 1659 1808 } 1809 + }, 1810 + "node_modules/@types/unist": { 1811 + "version": "3.0.3", 1812 + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", 1813 + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", 1814 + "license": "MIT" 1660 1815 }, 1661 1816 "node_modules/@typescript-eslint/eslint-plugin": { 1662 1817 "version": "8.52.0", ··· 1927 2082 "url": "https://opencollective.com/typescript-eslint" 1928 2083 } 1929 2084 }, 2085 + "node_modules/@ungap/structured-clone": { 2086 + "version": "1.3.0", 2087 + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", 2088 + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", 2089 + "license": "ISC" 2090 + }, 1930 2091 "node_modules/@unrs/resolver-binding-android-arm-eabi": { 1931 2092 "version": "1.11.1", 1932 2093 "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", ··· 2200 2361 "version": "8.15.0", 2201 2362 "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", 2202 2363 "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", 2203 - "dev": true, 2204 2364 "license": "MIT", 2205 2365 "bin": { 2206 2366 "acorn": "bin/acorn" ··· 2213 2373 "version": "5.3.2", 2214 2374 "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 2215 2375 "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 2216 - "dev": true, 2217 2376 "license": "MIT", 2218 2377 "peerDependencies": { 2219 2378 "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" ··· 2435 2594 "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", 2436 2595 "dev": true, 2437 2596 "license": "MIT" 2597 + }, 2598 + "node_modules/astring": { 2599 + "version": "1.9.0", 2600 + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", 2601 + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", 2602 + "license": "MIT", 2603 + "bin": { 2604 + "astring": "bin/astring" 2605 + } 2438 2606 }, 2439 2607 "node_modules/async-function": { 2440 2608 "version": "1.0.0", ··· 2488 2656 "node": ">= 0.4" 2489 2657 } 2490 2658 }, 2659 + "node_modules/bail": { 2660 + "version": "2.0.2", 2661 + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", 2662 + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", 2663 + "license": "MIT", 2664 + "funding": { 2665 + "type": "github", 2666 + "url": "https://github.com/sponsors/wooorm" 2667 + } 2668 + }, 2491 2669 "node_modules/balanced-match": { 2492 2670 "version": "1.0.2", 2493 2671 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", ··· 2642 2820 ], 2643 2821 "license": "CC-BY-4.0" 2644 2822 }, 2823 + "node_modules/ccount": { 2824 + "version": "2.0.1", 2825 + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", 2826 + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", 2827 + "license": "MIT", 2828 + "funding": { 2829 + "type": "github", 2830 + "url": "https://github.com/sponsors/wooorm" 2831 + } 2832 + }, 2645 2833 "node_modules/chalk": { 2646 2834 "version": "4.1.2", 2647 2835 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", ··· 2659 2847 "url": "https://github.com/chalk/chalk?sponsor=1" 2660 2848 } 2661 2849 }, 2850 + "node_modules/character-entities": { 2851 + "version": "2.0.2", 2852 + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", 2853 + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", 2854 + "license": "MIT", 2855 + "funding": { 2856 + "type": "github", 2857 + "url": "https://github.com/sponsors/wooorm" 2858 + } 2859 + }, 2860 + "node_modules/character-entities-html4": { 2861 + "version": "2.1.0", 2862 + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", 2863 + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", 2864 + "license": "MIT", 2865 + "funding": { 2866 + "type": "github", 2867 + "url": "https://github.com/sponsors/wooorm" 2868 + } 2869 + }, 2870 + "node_modules/character-entities-legacy": { 2871 + "version": "3.0.0", 2872 + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", 2873 + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", 2874 + "license": "MIT", 2875 + "funding": { 2876 + "type": "github", 2877 + "url": "https://github.com/sponsors/wooorm" 2878 + } 2879 + }, 2880 + "node_modules/character-reference-invalid": { 2881 + "version": "2.0.1", 2882 + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", 2883 + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", 2884 + "license": "MIT", 2885 + "funding": { 2886 + "type": "github", 2887 + "url": "https://github.com/sponsors/wooorm" 2888 + } 2889 + }, 2662 2890 "node_modules/client-only": { 2663 2891 "version": "0.0.1", 2664 2892 "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", 2665 2893 "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", 2666 2894 "license": "MIT" 2667 2895 }, 2896 + "node_modules/collapse-white-space": { 2897 + "version": "2.1.0", 2898 + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", 2899 + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", 2900 + "license": "MIT", 2901 + "funding": { 2902 + "type": "github", 2903 + "url": "https://github.com/sponsors/wooorm" 2904 + } 2905 + }, 2668 2906 "node_modules/color-convert": { 2669 2907 "version": "2.0.1", 2670 2908 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", ··· 2684 2922 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2685 2923 "dev": true, 2686 2924 "license": "MIT" 2925 + }, 2926 + "node_modules/comma-separated-tokens": { 2927 + "version": "2.0.3", 2928 + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", 2929 + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", 2930 + "license": "MIT", 2931 + "funding": { 2932 + "type": "github", 2933 + "url": "https://github.com/sponsors/wooorm" 2934 + } 2687 2935 }, 2688 2936 "node_modules/concat-map": { 2689 2937 "version": "0.0.1", ··· 2718 2966 "version": "3.2.3", 2719 2967 "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", 2720 2968 "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", 2721 - "dev": true, 2722 2969 "license": "MIT" 2723 2970 }, 2724 2971 "node_modules/damerau-levenshtein": { ··· 2786 3033 "version": "4.4.3", 2787 3034 "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", 2788 3035 "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", 2789 - "dev": true, 2790 3036 "license": "MIT", 2791 3037 "dependencies": { 2792 3038 "ms": "^2.1.3" ··· 2800 3046 } 2801 3047 } 2802 3048 }, 3049 + "node_modules/decode-named-character-reference": { 3050 + "version": "1.3.0", 3051 + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", 3052 + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", 3053 + "license": "MIT", 3054 + "dependencies": { 3055 + "character-entities": "^2.0.0" 3056 + }, 3057 + "funding": { 3058 + "type": "github", 3059 + "url": "https://github.com/sponsors/wooorm" 3060 + } 3061 + }, 2803 3062 "node_modules/deep-is": { 2804 3063 "version": "0.1.4", 2805 3064 "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", ··· 2843 3102 "url": "https://github.com/sponsors/ljharb" 2844 3103 } 2845 3104 }, 3105 + "node_modules/dequal": { 3106 + "version": "2.0.3", 3107 + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", 3108 + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", 3109 + "license": "MIT", 3110 + "engines": { 3111 + "node": ">=6" 3112 + } 3113 + }, 2846 3114 "node_modules/detect-libc": { 2847 3115 "version": "2.1.2", 2848 3116 "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", ··· 2851 3119 "license": "Apache-2.0", 2852 3120 "engines": { 2853 3121 "node": ">=8" 3122 + } 3123 + }, 3124 + "node_modules/devlop": { 3125 + "version": "1.1.0", 3126 + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", 3127 + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", 3128 + "license": "MIT", 3129 + "dependencies": { 3130 + "dequal": "^2.0.0" 3131 + }, 3132 + "funding": { 3133 + "type": "github", 3134 + "url": "https://github.com/sponsors/wooorm" 2854 3135 } 2855 3136 }, 2856 3137 "node_modules/doctrine": { ··· 3086 3367 "url": "https://github.com/sponsors/ljharb" 3087 3368 } 3088 3369 }, 3370 + "node_modules/esast-util-from-estree": { 3371 + "version": "2.0.0", 3372 + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", 3373 + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", 3374 + "license": "MIT", 3375 + "dependencies": { 3376 + "@types/estree-jsx": "^1.0.0", 3377 + "devlop": "^1.0.0", 3378 + "estree-util-visit": "^2.0.0", 3379 + "unist-util-position-from-estree": "^2.0.0" 3380 + }, 3381 + "funding": { 3382 + "type": "opencollective", 3383 + "url": "https://opencollective.com/unified" 3384 + } 3385 + }, 3386 + "node_modules/esast-util-from-js": { 3387 + "version": "2.0.1", 3388 + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", 3389 + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", 3390 + "license": "MIT", 3391 + "dependencies": { 3392 + "@types/estree-jsx": "^1.0.0", 3393 + "acorn": "^8.0.0", 3394 + "esast-util-from-estree": "^2.0.0", 3395 + "vfile-message": "^4.0.0" 3396 + }, 3397 + "funding": { 3398 + "type": "opencollective", 3399 + "url": "https://opencollective.com/unified" 3400 + } 3401 + }, 3089 3402 "node_modules/escalade": { 3090 3403 "version": "3.2.0", 3091 3404 "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", ··· 3523 3836 "node": ">=4.0" 3524 3837 } 3525 3838 }, 3839 + "node_modules/estree-util-attach-comments": { 3840 + "version": "3.0.0", 3841 + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", 3842 + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", 3843 + "license": "MIT", 3844 + "dependencies": { 3845 + "@types/estree": "^1.0.0" 3846 + }, 3847 + "funding": { 3848 + "type": "opencollective", 3849 + "url": "https://opencollective.com/unified" 3850 + } 3851 + }, 3852 + "node_modules/estree-util-build-jsx": { 3853 + "version": "3.0.1", 3854 + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", 3855 + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", 3856 + "license": "MIT", 3857 + "dependencies": { 3858 + "@types/estree-jsx": "^1.0.0", 3859 + "devlop": "^1.0.0", 3860 + "estree-util-is-identifier-name": "^3.0.0", 3861 + "estree-walker": "^3.0.0" 3862 + }, 3863 + "funding": { 3864 + "type": "opencollective", 3865 + "url": "https://opencollective.com/unified" 3866 + } 3867 + }, 3868 + "node_modules/estree-util-is-identifier-name": { 3869 + "version": "3.0.0", 3870 + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", 3871 + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", 3872 + "license": "MIT", 3873 + "funding": { 3874 + "type": "opencollective", 3875 + "url": "https://opencollective.com/unified" 3876 + } 3877 + }, 3878 + "node_modules/estree-util-scope": { 3879 + "version": "1.0.0", 3880 + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", 3881 + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", 3882 + "license": "MIT", 3883 + "dependencies": { 3884 + "@types/estree": "^1.0.0", 3885 + "devlop": "^1.0.0" 3886 + }, 3887 + "funding": { 3888 + "type": "opencollective", 3889 + "url": "https://opencollective.com/unified" 3890 + } 3891 + }, 3892 + "node_modules/estree-util-to-js": { 3893 + "version": "2.0.0", 3894 + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", 3895 + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", 3896 + "license": "MIT", 3897 + "dependencies": { 3898 + "@types/estree-jsx": "^1.0.0", 3899 + "astring": "^1.8.0", 3900 + "source-map": "^0.7.0" 3901 + }, 3902 + "funding": { 3903 + "type": "opencollective", 3904 + "url": "https://opencollective.com/unified" 3905 + } 3906 + }, 3907 + "node_modules/estree-util-visit": { 3908 + "version": "2.0.0", 3909 + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", 3910 + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", 3911 + "license": "MIT", 3912 + "dependencies": { 3913 + "@types/estree-jsx": "^1.0.0", 3914 + "@types/unist": "^3.0.0" 3915 + }, 3916 + "funding": { 3917 + "type": "opencollective", 3918 + "url": "https://opencollective.com/unified" 3919 + } 3920 + }, 3921 + "node_modules/estree-walker": { 3922 + "version": "3.0.3", 3923 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", 3924 + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", 3925 + "license": "MIT", 3926 + "dependencies": { 3927 + "@types/estree": "^1.0.0" 3928 + } 3929 + }, 3526 3930 "node_modules/esutils": { 3527 3931 "version": "2.0.3", 3528 3932 "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", ··· 3532 3936 "engines": { 3533 3937 "node": ">=0.10.0" 3534 3938 } 3939 + }, 3940 + "node_modules/extend": { 3941 + "version": "3.0.2", 3942 + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 3943 + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 3944 + "license": "MIT" 3535 3945 }, 3536 3946 "node_modules/fast-deep-equal": { 3537 3947 "version": "3.1.3", ··· 3832 4242 "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" 3833 4243 } 3834 4244 }, 4245 + "node_modules/github-slugger": { 4246 + "version": "2.0.0", 4247 + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", 4248 + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", 4249 + "license": "ISC" 4250 + }, 3835 4251 "node_modules/glob-parent": { 3836 4252 "version": "6.0.2", 3837 4253 "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", ··· 3989 4405 "node": ">= 0.4" 3990 4406 } 3991 4407 }, 4408 + "node_modules/hast-util-heading-rank": { 4409 + "version": "3.0.0", 4410 + "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz", 4411 + "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==", 4412 + "license": "MIT", 4413 + "dependencies": { 4414 + "@types/hast": "^3.0.0" 4415 + }, 4416 + "funding": { 4417 + "type": "opencollective", 4418 + "url": "https://opencollective.com/unified" 4419 + } 4420 + }, 4421 + "node_modules/hast-util-to-estree": { 4422 + "version": "3.1.3", 4423 + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", 4424 + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", 4425 + "license": "MIT", 4426 + "dependencies": { 4427 + "@types/estree": "^1.0.0", 4428 + "@types/estree-jsx": "^1.0.0", 4429 + "@types/hast": "^3.0.0", 4430 + "comma-separated-tokens": "^2.0.0", 4431 + "devlop": "^1.0.0", 4432 + "estree-util-attach-comments": "^3.0.0", 4433 + "estree-util-is-identifier-name": "^3.0.0", 4434 + "hast-util-whitespace": "^3.0.0", 4435 + "mdast-util-mdx-expression": "^2.0.0", 4436 + "mdast-util-mdx-jsx": "^3.0.0", 4437 + "mdast-util-mdxjs-esm": "^2.0.0", 4438 + "property-information": "^7.0.0", 4439 + "space-separated-tokens": "^2.0.0", 4440 + "style-to-js": "^1.0.0", 4441 + "unist-util-position": "^5.0.0", 4442 + "zwitch": "^2.0.0" 4443 + }, 4444 + "funding": { 4445 + "type": "opencollective", 4446 + "url": "https://opencollective.com/unified" 4447 + } 4448 + }, 4449 + "node_modules/hast-util-to-jsx-runtime": { 4450 + "version": "2.3.6", 4451 + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", 4452 + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", 4453 + "license": "MIT", 4454 + "dependencies": { 4455 + "@types/estree": "^1.0.0", 4456 + "@types/hast": "^3.0.0", 4457 + "@types/unist": "^3.0.0", 4458 + "comma-separated-tokens": "^2.0.0", 4459 + "devlop": "^1.0.0", 4460 + "estree-util-is-identifier-name": "^3.0.0", 4461 + "hast-util-whitespace": "^3.0.0", 4462 + "mdast-util-mdx-expression": "^2.0.0", 4463 + "mdast-util-mdx-jsx": "^3.0.0", 4464 + "mdast-util-mdxjs-esm": "^2.0.0", 4465 + "property-information": "^7.0.0", 4466 + "space-separated-tokens": "^2.0.0", 4467 + "style-to-js": "^1.0.0", 4468 + "unist-util-position": "^5.0.0", 4469 + "vfile-message": "^4.0.0" 4470 + }, 4471 + "funding": { 4472 + "type": "opencollective", 4473 + "url": "https://opencollective.com/unified" 4474 + } 4475 + }, 4476 + "node_modules/hast-util-to-string": { 4477 + "version": "3.0.1", 4478 + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", 4479 + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", 4480 + "license": "MIT", 4481 + "dependencies": { 4482 + "@types/hast": "^3.0.0" 4483 + }, 4484 + "funding": { 4485 + "type": "opencollective", 4486 + "url": "https://opencollective.com/unified" 4487 + } 4488 + }, 4489 + "node_modules/hast-util-whitespace": { 4490 + "version": "3.0.0", 4491 + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", 4492 + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", 4493 + "license": "MIT", 4494 + "dependencies": { 4495 + "@types/hast": "^3.0.0" 4496 + }, 4497 + "funding": { 4498 + "type": "opencollective", 4499 + "url": "https://opencollective.com/unified" 4500 + } 4501 + }, 3992 4502 "node_modules/hermes-estree": { 3993 4503 "version": "0.25.1", 3994 4504 "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", ··· 4043 4553 "node": ">=0.8.19" 4044 4554 } 4045 4555 }, 4556 + "node_modules/inline-style-parser": { 4557 + "version": "0.2.7", 4558 + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", 4559 + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", 4560 + "license": "MIT" 4561 + }, 4046 4562 "node_modules/internal-slot": { 4047 4563 "version": "1.1.0", 4048 4564 "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", ··· 4058 4574 "node": ">= 0.4" 4059 4575 } 4060 4576 }, 4577 + "node_modules/is-alphabetical": { 4578 + "version": "2.0.1", 4579 + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", 4580 + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", 4581 + "license": "MIT", 4582 + "funding": { 4583 + "type": "github", 4584 + "url": "https://github.com/sponsors/wooorm" 4585 + } 4586 + }, 4587 + "node_modules/is-alphanumerical": { 4588 + "version": "2.0.1", 4589 + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", 4590 + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", 4591 + "license": "MIT", 4592 + "dependencies": { 4593 + "is-alphabetical": "^2.0.0", 4594 + "is-decimal": "^2.0.0" 4595 + }, 4596 + "funding": { 4597 + "type": "github", 4598 + "url": "https://github.com/sponsors/wooorm" 4599 + } 4600 + }, 4061 4601 "node_modules/is-array-buffer": { 4062 4602 "version": "3.0.5", 4063 4603 "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", ··· 4216 4756 "url": "https://github.com/sponsors/ljharb" 4217 4757 } 4218 4758 }, 4759 + "node_modules/is-decimal": { 4760 + "version": "2.0.1", 4761 + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", 4762 + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", 4763 + "license": "MIT", 4764 + "funding": { 4765 + "type": "github", 4766 + "url": "https://github.com/sponsors/wooorm" 4767 + } 4768 + }, 4219 4769 "node_modules/is-extglob": { 4220 4770 "version": "2.1.1", 4221 4771 "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", ··· 4275 4825 "node": ">=0.10.0" 4276 4826 } 4277 4827 }, 4828 + "node_modules/is-hexadecimal": { 4829 + "version": "2.0.1", 4830 + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", 4831 + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", 4832 + "license": "MIT", 4833 + "funding": { 4834 + "type": "github", 4835 + "url": "https://github.com/sponsors/wooorm" 4836 + } 4837 + }, 4278 4838 "node_modules/is-map": { 4279 4839 "version": "2.0.3", 4280 4840 "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", ··· 4326 4886 }, 4327 4887 "funding": { 4328 4888 "url": "https://github.com/sponsors/ljharb" 4889 + } 4890 + }, 4891 + "node_modules/is-plain-obj": { 4892 + "version": "4.1.0", 4893 + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", 4894 + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", 4895 + "license": "MIT", 4896 + "engines": { 4897 + "node": ">=12" 4898 + }, 4899 + "funding": { 4900 + "url": "https://github.com/sponsors/sindresorhus" 4329 4901 } 4330 4902 }, 4331 4903 "node_modules/is-regex": { ··· 4932 5504 "dev": true, 4933 5505 "license": "MIT" 4934 5506 }, 5507 + "node_modules/longest-streak": { 5508 + "version": "3.1.0", 5509 + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", 5510 + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", 5511 + "license": "MIT", 5512 + "funding": { 5513 + "type": "github", 5514 + "url": "https://github.com/sponsors/wooorm" 5515 + } 5516 + }, 4935 5517 "node_modules/loose-envify": { 4936 5518 "version": "1.4.0", 4937 5519 "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", ··· 4974 5556 "@jridgewell/sourcemap-codec": "^1.5.5" 4975 5557 } 4976 5558 }, 5559 + "node_modules/markdown-extensions": { 5560 + "version": "2.0.0", 5561 + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", 5562 + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", 5563 + "license": "MIT", 5564 + "engines": { 5565 + "node": ">=16" 5566 + }, 5567 + "funding": { 5568 + "url": "https://github.com/sponsors/sindresorhus" 5569 + } 5570 + }, 5571 + "node_modules/markdown-table": { 5572 + "version": "3.0.4", 5573 + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", 5574 + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", 5575 + "license": "MIT", 5576 + "funding": { 5577 + "type": "github", 5578 + "url": "https://github.com/sponsors/wooorm" 5579 + } 5580 + }, 4977 5581 "node_modules/math-intrinsics": { 4978 5582 "version": "1.1.0", 4979 5583 "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", ··· 4984 5588 "node": ">= 0.4" 4985 5589 } 4986 5590 }, 5591 + "node_modules/mdast-util-find-and-replace": { 5592 + "version": "3.0.2", 5593 + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", 5594 + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", 5595 + "license": "MIT", 5596 + "dependencies": { 5597 + "@types/mdast": "^4.0.0", 5598 + "escape-string-regexp": "^5.0.0", 5599 + "unist-util-is": "^6.0.0", 5600 + "unist-util-visit-parents": "^6.0.0" 5601 + }, 5602 + "funding": { 5603 + "type": "opencollective", 5604 + "url": "https://opencollective.com/unified" 5605 + } 5606 + }, 5607 + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { 5608 + "version": "5.0.0", 5609 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", 5610 + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", 5611 + "license": "MIT", 5612 + "engines": { 5613 + "node": ">=12" 5614 + }, 5615 + "funding": { 5616 + "url": "https://github.com/sponsors/sindresorhus" 5617 + } 5618 + }, 5619 + "node_modules/mdast-util-from-markdown": { 5620 + "version": "2.0.2", 5621 + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", 5622 + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", 5623 + "license": "MIT", 5624 + "dependencies": { 5625 + "@types/mdast": "^4.0.0", 5626 + "@types/unist": "^3.0.0", 5627 + "decode-named-character-reference": "^1.0.0", 5628 + "devlop": "^1.0.0", 5629 + "mdast-util-to-string": "^4.0.0", 5630 + "micromark": "^4.0.0", 5631 + "micromark-util-decode-numeric-character-reference": "^2.0.0", 5632 + "micromark-util-decode-string": "^2.0.0", 5633 + "micromark-util-normalize-identifier": "^2.0.0", 5634 + "micromark-util-symbol": "^2.0.0", 5635 + "micromark-util-types": "^2.0.0", 5636 + "unist-util-stringify-position": "^4.0.0" 5637 + }, 5638 + "funding": { 5639 + "type": "opencollective", 5640 + "url": "https://opencollective.com/unified" 5641 + } 5642 + }, 5643 + "node_modules/mdast-util-gfm": { 5644 + "version": "3.1.0", 5645 + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", 5646 + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", 5647 + "license": "MIT", 5648 + "dependencies": { 5649 + "mdast-util-from-markdown": "^2.0.0", 5650 + "mdast-util-gfm-autolink-literal": "^2.0.0", 5651 + "mdast-util-gfm-footnote": "^2.0.0", 5652 + "mdast-util-gfm-strikethrough": "^2.0.0", 5653 + "mdast-util-gfm-table": "^2.0.0", 5654 + "mdast-util-gfm-task-list-item": "^2.0.0", 5655 + "mdast-util-to-markdown": "^2.0.0" 5656 + }, 5657 + "funding": { 5658 + "type": "opencollective", 5659 + "url": "https://opencollective.com/unified" 5660 + } 5661 + }, 5662 + "node_modules/mdast-util-gfm-autolink-literal": { 5663 + "version": "2.0.1", 5664 + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", 5665 + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", 5666 + "license": "MIT", 5667 + "dependencies": { 5668 + "@types/mdast": "^4.0.0", 5669 + "ccount": "^2.0.0", 5670 + "devlop": "^1.0.0", 5671 + "mdast-util-find-and-replace": "^3.0.0", 5672 + "micromark-util-character": "^2.0.0" 5673 + }, 5674 + "funding": { 5675 + "type": "opencollective", 5676 + "url": "https://opencollective.com/unified" 5677 + } 5678 + }, 5679 + "node_modules/mdast-util-gfm-footnote": { 5680 + "version": "2.1.0", 5681 + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", 5682 + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", 5683 + "license": "MIT", 5684 + "dependencies": { 5685 + "@types/mdast": "^4.0.0", 5686 + "devlop": "^1.1.0", 5687 + "mdast-util-from-markdown": "^2.0.0", 5688 + "mdast-util-to-markdown": "^2.0.0", 5689 + "micromark-util-normalize-identifier": "^2.0.0" 5690 + }, 5691 + "funding": { 5692 + "type": "opencollective", 5693 + "url": "https://opencollective.com/unified" 5694 + } 5695 + }, 5696 + "node_modules/mdast-util-gfm-strikethrough": { 5697 + "version": "2.0.0", 5698 + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", 5699 + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", 5700 + "license": "MIT", 5701 + "dependencies": { 5702 + "@types/mdast": "^4.0.0", 5703 + "mdast-util-from-markdown": "^2.0.0", 5704 + "mdast-util-to-markdown": "^2.0.0" 5705 + }, 5706 + "funding": { 5707 + "type": "opencollective", 5708 + "url": "https://opencollective.com/unified" 5709 + } 5710 + }, 5711 + "node_modules/mdast-util-gfm-table": { 5712 + "version": "2.0.0", 5713 + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", 5714 + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", 5715 + "license": "MIT", 5716 + "dependencies": { 5717 + "@types/mdast": "^4.0.0", 5718 + "devlop": "^1.0.0", 5719 + "markdown-table": "^3.0.0", 5720 + "mdast-util-from-markdown": "^2.0.0", 5721 + "mdast-util-to-markdown": "^2.0.0" 5722 + }, 5723 + "funding": { 5724 + "type": "opencollective", 5725 + "url": "https://opencollective.com/unified" 5726 + } 5727 + }, 5728 + "node_modules/mdast-util-gfm-task-list-item": { 5729 + "version": "2.0.0", 5730 + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", 5731 + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", 5732 + "license": "MIT", 5733 + "dependencies": { 5734 + "@types/mdast": "^4.0.0", 5735 + "devlop": "^1.0.0", 5736 + "mdast-util-from-markdown": "^2.0.0", 5737 + "mdast-util-to-markdown": "^2.0.0" 5738 + }, 5739 + "funding": { 5740 + "type": "opencollective", 5741 + "url": "https://opencollective.com/unified" 5742 + } 5743 + }, 5744 + "node_modules/mdast-util-mdx": { 5745 + "version": "3.0.0", 5746 + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", 5747 + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", 5748 + "license": "MIT", 5749 + "dependencies": { 5750 + "mdast-util-from-markdown": "^2.0.0", 5751 + "mdast-util-mdx-expression": "^2.0.0", 5752 + "mdast-util-mdx-jsx": "^3.0.0", 5753 + "mdast-util-mdxjs-esm": "^2.0.0", 5754 + "mdast-util-to-markdown": "^2.0.0" 5755 + }, 5756 + "funding": { 5757 + "type": "opencollective", 5758 + "url": "https://opencollective.com/unified" 5759 + } 5760 + }, 5761 + "node_modules/mdast-util-mdx-expression": { 5762 + "version": "2.0.1", 5763 + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", 5764 + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", 5765 + "license": "MIT", 5766 + "dependencies": { 5767 + "@types/estree-jsx": "^1.0.0", 5768 + "@types/hast": "^3.0.0", 5769 + "@types/mdast": "^4.0.0", 5770 + "devlop": "^1.0.0", 5771 + "mdast-util-from-markdown": "^2.0.0", 5772 + "mdast-util-to-markdown": "^2.0.0" 5773 + }, 5774 + "funding": { 5775 + "type": "opencollective", 5776 + "url": "https://opencollective.com/unified" 5777 + } 5778 + }, 5779 + "node_modules/mdast-util-mdx-jsx": { 5780 + "version": "3.2.0", 5781 + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", 5782 + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", 5783 + "license": "MIT", 5784 + "dependencies": { 5785 + "@types/estree-jsx": "^1.0.0", 5786 + "@types/hast": "^3.0.0", 5787 + "@types/mdast": "^4.0.0", 5788 + "@types/unist": "^3.0.0", 5789 + "ccount": "^2.0.0", 5790 + "devlop": "^1.1.0", 5791 + "mdast-util-from-markdown": "^2.0.0", 5792 + "mdast-util-to-markdown": "^2.0.0", 5793 + "parse-entities": "^4.0.0", 5794 + "stringify-entities": "^4.0.0", 5795 + "unist-util-stringify-position": "^4.0.0", 5796 + "vfile-message": "^4.0.0" 5797 + }, 5798 + "funding": { 5799 + "type": "opencollective", 5800 + "url": "https://opencollective.com/unified" 5801 + } 5802 + }, 5803 + "node_modules/mdast-util-mdxjs-esm": { 5804 + "version": "2.0.1", 5805 + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", 5806 + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", 5807 + "license": "MIT", 5808 + "dependencies": { 5809 + "@types/estree-jsx": "^1.0.0", 5810 + "@types/hast": "^3.0.0", 5811 + "@types/mdast": "^4.0.0", 5812 + "devlop": "^1.0.0", 5813 + "mdast-util-from-markdown": "^2.0.0", 5814 + "mdast-util-to-markdown": "^2.0.0" 5815 + }, 5816 + "funding": { 5817 + "type": "opencollective", 5818 + "url": "https://opencollective.com/unified" 5819 + } 5820 + }, 5821 + "node_modules/mdast-util-phrasing": { 5822 + "version": "4.1.0", 5823 + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", 5824 + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", 5825 + "license": "MIT", 5826 + "dependencies": { 5827 + "@types/mdast": "^4.0.0", 5828 + "unist-util-is": "^6.0.0" 5829 + }, 5830 + "funding": { 5831 + "type": "opencollective", 5832 + "url": "https://opencollective.com/unified" 5833 + } 5834 + }, 5835 + "node_modules/mdast-util-to-hast": { 5836 + "version": "13.2.1", 5837 + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", 5838 + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", 5839 + "license": "MIT", 5840 + "dependencies": { 5841 + "@types/hast": "^3.0.0", 5842 + "@types/mdast": "^4.0.0", 5843 + "@ungap/structured-clone": "^1.0.0", 5844 + "devlop": "^1.0.0", 5845 + "micromark-util-sanitize-uri": "^2.0.0", 5846 + "trim-lines": "^3.0.0", 5847 + "unist-util-position": "^5.0.0", 5848 + "unist-util-visit": "^5.0.0", 5849 + "vfile": "^6.0.0" 5850 + }, 5851 + "funding": { 5852 + "type": "opencollective", 5853 + "url": "https://opencollective.com/unified" 5854 + } 5855 + }, 5856 + "node_modules/mdast-util-to-markdown": { 5857 + "version": "2.1.2", 5858 + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", 5859 + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", 5860 + "license": "MIT", 5861 + "dependencies": { 5862 + "@types/mdast": "^4.0.0", 5863 + "@types/unist": "^3.0.0", 5864 + "longest-streak": "^3.0.0", 5865 + "mdast-util-phrasing": "^4.0.0", 5866 + "mdast-util-to-string": "^4.0.0", 5867 + "micromark-util-classify-character": "^2.0.0", 5868 + "micromark-util-decode-string": "^2.0.0", 5869 + "unist-util-visit": "^5.0.0", 5870 + "zwitch": "^2.0.0" 5871 + }, 5872 + "funding": { 5873 + "type": "opencollective", 5874 + "url": "https://opencollective.com/unified" 5875 + } 5876 + }, 5877 + "node_modules/mdast-util-to-string": { 5878 + "version": "4.0.0", 5879 + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", 5880 + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", 5881 + "license": "MIT", 5882 + "dependencies": { 5883 + "@types/mdast": "^4.0.0" 5884 + }, 5885 + "funding": { 5886 + "type": "opencollective", 5887 + "url": "https://opencollective.com/unified" 5888 + } 5889 + }, 4987 5890 "node_modules/merge2": { 4988 5891 "version": "1.4.1", 4989 5892 "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", ··· 4994 5897 "node": ">= 8" 4995 5898 } 4996 5899 }, 5900 + "node_modules/micromark": { 5901 + "version": "4.0.2", 5902 + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", 5903 + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", 5904 + "funding": [ 5905 + { 5906 + "type": "GitHub Sponsors", 5907 + "url": "https://github.com/sponsors/unifiedjs" 5908 + }, 5909 + { 5910 + "type": "OpenCollective", 5911 + "url": "https://opencollective.com/unified" 5912 + } 5913 + ], 5914 + "license": "MIT", 5915 + "dependencies": { 5916 + "@types/debug": "^4.0.0", 5917 + "debug": "^4.0.0", 5918 + "decode-named-character-reference": "^1.0.0", 5919 + "devlop": "^1.0.0", 5920 + "micromark-core-commonmark": "^2.0.0", 5921 + "micromark-factory-space": "^2.0.0", 5922 + "micromark-util-character": "^2.0.0", 5923 + "micromark-util-chunked": "^2.0.0", 5924 + "micromark-util-combine-extensions": "^2.0.0", 5925 + "micromark-util-decode-numeric-character-reference": "^2.0.0", 5926 + "micromark-util-encode": "^2.0.0", 5927 + "micromark-util-normalize-identifier": "^2.0.0", 5928 + "micromark-util-resolve-all": "^2.0.0", 5929 + "micromark-util-sanitize-uri": "^2.0.0", 5930 + "micromark-util-subtokenize": "^2.0.0", 5931 + "micromark-util-symbol": "^2.0.0", 5932 + "micromark-util-types": "^2.0.0" 5933 + } 5934 + }, 5935 + "node_modules/micromark-core-commonmark": { 5936 + "version": "2.0.3", 5937 + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", 5938 + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", 5939 + "funding": [ 5940 + { 5941 + "type": "GitHub Sponsors", 5942 + "url": "https://github.com/sponsors/unifiedjs" 5943 + }, 5944 + { 5945 + "type": "OpenCollective", 5946 + "url": "https://opencollective.com/unified" 5947 + } 5948 + ], 5949 + "license": "MIT", 5950 + "dependencies": { 5951 + "decode-named-character-reference": "^1.0.0", 5952 + "devlop": "^1.0.0", 5953 + "micromark-factory-destination": "^2.0.0", 5954 + "micromark-factory-label": "^2.0.0", 5955 + "micromark-factory-space": "^2.0.0", 5956 + "micromark-factory-title": "^2.0.0", 5957 + "micromark-factory-whitespace": "^2.0.0", 5958 + "micromark-util-character": "^2.0.0", 5959 + "micromark-util-chunked": "^2.0.0", 5960 + "micromark-util-classify-character": "^2.0.0", 5961 + "micromark-util-html-tag-name": "^2.0.0", 5962 + "micromark-util-normalize-identifier": "^2.0.0", 5963 + "micromark-util-resolve-all": "^2.0.0", 5964 + "micromark-util-subtokenize": "^2.0.0", 5965 + "micromark-util-symbol": "^2.0.0", 5966 + "micromark-util-types": "^2.0.0" 5967 + } 5968 + }, 5969 + "node_modules/micromark-extension-gfm": { 5970 + "version": "3.0.0", 5971 + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", 5972 + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", 5973 + "license": "MIT", 5974 + "dependencies": { 5975 + "micromark-extension-gfm-autolink-literal": "^2.0.0", 5976 + "micromark-extension-gfm-footnote": "^2.0.0", 5977 + "micromark-extension-gfm-strikethrough": "^2.0.0", 5978 + "micromark-extension-gfm-table": "^2.0.0", 5979 + "micromark-extension-gfm-tagfilter": "^2.0.0", 5980 + "micromark-extension-gfm-task-list-item": "^2.0.0", 5981 + "micromark-util-combine-extensions": "^2.0.0", 5982 + "micromark-util-types": "^2.0.0" 5983 + }, 5984 + "funding": { 5985 + "type": "opencollective", 5986 + "url": "https://opencollective.com/unified" 5987 + } 5988 + }, 5989 + "node_modules/micromark-extension-gfm-autolink-literal": { 5990 + "version": "2.1.0", 5991 + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", 5992 + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", 5993 + "license": "MIT", 5994 + "dependencies": { 5995 + "micromark-util-character": "^2.0.0", 5996 + "micromark-util-sanitize-uri": "^2.0.0", 5997 + "micromark-util-symbol": "^2.0.0", 5998 + "micromark-util-types": "^2.0.0" 5999 + }, 6000 + "funding": { 6001 + "type": "opencollective", 6002 + "url": "https://opencollective.com/unified" 6003 + } 6004 + }, 6005 + "node_modules/micromark-extension-gfm-footnote": { 6006 + "version": "2.1.0", 6007 + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", 6008 + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", 6009 + "license": "MIT", 6010 + "dependencies": { 6011 + "devlop": "^1.0.0", 6012 + "micromark-core-commonmark": "^2.0.0", 6013 + "micromark-factory-space": "^2.0.0", 6014 + "micromark-util-character": "^2.0.0", 6015 + "micromark-util-normalize-identifier": "^2.0.0", 6016 + "micromark-util-sanitize-uri": "^2.0.0", 6017 + "micromark-util-symbol": "^2.0.0", 6018 + "micromark-util-types": "^2.0.0" 6019 + }, 6020 + "funding": { 6021 + "type": "opencollective", 6022 + "url": "https://opencollective.com/unified" 6023 + } 6024 + }, 6025 + "node_modules/micromark-extension-gfm-strikethrough": { 6026 + "version": "2.1.0", 6027 + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", 6028 + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", 6029 + "license": "MIT", 6030 + "dependencies": { 6031 + "devlop": "^1.0.0", 6032 + "micromark-util-chunked": "^2.0.0", 6033 + "micromark-util-classify-character": "^2.0.0", 6034 + "micromark-util-resolve-all": "^2.0.0", 6035 + "micromark-util-symbol": "^2.0.0", 6036 + "micromark-util-types": "^2.0.0" 6037 + }, 6038 + "funding": { 6039 + "type": "opencollective", 6040 + "url": "https://opencollective.com/unified" 6041 + } 6042 + }, 6043 + "node_modules/micromark-extension-gfm-table": { 6044 + "version": "2.1.1", 6045 + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", 6046 + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", 6047 + "license": "MIT", 6048 + "dependencies": { 6049 + "devlop": "^1.0.0", 6050 + "micromark-factory-space": "^2.0.0", 6051 + "micromark-util-character": "^2.0.0", 6052 + "micromark-util-symbol": "^2.0.0", 6053 + "micromark-util-types": "^2.0.0" 6054 + }, 6055 + "funding": { 6056 + "type": "opencollective", 6057 + "url": "https://opencollective.com/unified" 6058 + } 6059 + }, 6060 + "node_modules/micromark-extension-gfm-tagfilter": { 6061 + "version": "2.0.0", 6062 + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", 6063 + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", 6064 + "license": "MIT", 6065 + "dependencies": { 6066 + "micromark-util-types": "^2.0.0" 6067 + }, 6068 + "funding": { 6069 + "type": "opencollective", 6070 + "url": "https://opencollective.com/unified" 6071 + } 6072 + }, 6073 + "node_modules/micromark-extension-gfm-task-list-item": { 6074 + "version": "2.1.0", 6075 + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", 6076 + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", 6077 + "license": "MIT", 6078 + "dependencies": { 6079 + "devlop": "^1.0.0", 6080 + "micromark-factory-space": "^2.0.0", 6081 + "micromark-util-character": "^2.0.0", 6082 + "micromark-util-symbol": "^2.0.0", 6083 + "micromark-util-types": "^2.0.0" 6084 + }, 6085 + "funding": { 6086 + "type": "opencollective", 6087 + "url": "https://opencollective.com/unified" 6088 + } 6089 + }, 6090 + "node_modules/micromark-extension-mdx-expression": { 6091 + "version": "3.0.1", 6092 + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", 6093 + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", 6094 + "funding": [ 6095 + { 6096 + "type": "GitHub Sponsors", 6097 + "url": "https://github.com/sponsors/unifiedjs" 6098 + }, 6099 + { 6100 + "type": "OpenCollective", 6101 + "url": "https://opencollective.com/unified" 6102 + } 6103 + ], 6104 + "license": "MIT", 6105 + "dependencies": { 6106 + "@types/estree": "^1.0.0", 6107 + "devlop": "^1.0.0", 6108 + "micromark-factory-mdx-expression": "^2.0.0", 6109 + "micromark-factory-space": "^2.0.0", 6110 + "micromark-util-character": "^2.0.0", 6111 + "micromark-util-events-to-acorn": "^2.0.0", 6112 + "micromark-util-symbol": "^2.0.0", 6113 + "micromark-util-types": "^2.0.0" 6114 + } 6115 + }, 6116 + "node_modules/micromark-extension-mdx-jsx": { 6117 + "version": "3.0.2", 6118 + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", 6119 + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", 6120 + "license": "MIT", 6121 + "dependencies": { 6122 + "@types/estree": "^1.0.0", 6123 + "devlop": "^1.0.0", 6124 + "estree-util-is-identifier-name": "^3.0.0", 6125 + "micromark-factory-mdx-expression": "^2.0.0", 6126 + "micromark-factory-space": "^2.0.0", 6127 + "micromark-util-character": "^2.0.0", 6128 + "micromark-util-events-to-acorn": "^2.0.0", 6129 + "micromark-util-symbol": "^2.0.0", 6130 + "micromark-util-types": "^2.0.0", 6131 + "vfile-message": "^4.0.0" 6132 + }, 6133 + "funding": { 6134 + "type": "opencollective", 6135 + "url": "https://opencollective.com/unified" 6136 + } 6137 + }, 6138 + "node_modules/micromark-extension-mdx-md": { 6139 + "version": "2.0.0", 6140 + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", 6141 + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", 6142 + "license": "MIT", 6143 + "dependencies": { 6144 + "micromark-util-types": "^2.0.0" 6145 + }, 6146 + "funding": { 6147 + "type": "opencollective", 6148 + "url": "https://opencollective.com/unified" 6149 + } 6150 + }, 6151 + "node_modules/micromark-extension-mdxjs": { 6152 + "version": "3.0.0", 6153 + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", 6154 + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", 6155 + "license": "MIT", 6156 + "dependencies": { 6157 + "acorn": "^8.0.0", 6158 + "acorn-jsx": "^5.0.0", 6159 + "micromark-extension-mdx-expression": "^3.0.0", 6160 + "micromark-extension-mdx-jsx": "^3.0.0", 6161 + "micromark-extension-mdx-md": "^2.0.0", 6162 + "micromark-extension-mdxjs-esm": "^3.0.0", 6163 + "micromark-util-combine-extensions": "^2.0.0", 6164 + "micromark-util-types": "^2.0.0" 6165 + }, 6166 + "funding": { 6167 + "type": "opencollective", 6168 + "url": "https://opencollective.com/unified" 6169 + } 6170 + }, 6171 + "node_modules/micromark-extension-mdxjs-esm": { 6172 + "version": "3.0.0", 6173 + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", 6174 + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", 6175 + "license": "MIT", 6176 + "dependencies": { 6177 + "@types/estree": "^1.0.0", 6178 + "devlop": "^1.0.0", 6179 + "micromark-core-commonmark": "^2.0.0", 6180 + "micromark-util-character": "^2.0.0", 6181 + "micromark-util-events-to-acorn": "^2.0.0", 6182 + "micromark-util-symbol": "^2.0.0", 6183 + "micromark-util-types": "^2.0.0", 6184 + "unist-util-position-from-estree": "^2.0.0", 6185 + "vfile-message": "^4.0.0" 6186 + }, 6187 + "funding": { 6188 + "type": "opencollective", 6189 + "url": "https://opencollective.com/unified" 6190 + } 6191 + }, 6192 + "node_modules/micromark-factory-destination": { 6193 + "version": "2.0.1", 6194 + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", 6195 + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", 6196 + "funding": [ 6197 + { 6198 + "type": "GitHub Sponsors", 6199 + "url": "https://github.com/sponsors/unifiedjs" 6200 + }, 6201 + { 6202 + "type": "OpenCollective", 6203 + "url": "https://opencollective.com/unified" 6204 + } 6205 + ], 6206 + "license": "MIT", 6207 + "dependencies": { 6208 + "micromark-util-character": "^2.0.0", 6209 + "micromark-util-symbol": "^2.0.0", 6210 + "micromark-util-types": "^2.0.0" 6211 + } 6212 + }, 6213 + "node_modules/micromark-factory-label": { 6214 + "version": "2.0.1", 6215 + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", 6216 + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", 6217 + "funding": [ 6218 + { 6219 + "type": "GitHub Sponsors", 6220 + "url": "https://github.com/sponsors/unifiedjs" 6221 + }, 6222 + { 6223 + "type": "OpenCollective", 6224 + "url": "https://opencollective.com/unified" 6225 + } 6226 + ], 6227 + "license": "MIT", 6228 + "dependencies": { 6229 + "devlop": "^1.0.0", 6230 + "micromark-util-character": "^2.0.0", 6231 + "micromark-util-symbol": "^2.0.0", 6232 + "micromark-util-types": "^2.0.0" 6233 + } 6234 + }, 6235 + "node_modules/micromark-factory-mdx-expression": { 6236 + "version": "2.0.3", 6237 + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", 6238 + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", 6239 + "funding": [ 6240 + { 6241 + "type": "GitHub Sponsors", 6242 + "url": "https://github.com/sponsors/unifiedjs" 6243 + }, 6244 + { 6245 + "type": "OpenCollective", 6246 + "url": "https://opencollective.com/unified" 6247 + } 6248 + ], 6249 + "license": "MIT", 6250 + "dependencies": { 6251 + "@types/estree": "^1.0.0", 6252 + "devlop": "^1.0.0", 6253 + "micromark-factory-space": "^2.0.0", 6254 + "micromark-util-character": "^2.0.0", 6255 + "micromark-util-events-to-acorn": "^2.0.0", 6256 + "micromark-util-symbol": "^2.0.0", 6257 + "micromark-util-types": "^2.0.0", 6258 + "unist-util-position-from-estree": "^2.0.0", 6259 + "vfile-message": "^4.0.0" 6260 + } 6261 + }, 6262 + "node_modules/micromark-factory-space": { 6263 + "version": "2.0.1", 6264 + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", 6265 + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", 6266 + "funding": [ 6267 + { 6268 + "type": "GitHub Sponsors", 6269 + "url": "https://github.com/sponsors/unifiedjs" 6270 + }, 6271 + { 6272 + "type": "OpenCollective", 6273 + "url": "https://opencollective.com/unified" 6274 + } 6275 + ], 6276 + "license": "MIT", 6277 + "dependencies": { 6278 + "micromark-util-character": "^2.0.0", 6279 + "micromark-util-types": "^2.0.0" 6280 + } 6281 + }, 6282 + "node_modules/micromark-factory-title": { 6283 + "version": "2.0.1", 6284 + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", 6285 + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", 6286 + "funding": [ 6287 + { 6288 + "type": "GitHub Sponsors", 6289 + "url": "https://github.com/sponsors/unifiedjs" 6290 + }, 6291 + { 6292 + "type": "OpenCollective", 6293 + "url": "https://opencollective.com/unified" 6294 + } 6295 + ], 6296 + "license": "MIT", 6297 + "dependencies": { 6298 + "micromark-factory-space": "^2.0.0", 6299 + "micromark-util-character": "^2.0.0", 6300 + "micromark-util-symbol": "^2.0.0", 6301 + "micromark-util-types": "^2.0.0" 6302 + } 6303 + }, 6304 + "node_modules/micromark-factory-whitespace": { 6305 + "version": "2.0.1", 6306 + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", 6307 + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", 6308 + "funding": [ 6309 + { 6310 + "type": "GitHub Sponsors", 6311 + "url": "https://github.com/sponsors/unifiedjs" 6312 + }, 6313 + { 6314 + "type": "OpenCollective", 6315 + "url": "https://opencollective.com/unified" 6316 + } 6317 + ], 6318 + "license": "MIT", 6319 + "dependencies": { 6320 + "micromark-factory-space": "^2.0.0", 6321 + "micromark-util-character": "^2.0.0", 6322 + "micromark-util-symbol": "^2.0.0", 6323 + "micromark-util-types": "^2.0.0" 6324 + } 6325 + }, 6326 + "node_modules/micromark-util-character": { 6327 + "version": "2.1.1", 6328 + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", 6329 + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", 6330 + "funding": [ 6331 + { 6332 + "type": "GitHub Sponsors", 6333 + "url": "https://github.com/sponsors/unifiedjs" 6334 + }, 6335 + { 6336 + "type": "OpenCollective", 6337 + "url": "https://opencollective.com/unified" 6338 + } 6339 + ], 6340 + "license": "MIT", 6341 + "dependencies": { 6342 + "micromark-util-symbol": "^2.0.0", 6343 + "micromark-util-types": "^2.0.0" 6344 + } 6345 + }, 6346 + "node_modules/micromark-util-chunked": { 6347 + "version": "2.0.1", 6348 + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", 6349 + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", 6350 + "funding": [ 6351 + { 6352 + "type": "GitHub Sponsors", 6353 + "url": "https://github.com/sponsors/unifiedjs" 6354 + }, 6355 + { 6356 + "type": "OpenCollective", 6357 + "url": "https://opencollective.com/unified" 6358 + } 6359 + ], 6360 + "license": "MIT", 6361 + "dependencies": { 6362 + "micromark-util-symbol": "^2.0.0" 6363 + } 6364 + }, 6365 + "node_modules/micromark-util-classify-character": { 6366 + "version": "2.0.1", 6367 + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", 6368 + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", 6369 + "funding": [ 6370 + { 6371 + "type": "GitHub Sponsors", 6372 + "url": "https://github.com/sponsors/unifiedjs" 6373 + }, 6374 + { 6375 + "type": "OpenCollective", 6376 + "url": "https://opencollective.com/unified" 6377 + } 6378 + ], 6379 + "license": "MIT", 6380 + "dependencies": { 6381 + "micromark-util-character": "^2.0.0", 6382 + "micromark-util-symbol": "^2.0.0", 6383 + "micromark-util-types": "^2.0.0" 6384 + } 6385 + }, 6386 + "node_modules/micromark-util-combine-extensions": { 6387 + "version": "2.0.1", 6388 + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", 6389 + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", 6390 + "funding": [ 6391 + { 6392 + "type": "GitHub Sponsors", 6393 + "url": "https://github.com/sponsors/unifiedjs" 6394 + }, 6395 + { 6396 + "type": "OpenCollective", 6397 + "url": "https://opencollective.com/unified" 6398 + } 6399 + ], 6400 + "license": "MIT", 6401 + "dependencies": { 6402 + "micromark-util-chunked": "^2.0.0", 6403 + "micromark-util-types": "^2.0.0" 6404 + } 6405 + }, 6406 + "node_modules/micromark-util-decode-numeric-character-reference": { 6407 + "version": "2.0.2", 6408 + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", 6409 + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", 6410 + "funding": [ 6411 + { 6412 + "type": "GitHub Sponsors", 6413 + "url": "https://github.com/sponsors/unifiedjs" 6414 + }, 6415 + { 6416 + "type": "OpenCollective", 6417 + "url": "https://opencollective.com/unified" 6418 + } 6419 + ], 6420 + "license": "MIT", 6421 + "dependencies": { 6422 + "micromark-util-symbol": "^2.0.0" 6423 + } 6424 + }, 6425 + "node_modules/micromark-util-decode-string": { 6426 + "version": "2.0.1", 6427 + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", 6428 + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", 6429 + "funding": [ 6430 + { 6431 + "type": "GitHub Sponsors", 6432 + "url": "https://github.com/sponsors/unifiedjs" 6433 + }, 6434 + { 6435 + "type": "OpenCollective", 6436 + "url": "https://opencollective.com/unified" 6437 + } 6438 + ], 6439 + "license": "MIT", 6440 + "dependencies": { 6441 + "decode-named-character-reference": "^1.0.0", 6442 + "micromark-util-character": "^2.0.0", 6443 + "micromark-util-decode-numeric-character-reference": "^2.0.0", 6444 + "micromark-util-symbol": "^2.0.0" 6445 + } 6446 + }, 6447 + "node_modules/micromark-util-encode": { 6448 + "version": "2.0.1", 6449 + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", 6450 + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", 6451 + "funding": [ 6452 + { 6453 + "type": "GitHub Sponsors", 6454 + "url": "https://github.com/sponsors/unifiedjs" 6455 + }, 6456 + { 6457 + "type": "OpenCollective", 6458 + "url": "https://opencollective.com/unified" 6459 + } 6460 + ], 6461 + "license": "MIT" 6462 + }, 6463 + "node_modules/micromark-util-events-to-acorn": { 6464 + "version": "2.0.3", 6465 + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", 6466 + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", 6467 + "funding": [ 6468 + { 6469 + "type": "GitHub Sponsors", 6470 + "url": "https://github.com/sponsors/unifiedjs" 6471 + }, 6472 + { 6473 + "type": "OpenCollective", 6474 + "url": "https://opencollective.com/unified" 6475 + } 6476 + ], 6477 + "license": "MIT", 6478 + "dependencies": { 6479 + "@types/estree": "^1.0.0", 6480 + "@types/unist": "^3.0.0", 6481 + "devlop": "^1.0.0", 6482 + "estree-util-visit": "^2.0.0", 6483 + "micromark-util-symbol": "^2.0.0", 6484 + "micromark-util-types": "^2.0.0", 6485 + "vfile-message": "^4.0.0" 6486 + } 6487 + }, 6488 + "node_modules/micromark-util-html-tag-name": { 6489 + "version": "2.0.1", 6490 + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", 6491 + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", 6492 + "funding": [ 6493 + { 6494 + "type": "GitHub Sponsors", 6495 + "url": "https://github.com/sponsors/unifiedjs" 6496 + }, 6497 + { 6498 + "type": "OpenCollective", 6499 + "url": "https://opencollective.com/unified" 6500 + } 6501 + ], 6502 + "license": "MIT" 6503 + }, 6504 + "node_modules/micromark-util-normalize-identifier": { 6505 + "version": "2.0.1", 6506 + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", 6507 + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", 6508 + "funding": [ 6509 + { 6510 + "type": "GitHub Sponsors", 6511 + "url": "https://github.com/sponsors/unifiedjs" 6512 + }, 6513 + { 6514 + "type": "OpenCollective", 6515 + "url": "https://opencollective.com/unified" 6516 + } 6517 + ], 6518 + "license": "MIT", 6519 + "dependencies": { 6520 + "micromark-util-symbol": "^2.0.0" 6521 + } 6522 + }, 6523 + "node_modules/micromark-util-resolve-all": { 6524 + "version": "2.0.1", 6525 + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", 6526 + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", 6527 + "funding": [ 6528 + { 6529 + "type": "GitHub Sponsors", 6530 + "url": "https://github.com/sponsors/unifiedjs" 6531 + }, 6532 + { 6533 + "type": "OpenCollective", 6534 + "url": "https://opencollective.com/unified" 6535 + } 6536 + ], 6537 + "license": "MIT", 6538 + "dependencies": { 6539 + "micromark-util-types": "^2.0.0" 6540 + } 6541 + }, 6542 + "node_modules/micromark-util-sanitize-uri": { 6543 + "version": "2.0.1", 6544 + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", 6545 + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", 6546 + "funding": [ 6547 + { 6548 + "type": "GitHub Sponsors", 6549 + "url": "https://github.com/sponsors/unifiedjs" 6550 + }, 6551 + { 6552 + "type": "OpenCollective", 6553 + "url": "https://opencollective.com/unified" 6554 + } 6555 + ], 6556 + "license": "MIT", 6557 + "dependencies": { 6558 + "micromark-util-character": "^2.0.0", 6559 + "micromark-util-encode": "^2.0.0", 6560 + "micromark-util-symbol": "^2.0.0" 6561 + } 6562 + }, 6563 + "node_modules/micromark-util-subtokenize": { 6564 + "version": "2.1.0", 6565 + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", 6566 + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", 6567 + "funding": [ 6568 + { 6569 + "type": "GitHub Sponsors", 6570 + "url": "https://github.com/sponsors/unifiedjs" 6571 + }, 6572 + { 6573 + "type": "OpenCollective", 6574 + "url": "https://opencollective.com/unified" 6575 + } 6576 + ], 6577 + "license": "MIT", 6578 + "dependencies": { 6579 + "devlop": "^1.0.0", 6580 + "micromark-util-chunked": "^2.0.0", 6581 + "micromark-util-symbol": "^2.0.0", 6582 + "micromark-util-types": "^2.0.0" 6583 + } 6584 + }, 6585 + "node_modules/micromark-util-symbol": { 6586 + "version": "2.0.1", 6587 + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", 6588 + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", 6589 + "funding": [ 6590 + { 6591 + "type": "GitHub Sponsors", 6592 + "url": "https://github.com/sponsors/unifiedjs" 6593 + }, 6594 + { 6595 + "type": "OpenCollective", 6596 + "url": "https://opencollective.com/unified" 6597 + } 6598 + ], 6599 + "license": "MIT" 6600 + }, 6601 + "node_modules/micromark-util-types": { 6602 + "version": "2.0.2", 6603 + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", 6604 + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", 6605 + "funding": [ 6606 + { 6607 + "type": "GitHub Sponsors", 6608 + "url": "https://github.com/sponsors/unifiedjs" 6609 + }, 6610 + { 6611 + "type": "OpenCollective", 6612 + "url": "https://opencollective.com/unified" 6613 + } 6614 + ], 6615 + "license": "MIT" 6616 + }, 4997 6617 "node_modules/micromatch": { 4998 6618 "version": "4.0.8", 4999 6619 "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", ··· 5076 6696 "version": "2.1.3", 5077 6697 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 5078 6698 "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 5079 - "dev": true, 5080 6699 "license": "MIT" 5081 6700 }, 5082 6701 "node_modules/multiformats": { ··· 5418 7037 "node": ">=6" 5419 7038 } 5420 7039 }, 7040 + "node_modules/parse-entities": { 7041 + "version": "4.0.2", 7042 + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", 7043 + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", 7044 + "license": "MIT", 7045 + "dependencies": { 7046 + "@types/unist": "^2.0.0", 7047 + "character-entities-legacy": "^3.0.0", 7048 + "character-reference-invalid": "^2.0.0", 7049 + "decode-named-character-reference": "^1.0.0", 7050 + "is-alphanumerical": "^2.0.0", 7051 + "is-decimal": "^2.0.0", 7052 + "is-hexadecimal": "^2.0.0" 7053 + }, 7054 + "funding": { 7055 + "type": "github", 7056 + "url": "https://github.com/sponsors/wooorm" 7057 + } 7058 + }, 7059 + "node_modules/parse-entities/node_modules/@types/unist": { 7060 + "version": "2.0.11", 7061 + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", 7062 + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", 7063 + "license": "MIT" 7064 + }, 5421 7065 "node_modules/path-exists": { 5422 7066 "version": "4.0.0", 5423 7067 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", ··· 5525 7169 "react-is": "^16.13.1" 5526 7170 } 5527 7171 }, 7172 + "node_modules/property-information": { 7173 + "version": "7.1.0", 7174 + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", 7175 + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", 7176 + "license": "MIT", 7177 + "funding": { 7178 + "type": "github", 7179 + "url": "https://github.com/sponsors/wooorm" 7180 + } 7181 + }, 5528 7182 "node_modules/punycode": { 5529 7183 "version": "2.3.1", 5530 7184 "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", ··· 5597 7251 "react-dom": ">=17.0.0" 5598 7252 } 5599 7253 }, 7254 + "node_modules/recma-build-jsx": { 7255 + "version": "1.0.0", 7256 + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", 7257 + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", 7258 + "license": "MIT", 7259 + "dependencies": { 7260 + "@types/estree": "^1.0.0", 7261 + "estree-util-build-jsx": "^3.0.0", 7262 + "vfile": "^6.0.0" 7263 + }, 7264 + "funding": { 7265 + "type": "opencollective", 7266 + "url": "https://opencollective.com/unified" 7267 + } 7268 + }, 7269 + "node_modules/recma-jsx": { 7270 + "version": "1.0.1", 7271 + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", 7272 + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", 7273 + "license": "MIT", 7274 + "dependencies": { 7275 + "acorn-jsx": "^5.0.0", 7276 + "estree-util-to-js": "^2.0.0", 7277 + "recma-parse": "^1.0.0", 7278 + "recma-stringify": "^1.0.0", 7279 + "unified": "^11.0.0" 7280 + }, 7281 + "funding": { 7282 + "type": "opencollective", 7283 + "url": "https://opencollective.com/unified" 7284 + }, 7285 + "peerDependencies": { 7286 + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 7287 + } 7288 + }, 7289 + "node_modules/recma-parse": { 7290 + "version": "1.0.0", 7291 + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", 7292 + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", 7293 + "license": "MIT", 7294 + "dependencies": { 7295 + "@types/estree": "^1.0.0", 7296 + "esast-util-from-js": "^2.0.0", 7297 + "unified": "^11.0.0", 7298 + "vfile": "^6.0.0" 7299 + }, 7300 + "funding": { 7301 + "type": "opencollective", 7302 + "url": "https://opencollective.com/unified" 7303 + } 7304 + }, 7305 + "node_modules/recma-stringify": { 7306 + "version": "1.0.0", 7307 + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", 7308 + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", 7309 + "license": "MIT", 7310 + "dependencies": { 7311 + "@types/estree": "^1.0.0", 7312 + "estree-util-to-js": "^2.0.0", 7313 + "unified": "^11.0.0", 7314 + "vfile": "^6.0.0" 7315 + }, 7316 + "funding": { 7317 + "type": "opencollective", 7318 + "url": "https://opencollective.com/unified" 7319 + } 7320 + }, 5600 7321 "node_modules/reflect.getprototypeof": { 5601 7322 "version": "1.0.10", 5602 7323 "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", ··· 5641 7362 "url": "https://github.com/sponsors/ljharb" 5642 7363 } 5643 7364 }, 7365 + "node_modules/rehype-recma": { 7366 + "version": "1.0.0", 7367 + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", 7368 + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", 7369 + "license": "MIT", 7370 + "dependencies": { 7371 + "@types/estree": "^1.0.0", 7372 + "@types/hast": "^3.0.0", 7373 + "hast-util-to-estree": "^3.0.0" 7374 + }, 7375 + "funding": { 7376 + "type": "opencollective", 7377 + "url": "https://opencollective.com/unified" 7378 + } 7379 + }, 7380 + "node_modules/rehype-slug": { 7381 + "version": "6.0.0", 7382 + "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz", 7383 + "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==", 7384 + "license": "MIT", 7385 + "dependencies": { 7386 + "@types/hast": "^3.0.0", 7387 + "github-slugger": "^2.0.0", 7388 + "hast-util-heading-rank": "^3.0.0", 7389 + "hast-util-to-string": "^3.0.0", 7390 + "unist-util-visit": "^5.0.0" 7391 + }, 7392 + "funding": { 7393 + "type": "opencollective", 7394 + "url": "https://opencollective.com/unified" 7395 + } 7396 + }, 7397 + "node_modules/remark-gfm": { 7398 + "version": "4.0.1", 7399 + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", 7400 + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", 7401 + "license": "MIT", 7402 + "dependencies": { 7403 + "@types/mdast": "^4.0.0", 7404 + "mdast-util-gfm": "^3.0.0", 7405 + "micromark-extension-gfm": "^3.0.0", 7406 + "remark-parse": "^11.0.0", 7407 + "remark-stringify": "^11.0.0", 7408 + "unified": "^11.0.0" 7409 + }, 7410 + "funding": { 7411 + "type": "opencollective", 7412 + "url": "https://opencollective.com/unified" 7413 + } 7414 + }, 7415 + "node_modules/remark-mdx": { 7416 + "version": "3.1.1", 7417 + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", 7418 + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", 7419 + "license": "MIT", 7420 + "dependencies": { 7421 + "mdast-util-mdx": "^3.0.0", 7422 + "micromark-extension-mdxjs": "^3.0.0" 7423 + }, 7424 + "funding": { 7425 + "type": "opencollective", 7426 + "url": "https://opencollective.com/unified" 7427 + } 7428 + }, 7429 + "node_modules/remark-parse": { 7430 + "version": "11.0.0", 7431 + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", 7432 + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", 7433 + "license": "MIT", 7434 + "dependencies": { 7435 + "@types/mdast": "^4.0.0", 7436 + "mdast-util-from-markdown": "^2.0.0", 7437 + "micromark-util-types": "^2.0.0", 7438 + "unified": "^11.0.0" 7439 + }, 7440 + "funding": { 7441 + "type": "opencollective", 7442 + "url": "https://opencollective.com/unified" 7443 + } 7444 + }, 7445 + "node_modules/remark-rehype": { 7446 + "version": "11.1.2", 7447 + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", 7448 + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", 7449 + "license": "MIT", 7450 + "dependencies": { 7451 + "@types/hast": "^3.0.0", 7452 + "@types/mdast": "^4.0.0", 7453 + "mdast-util-to-hast": "^13.0.0", 7454 + "unified": "^11.0.0", 7455 + "vfile": "^6.0.0" 7456 + }, 7457 + "funding": { 7458 + "type": "opencollective", 7459 + "url": "https://opencollective.com/unified" 7460 + } 7461 + }, 7462 + "node_modules/remark-stringify": { 7463 + "version": "11.0.0", 7464 + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", 7465 + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", 7466 + "license": "MIT", 7467 + "dependencies": { 7468 + "@types/mdast": "^4.0.0", 7469 + "mdast-util-to-markdown": "^2.0.0", 7470 + "unified": "^11.0.0" 7471 + }, 7472 + "funding": { 7473 + "type": "opencollective", 7474 + "url": "https://opencollective.com/unified" 7475 + } 7476 + }, 5644 7477 "node_modules/resolve": { 5645 7478 "version": "1.22.11", 5646 7479 "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", ··· 5994 7827 "url": "https://github.com/sponsors/ljharb" 5995 7828 } 5996 7829 }, 7830 + "node_modules/source-map": { 7831 + "version": "0.7.6", 7832 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", 7833 + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", 7834 + "license": "BSD-3-Clause", 7835 + "engines": { 7836 + "node": ">= 12" 7837 + } 7838 + }, 5997 7839 "node_modules/source-map-js": { 5998 7840 "version": "1.2.1", 5999 7841 "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", ··· 6003 7845 "node": ">=0.10.0" 6004 7846 } 6005 7847 }, 7848 + "node_modules/space-separated-tokens": { 7849 + "version": "2.0.2", 7850 + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", 7851 + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", 7852 + "license": "MIT", 7853 + "funding": { 7854 + "type": "github", 7855 + "url": "https://github.com/sponsors/wooorm" 7856 + } 7857 + }, 6006 7858 "node_modules/stable-hash": { 6007 7859 "version": "0.0.5", 6008 7860 "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", ··· 6137 7989 "url": "https://github.com/sponsors/ljharb" 6138 7990 } 6139 7991 }, 7992 + "node_modules/stringify-entities": { 7993 + "version": "4.0.4", 7994 + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", 7995 + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", 7996 + "license": "MIT", 7997 + "dependencies": { 7998 + "character-entities-html4": "^2.0.0", 7999 + "character-entities-legacy": "^3.0.0" 8000 + }, 8001 + "funding": { 8002 + "type": "github", 8003 + "url": "https://github.com/sponsors/wooorm" 8004 + } 8005 + }, 6140 8006 "node_modules/strip-bom": { 6141 8007 "version": "3.0.0", 6142 8008 "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", ··· 6160 8026 "url": "https://github.com/sponsors/sindresorhus" 6161 8027 } 6162 8028 }, 8029 + "node_modules/style-to-js": { 8030 + "version": "1.1.21", 8031 + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", 8032 + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", 8033 + "license": "MIT", 8034 + "dependencies": { 8035 + "style-to-object": "1.0.14" 8036 + } 8037 + }, 8038 + "node_modules/style-to-object": { 8039 + "version": "1.0.14", 8040 + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", 8041 + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", 8042 + "license": "MIT", 8043 + "dependencies": { 8044 + "inline-style-parser": "0.2.7" 8045 + } 8046 + }, 6163 8047 "node_modules/styled-jsx": { 6164 8048 "version": "5.1.6", 6165 8049 "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", ··· 6298 8182 }, 6299 8183 "engines": { 6300 8184 "node": ">=8.0" 8185 + } 8186 + }, 8187 + "node_modules/trim-lines": { 8188 + "version": "3.0.1", 8189 + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", 8190 + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", 8191 + "license": "MIT", 8192 + "funding": { 8193 + "type": "github", 8194 + "url": "https://github.com/sponsors/wooorm" 8195 + } 8196 + }, 8197 + "node_modules/trough": { 8198 + "version": "2.2.0", 8199 + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", 8200 + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", 8201 + "license": "MIT", 8202 + "funding": { 8203 + "type": "github", 8204 + "url": "https://github.com/sponsors/wooorm" 6301 8205 } 6302 8206 }, 6303 8207 "node_modules/ts-api-utils": { ··· 6515 8419 "integrity": "sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==", 6516 8420 "license": "MIT" 6517 8421 }, 8422 + "node_modules/unified": { 8423 + "version": "11.0.5", 8424 + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", 8425 + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", 8426 + "license": "MIT", 8427 + "dependencies": { 8428 + "@types/unist": "^3.0.0", 8429 + "bail": "^2.0.0", 8430 + "devlop": "^1.0.0", 8431 + "extend": "^3.0.0", 8432 + "is-plain-obj": "^4.0.0", 8433 + "trough": "^2.0.0", 8434 + "vfile": "^6.0.0" 8435 + }, 8436 + "funding": { 8437 + "type": "opencollective", 8438 + "url": "https://opencollective.com/unified" 8439 + } 8440 + }, 8441 + "node_modules/unist-util-is": { 8442 + "version": "6.0.1", 8443 + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", 8444 + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", 8445 + "license": "MIT", 8446 + "dependencies": { 8447 + "@types/unist": "^3.0.0" 8448 + }, 8449 + "funding": { 8450 + "type": "opencollective", 8451 + "url": "https://opencollective.com/unified" 8452 + } 8453 + }, 8454 + "node_modules/unist-util-position": { 8455 + "version": "5.0.0", 8456 + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", 8457 + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", 8458 + "license": "MIT", 8459 + "dependencies": { 8460 + "@types/unist": "^3.0.0" 8461 + }, 8462 + "funding": { 8463 + "type": "opencollective", 8464 + "url": "https://opencollective.com/unified" 8465 + } 8466 + }, 8467 + "node_modules/unist-util-position-from-estree": { 8468 + "version": "2.0.0", 8469 + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", 8470 + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", 8471 + "license": "MIT", 8472 + "dependencies": { 8473 + "@types/unist": "^3.0.0" 8474 + }, 8475 + "funding": { 8476 + "type": "opencollective", 8477 + "url": "https://opencollective.com/unified" 8478 + } 8479 + }, 8480 + "node_modules/unist-util-stringify-position": { 8481 + "version": "4.0.0", 8482 + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", 8483 + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", 8484 + "license": "MIT", 8485 + "dependencies": { 8486 + "@types/unist": "^3.0.0" 8487 + }, 8488 + "funding": { 8489 + "type": "opencollective", 8490 + "url": "https://opencollective.com/unified" 8491 + } 8492 + }, 8493 + "node_modules/unist-util-visit": { 8494 + "version": "5.1.0", 8495 + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", 8496 + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", 8497 + "license": "MIT", 8498 + "dependencies": { 8499 + "@types/unist": "^3.0.0", 8500 + "unist-util-is": "^6.0.0", 8501 + "unist-util-visit-parents": "^6.0.0" 8502 + }, 8503 + "funding": { 8504 + "type": "opencollective", 8505 + "url": "https://opencollective.com/unified" 8506 + } 8507 + }, 8508 + "node_modules/unist-util-visit-parents": { 8509 + "version": "6.0.2", 8510 + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", 8511 + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", 8512 + "license": "MIT", 8513 + "dependencies": { 8514 + "@types/unist": "^3.0.0", 8515 + "unist-util-is": "^6.0.0" 8516 + }, 8517 + "funding": { 8518 + "type": "opencollective", 8519 + "url": "https://opencollective.com/unified" 8520 + } 8521 + }, 6518 8522 "node_modules/unrs-resolver": { 6519 8523 "version": "1.11.1", 6520 8524 "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", ··· 6589 8593 "license": "BSD-2-Clause", 6590 8594 "dependencies": { 6591 8595 "punycode": "^2.1.0" 8596 + } 8597 + }, 8598 + "node_modules/vfile": { 8599 + "version": "6.0.3", 8600 + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", 8601 + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", 8602 + "license": "MIT", 8603 + "dependencies": { 8604 + "@types/unist": "^3.0.0", 8605 + "vfile-message": "^4.0.0" 8606 + }, 8607 + "funding": { 8608 + "type": "opencollective", 8609 + "url": "https://opencollective.com/unified" 8610 + } 8611 + }, 8612 + "node_modules/vfile-message": { 8613 + "version": "4.0.3", 8614 + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", 8615 + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", 8616 + "license": "MIT", 8617 + "dependencies": { 8618 + "@types/unist": "^3.0.0", 8619 + "unist-util-stringify-position": "^4.0.0" 8620 + }, 8621 + "funding": { 8622 + "type": "opencollective", 8623 + "url": "https://opencollective.com/unified" 6592 8624 } 6593 8625 }, 6594 8626 "node_modules/which": { ··· 6746 8778 }, 6747 8779 "peerDependencies": { 6748 8780 "zod": "^3.25.0 || ^4.0.0" 8781 + } 8782 + }, 8783 + "node_modules/zwitch": { 8784 + "version": "2.0.4", 8785 + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", 8786 + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", 8787 + "license": "MIT", 8788 + "funding": { 8789 + "type": "github", 8790 + "url": "https://github.com/sponsors/wooorm" 6749 8791 } 6750 8792 } 6751 8793 }
+61
public/llms.txt
··· 1 + # Standard.site Documentation 2 + 3 + ## Overview 4 + Standard.site provides AT Protocol lexicons for long-form publishing on the open social web. 5 + 6 + ## Navigation 7 + 8 + ### Getting Started 9 + - Introduction: https://standard.site/docs/introduction 10 + Overview of Standard.site lexicons and core concepts 11 + 12 + - Quick Start: https://standard.site/docs/quick-start 13 + Step-by-step guide to implementing Standard.site lexicons 14 + 15 + - Permissions: https://standard.site/docs/permissions 16 + Understanding record permissions and access control 17 + 18 + - Verification: https://standard.site/docs/verification 19 + Linking records to domains for authenticity 20 + 21 + ### Core Lexicons 22 + - Publication: https://standard.site/docs/lexicons/publication 23 + `site.standard.publication` - Collection metadata and theming 24 + 25 + - Document: https://standard.site/docs/lexicons/document 26 + `site.standard.document` - Individual document records 27 + 28 + - Subscription: https://standard.site/docs/lexicons/subscription 29 + `site.standard.graph.subscription` - Follow relationships 30 + 31 + - Theme: https://standard.site/docs/lexicons/theme 32 + `site.standard.theme` - Theming configuration 33 + 34 + ### Resources 35 + - Implementations: https://standard.site/docs/implementations 36 + Tools and platforms using Standard.site lexicons 37 + 38 + - FAQ: https://standard.site/docs/faq 39 + Common questions and answers 40 + 41 + ## Features 42 + - All documentation pages support anchor links (click any heading to copy its link) 43 + - Each page provides a "Markdown" link in the footer for direct AI agent consumption 44 + - Full markdown source available via API: /api/docs/markdown/{slug} 45 + 46 + ## API Access 47 + GET /api/docs/markdown/{slug} - Returns the raw markdown content of any documentation page 48 + Example: /api/docs/markdown/introduction 49 + 50 + ## Key Concepts 51 + - AT Protocol: Authenticated Transfer Protocol - decentralized social networking 52 + - PDS: Personal Data Server - stores user data and records 53 + - Lexicons: Schemas that define record types in AT Protocol 54 + - NSID: Namespaced Identifier - unique identifier format for lexicons 55 + 56 + ## Implementation Quick Reference 57 + 1. Create publication record with site.standard.publication lexicon 58 + 2. Create document records with site.standard.document lexicon 59 + 3. Link documents to publication via publication reference 60 + 4. Implement verification to link records to your domain 61 + 5. Support subscription records for follow functionality