@driftime/sanity-plugin-font 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +492 -2
- package/dist/catalog-BVw1r_SG.js +183 -0
- package/dist/catalog-BVw1r_SG.js.map +1 -0
- package/dist/catalog-KAqAIjzw.js +96 -0
- package/dist/catalog-KAqAIjzw.js.map +1 -0
- package/dist/catalog.d.ts +29 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +10 -0
- package/dist/catalog.js.map +1 -0
- package/dist/family-BAGnEjZg.js +36 -0
- package/dist/family-BAGnEjZg.js.map +1 -0
- package/dist/font-styles.d.ts +21 -0
- package/dist/font-styles.d.ts.map +1 -0
- package/dist/font-styles.js +43 -0
- package/dist/font-styles.js.map +1 -0
- package/dist/index.d.ts +76 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2364 -0
- package/dist/index.js.map +1 -0
- package/dist/names.d.ts +8 -0
- package/dist/names.d.ts.map +1 -0
- package/dist/names.js +0 -0
- package/dist/next-loader.d.ts +19 -0
- package/dist/next-loader.d.ts.map +1 -0
- package/dist/next-loader.js +28 -0
- package/dist/next-loader.js.map +1 -0
- package/dist/next.d.ts +42 -0
- package/dist/next.d.ts.map +1 -0
- package/dist/next.js +48 -0
- package/dist/next.js.map +1 -0
- package/dist/render.d.ts +12 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +183 -0
- package/dist/render.js.map +1 -0
- package/dist/resolve-Bkp0dEmr.d.ts +81 -0
- package/dist/resolve-Bkp0dEmr.d.ts.map +1 -0
- package/dist/types-DZl90ROd.d.ts +106 -0
- package/dist/types-DZl90ROd.d.ts.map +1 -0
- package/dist/types-DheP5tax.js +27 -0
- package/dist/types-DheP5tax.js.map +1 -0
- package/dist/utils-BV38iODp.js +29 -0
- package/dist/utils-BV38iODp.js.map +1 -0
- package/dist/vite.d.ts +61 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +53 -0
- package/dist/vite.js.map +1 -0
- package/package.json +120 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["isDefined","useState","ArrayOfObjectsFormNode","ArrayOfObjectsMember","BaseFormNode","DocumentFieldActionNode","ObjectFieldProps","ObjectFormNode","ObjectMember","ChangeIndicator","FieldActionsProvider","FieldActionsResolver","FormField","getPublishedId","useFormValue","hasMembers","node","collectNodeValidation","validation","collectMemberValidation","members","flatMap","member","kind","field","fieldSet","item","FieldProps","Field","t0","$","_c","actions","schemaType","title","description","presence","level","inputId","path","changed","children","inputProps","t1","Symbol","for","headerActions","setHeaderActions","t2","documentId","fieldValidation","focused","t3","publishedId","undefined","t4","name","t5","readOnly","deprecated","t6","t7","_c","Hidden","ComponentProps","ComponentType","createElement","defaultIconProps","width","height","strokeWidth","createSanityIcon","icon","props","Icon","SanityIcon","BinaryDocumentIcon","UploadIcon","Button","Card","Flex","Text","ComponentProps","DragEvent","useRef","useState","DropZoneProps","Omit","readOnly","onFiles","files","File","DropZone","t0","$","_c","props","dragging","setDragging","input","t1","handleDragOver","event","preventDefault","t2","handleDrop","event_0","dataTransfer","t3","t4","Symbol","for","t5","t6","t7","t8","current","click","t9","t10","event_1","currentTarget","value","t11","t12","_c","isDefined","createStylesheetUrl","SanityFontStyle","SanityFontWeight","SampleFile","url","weight","maxWeight","style","FontSample","source","family","weights","styles","text","files","FaceSource","fontFacePattern","parseStylesheet","css","matchAll","flatMap","groups","body","exec","listFaceSources","sample","map","response","fetch","ok","undefined","loadSample","name","sources","faces","Promise","all","face","FontFace","load","document","fonts","add","sampleRequests","Map","sampleCount","loadedSamples","getSampleKey","JSON","stringify","requestSample","key","request","get","set","delete","readLoadedSample","isDefined","useEffect","useState","FontSample","getSampleKey","readLoadedSample","requestSample","useFontSample","sample","$","_c","settled","setSettled","key","t0","undefined","cached","t1","t2","active","load","wanted","wantedKey","name","result","name_0","t3","t4","loading","_c","SanityFontWeight","fontWeightLabels","Record","isDefined","fontWeightLabels","CatalogFamily","SanityFontFile","SanityFontStyle","SanityFontWeight","FontVariant","weight","style","listVariants","weights","styles","flatMap","map","describeVariant","label","describeFile","maxWeight","Pick","range","meetsRequirements","family","variants","subsets","italics","every","includes","subset","holdsVariant","file","lightest","fileStyle","asset","_ref","getCoverageKey","findDuplicateFiles","files","seen","Set","filter","coverage","repeated","has","add","listFileVariants","required","inRange","variant","unique","Map","values","toSorted","first","second","listMissingVariants","some","isDefined","TrashIcon","Badge","Box","Button","Card","Flex","Stack","Text","ComponentProps","useFontSample","describeFile","SanityFontStyle","SanityFontWeight","FileRowProps","Omit","url","weight","maxWeight","style","filename","uploading","duplicate","readOnly","onRemove","FileRow","t0","$","_c","props","t1","label","t2","source","files","undefined","name","loading","t3","t4","Symbol","for","width","flexShrink","t5","t6","t7","fontFamily","fontWeight","fontStyle","opacity","transition","t8","minWidth","t9","t10","t11","t12","t13","t14","t15","t16","t17","_c","isDefined","createContext","useContext","ReactNode","logger","SanityFontCategory","FilesContextValues","fillDetails","family","category","FilesProviderProps","children","FilesContext","undefined","useFilesContext","filesContext","Error","format","FilesProvider","t0","$","_c","t1","t2","_c","assetFilenamesQuery","isDefined","useEffect","useState","useClient","apiVersion","assetFilenamesQuery","useAssetFilenames","references","$","_c","t0","Symbol","for","client","t1","filenames","setFilenames","t2","toSorted","join","key","t3","t4","active","load","ids","assets","fetch","Object","fromEntries","flatMap","_temp","split","_id","originalFilename","_c","_temp","isDefined","createFileUrl","reference","projectId","dataset","match","hash","extension","groups","undefined","isDefined","SanityFontCategory","SanityFontStyle","SanityFontWeight","fontWeights","FontFileDetails","family","category","weight","maxWeight","style","FontTables","Map","DataView","Decompressor","format","DecompressionStream","wantedTables","Set","knownTags","isDecompressor","value","createDecompression","Decompression","globalThis","Error","supportsBrotli","decompress","data","Uint8Array","decode","stream","Blob","pipeThrough","Response","arrayBuffer","readTag","view","offset","String","fromCodePoint","getUint8","readWoffTables","Promise","count","getUint16","entries","Array","from","length","_","index","entry","tag","getUint32","originalLength","tables","all","filter","has","map","buffer","byteOffset","table","byteLength","const","readBase128","byte","next","readWoff2Tables","undefined","compressedLength","flags","known","version","Math","floor","original","transformed","stored","push","start","set","roundWeight","rounded","min","max","round","find","readWeightAxis","axesOffset","axisCount","axisSize","axis","getInt32","readCategory","metrics","post","familyClass","panoseFamily","panoseSerif","panoseProportion","readFamilyName","storage","records","record","platform","language","name","wanted","bytes","TextDecoder","trim","readFontFile","ArrayBuffer","signature","get","selection","isDefined","isRecord","Card","Stack","Text","randomKey","useState","ArrayOfObjectsInputProps","insert","setIfMissing","unset","useClient","DropZone","FileRow","apiVersion","logger","uploadConcurrency","uploadRetries","useFilesContext","useAssetFilenames","createFileUrl","FontFileDetails","readFontFile","describeFile","findDuplicateFiles","getCoverageKey","SanityFontFile","fontFileTypeName","PendingFile","key","filename","url","details","Notice","tone","message","isFontFile","item","findCommonFamily","families","counts","Map","family","set","get","common","undefined","highest","count","createFontFile","assetId","weight","maxWeight","style","_type","_key","asset","_ref","FilesInputProps","FilesInput","value","onChange","readOnly","fillDetails","client","projectId","dataset","config","pending","setPending","notices","setNotices","uploadedNames","setUploadedNames","Record","files","filter","references","flatMap","storedNames","filenames","duplicates","Set","map","rows","uploading","toSorted","first","second","uploadAsset","file","File","retries","ReturnType","assets","upload","error","current","_id","originalFilename","warn","Error","String","entry","URL","revokeObjectURL","handleFiles","selected","read","Promise","all","arrayBuffer","held","find","name","fresh","uploads","pendingFile","push","coverage","existing","createObjectURL","category","kind","queue","drain","next","shift","Array","from","length","Math","min","has","const","messages","notice","WarningOutlineIcon","Card","Flex","Stack","Text","ComponentProps","CodeTextProps","Omit","text","CodeText","t0","$","_c","props","t1","t2","parts","split","map","part","index","start","slice","join","length","t3","ProblemProps","problem","title","description","Problem","Symbol","for","t4","t5","_c","GridLayout","columns","rowHeight","visibleRows","height","overscan","getNextIndex","key","current","last","undefined","getVisibleRows","scrollRow","count","totalRows","Math","ceil","firstRow","max","lastRow","min","getCenteredScrollTop","index","floor","getRevealedScrollTop","scrollTop","top","SanityFontCategory","fontCategoryLabels","Record","serif","display","handwriting","monospace","GridLayout","gridCardHeight","gridGap","gridRowHeight","gridColumns","gridVisibleRows","gridHeight","gridLayout","columns","rowHeight","visibleRows","height","overscan","isDefined","Box","Button","Stack","Text","ComponentProps","fontCategoryLabels","gridCardHeight","useFontSample","CatalogFamily","FontSample","CellProps","Omit","family","selected","focusable","position","total","onSelect","createCellSample","weights","italics","italic","available","weight","toSorted","first","second","Math","abs","source","styles","text","Cell","t0","$","_c","props","t1","name","loading","variable","t2","Set","count","size","t3","category","t4","t5","details","t6","t7","Symbol","for","height","minWidth","boxShadow","t8","t9","join","t10","t11","textAlign","t12","undefined","t13","t14","fontFamily","opacity","transition","t15","t16","t17","t18","t19","_c","getVisibleRows","isDefined","Box","Button","Flex","Grid","Text","ComponentProps","RefObject","Cell","gridColumns","gridGap","gridHeight","gridRowHeight","CatalogFamily","LibraryProps","Omit","families","rows","ReturnType","selected","activeIndex","activeCell","HTMLButtonElement","search","onSelect","family","onClearSearch","Library","t0","$","_c","props","totalRows","firstRow","lastRow","T0","t1","t2","t3","t4","t5","t6","visible","slice","height","overflowY","undefined","columnGap","rowGap","paddingTop","paddingBottom","map","offset","index","length","t7","_c","Button","Flex","Grid","Stack","Text","ComponentProps","Cell","gridColumns","gridGap","CatalogFamily","RecentProps","Omit","families","selected","onSelect","family","onForget","Recent","t0","$","_c","props","t1","Symbol","for","t2","t3","columnGap","rowGap","t4","t5","length","index","map","t6","_c","CatalogFamily","FamilySort","name","label","compare","first","second","familySorts","trending","added","localeCompare","family","fontCatalog","isDefined","CatalogFamily","parseCatalog","CatalogProblem","title","description","CatalogResult","families","problem","normalizeTerms","value","toLowerCase","replaceAll","readCatalog","Promise","ready","load","module","default","catalogRequest","undefined","requestCatalog","result","useEffect","useState","CatalogResult","requestCatalog","useFontCatalog","$","_c","result","setResult","t0","t1","Symbol","for","active","load","loaded","_c","useState","createRecentStore","storageKey","limit","getStorageKey","scope","read","stored","JSON","parse","globalThis","localStorage","getItem","Array","isArray","filter","entry","write","name","updated","slice","setItem","stringify","clear","removeItem","useRecent","store","$","_c","t0","recent","setRecent","t1","remember","t2","forget","t3","_c","createRecentStore","recentFontStore","useRecent","recentFontStore","useRecentFonts","Problem","getCenteredScrollTop","getNextIndex","getRevealedScrollTop","getVisibleRows","isDefined","SearchIcon","Box","Flex","Select","Spinner","Stack","Text","TextInput","ChangeEvent","ComponentProps","KeyboardEvent","useEffect","useRef","useState","Library","Recent","fontCategoryLabels","gridHeight","gridLayout","gridRowHeight","familySorts","useFontCatalog","useRecentFonts","CatalogFamily","normalizeTerms","FontVariant","meetsRequirements","SanityFontCategory","fontCategories","PickerProps","Omit","id","selected","categories","families","variants","subsets","onSelect","family","Picker","t0","$","_c","props","result","recent","remember","forget","catalog","byName","Map","map","_temp","listed","flatMap","name","get","t1","family_0","includes","category","offered","filter","offeredCategories","member","some","family_1","search","setSearch","setCategory","sort","setSort","scrollRow","setScrollRow","movedIndex","setMovedIndex","scroller","activeCell","focusIndex","undefined","scrollFrame","centred","query","filtering","t2","compare","results","family_2","toSorted","offeredByName","_temp2","recentFamilies","name_0","family_4","rows","length","selectedIndex","findIndex","t3","family_5","activeIndex","Math","max","element","current","scrollTop","t4","t5","Symbol","for","cancelAnimationFrame","t6","t7","focus","resetScroll","t8","clearSearch","t9","handleSearch","event","currentTarget","value","t10","handleCategory","event_0","find","member_0","t11","handleSort","event_1","value_0","t12","name_1","handleSelect","family_6","selectActive","family_7","handleSearchKeyDown","event_2","key","preventDefault","handleScroll","requestAnimationFrame","element_0","floor","handleGridKeyDown","event_3","last","next","index","min","element_1","T0","t13","t14","problem","_temp3","_temp4","t15","height","t16","t17","t18","toLocaleString","t19","name_2","label","member_1","family_3","_c","_temp","isDefined","useClient","apiVersion","createFileUrl","FontSample","SanityFont","useStoredSample","value","text","$","_c","t0","Symbol","for","t1","family","styles","t2","weights","bb0","projectId","dataset","config","source","t3","t4","t5","files","sampleFiles","flatMap","t6","asset","weight","maxWeight","style","url","_ref","undefined","_c","isDefined","Card","Flex","Stack","Text","ComponentProps","defaultPreviewText","useFontSample","useStoredSample","FontVariant","describeVariant","SanityFont","SampleProps","Omit","value","Partial","text","variants","Sample","t0","$","_c","props","t1","variant","specimen","caption","weight","items","map","name","loading","_temp","join","T0","t2","t3","t4","T1","t5","t6","t7","t8","style","specimen_0","fontFamily","undefined","fontWeight","fontStyle","opacity","transition","t9","t10","_c","ComponentProps","TypeIconProps","TypeIcon","props","$","_c","t0","t1","t2","Symbol","for","t3","_c","isDefined","isRecord","defaultSources","defaultStyles","defaultSubsets","defaultWeights","parseWeights","SanityFontConfig","SanityFontOptions","fontCategories","fontSources","fontStyles","fontWeights","selectMembers","list","Member","configured","selected","filter","member","includes","undefined","readFontOptions","value","sources","categories","weights","styles","subsets","Array","isArray","source","category","style","subset","resolveFontOptions","options","config","families","family","previewText","preview","text","Set","SanityFont","SanityFontSource","sourceFields","Record","google","upload","getStaleFields","source","other","isUpload","parent","defaultIconProps","isDefined","CloseIcon","EarthGlobeIcon","UploadIcon","Box","Button","Dialog","Flex","Stack","Tab","TabList","TabPanel","ReactNode","useState","ObjectInputProps","set","setIfMissing","unset","Picker","Sample","FilesProvider","TypeIcon","CatalogFamily","getFamilyName","resolveFontOptions","listFileVariants","listVariants","getStaleFields","FontSchemaType","SanityFontConfig","SanityFont","SanityFontSource","sourceTabs","Record","label","icon","google","upload","SourcesProps","id","offered","selected","readOnly","onSelect","source","children","Sources","t0","$","_c","length","t1","t2","Icon","map","t3","t4","t5","t6","InputProps","Partial","createSourcePatches","typeName","_type","field","createInput","config","Input","props","schemaType","value","onChange","renderDefault","storedSource","family","storedFamily","open","setOpen","tab","setTab","sources","categories","families","weights","styles","subsets","preview","options","defaultSource","undefined","includes","variants","sampleVariants","files","handleSelectSource","name","handleSelectFamily","selection","category","handleOpen","Symbol","for","handleClose","T0","t7","t8","t9","text","t10","t11","_c","isDefined","ComponentProps","useFontSample","useStoredSample","SanityFont","PreviewProps","Omit","value","Partial","Preview","t0","$","_c","props","style","name","t1","undefined","t2","fontFamily","lineHeight","t3","_c","isDefined","createElement","Preview","getFamilyName","SanityFont","createFontPreview","value","files","undefined","FontPreview","Field","Hidden","createSanityIcon","isDefined","isRecord","defineArrayMember","defineField","defineType","FilesInput","createInput","fontCategoryLabels","TypeIcon","getFamilyName","readFontOptions","resolveFontOptions","createFontPreview","describeFile","describeVariant","findDuplicateFiles","listMissingVariants","listVariants","isUpload","SanityFontConfig","SanityFont","SanityFontCategory","SanityFontFile","fontCategories","fontFileTypeName","fontTypeName","validateFont","value","Partial","categories","variants","ReturnType","source","family","category","weights","styles","files","includes","allowed","Intl","ListFormat","type","format","map","member","missing","list","variant","loaded","stale","some","weight","style","createFontType","config","name","icon","description","components","field","input","validation","rule","custom","context","options","preview","select","prepare","selection","Pick","title","subtitle","media","_type","fields","placeholder","hidden","parent","undefined","Array","isArray","of","duplicates","file","warning","accept","asset","maxWeight","filename","_key","_ref","ObjectOptions","ObjectSchemaType","TypeAliasDefinition","definePlugin","pluginName","createFontType","SanityFontCategory","SanityFontFamily","SanityFontSource","SanityFontStyle","SanityFontWeight","fontTypeName","IntrinsicDefinitions","font","SanityFontDefinition","SanityFontPreview","text","SanityFontConfig","sources","categories","families","weights","styles","subsets","preview","SanityFontOptions","Omit","options","FontSchemaType","plugin","config","name","schema","types","fontPlugin","\"body\"","\"url\"","\"weight\"","\"style\"","\"_type\"","\"_key\"","\"files\""],"sources":["../../@repo/components/field.tsx","../../@repo/components/hidden.tsx","../../@repo/lib/icons.ts","../src/components/files/drop-zone.tsx","../src/lib/samples.ts","../src/hooks/use-font-sample.ts","../src/config/weights.ts","../src/lib/requirements.ts","../src/components/files/file-row.tsx","../src/contexts/files.tsx","../src/groq/assets.ts","../src/hooks/use-asset-filenames.ts","../src/lib/files.ts","../src/lib/font-file.ts","../src/components/files/files.tsx","../../@repo/components/problem.tsx","../../@repo/lib/grid.ts","../src/config/categories.ts","../src/config/grid.ts","../src/components/picker/cell.tsx","../src/components/picker/library.tsx","../src/components/picker/recent.tsx","../src/config/sorts.ts","../src/lib/families.ts","../src/hooks/use-font-catalog.ts","../../@repo/lib/recent.ts","../src/lib/recent.ts","../src/hooks/use-recent-fonts.ts","../src/components/picker/picker.tsx","../src/hooks/use-stored-sample.ts","../src/components/sample.tsx","../src/icons/type.tsx","../src/lib/options.ts","../src/lib/sources.ts","../src/components/input.tsx","../src/components/preview.tsx","../src/lib/preview.ts","../src/schemas/types/font.ts","../src/plugin.ts"],"sourcesContent":["import { isDefined } from \"@repo/lib/utils\";\nimport { useState } from \"react\";\nimport type {\n ArrayOfObjectsFormNode,\n ArrayOfObjectsMember,\n BaseFormNode,\n DocumentFieldActionNode,\n ObjectFieldProps,\n ObjectFormNode,\n ObjectMember,\n} from \"sanity\";\nimport {\n ChangeIndicator,\n FieldActionsProvider,\n FieldActionsResolver,\n FormField,\n getPublishedId,\n useFormValue,\n} from \"sanity\";\n\n/**\n * Checks whether a form node has members, as objects and arrays of objects do.\n *\n * @param node - The form node to check.\n * @returns True if the node has members.\n */\nfunction hasMembers(node: BaseFormNode): node is ObjectFormNode | ArrayOfObjectsFormNode {\n return \"members\" in node;\n}\n\n/**\n * Collects the validation on a form node and everything inside it.\n *\n * @param node - The form node.\n * @returns Every validation result on the node or inside it.\n */\nfunction collectNodeValidation(node: BaseFormNode): BaseFormNode[\"validation\"] {\n return [...node.validation, ...(hasMembers(node) ? collectMemberValidation(node.members) : [])];\n}\n\n/**\n * Collects the validation anywhere inside a field's members. The form only passes a field the\n * validation at its own path, so a field that hides its members would otherwise show none of theirs.\n *\n * @param members - The members.\n * @returns Every validation result on the members or inside them.\n */\nfunction collectMemberValidation(members: (ObjectMember | ArrayOfObjectsMember)[]): BaseFormNode[\"validation\"] {\n return members.flatMap((member) => {\n if (member.kind === \"field\") return collectNodeValidation(member.field);\n if (member.kind === \"fieldSet\") return collectMemberValidation(member.fieldSet.members);\n if (member.kind === \"item\") return collectNodeValidation(member.item);\n\n return [];\n });\n}\n\nexport type FieldProps = ObjectFieldProps;\n\nexport function Field({\n actions,\n schemaType,\n title,\n description,\n presence,\n validation,\n level,\n inputId,\n path,\n changed,\n children,\n inputProps,\n}: FieldProps) {\n const [headerActions, setHeaderActions] = useState<DocumentFieldActionNode[]>([]);\n\n const documentId = useFormValue([\"_id\"]);\n const publishedId = typeof documentId === \"string\" ? getPublishedId(documentId) : undefined;\n const focused = inputProps.focused === true;\n const fieldValidation = [...validation, ...collectMemberValidation(inputProps.members)];\n\n return (\n <>\n {isDefined(publishedId) && isDefined(actions) && (\n <FieldActionsResolver\n actions={actions}\n documentId={publishedId}\n documentType={schemaType.name}\n onActions={setHeaderActions}\n path={path}\n schemaType={schemaType}\n />\n )}\n <FieldActionsProvider actions={headerActions} focused={focused} path={path}>\n <FormField\n __unstable_headerActions={headerActions}\n __unstable_presence={presence}\n description={description}\n inputId={inputId}\n level={level}\n title={title}\n validation={fieldValidation}\n deprecated={schemaType.deprecated}\n path={path}\n readOnly={inputProps.readOnly}\n >\n <ChangeIndicator path={path} hasFocus={focused} isChanged={changed}>\n {children}\n </ChangeIndicator>\n </FormField>\n </FieldActionsProvider>\n </>\n );\n}\n","export function Hidden() {\n return null;\n}\n","import type { ComponentProps, ComponentType } from \"react\";\nimport { createElement } from \"react\";\n\n/** Default props for the plugin's own icons. Icons from `@sanity/icons` already match the Studio. */\nexport const defaultIconProps: ComponentProps<\"svg\"> = { width: \"1em\", height: \"1em\", strokeWidth: 1.5 };\n\n/**\n * Wraps an SVG icon component for use in the Studio.\n *\n * @param icon - The icon to wrap.\n * @param props - Props that override the Studio icon defaults.\n * @returns An icon component.\n */\nexport function createSanityIcon(icon: ComponentType<ComponentProps<\"svg\">>, props?: ComponentProps<\"svg\">) {\n const Icon = icon;\n\n function SanityIcon() {\n return createElement(Icon, { ...defaultIconProps, ...props });\n }\n\n return SanityIcon;\n}\n","import { BinaryDocumentIcon } from \"@sanity/icons/BinaryDocument\";\nimport { UploadIcon } from \"@sanity/icons/Upload\";\nimport { Button, Card, Flex, Text } from \"@sanity/ui\";\nimport type { ComponentProps, DragEvent } from \"react\";\nimport { useRef, useState } from \"react\";\n\nexport type DropZoneProps = Omit<ComponentProps<typeof Card>, \"children\" | \"onDrop\"> & {\n readOnly: boolean | undefined;\n onFiles: (files: File[]) => void;\n};\n\nexport function DropZone({ readOnly, onFiles, ...props }: DropZoneProps) {\n const [dragging, setDragging] = useState(false);\n const input = useRef<HTMLInputElement>(null);\n\n function handleDragOver(event: DragEvent<HTMLDivElement>) {\n if (readOnly === true) return;\n\n event.preventDefault();\n setDragging(true);\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>) {\n event.preventDefault();\n setDragging(false);\n\n if (readOnly !== true) onFiles([...event.dataTransfer.files]);\n }\n\n return (\n <Card\n tone={readOnly === true ? \"transparent\" : \"inherit\"}\n border\n paddingX={3}\n paddingY={2}\n radius={2}\n onDragOver={handleDragOver}\n onDragLeave={() => {\n setDragging(false);\n }}\n onDrop={handleDrop}\n {...props}\n >\n <Flex align=\"center\" gap={4} justify=\"space-between\">\n <Flex flex={1} align=\"center\" gap={3} paddingLeft={1}>\n <Text size={1} muted>\n <BinaryDocumentIcon />\n </Text>\n <Text size={1} muted>\n {dragging ? \"Drop to upload files\" : \"Drag WOFF2 or WOFF files here\"}\n </Text>\n </Flex>\n <Button\n type=\"button\"\n mode=\"bleed\"\n icon={UploadIcon}\n text=\"Upload\"\n disabled={readOnly}\n onClick={() => {\n input.current?.click();\n }}\n />\n <input\n ref={input}\n type=\"file\"\n accept=\".woff2,.woff\"\n multiple\n hidden\n onChange={(event) => {\n onFiles([...(event.currentTarget.files ?? [])]);\n event.currentTarget.value = \"\";\n }}\n />\n </Flex>\n </Card>\n );\n}\n","import { isDefined } from \"@repo/lib/utils\";\n\nimport { createStylesheetUrl } from \"@/lib/google\";\nimport type { SanityFontStyle, SanityFontWeight } from \"@/types\";\n\n/** An uploaded file to show a sample from. */\ninterface SampleFile {\n /** Address the file is served from. */\n url: string;\n /** Weight the file holds, or the lightest a variable font file covers. */\n weight: SanityFontWeight;\n /** Heaviest weight a variable font file covers, or undefined for a file with one weight. */\n maxWeight?: SanityFontWeight;\n /** Style the file holds. */\n style: SanityFontStyle;\n}\n\n/** A font to show a sample of: some text from a Google family, or uploaded files. */\nexport type FontSample =\n | {\n source: \"google\";\n /** Name of the family. */\n family: string;\n /** Weights to load. */\n weights: SanityFontWeight[];\n /** Styles to load. */\n styles: SanityFontStyle[];\n /** Characters to load, which keeps each request to a few hundred bytes. */\n text: string;\n }\n | {\n source: \"upload\";\n /** The files to load. */\n files: SampleFile[];\n };\n\n/** A font file to register, with the descriptors it's registered under. */\ninterface FaceSource {\n /** Address of the file. */\n url: string;\n /** Weight, or range of weights, the file covers. */\n weight: string;\n /** Style the file holds. */\n style: string;\n}\n\n/** Reads each `@font-face` rule in a Google Fonts stylesheet. */\nconst fontFacePattern = /@font-face\\s*\\{(?<body>[^}]*)\\}/gu;\n\n/**\n * Reads the files, weights, and styles out of a Google Fonts stylesheet.\n *\n * @param css - The stylesheet.\n * @returns The files.\n */\nfunction parseStylesheet(css: string) {\n return [...css.matchAll(fontFacePattern)].flatMap(({ groups }): FaceSource[] => {\n const body = groups?.[\"body\"] ?? \"\";\n const url = /src:\\s*url\\((?<url>[^)]+)\\)/u.exec(body)?.groups?.[\"url\"];\n const weight = /font-weight:\\s*(?<weight>[\\d ]+);/u.exec(body)?.groups?.[\"weight\"];\n const style = /font-style:\\s*(?<style>\\w+);/u.exec(body)?.groups?.[\"style\"];\n\n return isDefined(url) && isDefined(weight) && isDefined(style) ? [{ url, weight, style }] : [];\n });\n}\n\n/**\n * Lists the files a sample loads.\n *\n * @param sample - The sample.\n * @returns The files, or undefined when Google Fonts couldn't be reached.\n */\nasync function listFaceSources(sample: FontSample) {\n if (sample.source === \"upload\") {\n return sample.files.map(({ url, weight, maxWeight, style }) => ({\n url,\n weight: isDefined(maxWeight) && maxWeight > weight ? `${weight} ${maxWeight}` : `${weight}`,\n style,\n }));\n }\n\n const { family, weights, styles, text } = sample;\n const response = await fetch(createStylesheetUrl(family, weights, styles, \"swap\", text));\n if (!response.ok) return undefined;\n\n return parseStylesheet(await response.text());\n}\n\n/**\n * Loads a sample's files and registers them with the document under a name of their own, so a cut-down font made\n * for a preview never stands in for the real one anywhere else in the Studio.\n *\n * @param sample - The sample.\n * @param name - Name to register the files under.\n * @returns The name, or undefined when the files couldn't be loaded.\n */\nasync function loadSample(sample: FontSample, name: string) {\n try {\n const sources = await listFaceSources(sample);\n if (!isDefined(sources)) return undefined;\n\n const faces = await Promise.all(\n sources.map(async ({ url, weight, style }) => {\n const face = new FontFace(name, `url(${url})`, { weight, style });\n await face.load();\n\n return face;\n }),\n );\n\n for (const face of faces) document.fonts.add(face);\n\n return name;\n } catch {\n return undefined;\n }\n}\n\n/** Sample requests shared by every field in the session, keyed by what they load, since a font file never changes. */\nconst sampleRequests = new Map<string, Promise<string | undefined>>();\n\n/** Number of samples requested so far, which names each one uniquely even after a failed one is retried. */\nlet sampleCount = 0;\n\n/** Names of the samples that have loaded, keyed like the requests, so a sample shown again appears straight away. */\nconst loadedSamples = new Map<string, string>();\n\n/**\n * Builds the key a sample is requested under.\n *\n * @param sample - The sample.\n * @returns The key.\n */\nexport function getSampleKey(sample: FontSample) {\n return JSON.stringify(sample);\n}\n\n/**\n * Loads a sample, reusing a request already made for the same files. A request that fails is forgotten, so a file that\n * was still uploading loads the next time it's shown.\n *\n * @param sample - The sample.\n * @returns Name the files are registered under, or undefined when they couldn't be loaded.\n */\nexport async function requestSample(sample: FontSample) {\n const key = getSampleKey(sample);\n let request = sampleRequests.get(key);\n\n if (!isDefined(request)) {\n sampleCount += 1;\n request = loadSample(sample, `font-sample-${sampleCount}`);\n sampleRequests.set(key, request);\n }\n\n const name = await request;\n\n if (isDefined(name)) loadedSamples.set(key, name);\n else sampleRequests.delete(key);\n\n return name;\n}\n\n/**\n * Reads a sample that has already loaded, without waiting.\n *\n * @param key - The sample's key.\n * @returns Name the files are registered under, or undefined when the sample hasn't loaded.\n */\nexport function readLoadedSample(key: string) {\n return loadedSamples.get(key);\n}\n","import { isDefined } from \"@repo/lib/utils\";\nimport { useEffect, useState } from \"react\";\n\nimport type { FontSample } from \"@/lib/samples\";\nimport { getSampleKey, readLoadedSample, requestSample } from \"@/lib/samples\";\n\n/**\n * Loads a font sample. A sample that has already loaded is returned straight away, so it never flashes in the\n * Studio's own font when it's shown again.\n *\n * @param sample - The sample, or undefined when there's nothing to show.\n * @returns Name to set as the `font-family`, or undefined until the sample has loaded, and whether it's still loading.\n */\nexport function useFontSample(sample: FontSample | undefined) {\n const [settled, setSettled] = useState<{ key: string; name: string | undefined }>();\n\n const key = isDefined(sample) ? getSampleKey(sample) : undefined;\n const cached = isDefined(key) ? readLoadedSample(key) : undefined;\n\n useEffect(() => {\n if (!isDefined(sample) || !isDefined(key) || isDefined(readLoadedSample(key))) return undefined;\n\n let active = true;\n\n async function load(wanted: FontSample, wantedKey: string) {\n const name = await requestSample(wanted);\n if (active) setSettled({ key: wantedKey, name });\n }\n\n void load(sample, key);\n\n return () => {\n active = false;\n };\n }, [sample, key]);\n\n const result = settled?.key === key ? settled : undefined;\n const name = cached ?? result?.name;\n\n return { name, loading: isDefined(key) && !isDefined(name) && !isDefined(result) };\n}\n","import type { SanityFontWeight } from \"@/types\";\n\n/** Name type designers give each weight. */\nexport const fontWeightLabels: Record<SanityFontWeight, string> = {\n 100: \"Thin\",\n 200: \"ExtraLight\",\n 300: \"Light\",\n 400: \"Regular\",\n 500: \"Medium\",\n 600: \"SemiBold\",\n 700: \"Bold\",\n 800: \"ExtraBold\",\n 900: \"Black\",\n};\n","import { isDefined } from \"@repo/lib/utils\";\n\nimport { fontWeightLabels } from \"@/config/weights\";\nimport type { CatalogFamily } from \"@/lib/catalog\";\nimport type { SanityFontFile, SanityFontStyle, SanityFontWeight } from \"@/types\";\n\n/** One weight in one style. */\nexport interface FontVariant {\n /** The weight. */\n weight: SanityFontWeight;\n /** The style. */\n style: SanityFontStyle;\n}\n\n/**\n * Lists every combination of the weights and styles, lightest first, with each weight's italic after its normal.\n *\n * @param weights - The weights.\n * @param styles - The styles.\n * @returns The combinations.\n */\nexport function listVariants(weights: SanityFontWeight[], styles: SanityFontStyle[]): FontVariant[] {\n return weights.flatMap((weight) => styles.map((style) => ({ weight, style })));\n}\n\n/**\n * Names a weight and style the way type designers do, such as \"Bold Italic\".\n *\n * @param variant - The weight and style.\n * @returns The name.\n */\nexport function describeVariant({ weight, style }: FontVariant) {\n const label = fontWeightLabels[weight];\n\n if (style === \"normal\") return label;\n\n return weight === 400 ? \"Italic\" : `${label} Italic`;\n}\n\n/**\n * Names the weights and style a file holds, such as \"Bold Italic\", or \"Thin to Black\" for a variable font.\n *\n * @param file - The file's weight, heaviest weight, and style.\n * @returns The name.\n */\nexport function describeFile({ weight, maxWeight, style }: Pick<SanityFontFile, \"weight\" | \"maxWeight\" | \"style\">) {\n if (!isDefined(weight)) return \"Font file\";\n if (!isDefined(maxWeight)) return describeVariant({ weight, style: style ?? \"normal\" });\n\n const range = `${fontWeightLabels[weight]} to ${fontWeightLabels[maxWeight]}`;\n\n return style === \"italic\" ? `${range} Italic` : range;\n}\n\n/**\n * Checks whether a Google family has every weight, style, and character set a field requires.\n *\n * @param family - The family.\n * @param variants - The weights and styles required.\n * @param subsets - The character sets required.\n * @returns Whether the family meets them all.\n */\nexport function meetsRequirements(family: CatalogFamily, variants: FontVariant[], subsets: string[]) {\n const { weights, italics } = family;\n\n return (\n variants.every(({ weight, style }) => (style === \"italic\" ? italics : weights).includes(weight)) &&\n subsets.every((subset) => family.subsets.includes(subset))\n );\n}\n\n/**\n * Checks whether an uploaded file holds a weight and style, counting every weight a variable font file covers.\n *\n * @param file - The file.\n * @param variant - The weight and style.\n * @returns Whether the file holds it.\n */\nfunction holdsVariant(file: SanityFontFile, { weight, style }: FontVariant) {\n const { weight: lightest, maxWeight, style: fileStyle } = file;\n if (!isDefined(file.asset?._ref) || !isDefined(lightest) || (fileStyle ?? \"normal\") !== style) return false;\n\n return weight === lightest || (isDefined(maxWeight) && weight >= lightest && weight <= maxWeight);\n}\n\n/**\n * Identifies the weights and style a file holds, so two files holding the same ones can be told apart from the rest.\n *\n * @param file - The file's weight, heaviest weight, and style.\n * @returns The identifier.\n */\nexport function getCoverageKey({ weight, maxWeight, style }: Pick<SanityFontFile, \"weight\" | \"maxWeight\" | \"style\">) {\n return `${weight ?? \"\"}-${maxWeight ?? \"\"}-${style ?? \"normal\"}`;\n}\n\n/**\n * Lists the uploaded files that hold the same weights and style as a file before them.\n *\n * @param files - The uploaded files, in order.\n * @returns The repeated files.\n */\nexport function findDuplicateFiles(files: SanityFontFile[]) {\n const seen = new Set<string>();\n\n return files.filter((file) => {\n if (!isDefined(file.weight)) return false;\n\n const coverage = getCoverageKey(file);\n const repeated = seen.has(coverage);\n\n seen.add(coverage);\n\n return repeated;\n });\n}\n\n/**\n * Lists the weights and styles the uploaded files actually hold, for showing them. A variable font file shows the\n * required weights within its range, or its lightest and heaviest when none are.\n *\n * @param files - The uploaded files.\n * @param required - The weights and styles the field requires.\n * @returns The weights and styles, lightest first, with each weight's italic after its normal.\n */\nexport function listFileVariants(files: SanityFontFile[], required: FontVariant[]) {\n const variants = files.flatMap(({ asset, weight, maxWeight, style = \"normal\" }): FontVariant[] => {\n if (!isDefined(asset?._ref) || !isDefined(weight)) return [];\n if (!isDefined(maxWeight)) return [{ weight, style }];\n\n const inRange = required.filter(\n (variant) => variant.style === style && variant.weight >= weight && variant.weight <= maxWeight,\n );\n\n return isDefined(inRange)\n ? inRange\n : [\n { weight, style },\n { weight: maxWeight, style },\n ];\n });\n\n const unique = new Map(variants.map((variant) => [`${variant.weight}-${variant.style}`, variant]));\n\n return [...unique.values()].toSorted(\n (first, second) =>\n first.weight - second.weight || (first.style === \"italic\" ? 1 : 0) - (second.style === \"italic\" ? 1 : 0),\n );\n}\n\n/**\n * Lists the weights and styles a field requires that no uploaded file holds.\n *\n * @param files - The uploaded files.\n * @param variants - The weights and styles required.\n * @returns The missing weights and styles.\n */\nexport function listMissingVariants(files: SanityFontFile[], variants: FontVariant[]) {\n return variants.filter((variant) => !files.some((file) => holdsVariant(file, variant)));\n}\n","import { isDefined } from \"@repo/lib/utils\";\nimport { TrashIcon } from \"@sanity/icons/Trash\";\nimport { Badge, Box, Button, Card, Flex, Stack, Text } from \"@sanity/ui\";\nimport type { ComponentProps } from \"react\";\n\nimport { useFontSample } from \"@/hooks/use-font-sample\";\nimport { describeFile } from \"@/lib/requirements\";\nimport type { SanityFontStyle, SanityFontWeight } from \"@/types\";\n\nexport type FileRowProps = Omit<ComponentProps<typeof Card>, \"children\"> & {\n url: string | undefined;\n weight: SanityFontWeight | undefined;\n maxWeight: SanityFontWeight | undefined;\n style: SanityFontStyle | undefined;\n filename: string | undefined;\n uploading: boolean;\n duplicate: boolean;\n readOnly: boolean | undefined;\n onRemove: () => void;\n};\n\nexport function FileRow({\n url,\n weight,\n maxWeight,\n style,\n filename,\n uploading,\n duplicate,\n readOnly,\n onRemove,\n ...props\n}: FileRowProps) {\n const label = describeFile({ weight, maxWeight, style });\n const { name, loading } = useFontSample(\n isDefined(url) && isDefined(weight)\n ? {\n source: \"upload\",\n files: [{ url, weight, ...(isDefined(maxWeight) && { maxWeight }), style: style ?? \"normal\" }],\n }\n : undefined,\n );\n\n return (\n <Card padding={3} radius={2} border tone={duplicate ? \"caution\" : \"default\"} {...props}>\n <Flex align=\"center\" gap={3}>\n <Box style={{ width: 40, flexShrink: 0 }}>\n <Text\n size={3}\n align=\"center\"\n style={{\n fontFamily: isDefined(name) ? `\"${name}\"` : undefined,\n fontWeight: weight,\n fontStyle: style,\n opacity: loading ? 0 : 1,\n transition: \"opacity 150ms ease-out\",\n }}\n >\n Aa\n </Text>\n </Box>\n <Stack flex={1} gap={2} style={{ minWidth: 0 }}>\n <Text size={1} weight=\"medium\" textOverflow=\"ellipsis\">\n {label}\n </Text>\n {isDefined(filename) && (\n <Text size={1} muted textOverflow=\"ellipsis\" translate=\"no\">\n {filename}\n </Text>\n )}\n </Stack>\n {duplicate && <Badge tone=\"caution\">Duplicate</Badge>}\n <Button\n type=\"button\"\n mode=\"bleed\"\n tone=\"critical\"\n icon={TrashIcon}\n loading={uploading}\n disabled={readOnly === true || uploading}\n onClick={onRemove}\n aria-label={uploading ? `Uploading ${label}` : `Remove ${label}`}\n />\n </Flex>\n </Card>\n );\n}\n","import { isDefined } from \"@repo/lib/utils\";\nimport { createContext, useContext } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { logger } from \"@/config/defaults\";\nimport type { SanityFontCategory } from \"@/types\";\n\n/** What the font field shares with its files input, which can't otherwise change the font around it. */\ninterface FilesContextValues {\n /**\n * Sets the family name and kind of typeface where the font doesn't have them yet.\n *\n * @param family - The family name read from the files, or undefined when they don't name one.\n * @param category - The kind of typeface read from the files, or undefined when they don't say.\n */\n fillDetails: (family: string | undefined, category: SanityFontCategory | undefined) => void;\n}\n\nexport type FilesProviderProps = FilesContextValues & {\n children: ReactNode;\n};\n\nconst FilesContext = createContext<FilesContextValues | undefined>(undefined);\n\n/**\n * Reads what the font field shares with its files input.\n *\n * @returns A function that fills in the family name and kind of typeface.\n * @throws When used outside the provider.\n */\nexport function useFilesContext() {\n const filesContext = useContext(FilesContext);\n\n if (!isDefined(filesContext)) {\n throw new Error(logger.format(\"The files input is only available inside a font field.\"));\n }\n\n return filesContext;\n}\n\n/**\n * Provides a way to fill in the font's family name and kind of typeface to its files input.\n *\n * @returns The provider.\n */\nexport function FilesProvider({ fillDetails, children }: FilesProviderProps) {\n return <FilesContext value={{ fillDetails }}>{children}</FilesContext>;\n}\n","/** Original filename of each asset, by asset ID. */\nexport const assetFilenamesQuery = \"*[_id in $ids] { _id, originalFilename }\";\n","import { isDefined } from \"@repo/lib/utils\";\nimport { useEffect, useState } from \"react\";\nimport { useClient } from \"sanity\";\n\nimport { apiVersion } from \"@/config/defaults\";\nimport { assetFilenamesQuery } from \"@/groq/assets\";\n\n/**\n * Looks up the original filenames of uploaded file assets, which the stored references don't carry.\n *\n * @param references - IDs of the assets.\n * @returns Each filename, keyed by asset ID, once they've loaded.\n */\nexport function useAssetFilenames(references: string[]) {\n const client = useClient({ apiVersion });\n const [filenames, setFilenames] = useState<Record<string, string>>({});\n\n const key = references.toSorted().join(\",\");\n\n useEffect(() => {\n if (!isDefined(key)) return undefined;\n\n let active = true;\n\n async function load(ids: string[]) {\n const assets = await client.fetch<{ _id: string; originalFilename?: string }[]>(assetFilenamesQuery, { ids });\n if (!active) return;\n\n setFilenames(\n Object.fromEntries(\n assets.flatMap(({ _id, originalFilename }) => (isDefined(originalFilename) ? [[_id, originalFilename]] : [])),\n ),\n );\n }\n\n void load(key.split(\",\"));\n\n return () => {\n active = false;\n };\n }, [client, key]);\n\n return filenames;\n}\n","import { isDefined } from \"@repo/lib/utils\";\n\n/**\n * Builds the address Sanity serves an uploaded file from, given its asset ID.\n *\n * @param reference - ID of the file asset, such as `file-abc123-woff2`.\n * @param projectId - ID of the Sanity project.\n * @param dataset - Name of the dataset.\n * @returns The address, or undefined when the ID isn't a file asset's.\n */\nexport function createFileUrl(reference: string | undefined, projectId: string, dataset: string) {\n const match = reference?.match(/^file-(?<hash>[\\da-f]+)-(?<extension>\\w+)$/u);\n const { hash, extension } = match?.groups ?? {};\n if (!isDefined(hash) || !isDefined(extension)) return undefined;\n\n return `https://cdn.sanity.io/files/${projectId}/${dataset}/${hash}.${extension}`;\n}\n","import { isDefined } from \"@repo/lib/utils\";\n\nimport type { SanityFontCategory, SanityFontStyle, SanityFontWeight } from \"@/types\";\nimport { fontWeights } from \"@/types\";\n\n/** What a font file says about itself. */\nexport interface FontFileDetails {\n /** Name of the family the file belongs to, or undefined when the file doesn't name one. */\n family?: string;\n /** Kind of typeface, or undefined when the file doesn't say. */\n category?: SanityFontCategory;\n /** Weight the file holds, or the lightest a variable font file covers. */\n weight: SanityFontWeight;\n /** Heaviest weight a variable font file covers, or undefined for a file with one weight. */\n maxWeight?: SanityFontWeight;\n /** Style the file holds. */\n style: SanityFontStyle;\n}\n\n/** Tables the details are read from, as raw bytes keyed by tag. */\ntype FontTables = Map<string, DataView>;\n\n/** The browser's decompression, taking any format name, since TypeScript's types don't list Brotli yet. */\ntype Decompressor = new (format: string) => DecompressionStream;\n\n/** Tables the details are read from. */\nconst wantedTables = new Set([\"OS/2\", \"fvar\", \"name\", \"post\"]);\n\n/** Tags WOFF2 abbreviates to an index, in the order the specification lists them. */\nconst knownTags = [\n \"cmap\",\n \"head\",\n \"hhea\",\n \"hmtx\",\n \"maxp\",\n \"name\",\n \"OS/2\",\n \"post\",\n \"cvt \",\n \"fpgm\",\n \"glyf\",\n \"loca\",\n \"prep\",\n \"CFF \",\n \"VORG\",\n \"EBDT\",\n \"EBLC\",\n \"gasp\",\n \"hdmx\",\n \"kern\",\n \"LTSH\",\n \"PCLT\",\n \"VDMX\",\n \"vhea\",\n \"vmtx\",\n \"BASE\",\n \"GDEF\",\n \"GPOS\",\n \"GSUB\",\n \"EBSC\",\n \"JSTF\",\n \"MATH\",\n \"CBDT\",\n \"CBLC\",\n \"COLR\",\n \"CPAL\",\n \"SVG \",\n \"sbix\",\n \"acnt\",\n \"avar\",\n \"bdat\",\n \"bloc\",\n \"bsln\",\n \"cvar\",\n \"fdsc\",\n \"feat\",\n \"fmtx\",\n \"fvar\",\n \"gvar\",\n \"hsty\",\n \"just\",\n \"lcar\",\n \"mort\",\n \"morx\",\n \"opbd\",\n \"prop\",\n \"trak\",\n \"Zapf\",\n \"Silf\",\n \"Glat\",\n \"Gloc\",\n \"Feat\",\n \"Sill\",\n];\n\n/**\n * Checks whether a value is the browser's decompression.\n *\n * @param value - The value to check.\n * @returns True if the value can be constructed.\n */\nfunction isDecompressor(value: unknown): value is Decompressor {\n return typeof value === \"function\";\n}\n\n/**\n * Creates the browser's decompression for a format.\n *\n * @param format - The format.\n * @returns The decompression.\n * @throws When the browser has no decompression, or doesn't support the format.\n */\nfunction createDecompression(format: string) {\n const Decompression: unknown = globalThis.DecompressionStream;\n if (!isDecompressor(Decompression)) throw new Error(\"The browser can't decompress fonts.\");\n\n return new Decompression(format);\n}\n\n/**\n * Checks whether the browser can decompress Brotli itself.\n *\n * @returns Whether it can.\n */\nfunction supportsBrotli() {\n try {\n return isDefined(createDecompression(\"brotli\"));\n } catch {\n return false;\n }\n}\n\n/**\n * Decompresses bytes, with the browser's own decompression where it can. Chrome and Edge can't decompress Brotli yet,\n * so they load a decoder for it, and only when a WOFF2 file is read.\n *\n * @param data - The compressed bytes.\n * @param format - The compression: zlib for WOFF, or Brotli for WOFF2.\n * @returns The decompressed bytes.\n */\nasync function decompress(data: Uint8Array, format: \"deflate\" | \"brotli\") {\n if (format === \"brotli\" && !supportsBrotli()) {\n const { decompress: decode } = await import(\"brotli/decompress\");\n\n return decode(data);\n }\n\n const stream = new Blob([new Uint8Array(data)]).stream().pipeThrough(createDecompression(format));\n\n return new Uint8Array(await new Response(stream).arrayBuffer());\n}\n\n/**\n * Reads four bytes as a table tag.\n *\n * @param view - The bytes.\n * @param offset - Where the tag starts.\n * @returns The tag.\n */\nfunction readTag(view: DataView, offset: number) {\n return String.fromCodePoint(\n view.getUint8(offset),\n view.getUint8(offset + 1),\n view.getUint8(offset + 2),\n view.getUint8(offset + 3),\n );\n}\n\n/**\n * Finds the wanted tables in a WOFF file, each compressed on its own.\n *\n * @param view - The file.\n * @returns The tables.\n */\nasync function readWoffTables(view: DataView): Promise<FontTables> {\n const count = view.getUint16(12);\n const entries = Array.from({ length: count }, (_, index) => {\n const entry = 44 + index * 20;\n\n return {\n tag: readTag(view, entry),\n offset: view.getUint32(entry + 4),\n length: view.getUint32(entry + 8),\n originalLength: view.getUint32(entry + 12),\n };\n });\n\n const tables = await Promise.all(\n entries\n .filter(({ tag }) => wantedTables.has(tag))\n .map(async ({ tag, offset, length, originalLength }) => {\n const data = new Uint8Array(view.buffer, view.byteOffset + offset, length);\n const table = length < originalLength ? await decompress(data, \"deflate\") : data;\n\n return [tag, new DataView(table.buffer, table.byteOffset, table.byteLength)] as const;\n }),\n );\n\n return new Map(tables);\n}\n\n/**\n * Reads a WOFF2 variable-length number, which spends seven bits of each byte on the value.\n *\n * @param view - The file.\n * @param offset - Where the number starts.\n * @returns The number, and where the next value starts.\n */\nfunction readBase128(view: DataView, offset: number) {\n let value = 0;\n\n for (let index = 0; index < 5; index += 1) {\n const byte = view.getUint8(offset + index);\n\n // The low seven bits carry the value, and the high bit says whether another byte follows.\n value = value * 128 + (byte % 128);\n if (byte < 128) return { value, next: offset + index + 1 };\n }\n\n throw new Error(\"The number is longer than WOFF2 allows.\");\n}\n\n/**\n * Finds the wanted tables in a WOFF2 file, whose tables are compressed together. The tables read are never\n * transformed, so they're used exactly as they come out.\n *\n * @param view - The file.\n * @returns The tables, or undefined for a file of several fonts.\n */\nasync function readWoff2Tables(view: DataView): Promise<FontTables | undefined> {\n if (readTag(view, 4) === \"ttcf\") return undefined;\n\n const count = view.getUint16(12);\n const compressedLength = view.getUint32(20);\n const entries: { tag: string; length: number }[] = [];\n let offset = 48;\n\n for (let index = 0; index < count; index += 1) {\n const flags = view.getUint8(offset);\n // The low six bits index the known tags, and the top two give the transform version.\n const known = knownTags[flags % 64];\n const tag = known ?? readTag(view, offset + 1);\n const version = Math.floor(flags / 64);\n const original = readBase128(view, offset + (isDefined(known) ? 1 : 5));\n const transformed = tag === \"glyf\" || tag === \"loca\" ? version === 0 : version !== 0;\n const stored = transformed ? readBase128(view, original.next) : undefined;\n\n entries.push({ tag, length: stored?.value ?? original.value });\n offset = stored?.next ?? original.next;\n }\n\n const data = await decompress(new Uint8Array(view.buffer, view.byteOffset + offset, compressedLength), \"brotli\");\n const tables: FontTables = new Map();\n let start = 0;\n\n for (const { tag, length } of entries) {\n if (wantedTables.has(tag)) tables.set(tag, new DataView(data.buffer, data.byteOffset + start, length));\n start += length;\n }\n\n return tables;\n}\n\n/**\n * Rounds a weight to the nearest one a font can be loaded in.\n *\n * @param value - The weight.\n * @returns The nearest weight from 100 to 900.\n */\nfunction roundWeight(value: number): SanityFontWeight {\n const rounded = Math.min(900, Math.max(100, Math.round(value / 100) * 100));\n\n return fontWeights.find((weight) => weight === rounded) ?? 400;\n}\n\n/**\n * Reads the weight range of a variable font from its axes.\n *\n * @param table - The `fvar` table, or undefined for a font that isn't variable.\n * @returns The lightest and heaviest weights, or undefined when the font has no weight axis.\n */\nfunction readWeightAxis(table: DataView | undefined) {\n if (!isDefined(table)) return undefined;\n\n const axesOffset = table.getUint16(4);\n const axisCount = table.getUint16(8);\n const axisSize = table.getUint16(10);\n\n for (let index = 0; index < axisCount; index += 1) {\n const axis = axesOffset + index * axisSize;\n\n // Axis values are 16.16 fixed-point numbers.\n if (readTag(table, axis) === \"wght\") {\n return { min: table.getInt32(axis + 4) / 65_536, max: table.getInt32(axis + 12) / 65_536 };\n }\n }\n\n return undefined;\n}\n\n/**\n * Reads the kind of typeface from the classifications a font records about itself: the fixed-pitch flag for monospace,\n * then the IBM family class, then the PANOSE classification.\n *\n * @param metrics - The `OS/2` table.\n * @param post - The `post` table, or undefined when the file has none.\n * @returns The kind of typeface, or undefined when the font doesn't say.\n */\nfunction readCategory(metrics: DataView, post: DataView | undefined): SanityFontCategory | undefined {\n const familyClass = metrics.getUint8(30);\n const panoseFamily = metrics.getUint8(32);\n const panoseSerif = metrics.getUint8(33);\n const panoseProportion = metrics.getUint8(35);\n\n if ((isDefined(post) && post.getUint32(12) !== 0) || (panoseFamily === 2 && panoseProportion === 9)) {\n return \"monospace\";\n }\n\n // IBM classes: 1 to 7 are serif styles, 8 sans serif, 9 ornamentals, and 10 scripts.\n if (familyClass >= 1 && familyClass <= 7) return \"serif\";\n if (familyClass === 8) return \"sans-serif\";\n if (familyClass === 9) return \"display\";\n if (familyClass === 10) return \"handwriting\";\n\n // PANOSE families: 2 is Latin text (serif styles 2 to 10, sans 11 to 15), 3 hand-written, and 4 decorative.\n if (panoseFamily === 3) return \"handwriting\";\n if (panoseFamily === 4) return \"display\";\n if (panoseFamily === 2 && panoseSerif >= 2 && panoseSerif <= 10) return \"serif\";\n if (panoseFamily === 2 && panoseSerif >= 11 && panoseSerif <= 15) return \"sans-serif\";\n\n return undefined;\n}\n\n/**\n * Reads the family name, preferring the typographic family over the legacy one, which can include the weight.\n *\n * @param table - The `name` table, or undefined when the file has none.\n * @returns The family name, or undefined when there isn't one.\n */\nfunction readFamilyName(table: DataView | undefined) {\n if (!isDefined(table)) return undefined;\n\n const count = table.getUint16(2);\n const storage = table.getUint16(4);\n const records = Array.from({ length: count }, (_, index) => {\n const record = 6 + index * 12;\n\n return {\n platform: table.getUint16(record),\n language: table.getUint16(record + 4),\n name: table.getUint16(record + 6),\n length: table.getUint16(record + 8),\n offset: table.getUint16(record + 10),\n };\n });\n\n for (const wanted of [16, 1]) {\n // Windows names in US English first, then any Windows name, then Mac names.\n const record =\n records.find(({ platform, language, name }) => platform === 3 && language === 0x04_09 && name === wanted) ??\n records.find(({ platform, name }) => platform === 3 && name === wanted) ??\n records.find(({ platform, name }) => platform === 1 && name === wanted);\n if (!isDefined(record)) continue;\n\n const bytes = new Uint8Array(table.buffer, table.byteOffset + storage + record.offset, record.length);\n const name = new TextDecoder(record.platform === 3 ? \"utf-16be\" : \"macintosh\").decode(bytes).trim();\n if (isDefined(name)) return name;\n }\n\n return undefined;\n}\n\n/**\n * Reads a WOFF or WOFF2 file's family name, its weight or, for a variable font, its range of weights, and its style.\n *\n * @param buffer - The file.\n * @returns The details, or undefined when the file isn't a WOFF or WOFF2 font, holds several fonts, or can't be read.\n */\nexport async function readFontFile(buffer: ArrayBuffer): Promise<FontFileDetails | undefined> {\n try {\n const view = new DataView(buffer);\n const signature = readTag(view, 0);\n let tables: FontTables | undefined = undefined;\n\n if (signature === \"wOFF\") tables = await readWoffTables(view);\n else if (signature === \"wOF2\") tables = await readWoff2Tables(view);\n\n const metrics = tables?.get(\"OS/2\");\n if (!isDefined(tables) || !isDefined(metrics)) return undefined;\n\n const selection = metrics.getUint16(62);\n const axis = readWeightAxis(tables.get(\"fvar\"));\n const family = readFamilyName(tables.get(\"name\"));\n const category = readCategory(metrics, tables.get(\"post\"));\n const weight = roundWeight(axis?.min ?? metrics.getUint16(4));\n const maxWeight = isDefined(axis) ? roundWeight(axis.max) : undefined;\n\n return {\n ...(isDefined(family) && { family }),\n ...(isDefined(category) && { category }),\n weight,\n ...(isDefined(maxWeight) && maxWeight > weight && { maxWeight }),\n // Bit 0 of `fsSelection` marks italic, and bit 9 oblique.\n style: selection % 2 === 1 || Math.floor(selection / 512) % 2 === 1 ? \"italic\" : \"normal\",\n };\n } catch {\n return undefined;\n }\n}\n","import { isDefined, isRecord } from \"@repo/lib/utils\";\nimport { Card, Stack, Text } from \"@sanity/ui\";\nimport { randomKey } from \"@sanity/util/content\";\nimport { useState } from \"react\";\nimport type { ArrayOfObjectsInputProps } from \"sanity\";\nimport { insert, setIfMissing, unset, useClient } from \"sanity\";\n\nimport { DropZone } from \"@/components/files/drop-zone\";\nimport { FileRow } from \"@/components/files/file-row\";\nimport { apiVersion, logger, uploadConcurrency, uploadRetries } from \"@/config/defaults\";\nimport { useFilesContext } from \"@/contexts/files\";\nimport { useAssetFilenames } from \"@/hooks/use-asset-filenames\";\nimport { createFileUrl } from \"@/lib/files\";\nimport type { FontFileDetails } from \"@/lib/font-file\";\nimport { readFontFile } from \"@/lib/font-file\";\nimport { describeFile, findDuplicateFiles, getCoverageKey } from \"@/lib/requirements\";\nimport type { SanityFontFile } from \"@/types\";\nimport { fontFileTypeName } from \"@/types\";\n\n/** A file that has been read and is still uploading. */\ninterface PendingFile {\n /** Key the file is stored under once it's uploaded. */\n key: string;\n /** Name of the file on the author's computer. */\n filename: string;\n /** Address of the file in the browser, so it previews before it's uploaded. */\n url: string;\n /** What the file holds. */\n details: FontFileDetails;\n}\n\n/** A message about files that weren't added, shown until the next files are added. */\ninterface Notice {\n /** Whether the files failed, or were left out on purpose. */\n tone: \"critical\" | \"caution\";\n /** What happened, naming the file. */\n message: string;\n}\n\n/**\n * Checks whether an array item is an uploaded font file.\n *\n * @param item - The item.\n * @returns True if the item is a font file.\n */\nfunction isFontFile(item: unknown): item is SanityFontFile {\n return isRecord(item) && item[\"_type\"] === fontFileTypeName && typeof item[\"_key\"] === \"string\";\n}\n\n/**\n * Picks the family most of the files belong to, the earliest winning a tie, so one stray file doesn't decide it.\n *\n * @param families - Family name of each file, in order.\n * @returns The family, or undefined when no file names one.\n */\nfunction findCommonFamily(families: string[]) {\n const counts = new Map<string, number>();\n\n for (const family of families) counts.set(family, (counts.get(family) ?? 0) + 1);\n\n let common: string | undefined = undefined;\n let highest = 0;\n\n for (const [family, count] of counts) {\n if (count > highest) {\n common = family;\n highest = count;\n }\n }\n\n return common;\n}\n\n/**\n * Builds a stored file from an asset and what it holds.\n *\n * @param key - Key to store the file under.\n * @param assetId - ID of the file asset.\n * @param details - What the file holds.\n * @returns The stored file.\n */\nfunction createFontFile(key: string, assetId: string, { family, weight, maxWeight, style }: FontFileDetails) {\n return {\n _type: fontFileTypeName,\n _key: key,\n asset: { _type: \"reference\", _ref: assetId },\n ...(isDefined(family) && { family }),\n weight,\n ...(isDefined(maxWeight) && { maxWeight }),\n style,\n };\n}\n\nexport type FilesInputProps = ArrayOfObjectsInputProps;\n\nexport function FilesInput({ value, onChange, readOnly }: FilesInputProps) {\n const { fillDetails } = useFilesContext();\n const client = useClient({ apiVersion });\n const { projectId, dataset } = client.config();\n\n const [pending, setPending] = useState<PendingFile[]>([]);\n const [notices, setNotices] = useState<Notice[]>([]);\n const [uploadedNames, setUploadedNames] = useState<Record<string, string>>({});\n\n const files = (value ?? []).filter((item) => isFontFile(item));\n const references = files.flatMap(({ asset }) => (isDefined(asset?._ref) ? [asset._ref] : []));\n const storedNames = useAssetFilenames(references);\n const filenames = { ...storedNames, ...uploadedNames };\n const duplicates = new Set(findDuplicateFiles(files).map(({ _key }) => _key));\n\n const rows = [\n ...files.map(({ _key, asset, weight, maxWeight, style }) => ({\n key: _key,\n url: isDefined(projectId) && isDefined(dataset) ? createFileUrl(asset?._ref, projectId, dataset) : undefined,\n weight,\n maxWeight,\n style,\n filename: isDefined(asset?._ref) ? filenames[asset._ref] : undefined,\n uploading: false,\n })),\n ...pending.map(({ key, filename, url, details }) => ({ key, url, ...details, filename, uploading: true })),\n ].toSorted(\n (first, second) =>\n (first.weight ?? 0) - (second.weight ?? 0) ||\n (first.style === \"italic\" ? 1 : 0) - (second.style === \"italic\" ? 1 : 0),\n );\n\n /**\n * Uploads a file, trying again when the upload fails.\n *\n * @param file - The file.\n * @param filename - Name to store the file under.\n * @param retries - Times left to try again.\n * @returns The uploaded asset.\n * @throws When the last attempt fails.\n */\n async function uploadAsset(file: File, filename: string, retries: number): ReturnType<typeof client.assets.upload> {\n try {\n const asset = await client.assets.upload(\"file\", file, { filename });\n\n return asset;\n } catch (error) {\n if (retries <= 0) throw error;\n\n return uploadAsset(file, filename, retries - 1);\n }\n }\n\n /**\n * Uploads one file that has been read and adds it to the font.\n *\n * @param file - The file.\n * @param pendingFile - The file as it's shown while uploading.\n */\n async function upload(file: File, { key, filename, url, details }: PendingFile) {\n try {\n const asset = await uploadAsset(file, filename, uploadRetries);\n\n setUploadedNames((current) => ({ ...current, [asset._id]: asset.originalFilename ?? filename }));\n onChange([setIfMissing([]), insert([createFontFile(key, asset._id, details)], \"after\", [-1])]);\n } catch (error) {\n logger.warn(`Couldn't upload ${filename}: ${error instanceof Error ? error.message : String(error)}`);\n setNotices((current) => [\n ...current,\n { tone: \"critical\", message: `${filename} couldn't be uploaded. Try again.` },\n ]);\n }\n\n setPending((current) => current.filter((entry) => entry.key !== key));\n URL.revokeObjectURL(url);\n }\n\n async function handleFiles(selected: File[]) {\n const read = await Promise.all(\n selected.map(async (file) => ({ file, details: await readFontFile(await file.arrayBuffer()) })),\n );\n\n const held = new Map(\n [...files, ...pending.map(({ details }) => details)].map((file) => [getCoverageKey(file), describeFile(file)]),\n );\n const family =\n [...files.map((file) => file.family), ...pending.map(({ details }) => details.family)].find((name) =>\n isDefined(name),\n ) ?? findCommonFamily(read.flatMap(({ details }) => (isDefined(details?.family) ? [details.family] : [])));\n const fresh: Notice[] = [];\n const uploads: { file: File; pendingFile: PendingFile }[] = [];\n\n for (const { file, details } of read) {\n if (!isDefined(details)) {\n fresh.push({ tone: \"critical\", message: `${file.name} isn't a WOFF or WOFF2 font, or couldn't be read.` });\n continue;\n }\n\n if (isDefined(family) && isDefined(details.family) && details.family !== family) {\n fresh.push({\n tone: \"caution\",\n message: `${file.name} wasn't added. Every file in a font must come from the same family, and this one is from ${details.family}, not ${family}.`,\n });\n continue;\n }\n\n const coverage = getCoverageKey(details);\n const existing = held.get(coverage);\n\n if (isDefined(existing)) {\n fresh.push({ tone: \"caution\", message: `${file.name} wasn't added, because ${existing} is already uploaded.` });\n continue;\n }\n\n held.set(coverage, describeFile(details));\n uploads.push({\n file,\n pendingFile: { key: randomKey(12), filename: file.name, url: URL.createObjectURL(file), details },\n });\n }\n\n setNotices(fresh);\n\n if (isDefined(uploads)) {\n const category = uploads.map(({ pendingFile }) => pendingFile.details.category).find((kind) => isDefined(kind));\n\n fillDetails(family, category);\n }\n\n setPending((current) => [...current, ...uploads.map(({ pendingFile }) => pendingFile)]);\n\n const queue = [...uploads];\n\n /** Uploads the queued files one after another. */\n async function drain(): Promise<void> {\n const next = queue.shift();\n if (!isDefined(next)) return;\n\n await upload(next.file, next.pendingFile);\n await drain();\n }\n\n await Promise.all(Array.from({ length: Math.min(uploadConcurrency, queue.length) }, drain));\n }\n\n return (\n <Stack gap={3}>\n {isDefined(rows) && (\n <Stack gap={2}>\n {rows.map(({ key, url, weight, maxWeight, style, filename, uploading }) => (\n <FileRow\n key={key}\n url={url}\n weight={weight}\n maxWeight={maxWeight}\n style={style}\n filename={filename}\n uploading={uploading}\n duplicate={duplicates.has(key)}\n readOnly={readOnly}\n onRemove={() => {\n onChange(unset([{ _key: key }]));\n }}\n />\n ))}\n </Stack>\n )}\n {([\"critical\", \"caution\"] as const).map((tone) => {\n const messages = notices.filter((notice) => notice.tone === tone);\n\n return (\n isDefined(messages) && (\n <Card key={tone} tone={tone} padding={3} radius={2} border>\n <Stack gap={3}>\n {messages.map(({ message }) => (\n <Text key={message} size={1}>\n {message}\n </Text>\n ))}\n </Stack>\n </Card>\n )\n );\n })}\n <DropZone\n readOnly={readOnly}\n onFiles={(selected) => {\n void handleFiles(selected);\n }}\n />\n </Stack>\n );\n}\n","import { WarningOutlineIcon } from \"@sanity/icons/WarningOutline\";\nimport { Card, Flex, Stack, Text } from \"@sanity/ui\";\nimport type { ComponentProps } from \"react\";\n\nexport type CodeTextProps = Omit<ComponentProps<\"span\">, \"children\"> & {\n text: string;\n};\n\nexport function CodeText({ text, ...props }: CodeTextProps) {\n const parts = text.split(\"`\");\n\n return (\n <span {...props}>\n {parts.map((part, index) => {\n const start = parts.slice(0, index).join(\"`\").length;\n\n return index % 2 === 1 ? <code key={start}>{part}</code> : part;\n })}\n </span>\n );\n}\n\nexport type ProblemProps = Omit<ComponentProps<typeof Card>, \"children\"> & {\n problem: { title: string; description: string };\n};\n\nexport function Problem({ problem, ...props }: ProblemProps) {\n return (\n <Card tone=\"caution\" padding={4} radius={2} border {...props}>\n <Flex gap={3}>\n <Text size={1}>\n <WarningOutlineIcon />\n </Text>\n <Stack gap={3}>\n <Text size={1} weight=\"medium\">\n <CodeText text={problem.title} />\n </Text>\n <Text size={1} muted>\n <CodeText text={problem.description} />\n </Text>\n </Stack>\n </Flex>\n </Card>\n );\n}\n","/** Layout of a virtualised grid whose rows all have the same height. */\nexport interface GridLayout {\n /** Items per row. */\n columns: number;\n /** Distance in pixels from the top of one row to the top of the next. */\n rowHeight: number;\n /** Rows visible at once. */\n visibleRows: number;\n /** Height in pixels of the scrolling area. */\n height: number;\n /** Extra rows rendered above and below the visible ones, so rows are already drawn as they scroll into view. */\n overscan: number;\n}\n\n/**\n * Works out which item a key press moves to.\n *\n * @param layout - The grid's layout.\n * @param key - The key pressed.\n * @param current - Index of the current item.\n * @param last - Index of the last item.\n * @returns The new index, or undefined when the key doesn't move.\n */\nexport function getNextIndex({ columns }: GridLayout, key: string, current: number, last: number) {\n if (key === \"ArrowRight\") return current + 1;\n if (key === \"ArrowLeft\") return current - 1;\n if (key === \"ArrowDown\") return current + columns;\n if (key === \"ArrowUp\") return current - columns;\n if (key === \"Home\") return 0;\n if (key === \"End\") return last;\n\n return undefined;\n}\n\n/**\n * Works out which rows to render at a scroll position, so only items near the viewport are mounted.\n * Padding replaces the other rows, so the scrollbar stays the right size.\n *\n * @param layout - The grid's layout.\n * @param scrollRow - The row scrolled to.\n * @param count - Number of items in the grid.\n * @returns The first and last rows to render, and the total number of rows.\n */\nexport function getVisibleRows({ columns, visibleRows, overscan }: GridLayout, scrollRow: number, count: number) {\n const totalRows = Math.ceil(count / columns);\n const firstRow = Math.max(0, scrollRow - overscan);\n const lastRow = Math.min(totalRows, firstRow + visibleRows + overscan * 2);\n\n return { totalRows, firstRow, lastRow };\n}\n\n/**\n * Works out the scroll position that centres an item, for opening on the selected one.\n *\n * @param layout - The grid's layout.\n * @param index - Index of the item.\n * @returns The scroll position.\n */\nexport function getCenteredScrollTop({ columns, rowHeight, height }: GridLayout, index: number) {\n return Math.max(0, Math.floor(index / columns) * rowHeight - height / 2);\n}\n\n/**\n * Works out the scroll position that brings an item into view, keeping the current one if it's already visible. It\n * uses the index because Home and End can move to rows that aren't mounted.\n *\n * @param layout - The grid's layout.\n * @param index - Index of the item.\n * @param scrollTop - The current scroll position.\n * @returns The scroll position.\n */\nexport function getRevealedScrollTop({ columns, rowHeight, height }: GridLayout, index: number, scrollTop: number) {\n const top = Math.floor(index / columns) * rowHeight;\n\n if (top < scrollTop) return top;\n if (top + rowHeight > scrollTop + height) return top + rowHeight - height;\n\n return scrollTop;\n}\n","import type { SanityFontCategory } from \"@/types\";\n\n/** Readable name of each kind of typeface. */\nexport const fontCategoryLabels: Record<SanityFontCategory, string> = {\n \"sans-serif\": \"Sans Serif\",\n serif: \"Serif\",\n display: \"Display\",\n handwriting: \"Handwriting\",\n monospace: \"Monospace\",\n};\n","import type { GridLayout } from \"@repo/lib/grid\";\n\n/** Card height in pixels, fixed so the grid never reflows as previews load. */\nexport const gridCardHeight = 72;\n\n/** Gap between cards in pixels, across and down. */\nexport const gridGap = 8;\n\n/** Distance from one row to the next, used to position the rendered rows. */\nexport const gridRowHeight = gridCardHeight + gridGap;\n\n/** Families per row. */\nexport const gridColumns = 3;\n\n/** Rows visible at once. */\nconst gridVisibleRows = 5;\n\n/** Height of the scrolling area. The last row has no gap after it. */\nexport const gridHeight = gridVisibleRows * gridRowHeight - gridGap;\n\n/**\n * Layout the grid's scrolling and keyboard movement work from. A whole screen of rows is mounted above and below the\n * visible ones, so their previews have loaded by the time they scroll into view.\n */\nexport const gridLayout: GridLayout = {\n columns: gridColumns,\n rowHeight: gridRowHeight,\n visibleRows: gridVisibleRows,\n height: gridHeight,\n overscan: gridVisibleRows,\n};\n","import { isDefined } from \"@repo/lib/utils\";\nimport { Box, Button, Stack, Text } from \"@sanity/ui\";\nimport type { ComponentProps } from \"react\";\n\nimport { fontCategoryLabels } from \"@/config/categories\";\nimport { gridCardHeight } from \"@/config/grid\";\nimport { useFontSample } from \"@/hooks/use-font-sample\";\nimport type { CatalogFamily } from \"@/lib/catalog\";\nimport type { FontSample } from \"@/lib/samples\";\n\nexport type CellProps = Omit<ComponentProps<typeof Button>, \"selected\" | \"onSelect\" | \"onClick\" | \"children\"> & {\n family: CatalogFamily;\n selected: boolean;\n focusable: boolean;\n position: number;\n total: number;\n onSelect: (family: CatalogFamily) => void;\n};\n\n/**\n * Describes the sample a card shows: the family's name, in its regular weight or the nearest it has.\n *\n * @param family - The family.\n * @returns The sample.\n */\nfunction createCellSample({ family, weights, italics }: CatalogFamily): FontSample {\n const italic = !isDefined(weights);\n const available = italic ? italics : weights;\n const [weight = 400] = available.toSorted((first, second) => Math.abs(first - 400) - Math.abs(second - 400));\n\n return { source: \"google\", family, weights: [weight], styles: [italic ? \"italic\" : \"normal\"], text: family };\n}\n\nexport function Cell({ family, selected, focusable, position, total, onSelect, ...props }: CellProps) {\n const { name, loading } = useFontSample(createCellSample(family));\n const { weights, italics, variable } = family;\n const count = new Set([...weights, ...italics]).size;\n const details = [\n fontCategoryLabels[family.category],\n variable ? \"Variable\" : `${count} ${count === 1 ? \"weight\" : \"weights\"}`,\n ];\n\n return (\n <Button\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n aria-posinset={position}\n aria-setsize={total}\n tabIndex={focusable ? 0 : -1}\n mode=\"bleed\"\n selected={selected}\n padding={3}\n style={{ height: gridCardHeight, minWidth: 0, boxShadow: \"inset 0 0 0 1px var(--card-border-color)\" }}\n aria-label={[family.family, ...details].join(\", \")}\n onClick={() => {\n onSelect(family);\n }}\n {...props}\n >\n <Box style={{ minWidth: 0, textAlign: \"left\" }}>\n <Stack gap={3}>\n <Text\n size={3}\n textOverflow=\"ellipsis\"\n translate=\"no\"\n style={{\n fontFamily: isDefined(name) ? `\"${name}\"` : undefined,\n opacity: loading ? 0 : 1,\n transition: \"opacity 150ms ease-out\",\n }}\n >\n {family.family}\n </Text>\n <Text size={0} muted textOverflow=\"ellipsis\">\n {details.join(\" · \")}\n </Text>\n </Stack>\n </Box>\n </Button>\n );\n}\n","import type { getVisibleRows } from \"@repo/lib/grid\";\nimport { isDefined } from \"@repo/lib/utils\";\nimport { Box, Button, Flex, Grid, Text } from \"@sanity/ui\";\nimport type { ComponentProps, RefObject } from \"react\";\n\nimport { Cell } from \"@/components/picker/cell\";\nimport { gridColumns, gridGap, gridHeight, gridRowHeight } from \"@/config/grid\";\nimport type { CatalogFamily } from \"@/lib/catalog\";\n\nexport type LibraryProps = Omit<ComponentProps<typeof Box>, \"children\" | \"onSelect\"> & {\n families: CatalogFamily[];\n rows: ReturnType<typeof getVisibleRows>;\n selected: string | undefined;\n activeIndex: number;\n activeCell: RefObject<HTMLButtonElement | null>;\n search: string;\n onSelect: (family: CatalogFamily) => void;\n onClearSearch: () => void;\n};\n\nexport function Library({\n families,\n rows,\n selected,\n activeIndex,\n activeCell,\n search,\n onSelect,\n onClearSearch,\n ...props\n}: LibraryProps) {\n const { totalRows, firstRow, lastRow } = rows;\n const visible = families.slice(firstRow * gridColumns, lastRow * gridColumns);\n\n return (\n <Box\n role=\"listbox\"\n aria-label=\"Google Fonts\"\n style={isDefined(families) ? { height: gridHeight, overflowY: \"auto\" } : undefined}\n {...props}\n >\n {!isDefined(families) && (\n <Flex align=\"center\" justify=\"center\" direction=\"column\" gap={3} paddingTop={5} paddingBottom={6}>\n <Text size={1} muted>\n {isDefined(search) ? `Nothing matches \"${search}\".` : \"No fonts of this kind.\"}\n </Text>\n <Button\n type=\"button\"\n mode=\"ghost\"\n text={isDefined(search) ? \"Clear search\" : \"Show all kinds\"}\n onClick={onClearSearch}\n />\n </Flex>\n )}\n {isDefined(families) && (\n <Grid\n gridTemplateColumns={gridColumns}\n style={{\n columnGap: gridGap,\n rowGap: gridGap,\n paddingTop: firstRow * gridRowHeight,\n paddingBottom: (totalRows - lastRow) * gridRowHeight,\n }}\n >\n {visible.map((family, offset) => {\n const index = firstRow * gridColumns + offset;\n\n return (\n <Cell\n key={family.family}\n ref={index === activeIndex ? activeCell : undefined}\n family={family}\n selected={family.family === selected}\n focusable={index === activeIndex}\n position={index + 1}\n total={families.length}\n onSelect={onSelect}\n />\n );\n })}\n </Grid>\n )}\n </Box>\n );\n}\n","import { Button, Flex, Grid, Stack, Text } from \"@sanity/ui\";\nimport type { ComponentProps } from \"react\";\n\nimport { Cell } from \"@/components/picker/cell\";\nimport { gridColumns, gridGap } from \"@/config/grid\";\nimport type { CatalogFamily } from \"@/lib/catalog\";\n\nexport type RecentProps = Omit<ComponentProps<typeof Stack>, \"children\" | \"onSelect\"> & {\n families: CatalogFamily[];\n selected: string | undefined;\n onSelect: (family: CatalogFamily) => void;\n onForget: () => void;\n};\n\nexport function Recent({ families, selected, onSelect, onForget, ...props }: RecentProps) {\n return (\n <Stack gap={3} {...props}>\n <Flex align=\"center\" justify=\"space-between\" gap={2}>\n <Text size={1} weight=\"medium\" muted>\n Recent fonts\n </Text>\n <Button\n type=\"button\"\n mode=\"bleed\"\n fontSize={1}\n padding={2}\n text=\"Clear\"\n onClick={onForget}\n aria-label=\"Clear recent fonts\"\n />\n </Flex>\n <Grid\n role=\"listbox\"\n aria-label=\"Recent fonts\"\n gridTemplateColumns={gridColumns}\n style={{ columnGap: gridGap, rowGap: gridGap }}\n >\n {families.map((family, index) => (\n <Cell\n key={family.family}\n family={family}\n selected={family.family === selected}\n focusable\n position={index + 1}\n total={families.length}\n onSelect={onSelect}\n />\n ))}\n </Grid>\n </Stack>\n );\n}\n","import type { CatalogFamily } from \"@/lib/catalog\";\n\n/** An order the picker can list families in. */\ninterface FamilySort {\n /** Identifier of the order. */\n name: string;\n /** Readable name of the order. */\n label: string;\n /**\n * Compares two families. Families it ranks equally keep the catalog's order, which is the most popular first.\n *\n * @param first - One family.\n * @param second - The other family.\n * @returns A negative number when the first comes first, a positive number when the second does, or zero.\n */\n compare: (first: CatalogFamily, second: CatalogFamily) => number;\n}\n\n/** Orders the picker offers, the first being the default. */\nexport const familySorts: FamilySort[] = [\n { name: \"popular\", label: \"Popular\", compare: () => 0 },\n { name: \"trending\", label: \"Trending\", compare: (first, second) => first.trending - second.trending },\n { name: \"newest\", label: \"Newest\", compare: (first, second) => second.added.localeCompare(first.added) },\n { name: \"name\", label: \"Name\", compare: (first, second) => first.family.localeCompare(second.family, \"en-US\") },\n];\n","import { fontCatalog } from \"@driftime/sanity-plugin-font/catalog\";\nimport { isDefined } from \"@repo/lib/utils\";\n\nimport type { CatalogFamily } from \"@/lib/catalog\";\nimport { parseCatalog } from \"@/lib/catalog\";\n\n/** Why the catalog can't be shown, and what to do about it, with code marked by backticks. */\ninterface CatalogProblem {\n /** What's wrong, in a few words. */\n title: string;\n /** What to do about it. */\n description: string;\n}\n\n/** Outcome of loading the catalog: its families, or why they can't be shown. */\nexport type CatalogResult =\n | { families: CatalogFamily[]; problem?: undefined }\n | { families?: undefined; problem: CatalogProblem };\n\n/**\n * Normalises text for search, so a family matches however its name is spaced or capitalised.\n *\n * @param value - The text.\n * @returns The normalised text.\n */\nexport function normalizeTerms(value: string) {\n return value.toLowerCase().replaceAll(/[\\s-]+/gu, \"\");\n}\n\n/**\n * Loads the catalog the build step downloaded.\n *\n * @returns The families, or why they can't be shown.\n */\nasync function readCatalog(): Promise<CatalogResult> {\n const { ready, load } = fontCatalog;\n\n if (!ready) {\n return {\n problem: {\n title: \"Google Fonts isn't set up\",\n description: \"Add `withFonts()` to the Studio's build configuration, then restart the Studio.\",\n },\n };\n }\n\n if (!isDefined(load)) {\n return {\n problem: {\n title: \"Couldn't download Google Fonts\",\n description: \"The Studio's build couldn't reach Google Fonts. Check the connection, then restart the Studio.\",\n },\n };\n }\n\n const module = await load();\n const families = parseCatalog(module.default);\n if (!isDefined(families)) {\n return { problem: { title: \"Couldn't load Google Fonts\", description: \"Restart the Studio and try again.\" } };\n }\n\n return { families };\n}\n\n/** Catalog request shared by every field in the session, since the catalog never changes while the Studio runs. */\nlet catalogRequest: Promise<CatalogResult> | undefined = undefined;\n\n/**\n * Loads the catalog, reusing a request already in progress.\n *\n * @returns The families, or why they can't be shown.\n */\nexport async function requestCatalog() {\n catalogRequest ??= readCatalog();\n\n const result = await catalogRequest;\n\n return result;\n}\n","import { useEffect, useState } from \"react\";\n\nimport type { CatalogResult } from \"@/lib/families\";\nimport { requestCatalog } from \"@/lib/families\";\n\n/**\n * Loads the Google Fonts catalog. Only an open picker calls this, so a Studio that never opens one never loads it.\n *\n * @returns The families or why they can't be shown, or undefined while loading.\n */\nexport function useFontCatalog() {\n const [result, setResult] = useState<CatalogResult>();\n\n useEffect(() => {\n let active = true;\n\n async function load() {\n const loaded = await requestCatalog();\n if (active) setResult(loaded);\n }\n\n void load();\n\n return () => {\n active = false;\n };\n }, []);\n\n return result;\n}\n","import { useState } from \"react\";\n\n/**\n * Creates a list of recent choices kept in the browser's local storage rather than the dataset, one list per scope.\n *\n * @param storageKey - Local storage key the lists are kept under, followed by each list's scope.\n * @param limit - Number of choices each list keeps.\n * @returns Functions that read, add to, and clear a list.\n */\nexport function createRecentStore(storageKey: string, limit: number) {\n /**\n * Builds the storage key for one list.\n *\n * @param scope - The list's scope.\n * @returns The storage key.\n */\n function getStorageKey(scope: string) {\n return `${storageKey}:${scope}`;\n }\n\n /**\n * Reads a list.\n *\n * @param scope - The list's scope.\n * @returns The choices, most recent first.\n */\n function read(scope: string) {\n try {\n const stored: unknown = JSON.parse(globalThis.localStorage.getItem(getStorageKey(scope)) ?? \"[]\");\n if (!Array.isArray(stored)) return [];\n\n return stored.filter((entry: unknown) => typeof entry === \"string\");\n } catch {\n return [];\n }\n }\n\n /**\n * Adds a choice to the front of a list.\n *\n * @param scope - The list's scope.\n * @param name - The choice.\n * @returns The updated choices, most recent first.\n */\n function write(scope: string, name: string) {\n const updated = [name, ...read(scope).filter((entry) => entry !== name)].slice(0, limit);\n\n try {\n globalThis.localStorage.setItem(getStorageKey(scope), JSON.stringify(updated));\n } catch {\n // If storage is blocked, the choice just isn't remembered.\n }\n\n return updated;\n }\n\n /**\n * Clears a list.\n *\n * @param scope - The list's scope.\n */\n function clear(scope: string) {\n try {\n globalThis.localStorage.removeItem(getStorageKey(scope));\n } catch {\n // If storage is blocked, there's nothing to clear.\n }\n }\n\n return { read, write, clear };\n}\n\n/**\n * Tracks one list of recent choices. The list is read when the component mounts, so choices made in another tab are\n * included.\n *\n * @param store - The store the list is kept in.\n * @param scope - The list's scope.\n * @returns The recent choices, most recent first, and functions to add to and clear them.\n */\nexport function useRecent(store: ReturnType<typeof createRecentStore>, scope: string) {\n const [recent, setRecent] = useState<string[]>(() => store.read(scope));\n\n function remember(name: string) {\n setRecent(store.write(scope, name));\n }\n\n function forget() {\n store.clear(scope);\n setRecent([]);\n }\n\n return { recent, remember, forget };\n}\n","import { createRecentStore } from \"@repo/lib/recent\";\n\n/** Recent Google fonts, kept in the browser, up to one row of the grid. */\nexport const recentFontStore = createRecentStore(\"driftime:sanity-plugin-font:recent\", 3);\n","import { useRecent } from \"@repo/lib/recent\";\n\nimport { recentFontStore } from \"@/lib/recent\";\n\n/**\n * Tracks the Google fonts an author chose most recently. The list is read when the picker opens, so choices made in\n * another tab are included.\n *\n * @returns The recent family names, most recent first, and functions to add to and clear them.\n */\nexport function useRecentFonts() {\n return useRecent(recentFontStore, \"google\");\n}\n","import { Problem } from \"@repo/components/problem\";\nimport { getCenteredScrollTop, getNextIndex, getRevealedScrollTop, getVisibleRows } from \"@repo/lib/grid\";\nimport { isDefined } from \"@repo/lib/utils\";\nimport { SearchIcon } from \"@sanity/icons/Search\";\nimport { Box, Flex, Select, Spinner, Stack, Text, TextInput } from \"@sanity/ui\";\nimport type { ChangeEvent, ComponentProps, KeyboardEvent } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\n\nimport { Library } from \"@/components/picker/library\";\nimport { Recent } from \"@/components/picker/recent\";\nimport { fontCategoryLabels } from \"@/config/categories\";\nimport { gridHeight, gridLayout, gridRowHeight } from \"@/config/grid\";\nimport { familySorts } from \"@/config/sorts\";\nimport { useFontCatalog } from \"@/hooks/use-font-catalog\";\nimport { useRecentFonts } from \"@/hooks/use-recent-fonts\";\nimport type { CatalogFamily } from \"@/lib/catalog\";\nimport { normalizeTerms } from \"@/lib/families\";\nimport type { FontVariant } from \"@/lib/requirements\";\nimport { meetsRequirements } from \"@/lib/requirements\";\nimport type { SanityFontCategory } from \"@/types\";\nimport { fontCategories } from \"@/types\";\n\nexport type PickerProps = Omit<ComponentProps<typeof Stack>, \"children\" | \"onSelect\"> & {\n id: string;\n selected: string | undefined;\n categories: SanityFontCategory[];\n families: string[] | undefined;\n variants: FontVariant[];\n subsets: string[];\n onSelect: (family: CatalogFamily) => void;\n};\n\nexport function Picker({ id, selected, categories, families, variants, subsets, onSelect, ...props }: PickerProps) {\n const result = useFontCatalog();\n const { recent, remember, forget } = useRecentFonts();\n const catalog = result?.families ?? [];\n const byName = new Map(catalog.map((family) => [family.family, family]));\n const listed = isDefined(families) ? families.flatMap((name) => byName.get(name) ?? []) : catalog;\n const offered = listed.filter(\n (family) => categories.includes(family.category) && meetsRequirements(family, variants, subsets),\n );\n const offeredCategories = fontCategories.filter((member) => offered.some((family) => family.category === member));\n\n const [search, setSearch] = useState(\"\");\n const [category, setCategory] = useState<SanityFontCategory>();\n const [sort, setSort] = useState(familySorts[0]);\n const [scrollRow, setScrollRow] = useState(0);\n const [movedIndex, setMovedIndex] = useState<number>();\n\n const scroller = useRef<HTMLDivElement>(null);\n const activeCell = useRef<HTMLButtonElement>(null);\n const focusIndex = useRef<number>(undefined);\n const scrollFrame = useRef<number>(undefined);\n const centred = useRef(false);\n\n const query = normalizeTerms(search);\n const filtering = isDefined(query) || isDefined(category);\n const results = offered\n .filter(\n (family) =>\n (!isDefined(query) || normalizeTerms(family.family).includes(query)) &&\n (!isDefined(category) || family.category === category),\n )\n .toSorted(isDefined(families) ? undefined : sort?.compare);\n\n const offeredByName = new Map(offered.map((family) => [family.family, family]));\n const recentFamilies = filtering\n ? []\n : recent.flatMap((name) => {\n const family = offeredByName.get(name);\n\n return isDefined(family) ? [family] : [];\n });\n\n const rows = getVisibleRows(gridLayout, scrollRow, results.length);\n\n const selectedIndex = filtering || !isDefined(selected) ? -1 : results.findIndex(({ family }) => family === selected);\n const activeIndex = movedIndex ?? Math.max(0, selectedIndex);\n\n // Only on opening, so changing the filters or the order doesn't jump back to the selected font.\n useEffect(() => {\n const element = scroller.current;\n if (!isDefined(element) || selectedIndex === -1 || centred.current) return;\n\n centred.current = true;\n element.scrollTop = getCenteredScrollTop(gridLayout, selectedIndex);\n }, [scroller, selectedIndex]);\n\n useEffect(\n () => () => {\n if (isDefined(scrollFrame.current)) cancelAnimationFrame(scrollFrame.current);\n },\n [],\n );\n\n useEffect(() => {\n if (focusIndex.current !== activeIndex) return;\n\n focusIndex.current = undefined;\n if (isDefined(activeCell.current)) activeCell.current.focus();\n }, [activeIndex]);\n\n function resetScroll() {\n setMovedIndex(undefined);\n\n if (isDefined(scroller.current)) scroller.current.scrollTop = 0;\n }\n\n function clearSearch() {\n setSearch(\"\");\n setCategory(undefined);\n setMovedIndex(undefined);\n }\n\n function handleSearch(event: ChangeEvent<HTMLInputElement>) {\n setSearch(event.currentTarget.value);\n resetScroll();\n }\n\n function handleCategory(event: ChangeEvent<HTMLSelectElement>) {\n const { value } = event.currentTarget;\n\n setCategory(fontCategories.find((member) => member === value));\n resetScroll();\n }\n\n function handleSort(event: ChangeEvent<HTMLSelectElement>) {\n const { value } = event.currentTarget;\n\n setSort(familySorts.find(({ name }) => name === value));\n resetScroll();\n }\n\n function handleSelect(family: CatalogFamily) {\n remember(family.family);\n onSelect(family);\n }\n\n function selectActive() {\n const family = results[activeIndex];\n\n if (isDefined(family)) handleSelect(family);\n }\n\n function handleSearchKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n if (event.key === \"Enter\") {\n event.preventDefault();\n selectActive();\n\n return;\n }\n\n if (event.key !== \"ArrowDown\") return;\n\n event.preventDefault();\n\n if (isDefined(activeCell.current)) activeCell.current.focus();\n }\n\n function handleScroll() {\n if (isDefined(scrollFrame.current)) return;\n\n scrollFrame.current = requestAnimationFrame(() => {\n scrollFrame.current = undefined;\n\n const element = scroller.current;\n if (isDefined(element)) setScrollRow(Math.floor(element.scrollTop / gridRowHeight));\n });\n }\n\n function handleGridKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const last = results.length - 1;\n if (last < 0) return;\n\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n selectActive();\n\n return;\n }\n\n const next = getNextIndex(gridLayout, event.key, activeIndex, last);\n if (!isDefined(next)) return;\n\n event.preventDefault();\n\n const index = Math.min(Math.max(next, 0), last);\n focusIndex.current = index;\n setMovedIndex(index);\n\n const element = scroller.current;\n if (!isDefined(element)) return;\n\n element.scrollTop = getRevealedScrollTop(gridLayout, index, element.scrollTop);\n }\n\n return (\n <Stack gap={4} {...props}>\n {!isDefined(result?.problem) && (\n <Flex gap={2}>\n <Box flex={1}>\n <TextInput\n type=\"search\"\n icon={<SearchIcon />}\n placeholder=\"Search by name\"\n value={search}\n onChange={handleSearch}\n onKeyDown={handleSearchKeyDown}\n disabled={!isDefined(offered)}\n aria-label=\"Search Google Fonts\"\n />\n </Box>\n {offeredCategories.length > 1 && (\n <Box flex=\"none\">\n <Select\n id={`${id}-category`}\n value={category ?? \"\"}\n onChange={handleCategory}\n disabled={!isDefined(offered)}\n aria-label=\"Kind of typeface\"\n >\n <option value=\"\">All kinds</option>\n {offeredCategories.map((member) => (\n <option key={member} value={member}>\n {fontCategoryLabels[member]}\n </option>\n ))}\n </Select>\n </Box>\n )}\n {!isDefined(families) && (\n <Box flex=\"none\">\n <Select\n id={`${id}-sort`}\n value={sort?.name}\n onChange={handleSort}\n disabled={!isDefined(offered)}\n aria-label=\"Sort fonts\"\n >\n {familySorts.map(({ name, label }) => (\n <option key={name} value={name}>\n {label}\n </option>\n ))}\n </Select>\n </Box>\n )}\n </Flex>\n )}\n {!isDefined(result) && (\n <Flex align=\"center\" justify=\"center\" style={{ height: gridHeight }}>\n <Spinner muted />\n </Flex>\n )}\n {isDefined(result?.problem) && <Problem problem={result.problem} />}\n {isDefined(recentFamilies) && (\n <Recent families={recentFamilies} selected={selected} onSelect={handleSelect} onForget={forget} />\n )}\n {isDefined(result?.families) && (\n <Stack gap={3}>\n <Box paddingY={2}>\n <Text size={1} weight=\"medium\" muted>\n All fonts ({results.length.toLocaleString(\"en-US\")})\n </Text>\n </Box>\n {!isDefined(offered) && (\n <Flex align=\"center\" justify=\"center\" paddingTop={5} paddingBottom={6}>\n <Text size={1} muted>\n No Google font matches the options set for this field.\n </Text>\n </Flex>\n )}\n {isDefined(offered) && (\n <Library\n ref={scroller}\n families={results}\n rows={rows}\n selected={selected}\n activeIndex={activeIndex}\n activeCell={activeCell}\n search={search}\n onSelect={handleSelect}\n onClearSearch={clearSearch}\n onScroll={handleScroll}\n onKeyDown={handleGridKeyDown}\n />\n )}\n </Stack>\n )}\n </Stack>\n );\n}\n","import { isDefined } from \"@repo/lib/utils\";\nimport { useClient } from \"sanity\";\n\nimport { apiVersion } from \"@/config/defaults\";\nimport { createFileUrl } from \"@/lib/files\";\nimport type { FontSample } from \"@/lib/samples\";\nimport type { SanityFont } from \"@/types\";\n\n/**\n * Describes the sample a stored font shows in the Studio: some text from its Google family, or its uploaded files.\n *\n * @param value - The stored font.\n * @param text - Characters a Google family is loaded for.\n * @returns The sample, or undefined when nothing loadable was stored.\n */\nexport function useStoredSample(value: Partial<SanityFont> | undefined, text: string): FontSample | undefined {\n const { projectId, dataset } = useClient({ apiVersion }).config();\n const { source, family, weights, styles, files } = value ?? {};\n\n if (source === \"upload\") {\n const sampleFiles = (files ?? []).flatMap(({ asset, weight, maxWeight, style }) => {\n const url =\n isDefined(projectId) && isDefined(dataset) ? createFileUrl(asset?._ref, projectId, dataset) : undefined;\n\n return isDefined(url) && isDefined(weight)\n ? [{ url, weight, ...(isDefined(maxWeight) && { maxWeight }), style: style ?? \"normal\" }]\n : [];\n });\n\n return isDefined(sampleFiles) ? { source, files: sampleFiles } : undefined;\n }\n\n if (!isDefined(family)) return undefined;\n\n return { source: \"google\", family, weights: weights ?? [], styles: styles ?? [], text };\n}\n","import { isDefined } from \"@repo/lib/utils\";\nimport { Card, Flex, Stack, Text } from \"@sanity/ui\";\nimport type { ComponentProps } from \"react\";\n\nimport { defaultPreviewText } from \"@/config/defaults\";\nimport { useFontSample } from \"@/hooks/use-font-sample\";\nimport { useStoredSample } from \"@/hooks/use-stored-sample\";\nimport type { FontVariant } from \"@/lib/requirements\";\nimport { describeVariant } from \"@/lib/requirements\";\nimport type { SanityFont } from \"@/types\";\n\nexport type SampleProps = Omit<ComponentProps<typeof Card>, \"children\"> & {\n value: Partial<SanityFont>;\n text: string | undefined;\n variants: FontVariant[];\n};\n\nexport function Sample({ value, text, variants, ...props }: SampleProps) {\n const items = variants.map((variant) => ({\n ...variant,\n specimen: text ?? defaultPreviewText,\n caption: `${describeVariant(variant)} (${variant.weight})`,\n }));\n\n const { name, loading } = useFontSample(useStoredSample(value, items.map(({ specimen }) => specimen).join(\" \")));\n\n return (\n <Card padding={4} radius={2} border {...props}>\n <Flex gap={5} wrap=\"wrap\">\n {items.map(({ weight, style, specimen, caption }) => (\n <Stack key={`${weight}-${style}`} gap={3}>\n <Text\n size={3}\n align=\"center\"\n style={{\n fontFamily: isDefined(name) ? `\"${name}\"` : undefined,\n fontWeight: weight,\n fontStyle: style,\n opacity: loading ? 0 : 1,\n transition: \"opacity 150ms ease-out\",\n }}\n >\n {specimen}\n </Text>\n <Text size={0} align=\"center\" muted>\n {caption}\n </Text>\n </Stack>\n ))}\n </Flex>\n </Card>\n );\n}\n","import type { ComponentProps } from \"react\";\n\nexport type TypeIconProps = ComponentProps<\"svg\">;\n\nexport function TypeIcon(props: TypeIconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={24}\n height={24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M12 4v16\" />\n <path d=\"M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2\" />\n <path d=\"M9 20h6\" />\n </svg>\n );\n}\n","import { isDefined, isRecord } from \"@repo/lib/utils\";\n\nimport { defaultSources, defaultStyles, defaultSubsets, defaultWeights } from \"@/config/defaults\";\nimport { parseWeights } from \"@/lib/catalog\";\nimport type { SanityFontConfig, SanityFontOptions } from \"@/plugin\";\nimport { fontCategories, fontSources, fontStyles, fontWeights } from \"@/types\";\n\n/**\n * Keeps the members of a configured list that a font can use, in their definition's order.\n *\n * @param list - Every allowed member, in order.\n * @param configured - The configured list, or undefined when none is set.\n * @returns The members, or undefined when none are usable.\n */\nfunction selectMembers<Member>(list: readonly Member[], configured: Member[] | undefined) {\n const selected = list.filter((member) => configured?.includes(member) === true);\n\n return isDefined(selected) ? selected : undefined;\n}\n\n/**\n * Reads a field's options where only their shape is known, as in validation.\n *\n * @param value - The options.\n * @returns The options, or undefined when there are none.\n */\nexport function readFontOptions(value: unknown): SanityFontOptions | undefined {\n if (!isRecord(value)) return undefined;\n\n const { sources, categories, weights, styles, subsets } = value;\n\n return {\n ...(Array.isArray(sources) && { sources: fontSources.filter((source) => sources.includes(source)) }),\n ...(Array.isArray(categories) && {\n categories: fontCategories.filter((category) => categories.includes(category)),\n }),\n ...(Array.isArray(weights) && { weights: parseWeights(weights) }),\n ...(Array.isArray(styles) && { styles: fontStyles.filter((style) => styles.includes(style)) }),\n ...(Array.isArray(subsets) && {\n subsets: subsets.filter((subset: unknown): subset is string => typeof subset === \"string\"),\n }),\n };\n}\n\n/**\n * Resolves what a font field offers, requires, and previews. A field's own settings replace the plugin's, and a list\n * with nothing usable in it falls back to the default.\n *\n * @param options - The field's options.\n * @param config - The plugin configuration.\n * @returns The field's settings.\n */\nexport function resolveFontOptions(options: SanityFontOptions | undefined, config: SanityFontConfig) {\n const subsets = (options?.subsets ?? config.subsets)?.filter((subset) => isDefined(subset));\n const families = (options?.families ?? config.families)?.filter((family) => isDefined(family));\n const previewText = options?.preview?.text ?? config.preview?.text;\n\n return {\n sources: selectMembers(fontSources, options?.sources ?? config.sources) ?? defaultSources,\n categories: selectMembers(fontCategories, options?.categories ?? config.categories) ?? [...fontCategories],\n families: isDefined(families) ? [...new Set<string>(families)] : undefined,\n weights: selectMembers(fontWeights, options?.weights ?? config.weights) ?? defaultWeights,\n styles: selectMembers(fontStyles, options?.styles ?? config.styles) ?? defaultStyles,\n subsets: isDefined(subsets) ? subsets : defaultSubsets,\n preview: { text: isDefined(previewText) ? previewText : undefined },\n };\n}\n","import type { SanityFont, SanityFontSource } from \"@/types\";\n\n/** Fields only one source sets, which are cleared when the font switches to the other. */\nconst sourceFields: Record<SanityFontSource, (keyof SanityFont)[]> = {\n google: [\"weights\", \"styles\"],\n upload: [\"files\"],\n};\n\n/**\n * Lists the fields to clear when a font switches source. The family and kind of typeface are cleared too, since they\n * described the other source's font.\n *\n * @param source - The new source.\n * @returns The fields to clear.\n */\nexport function getStaleFields(source: SanityFontSource): (keyof SanityFont)[] {\n const other: SanityFontSource = source === \"google\" ? \"upload\" : \"google\";\n\n return [\"family\", \"category\", ...sourceFields[other]];\n}\n\n/**\n * Checks whether a font holds uploaded files, so the upload fields are only shown and required for an upload.\n *\n * @param parent - The font.\n * @returns Whether the font is an upload.\n */\nexport function isUpload(parent: unknown) {\n return typeof parent === \"object\" && parent !== null && \"source\" in parent && parent.source === \"upload\";\n}\n","import { defaultIconProps } from \"@repo/lib/icons\";\nimport { isDefined } from \"@repo/lib/utils\";\nimport { CloseIcon } from \"@sanity/icons/Close\";\nimport { EarthGlobeIcon } from \"@sanity/icons/EarthGlobe\";\nimport { UploadIcon } from \"@sanity/icons/Upload\";\nimport { Box, Button, Dialog, Flex, Stack, Tab, TabList, TabPanel } from \"@sanity/ui\";\nimport type { ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport type { ObjectInputProps } from \"sanity\";\nimport { set, setIfMissing, unset } from \"sanity\";\n\nimport { Picker } from \"@/components/picker/picker\";\nimport { Sample } from \"@/components/sample\";\nimport { FilesProvider } from \"@/contexts/files\";\nimport { TypeIcon } from \"@/icons/type\";\nimport type { CatalogFamily } from \"@/lib/catalog\";\nimport { getFamilyName } from \"@/lib/family\";\nimport { resolveFontOptions } from \"@/lib/options\";\nimport { listFileVariants, listVariants } from \"@/lib/requirements\";\nimport { getStaleFields } from \"@/lib/sources\";\nimport type { FontSchemaType, SanityFontConfig } from \"@/plugin\";\nimport type { SanityFont, SanityFontSource } from \"@/types\";\n\n/** Label and icon of each source's tab. */\nconst sourceTabs: Record<SanityFontSource, { label: string; icon: typeof UploadIcon }> = {\n google: { label: \"Google Fonts\", icon: EarthGlobeIcon },\n upload: { label: \"Upload\", icon: UploadIcon },\n};\n\ninterface SourcesProps {\n id: string;\n offered: SanityFontSource[];\n selected: SanityFontSource;\n readOnly: boolean | undefined;\n onSelect: (source: SanityFontSource) => void;\n children: ReactNode;\n}\n\nfunction Sources({ id, offered, selected, readOnly, onSelect, children }: SourcesProps) {\n if (offered.length < 2) return <>{children}</>;\n\n return (\n <Stack gap={4}>\n <TabList gap={1}>\n {offered.map((source) => {\n const { label, icon: Icon } = sourceTabs[source];\n\n return (\n <Tab\n key={source}\n id={`${id}-tab-${source}`}\n aria-controls={`${id}-panel`}\n icon={<Icon />}\n label={label}\n selected={source === selected}\n disabled={readOnly}\n onClick={() => {\n onSelect(source);\n }}\n />\n );\n })}\n </TabList>\n <TabPanel id={`${id}-panel`} aria-labelledby={`${id}-tab-${selected}`}>\n {children}\n </TabPanel>\n </Stack>\n );\n}\n\nexport type InputProps = ObjectInputProps<Partial<SanityFont>, FontSchemaType>;\n\n/**\n * Builds the patches that switch a font to another source, clearing the fields the previous one set. Otherwise\n * they'd stay hidden in the document and reappear if the author switched back.\n *\n * @param typeName - The font type's schema name.\n * @param source - The new source.\n * @returns The patches.\n */\nfunction createSourcePatches(typeName: string, source: SanityFontSource) {\n return [\n setIfMissing({ _type: typeName }),\n set(source, [\"source\" satisfies keyof SanityFont]),\n ...getStaleFields(source).map((field) => unset([field])),\n ];\n}\n\n/**\n * Creates the font field input, bound to the plugin's configuration. A field's own lists replace the plugin's rather\n * than adding to them.\n *\n * @param config - The plugin configuration.\n * @returns The input component.\n */\nexport function createInput(config: SanityFontConfig) {\n function Input(props: InputProps) {\n const { id, schemaType, value, onChange, readOnly, renderDefault } = props;\n const { source: storedSource, family: storedFamily } = value ?? {};\n const family = getFamilyName(value);\n\n const [open, setOpen] = useState(false);\n const [tab, setTab] = useState<SanityFontSource>();\n\n const { sources, categories, families, weights, styles, subsets, preview } = resolveFontOptions(\n schemaType.options,\n config,\n );\n const [defaultSource = \"google\"] = sources;\n const selected = tab ?? (isDefined(storedSource) && sources.includes(storedSource) ? storedSource : defaultSource);\n\n const variants = listVariants(weights, styles);\n const sampleVariants =\n storedSource === \"upload\"\n ? listFileVariants(value?.files ?? [], variants)\n : listVariants(value?.weights ?? [], value?.styles ?? []);\n\n // The upload fields are only shown for an upload, so switching to that tab stores the source straight away.\n function handleSelectSource(source: SanityFontSource) {\n setTab(source);\n\n if (source === \"upload\" && storedSource !== \"upload\") onChange(createSourcePatches(schemaType.name, source));\n }\n\n function handleSelectFamily(selection: CatalogFamily) {\n onChange([\n ...createSourcePatches(schemaType.name, \"google\"),\n set(selection.family, [\"family\" satisfies keyof SanityFont]),\n set(selection.category, [\"category\" satisfies keyof SanityFont]),\n set(weights, [\"weights\" satisfies keyof SanityFont]),\n set(styles, [\"styles\" satisfies keyof SanityFont]),\n ]);\n setOpen(false);\n }\n\n function handleOpen() {\n if (selected === \"upload\" && storedSource !== \"upload\") onChange(createSourcePatches(schemaType.name, \"upload\"));\n\n setOpen(true);\n }\n\n function handleClose() {\n setTab(undefined);\n setOpen(false);\n }\n\n return (\n <Stack gap={3}>\n <Flex gap={2}>\n <Button\n id={id}\n type=\"button\"\n mode=\"ghost\"\n icon={<TypeIcon {...defaultIconProps} />}\n text={family ?? \"Select font\"}\n disabled={readOnly}\n onClick={handleOpen}\n aria-label={isDefined(family) ? `${family} currently selected` : \"Select font\"}\n />\n {isDefined(value) && (\n <Button\n type=\"button\"\n mode=\"ghost\"\n tone=\"critical\"\n icon={<CloseIcon />}\n text=\"Clear\"\n disabled={readOnly}\n onClick={() => {\n onChange(unset());\n }}\n aria-label=\"Clear the selected font\"\n />\n )}\n </Flex>\n {isDefined(family) && isDefined(sampleVariants) && (\n <Sample value={value ?? {}} text={preview.text} variants={sampleVariants} />\n )}\n {open && (\n <Dialog id={`${id}-dialog`} header=\"Select font\" width={1} onClose={handleClose} onClickOutside={handleClose}>\n <Box padding={4}>\n <Sources id={id} offered={sources} selected={selected} readOnly={readOnly} onSelect={handleSelectSource}>\n {selected === \"google\" && (\n <Picker\n id={id}\n selected={storedSource === \"google\" ? storedFamily : undefined}\n categories={categories}\n families={families}\n variants={variants}\n subsets={subsets}\n onSelect={handleSelectFamily}\n />\n )}\n {selected === \"upload\" && (\n <FilesProvider\n fillDetails={(name, category) => {\n onChange([\n ...(isDefined(name) ? [setIfMissing(name, [\"family\" satisfies keyof SanityFont])] : []),\n ...(isDefined(category)\n ? [setIfMissing(category, [\"category\" satisfies keyof SanityFont])]\n : []),\n ]);\n }}\n >\n {renderDefault(props)}\n </FilesProvider>\n )}\n </Sources>\n </Box>\n </Dialog>\n )}\n </Stack>\n );\n }\n\n return Input;\n}\n","import { isDefined } from \"@repo/lib/utils\";\nimport type { ComponentProps } from \"react\";\n\nimport { useFontSample } from \"@/hooks/use-font-sample\";\nimport { useStoredSample } from \"@/hooks/use-stored-sample\";\nimport type { SanityFont } from \"@/types\";\n\nexport type PreviewProps = Omit<ComponentProps<\"span\">, \"children\"> & {\n value: Partial<SanityFont>;\n};\n\nexport function Preview({ value, style, ...props }: PreviewProps) {\n const { name } = useFontSample(useStoredSample(value, \"Aa\"));\n\n return (\n <span style={{ fontFamily: isDefined(name) ? `\"${name}\"` : undefined, lineHeight: 1, ...style }} {...props}>\n Aa\n </span>\n );\n}\n","import { isDefined } from \"@repo/lib/utils\";\nimport { createElement } from \"react\";\n\nimport { Preview } from \"@/components/preview\";\nimport { getFamilyName } from \"@/lib/family\";\nimport type { SanityFont } from \"@/types\";\n\n/**\n * Creates preview media for a stored font, so each document shows a sample in its own font instead of an icon.\n *\n * @param value - The stored font.\n * @returns The media component, or undefined when neither a family nor a file was stored.\n * @public\n */\nexport function createFontPreview(value: SanityFont | undefined) {\n if (!isDefined(value) || (!isDefined(getFamilyName(value)) && !isDefined(value.files))) return undefined;\n\n return function FontPreview() {\n return createElement(Preview, { value });\n };\n}\n","import { Field } from \"@repo/components/field\";\nimport { Hidden } from \"@repo/components/hidden\";\nimport { createSanityIcon } from \"@repo/lib/icons\";\nimport { isDefined, isRecord } from \"@repo/lib/utils\";\nimport { defineArrayMember, defineField, defineType } from \"sanity\";\n\nimport { FilesInput } from \"@/components/files/files\";\nimport { createInput } from \"@/components/input\";\nimport { fontCategoryLabels } from \"@/config/categories\";\nimport { TypeIcon } from \"@/icons/type\";\nimport { getFamilyName } from \"@/lib/family\";\nimport { readFontOptions, resolveFontOptions } from \"@/lib/options\";\nimport { createFontPreview } from \"@/lib/preview\";\nimport {\n describeFile,\n describeVariant,\n findDuplicateFiles,\n listMissingVariants,\n listVariants,\n} from \"@/lib/requirements\";\nimport { isUpload } from \"@/lib/sources\";\nimport type { SanityFontConfig } from \"@/plugin\";\nimport type { SanityFont, SanityFontCategory, SanityFontFile } from \"@/types\";\nimport { fontCategories, fontFileTypeName, fontTypeName } from \"@/types\";\n\n/** Weights listed in the upload fields, each with its name. */\n\n/**\n * Validates a font against the kinds of typeface its field allows and the weights and styles it requires.\n *\n * @param value - The font.\n * @param categories - The kinds of typeface allowed.\n * @param variants - The weights and styles required.\n * @returns True when the font is valid, or what's wrong.\n */\nfunction validateFont(\n value: Partial<SanityFont>,\n categories: SanityFontCategory[],\n variants: ReturnType<typeof listVariants>,\n) {\n const { source, family, category, weights, styles, files } = value;\n\n if (source === \"upload\" && isDefined(category) && !categories.includes(category)) {\n const allowed = new Intl.ListFormat(\"en-US\", { type: \"disjunction\" }).format(\n categories.map((member) => fontCategoryLabels[member]),\n );\n\n return `This field only takes ${allowed} fonts. Choose another kind, or upload a different font.`;\n }\n\n if (source === \"upload\") {\n const missing = listMissingVariants(files ?? [], variants);\n if (!isDefined(missing)) return true;\n\n const list = new Intl.ListFormat(\"en-US\").format(missing.map((variant) => describeVariant(variant)));\n\n return `Upload a file for ${list}, which this field needs.`;\n }\n\n if (!isDefined(family)) return \"Select a font.\";\n\n const loaded = listVariants(weights ?? [], styles ?? []);\n const stale = variants.some(\n (variant) => !loaded.some(({ weight, style }) => weight === variant.weight && style === variant.style),\n );\n\n return stale ? \"Select the font again to load the weights and styles this field needs.\" : true;\n}\n\n/**\n * Creates the font object type, applying the plugin's settings to fields that don't set their own.\n *\n * @param config - The plugin configuration.\n * @returns The font type.\n */\nexport function createFontType(config: SanityFontConfig) {\n return defineType({\n name: fontTypeName satisfies SanityFont[\"_type\"],\n type: \"object\",\n icon: createSanityIcon(TypeIcon),\n description: \"Font chosen from Google Fonts or uploaded.\",\n // Uses a primitive field's flat frame on purpose, instead of Sanity's collapsible object fieldset.\n components: { field: Field, input: createInput(config) },\n validation: (rule) =>\n rule.custom((value: Partial<SanityFont> | undefined, context) => {\n if (!isDefined(value)) return true;\n\n const { categories, weights, styles } = resolveFontOptions(readFontOptions(context.type?.options), config);\n\n return validateFont(value, categories, listVariants(weights, styles));\n }),\n preview: {\n select: {\n source: \"source\",\n family: \"family\",\n files: \"files\",\n },\n prepare(selection: Pick<SanityFont, \"source\" | \"family\" | \"files\">) {\n const { source, family, files } = selection;\n\n return {\n title: getFamilyName({ source, family, files }) ?? \"No font\",\n subtitle: source === \"upload\" ? \"Uploaded\" : \"Google Fonts\",\n media: createFontPreview({ _type: fontTypeName, source, family, files }),\n };\n },\n },\n fields: [\n defineField({\n name: \"source\" satisfies keyof SanityFont,\n type: \"string\",\n description: \"Where the font comes from, chosen from the tabs.\",\n // Sanity drops an object whose fields are all hidden, so this field stays in the form but renders nothing.\n components: { field: Hidden },\n }),\n defineField({\n name: \"family\" satisfies keyof SanityFont,\n type: \"string\",\n description: \"Name the site uses for the font, filled in from the font files.\",\n placeholder: \"Defaults to the family in the font files\",\n hidden: ({ parent }) => !isUpload(parent),\n validation: (rule) =>\n rule.custom((value, context) => {\n const files = isRecord(context.parent) ? context.parent[\"files\"] : undefined;\n\n return isUpload(context.parent) && Array.isArray(files) && isDefined(files) && !isDefined(value)\n ? \"Enter the name of the font family.\"\n : true;\n }),\n }),\n defineField({\n name: \"category\" satisfies keyof SanityFont,\n type: \"string\",\n description: \"Kind of typeface, which decides the fallback shown while the font loads.\",\n options: {\n list: fontCategories.map((category) => ({ title: fontCategoryLabels[category], value: category })),\n },\n hidden: ({ parent }) => !isUpload(parent),\n }),\n defineField({\n name: \"weights\" satisfies keyof SanityFont,\n type: \"array\",\n description: \"Weights to load from Google Fonts, saved when the family is chosen.\",\n of: [defineArrayMember({ type: \"number\" })],\n hidden: true,\n }),\n defineField({\n name: \"styles\" satisfies keyof SanityFont,\n type: \"array\",\n description: \"Styles to load from Google Fonts, saved when the family is chosen.\",\n of: [defineArrayMember({ type: \"string\" })],\n hidden: true,\n }),\n defineField({\n name: \"files\" satisfies keyof SanityFont,\n type: \"array\",\n description: \"WOFF2 or WOFF files, one for each weight and style, or a single variable font.\",\n components: { input: FilesInput },\n hidden: ({ parent }) => !isUpload(parent),\n validation: (rule) => [\n rule.custom((value, context) =>\n isUpload(context.parent) && !isDefined(value) ? \"Upload the font's files.\" : true,\n ),\n rule\n .custom((value: SanityFontFile[] | undefined) => {\n const duplicates = findDuplicateFiles(value ?? []);\n if (!isDefined(duplicates)) return true;\n\n const list = new Intl.ListFormat(\"en-US\").format(duplicates.map((file) => describeFile(file)));\n\n return `More than one file holds ${list}. Remove the duplicates.`;\n })\n .warning(),\n ],\n of: [\n defineArrayMember({\n name: fontFileTypeName satisfies SanityFontFile[\"_type\"],\n type: \"file\",\n options: { accept: \".woff2,.woff\" },\n preview: {\n select: {\n asset: \"asset\",\n weight: \"weight\",\n maxWeight: \"maxWeight\",\n style: \"style\",\n filename: \"asset.originalFilename\",\n },\n prepare(\n selection: Pick<SanityFontFile, \"asset\" | \"weight\" | \"maxWeight\" | \"style\"> & { filename?: string },\n ) {\n const { asset, weight, maxWeight, style, filename } = selection;\n\n return {\n title: describeFile({ weight, maxWeight, style }),\n subtitle: filename,\n media: isDefined(asset)\n ? createFontPreview({\n _type: fontTypeName,\n source: \"upload\",\n files: [{ _type: fontFileTypeName, _key: \"preview\", asset, weight, maxWeight, style }],\n })\n : undefined,\n };\n },\n },\n validation: (rule) =>\n rule.custom((value: Partial<SanityFontFile> | undefined) =>\n isDefined(value?.asset?._ref) && !isDefined(value.weight)\n ? \"This file has no weight or style. Remove it and upload it again.\"\n : true,\n ),\n fields: [\n defineField({\n name: \"family\" satisfies keyof SanityFontFile,\n type: \"string\",\n description: \"Name of the family the file belongs to, read from the file.\",\n hidden: true,\n }),\n defineField({\n name: \"weight\" satisfies keyof SanityFontFile,\n type: \"number\",\n description: \"Weight the file holds, or the lightest a variable font file covers, read from the file.\",\n hidden: true,\n }),\n defineField({\n name: \"maxWeight\" satisfies keyof SanityFontFile,\n type: \"number\",\n description: \"Heaviest weight a variable font file covers, read from the file.\",\n hidden: true,\n }),\n defineField({\n name: \"style\" satisfies keyof SanityFontFile,\n type: \"string\",\n description: \"Style the file holds, read from the file.\",\n hidden: true,\n }),\n ],\n }),\n ],\n }),\n ],\n });\n}\n","import type { ObjectOptions, ObjectSchemaType, TypeAliasDefinition } from \"sanity\";\nimport { definePlugin } from \"sanity\";\n\nimport { pluginName } from \"@/config/defaults\";\nimport { createFontType } from \"@/schemas/types/font\";\nimport type {\n SanityFontCategory,\n SanityFontFamily,\n SanityFontSource,\n SanityFontStyle,\n SanityFontWeight,\n fontTypeName,\n} from \"@/types\";\n\ndeclare module \"@sanity/types\" {\n interface IntrinsicDefinitions {\n /** Definition of a field of type `font`. */\n font: SanityFontDefinition;\n }\n}\n\n/**\n * Settings for the sample shown below the field once a font is chosen.\n *\n * @public\n */\nexport interface SanityFontPreview {\n /** Text shown in each weight and style of the chosen font. Defaults to \"Aa\". */\n text?: string;\n}\n\n/**\n * What a font field offers and what a font must have. The picker only lists Google fonts that have every weight,\n * style, and character set, and validation lists any an upload is missing.\n *\n * @public\n */\nexport interface SanityFontConfig {\n /** Where fonts come from. Defaults to both Google Fonts and uploads. */\n sources?: SanityFontSource[];\n /** Kinds of typeface a font can be, such as `serif`. Defaults to every kind. */\n categories?: SanityFontCategory[];\n /** Google families the picker offers, in the order listed. Names the catalog doesn't have are skipped. Defaults to every family. */\n families?: SanityFontFamily[];\n /** Weights a font must have. Defaults to 400 and 600. */\n weights?: SanityFontWeight[];\n /** Styles a font must have in every weight. Defaults to normal only. */\n styles?: SanityFontStyle[];\n /** Character sets a Google font must cover, such as `latin-ext`. Defaults to `latin`. */\n subsets?: string[];\n /** Settings for the sample shown below the field. */\n preview?: SanityFontPreview;\n}\n\n/**\n * Options for a font field. Each list a field sets replaces the plugin's, and its preview text replaces the plugin's.\n *\n * @public\n */\nexport interface SanityFontOptions extends ObjectOptions, SanityFontConfig {}\n\n/**\n * Definition of a field or array member holding a font, so its options are type-checked like a built-in type's.\n *\n * @public\n */\nexport interface SanityFontDefinition extends Omit<TypeAliasDefinition<typeof fontTypeName, undefined>, \"options\"> {\n /** Options for the field. */\n options?: SanityFontOptions;\n}\n\n/** Compiled font field type, with the field's own options. */\nexport interface FontSchemaType extends ObjectSchemaType {\n options?: SanityFontOptions;\n}\n\nconst plugin = definePlugin<SanityFontConfig>((config) => ({\n name: pluginName,\n schema: {\n types: [createFontType(config)],\n },\n}));\n\n/**\n * Adds a font field type to Sanity Studio, with a searchable picker for Google Fonts and uploads for anything else.\n *\n * @param config - The plugin configuration, which every field uses unless it sets its own.\n * @returns The plugin.\n * @public\n */\nexport function fontPlugin(config: SanityFontConfig = {}) {\n return plugin(config);\n}\n"],"mappings":"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"}
|
package/dist/names.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Names of every Google Fonts family. This is a placeholder: the build step replaces this package's copy of it with
|
|
3
|
+
* the names in the catalog it downloaded, so options that list families can be checked.
|
|
4
|
+
*
|
|
5
|
+
* @public
|
|
6
|
+
*/
|
|
7
|
+
export type SanityFontNames = never;
|
|
8
|
+
//# sourceMappingURL=names.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"names.d.ts","names":["SanityFontNames"],"sources":["../src/names.ts"],"mappings":"AAMA;;;;;;YAAYA"}
|
package/dist/names.js
ADDED
|
File without changes
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The parts of a webpack or Turbopack loader's context the build step uses.
|
|
3
|
+
*
|
|
4
|
+
* @public
|
|
5
|
+
*/
|
|
6
|
+
interface LoaderContext {
|
|
7
|
+
/** Path of the module being loaded. */
|
|
8
|
+
resourcePath: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Webpack and Turbopack loader that replaces the placeholder catalog with the one the build step downloaded.
|
|
12
|
+
*
|
|
13
|
+
* @param this - The loader context.
|
|
14
|
+
* @returns The catalog module's code.
|
|
15
|
+
* @public
|
|
16
|
+
*/
|
|
17
|
+
declare function fontCatalogLoader(this: LoaderContext): Promise<string>;
|
|
18
|
+
export { fontCatalogLoader as default };
|
|
19
|
+
//# sourceMappingURL=next-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"next-loader.d.ts","names":["LoaderContext","generateCatalogModule","Promise","LoaderContext","fontCatalogLoader","Promise","default"],"sources":["../src/build/loader.ts","../src/next-loader.ts"],"mappings":"AAYA;;;;;UAAiBA;;EAEf;;;;;;;;;iBCJaI,kBAAkB,MAAMD,gBAAaE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { t as isDefined } from "./utils-BV38iODp.js";
|
|
2
|
+
import { r as createCatalogModule, t as writeFontCatalog } from "./catalog-BVw1r_SG.js";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
/**
|
|
5
|
+
* Generates the module that replaces the placeholder catalog, importing the catalog from where the build step wrote it.
|
|
6
|
+
*
|
|
7
|
+
* @param resourcePath - Path of the placeholder being replaced.
|
|
8
|
+
* @returns The module's code.
|
|
9
|
+
*/
|
|
10
|
+
async function generateCatalogModule(resourcePath) {
|
|
11
|
+
let catalog = await writeFontCatalog(process.cwd());
|
|
12
|
+
if (!isDefined(catalog)) return createCatalogModule(void 0);
|
|
13
|
+
let relative = path.relative(path.dirname(resourcePath), catalog.file).replaceAll("\\", "/");
|
|
14
|
+
return createCatalogModule(relative.startsWith(".") ? relative : `./${relative}`);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Webpack and Turbopack loader that replaces the placeholder catalog with the one the build step downloaded.
|
|
18
|
+
*
|
|
19
|
+
* @param this - The loader context.
|
|
20
|
+
* @returns The catalog module's code.
|
|
21
|
+
* @public
|
|
22
|
+
*/
|
|
23
|
+
async function fontCatalogLoader() {
|
|
24
|
+
return await generateCatalogModule(this.resourcePath);
|
|
25
|
+
}
|
|
26
|
+
export { fontCatalogLoader as default };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=next-loader.js.map
|