[{"data":1,"prerenderedAt":3859},["ShallowReactive",2],{"navigation_docs":3,"docs-navigation-with-icons":419,"-docs-typegen-astro":561,"-docs-typegen-astro-surround":3854},[4,66,87,124,405],{"title":5,"path":6,"stem":7,"children":8,"page":65},"Api","\u002Fdocs\u002Fapi","docs\u002Fapi",[9,13,17,21,25,29,33,37,41,45,49,53,57,61],{"title":10,"path":11,"stem":12},"Best Practices","\u002Fdocs\u002Fapi\u002Fbest-practices","docs\u002Fapi\u002Fbest-practices",{"title":14,"path":15,"stem":16},"Blog","\u002Fdocs\u002Fapi\u002Fblog","docs\u002Fapi\u002Fblog",{"title":18,"path":19,"stem":20},"Code Examples","\u002Fdocs\u002Fapi\u002Fcode-examples","docs\u002Fapi\u002Fcode-examples",{"title":22,"path":23,"stem":24},"Collections","\u002Fdocs\u002Fapi\u002Fcollections","docs\u002Fapi\u002Fcollections",{"title":26,"path":27,"stem":28},"Field Types","\u002Fdocs\u002Fapi\u002Ffield-types","docs\u002Fapi\u002Ffield-types",{"title":30,"path":31,"stem":32},"Rate Limits & Errors","\u002Fdocs\u002Fapi\u002Flimits-and-errors","docs\u002Fapi\u002Flimits-and-errors",{"title":34,"path":35,"stem":36},"Media","\u002Fdocs\u002Fapi\u002Fmedia","docs\u002Fapi\u002Fmedia",{"title":38,"path":39,"stem":40},"Overview","\u002Fdocs\u002Fapi\u002Foverview","docs\u002Fapi\u002Foverview",{"title":42,"path":43,"stem":44},"Pages","\u002Fdocs\u002Fapi\u002Fpages","docs\u002Fapi\u002Fpages",{"title":46,"path":47,"stem":48},"Query Parameters","\u002Fdocs\u002Fapi\u002Fquery-parameters","docs\u002Fapi\u002Fquery-parameters",{"title":50,"path":51,"stem":52},"Responses & Caching","\u002Fdocs\u002Fapi\u002Fresponses","docs\u002Fapi\u002Fresponses",{"title":54,"path":55,"stem":56},"Troubleshooting","\u002Fdocs\u002Fapi\u002Ftroubleshooting","docs\u002Fapi\u002Ftroubleshooting",{"title":58,"path":59,"stem":60},"Validation","\u002Fdocs\u002Fapi\u002Fvalidation","docs\u002Fapi\u002Fvalidation",{"title":62,"path":63,"stem":64},"Webhooks","\u002Fdocs\u002Fapi\u002Fwebhooks","docs\u002Fapi\u002Fwebhooks",false,{"title":67,"path":68,"stem":69,"children":70,"page":65},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002Fgetting-started",[71,75,79,83],{"title":72,"path":73,"stem":74},"Authentication","\u002Fdocs\u002Fgetting-started\u002Fauthentication","docs\u002Fgetting-started\u002Fauthentication",{"title":76,"path":77,"stem":78},"Introduction","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002Fgetting-started\u002Fintroduction",{"title":80,"path":81,"stem":82},"Quickstart","\u002Fdocs\u002Fgetting-started\u002Fquickstart","docs\u002Fgetting-started\u002Fquickstart",{"title":84,"path":85,"stem":86},"Write Operations","\u002Fdocs\u002Fgetting-started\u002Fwrite-operations","docs\u002Fgetting-started\u002Fwrite-operations",{"title":88,"path":89,"stem":90,"children":91,"page":65},"Guides","\u002Fdocs\u002Fguides","docs\u002Fguides",[92,96,100,104,108,112,116,120],{"title":93,"path":94,"stem":95},"Admin Interface","\u002Fdocs\u002Fguides\u002Fadmin-interface","docs\u002Fguides\u002Fadmin-interface",{"title":97,"path":98,"stem":99},"ButterCMS Migration","\u002Fdocs\u002Fguides\u002Fbuttercms-migration","docs\u002Fguides\u002Fbuttercms-migration",{"title":101,"path":102,"stem":103},"Migrations","\u002Fdocs\u002Fguides\u002Fmigrations","docs\u002Fguides\u002Fmigrations",{"title":105,"path":106,"stem":107},"Page Management","\u002Fdocs\u002Fguides\u002Fpage-management","docs\u002Fguides\u002Fpage-management",{"title":109,"path":110,"stem":111},"Public API Usage","\u002Fdocs\u002Fguides\u002Fpublic-api-usage","docs\u002Fguides\u002Fpublic-api-usage",{"title":113,"path":114,"stem":115},"Schema Builder","\u002Fdocs\u002Fguides\u002Fschema-builder","docs\u002Fguides\u002Fschema-builder",{"title":117,"path":118,"stem":119},"User Management","\u002Fdocs\u002Fguides\u002Fuser-management","docs\u002Fguides\u002Fuser-management",{"title":121,"path":122,"stem":123},"Rich Text Editor","\u002Fdocs\u002Fguides\u002Fwysiwyg-editor","docs\u002Fguides\u002Fwysiwyg-editor",{"title":125,"path":126,"stem":127,"children":128,"page":65},"Sdk","\u002Fdocs\u002Fsdk","docs\u002Fsdk",[129,132,136,140,144],{"title":38,"path":130,"stem":131},"\u002Fdocs\u002Fsdk\u002Freadme","docs\u002Fsdk\u002FREADME",{"title":133,"path":134,"stem":135},"Astro","\u002Fdocs\u002Fsdk\u002Fastro","docs\u002Fsdk\u002Fastro",{"title":137,"path":138,"stem":139},"Next.js","\u002Fdocs\u002Fsdk\u002Fnextjs","docs\u002Fsdk\u002Fnextjs",{"title":141,"path":142,"stem":143},"Nuxt","\u002Fdocs\u002Fsdk\u002Fnuxt","docs\u002Fsdk\u002Fnuxt",{"title":145,"path":146,"stem":147,"children":148,"page":65},"Reference","\u002Fdocs\u002Fsdk\u002Freference","docs\u002Fsdk\u002Freference",[149,153,222,235,380],{"title":150,"path":151,"stem":152},"@tentocms\u002Fclient","\u002Fdocs\u002Fsdk\u002Freference\u002Freadme","docs\u002Fsdk\u002Freference\u002FREADME",{"title":154,"path":155,"stem":156,"children":157,"page":65},"Classes","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses","docs\u002Fsdk\u002Freference\u002Fclasses",[158,162,166,170,174,178,182,186,190,194,198,202,206,210,214,218],{"title":159,"path":160,"stem":161},"Class: BlogCategoriesResource","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Fblogcategoriesresource","docs\u002Fsdk\u002Freference\u002Fclasses\u002FBlogCategoriesResource",{"title":163,"path":164,"stem":165},"Class: BlogPostsResource","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Fblogpostsresource","docs\u002Fsdk\u002Freference\u002Fclasses\u002FBlogPostsResource",{"title":167,"path":168,"stem":169},"Class: BlogResource","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Fblogresource","docs\u002Fsdk\u002Freference\u002Fclasses\u002FBlogResource",{"title":171,"path":172,"stem":173},"Class: BlogTagsResource","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Fblogtagsresource","docs\u002Fsdk\u002Freference\u002Fclasses\u002FBlogTagsResource",{"title":175,"path":176,"stem":177},"Class: CollectionsResource","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Fcollectionsresource","docs\u002Fsdk\u002Freference\u002Fclasses\u002FCollectionsResource",{"title":179,"path":180,"stem":181},"Class: CollectionsWriteResource","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Fcollectionswriteresource","docs\u002Fsdk\u002Freference\u002Fclasses\u002FCollectionsWriteResource",{"title":183,"path":184,"stem":185},"Class: MediaResource","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Fmediaresource","docs\u002Fsdk\u002Freference\u002Fclasses\u002FMediaResource",{"title":187,"path":188,"stem":189},"Class: MediaWriteResource","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Fmediawriteresource","docs\u002Fsdk\u002Freference\u002Fclasses\u002FMediaWriteResource",{"title":191,"path":192,"stem":193},"Class: PagesResource","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Fpagesresource","docs\u002Fsdk\u002Freference\u002Fclasses\u002FPagesResource",{"title":195,"path":196,"stem":197},"Class: PagesWriteResource","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Fpageswriteresource","docs\u002Fsdk\u002Freference\u002Fclasses\u002FPagesWriteResource",{"title":199,"path":200,"stem":201},"Class: TentoAuthenticationError","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Ftentoauthenticationerror","docs\u002Fsdk\u002Freference\u002Fclasses\u002FTentoAuthenticationError",{"title":203,"path":204,"stem":205},"Class: TentoClient","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Ftentoclient","docs\u002Fsdk\u002Freference\u002Fclasses\u002FTentoClient",{"title":207,"path":208,"stem":209},"Class: TentoError","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Ftentoerror","docs\u002Fsdk\u002Freference\u002Fclasses\u002FTentoError",{"title":211,"path":212,"stem":213},"Class: TentoNetworkError","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Ftentonetworkerror","docs\u002Fsdk\u002Freference\u002Fclasses\u002FTentoNetworkError",{"title":215,"path":216,"stem":217},"Class: TentoNotFoundError","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Ftentonotfounderror","docs\u002Fsdk\u002Freference\u002Fclasses\u002FTentoNotFoundError",{"title":219,"path":220,"stem":221},"Class: TentoRateLimitError","\u002Fdocs\u002Fsdk\u002Freference\u002Fclasses\u002Ftentoratelimiterror","docs\u002Fsdk\u002Freference\u002Fclasses\u002FTentoRateLimitError",{"title":223,"path":224,"stem":225,"children":226,"page":65},"Functions","\u002Fdocs\u002Fsdk\u002Freference\u002Ffunctions","docs\u002Fsdk\u002Freference\u002Ffunctions",[227,231],{"title":228,"path":229,"stem":230},"Function: getUrl()","\u002Fdocs\u002Fsdk\u002Freference\u002Ffunctions\u002Fgeturl","docs\u002Fsdk\u002Freference\u002Ffunctions\u002FgetUrl",{"title":232,"path":233,"stem":234},"Function: mockMedia()","\u002Fdocs\u002Fsdk\u002Freference\u002Ffunctions\u002Fmockmedia","docs\u002Fsdk\u002Freference\u002Ffunctions\u002FmockMedia",{"title":236,"path":237,"stem":238,"children":239,"page":65},"Interfaces","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces","docs\u002Fsdk\u002Freference\u002Finterfaces",[240,244,248,252,256,260,264,268,272,276,280,284,288,292,296,300,304,308,312,316,320,324,328,332,336,340,344,348,352,356,360,364,368,372,376],{"title":241,"path":242,"stem":243},"Interface: BlogAuthor","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fblogauthor","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FBlogAuthor",{"title":245,"path":246,"stem":247},"Interface: BlogCategory","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fblogcategory","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FBlogCategory",{"title":249,"path":250,"stem":251},"Interface: BlogPost","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fblogpost","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FBlogPost",{"title":253,"path":254,"stem":255},"Interface: BlogPostListOptions","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fblogpostlistoptions","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FBlogPostListOptions",{"title":257,"path":258,"stem":259},"Interface: BlogTag","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fblogtag","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FBlogTag",{"title":261,"path":262,"stem":263},"Interface: CollectionItemResponse\u003CT>","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fcollectionitemresponse","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FCollectionItemResponse",{"title":265,"path":266,"stem":267},"Interface: CollectionListOptions","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fcollectionlistoptions","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FCollectionListOptions",{"title":269,"path":270,"stem":271},"Interface: CollectionListResponse\u003CT>","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fcollectionlistresponse","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FCollectionListResponse",{"title":273,"path":274,"stem":275},"Interface: CollectionTypeMeta","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fcollectiontypemeta","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FCollectionTypeMeta",{"title":277,"path":278,"stem":279},"Interface: CreateCollectionItemInput","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fcreatecollectioniteminput","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FCreateCollectionItemInput",{"title":281,"path":282,"stem":283},"Interface: CreatePageInput","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fcreatepageinput","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FCreatePageInput",{"title":285,"path":286,"stem":287},"Interface: DryRunResult","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fdryrunresult","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FDryRunResult",{"title":289,"path":290,"stem":291},"Interface: FilterCondition","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Ffiltercondition","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FFilterCondition",{"title":293,"path":294,"stem":295},"Interface: ItemResponse\u003CT>","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fitemresponse","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FItemResponse",{"title":297,"path":298,"stem":299},"Interface: ListResponse\u003CT>","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Flistresponse","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FListResponse",{"title":301,"path":302,"stem":303},"Interface: Media","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fmedia","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FMedia",{"title":305,"path":306,"stem":307},"Interface: MediaItem","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fmediaitem","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FMediaItem",{"title":309,"path":310,"stem":311},"Interface: MediaOption","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fmediaoption","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FMediaOption",{"title":313,"path":314,"stem":315},"Interface: MediaTransformOptions","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fmediatransformoptions","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FMediaTransformOptions",{"title":317,"path":318,"stem":319},"Interface: Page\u003CTContent>","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fpage","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FPage",{"title":321,"path":322,"stem":323},"Interface: PageGetOptions","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fpagegetoptions","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FPageGetOptions",{"title":325,"path":326,"stem":327},"Interface: PageListOptions","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fpagelistoptions","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FPageListOptions",{"title":329,"path":330,"stem":331},"Interface: PageWithRedirect\u003CTContent>","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fpagewithredirect","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FPageWithRedirect",{"title":333,"path":334,"stem":335},"Interface: PaginationMeta","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fpaginationmeta","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FPaginationMeta",{"title":337,"path":338,"stem":339},"Interface: PreviewOption","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fpreviewoption","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FPreviewOption",{"title":341,"path":342,"stem":343},"Interface: RedirectInfo","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fredirectinfo","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FRedirectInfo",{"title":345,"path":346,"stem":347},"Interface: RefTypesOption","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Freftypesoption","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FRefTypesOption",{"title":349,"path":350,"stem":351},"Interface: SeoMetadata","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fseometadata","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FSeoMetadata",{"title":353,"path":354,"stem":355},"Interface: TentoClientConfig","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Ftentoclientconfig","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FTentoClientConfig",{"title":357,"path":358,"stem":359},"Interface: TentoMedia","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Ftentomedia","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FTentoMedia",{"title":361,"path":362,"stem":363},"Interface: UpdateCollectionItemInput","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fupdatecollectioniteminput","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FUpdateCollectionItemInput",{"title":365,"path":366,"stem":367},"Interface: UpdatePageInput","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fupdatepageinput","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FUpdatePageInput",{"title":369,"path":370,"stem":371},"Interface: UploadMediaInput","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fuploadmediainput","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FUploadMediaInput",{"title":373,"path":374,"stem":375},"Interface: WriteCollectionItem","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fwritecollectionitem","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FWriteCollectionItem",{"title":377,"path":378,"stem":379},"Interface: WritePage","\u002Fdocs\u002Fsdk\u002Freference\u002Finterfaces\u002Fwritepage","docs\u002Fsdk\u002Freference\u002Finterfaces\u002FWritePage",{"title":381,"path":382,"stem":383,"children":384,"page":65},"Type Aliases","\u002Fdocs\u002Fsdk\u002Freference\u002Ftype-aliases","docs\u002Fsdk\u002Freference\u002Ftype-aliases",[385,389,393,397,401],{"title":386,"path":387,"stem":388},"Type Alias: BlogPostListItem","\u002Fdocs\u002Fsdk\u002Freference\u002Ftype-aliases\u002Fblogpostlistitem","docs\u002Fsdk\u002Freference\u002Ftype-aliases\u002FBlogPostListItem",{"title":390,"path":391,"stem":392},"Type Alias: BlogPostListResponse","\u002Fdocs\u002Fsdk\u002Freference\u002Ftype-aliases\u002Fblogpostlistresponse","docs\u002Fsdk\u002Freference\u002Ftype-aliases\u002FBlogPostListResponse",{"title":394,"path":395,"stem":396},"Type Alias: CollectionItem\u003CTContent>","\u002Fdocs\u002Fsdk\u002Freference\u002Ftype-aliases\u002Fcollectionitem","docs\u002Fsdk\u002Freference\u002Ftype-aliases\u002FCollectionItem",{"title":398,"path":399,"stem":400},"Type Alias: FilterOperator","\u002Fdocs\u002Fsdk\u002Freference\u002Ftype-aliases\u002Ffilteroperator","docs\u002Fsdk\u002Freference\u002Ftype-aliases\u002FFilterOperator",{"title":402,"path":403,"stem":404},"Type Alias: MediaMode","\u002Fdocs\u002Fsdk\u002Freference\u002Ftype-aliases\u002Fmediamode","docs\u002Fsdk\u002Freference\u002Ftype-aliases\u002FMediaMode",{"title":406,"path":407,"stem":408,"children":409,"page":65},"Typegen","\u002Fdocs\u002Ftypegen","docs\u002Ftypegen",[410,413,416],{"title":133,"path":411,"stem":412},"\u002Fdocs\u002Ftypegen\u002Fastro","docs\u002Ftypegen\u002Fastro",{"title":137,"path":414,"stem":415},"\u002Fdocs\u002Ftypegen\u002Fnextjs","docs\u002Ftypegen\u002Fnextjs",{"title":141,"path":417,"stem":418},"\u002Fdocs\u002Ftypegen\u002Fnuxt","docs\u002Ftypegen\u002Fnuxt",[420,450,460,478,556],{"title":5,"path":6,"stem":7,"children":421,"page":65},[422,424,426,428,430,432,434,436,438,440,442,444,446,448],{"title":10,"path":11,"stem":12,"icon":423},"i-lucide-sparkles",{"title":14,"path":15,"stem":16,"icon":425},"i-lucide-newspaper",{"title":18,"path":19,"stem":20,"icon":427},"i-lucide-terminal",{"title":22,"path":23,"stem":24,"icon":429},"i-lucide-layers",{"title":26,"path":27,"stem":28,"icon":431},"i-lucide-type",{"title":30,"path":31,"stem":32,"icon":433},"i-lucide-triangle-alert",{"title":34,"path":35,"stem":36,"icon":435},"i-lucide-image",{"title":38,"path":39,"stem":40,"icon":437},"i-lucide-map",{"title":42,"path":43,"stem":44,"icon":439},"i-lucide-file-text",{"title":46,"path":47,"stem":48,"icon":441},"i-lucide-sliders-horizontal",{"title":50,"path":51,"stem":52,"icon":443},"i-lucide-braces",{"title":54,"path":55,"stem":56,"icon":445},"i-lucide-wrench",{"title":58,"path":59,"stem":60,"icon":447},"i-lucide-shield-check",{"title":62,"path":63,"stem":64,"icon":449},"i-lucide-webhook",{"title":67,"path":68,"stem":69,"children":451,"page":65},[452,454,456,458],{"title":72,"path":73,"stem":74,"icon":453},"i-lucide-key-round",{"title":76,"path":77,"stem":78,"icon":455},"i-lucide-compass",{"title":80,"path":81,"stem":82,"icon":457},"i-lucide-rocket",{"title":84,"path":85,"stem":86,"icon":459},"i-lucide-pencil",{"title":88,"path":89,"stem":90,"children":461,"page":65},[462,464,466,468,470,472,474,476],{"title":93,"path":94,"stem":95,"icon":463},"i-lucide-layout-dashboard",{"title":97,"path":98,"stem":99,"icon":465},"i-lucide-package",{"title":101,"path":102,"stem":103,"icon":467},"i-lucide-git-branch",{"title":105,"path":106,"stem":107,"icon":469},"i-lucide-files",{"title":109,"path":110,"stem":111,"icon":471},"i-lucide-plug-zap",{"title":113,"path":114,"stem":115,"icon":473},"i-lucide-wand",{"title":117,"path":118,"stem":119,"icon":475},"i-lucide-users",{"title":121,"path":122,"stem":123,"icon":477},"i-lucide-pilcrow",{"title":125,"path":126,"stem":127,"children":479,"page":65},[480,481,482,484,486],{"title":38,"path":130,"stem":131,"icon":465},{"title":133,"path":134,"stem":135,"icon":457},{"title":137,"path":138,"stem":139,"icon":483},"i-lucide-triangle",{"title":141,"path":142,"stem":143,"icon":485},"i-lucide-hexagon",{"title":145,"path":146,"stem":147,"children":487,"page":65},[488,490,508,512,549],{"title":150,"path":151,"stem":152,"icon":489},null,{"title":154,"path":155,"stem":156,"children":491,"page":65},[492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507],{"title":159,"path":160,"stem":161,"icon":489},{"title":163,"path":164,"stem":165,"icon":489},{"title":167,"path":168,"stem":169,"icon":489},{"title":171,"path":172,"stem":173,"icon":489},{"title":175,"path":176,"stem":177,"icon":489},{"title":179,"path":180,"stem":181,"icon":489},{"title":183,"path":184,"stem":185,"icon":489},{"title":187,"path":188,"stem":189,"icon":489},{"title":191,"path":192,"stem":193,"icon":489},{"title":195,"path":196,"stem":197,"icon":489},{"title":199,"path":200,"stem":201,"icon":489},{"title":203,"path":204,"stem":205,"icon":489},{"title":207,"path":208,"stem":209,"icon":489},{"title":211,"path":212,"stem":213,"icon":489},{"title":215,"path":216,"stem":217,"icon":489},{"title":219,"path":220,"stem":221,"icon":489},{"title":223,"path":224,"stem":225,"children":509,"page":65},[510,511],{"title":228,"path":229,"stem":230,"icon":489},{"title":232,"path":233,"stem":234,"icon":489},{"title":236,"path":237,"stem":238,"children":513,"page":65},[514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548],{"title":241,"path":242,"stem":243,"icon":489},{"title":245,"path":246,"stem":247,"icon":489},{"title":249,"path":250,"stem":251,"icon":489},{"title":253,"path":254,"stem":255,"icon":489},{"title":257,"path":258,"stem":259,"icon":489},{"title":261,"path":262,"stem":263,"icon":489},{"title":265,"path":266,"stem":267,"icon":489},{"title":269,"path":270,"stem":271,"icon":489},{"title":273,"path":274,"stem":275,"icon":489},{"title":277,"path":278,"stem":279,"icon":489},{"title":281,"path":282,"stem":283,"icon":489},{"title":285,"path":286,"stem":287,"icon":489},{"title":289,"path":290,"stem":291,"icon":489},{"title":293,"path":294,"stem":295,"icon":489},{"title":297,"path":298,"stem":299,"icon":489},{"title":301,"path":302,"stem":303,"icon":489},{"title":305,"path":306,"stem":307,"icon":489},{"title":309,"path":310,"stem":311,"icon":489},{"title":313,"path":314,"stem":315,"icon":489},{"title":317,"path":318,"stem":319,"icon":489},{"title":321,"path":322,"stem":323,"icon":489},{"title":325,"path":326,"stem":327,"icon":489},{"title":329,"path":330,"stem":331,"icon":489},{"title":333,"path":334,"stem":335,"icon":489},{"title":337,"path":338,"stem":339,"icon":489},{"title":341,"path":342,"stem":343,"icon":489},{"title":345,"path":346,"stem":347,"icon":489},{"title":349,"path":350,"stem":351,"icon":489},{"title":353,"path":354,"stem":355,"icon":489},{"title":357,"path":358,"stem":359,"icon":489},{"title":361,"path":362,"stem":363,"icon":489},{"title":365,"path":366,"stem":367,"icon":489},{"title":369,"path":370,"stem":371,"icon":489},{"title":373,"path":374,"stem":375,"icon":489},{"title":377,"path":378,"stem":379,"icon":489},{"title":381,"path":382,"stem":383,"children":550,"page":65},[551,552,553,554,555],{"title":386,"path":387,"stem":388,"icon":489},{"title":390,"path":391,"stem":392,"icon":489},{"title":394,"path":395,"stem":396,"icon":489},{"title":398,"path":399,"stem":400,"icon":489},{"title":402,"path":403,"stem":404,"icon":489},{"title":406,"path":407,"stem":408,"children":557,"page":65},[558,559,560],{"title":133,"path":411,"stem":412,"icon":457},{"title":137,"path":414,"stem":415,"icon":483},{"title":141,"path":417,"stem":418,"icon":485},{"id":562,"title":133,"body":563,"description":3849,"extension":3850,"icon":457,"links":489,"meta":3851,"navigation":952,"path":411,"seo":3852,"stem":412,"__hash__":3853},"docs\u002Fdocs\u002Ftypegen\u002Fastro.md",{"type":564,"value":565,"toc":3817},"minimark",[566,570,575,604,648,652,657,664,680,703,832,836,842,871,878,884,912,930,972,996,1014,1047,1051,1057,1195,1199,1214,1220,1224,1228,1231,1494,1498,1501,1641,1645,1767,1771,1774,2297,2300,2363,2367,2370,2501,2504,2575,2579,2582,3010,3013,3162,3165,3192,3205,3208,3243,3263,3318,3348,3354,3358,3402,3406,3410,3413,3450,3453,3457,3475,3479,3484,3610,3613,3617,3640,3644,3661,3665,3671,3704,3711,3715,3718,3782,3786,3813],[567,568,569],"p",{},"This guide shows you how to integrate TentoCMS type generation into your Astro project for fully typed content fetching.",[571,572,574],"h2",{"id":573},"installation","Installation",[576,577,582],"pre",{"className":578,"code":579,"language":580,"meta":581,"style":581},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npm install -D @tentocms\u002Ftypegen\n","bash","",[583,584,585],"code",{"__ignoreMap":581},[586,587,590,594,598,601],"span",{"class":588,"line":589},"line",1,[586,591,593],{"class":592},"sBMFI","npm",[586,595,597],{"class":596},"sfazB"," install",[586,599,600],{"class":596}," -D",[586,602,603],{"class":596}," @tentocms\u002Ftypegen\n",[605,606,607],"blockquote",{},[567,608,609,617,618,621,622,625,626,628,629,632,633,636,637,640,641,644,645,647],{},[610,611,612,613,616],"strong",{},"Optional: the ",[583,614,615],{},"Page\u003CT>"," wrapper type."," The examples below that fetch a single page (e.g. ",[583,619,620],{},"Page\u003CBlogPostFields>",") import the ",[583,623,624],{},"Page"," type from ",[583,627,150],{}," — it describes the ",[583,630,631],{},"{ id, name, slug, type, fields, seo, publishedAt, updatedAt }"," envelope the REST API actually returns. ",[583,634,635],{},"typegen"," itself only generates the schema-shaped interfaces (",[583,638,639],{},"*Content","\u002F",[583,642,643],{},"*Fields","\u002Fcollection types); it does not emit a page-envelope wrapper. If you'd rather avoid the extra type-only dependency, replace ",[583,646,620],{}," with an inline type or your own envelope interface.",[571,649,651],{"id":650},"configuration","Configuration",[653,654,656],"h3",{"id":655},"_1-create-configuration-file","1. Create Configuration File",[567,658,659,660,663],{},"Run the init command to create a ",[583,661,662],{},"tentocms.config.js"," file:",[576,665,667],{"className":578,"code":666,"language":580,"meta":581,"style":581},"npx tentocms-typegen init\n",[583,668,669],{"__ignoreMap":581},[586,670,671,674,677],{"class":588,"line":589},[586,672,673],{"class":592},"npx",[586,675,676],{"class":596}," tentocms-typegen",[586,678,679],{"class":596}," init\n",[567,681,682,683,686,687,690,691,694,695,698,699,702],{},"This creates the file below. ",[583,684,685],{},"init"," detects your project layout: a ",[583,688,689],{},".\u002Fsrc\u002F"," directory (standard in Astro) yields ",[583,692,693],{},".\u002Fsrc\u002Ftypes\u002Fcms.ts","; otherwise (a Nuxt project or no ",[583,696,697],{},"src\u002F",") it uses ",[583,700,701],{},".\u002Ftypes\u002Fcms.ts",".",[576,704,708],{"className":705,"code":706,"language":707,"meta":581,"style":581},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F tentocms.config.js\nexport default {\n  apiKey: process.env.TENTO_API_KEY,\n  apiUrl: process.env.TENTO_BASE_URL,\n  output: '.\u002Fsrc\u002Ftypes\u002Fcms.ts',\n  watch: {\n    interval: 30,\n  },\n}\n","javascript",[583,709,710,716,730,757,778,796,806,820,826],{"__ignoreMap":581},[586,711,712],{"class":588,"line":589},[586,713,715],{"class":714},"sHwdD","\u002F\u002F tentocms.config.js\n",[586,717,719,723,726],{"class":588,"line":718},2,[586,720,722],{"class":721},"s7zQu","export",[586,724,725],{"class":721}," default",[586,727,729],{"class":728},"sMK4o"," {\n",[586,731,733,737,740,744,746,749,751,754],{"class":588,"line":732},3,[586,734,736],{"class":735},"swJcz","  apiKey",[586,738,739],{"class":728},":",[586,741,743],{"class":742},"sTEyZ"," process",[586,745,702],{"class":728},[586,747,748],{"class":742},"env",[586,750,702],{"class":728},[586,752,753],{"class":742},"TENTO_API_KEY",[586,755,756],{"class":728},",\n",[586,758,760,763,765,767,769,771,773,776],{"class":588,"line":759},4,[586,761,762],{"class":735},"  apiUrl",[586,764,739],{"class":728},[586,766,743],{"class":742},[586,768,702],{"class":728},[586,770,748],{"class":742},[586,772,702],{"class":728},[586,774,775],{"class":742},"TENTO_BASE_URL",[586,777,756],{"class":728},[586,779,781,784,786,789,791,794],{"class":588,"line":780},5,[586,782,783],{"class":735},"  output",[586,785,739],{"class":728},[586,787,788],{"class":728}," '",[586,790,693],{"class":596},[586,792,793],{"class":728},"'",[586,795,756],{"class":728},[586,797,799,802,804],{"class":588,"line":798},6,[586,800,801],{"class":735},"  watch",[586,803,739],{"class":728},[586,805,729],{"class":728},[586,807,809,812,814,818],{"class":588,"line":808},7,[586,810,811],{"class":735},"    interval",[586,813,739],{"class":728},[586,815,817],{"class":816},"sbssI"," 30",[586,819,756],{"class":728},[586,821,823],{"class":588,"line":822},8,[586,824,825],{"class":728},"  },\n",[586,827,829],{"class":588,"line":828},9,[586,830,831],{"class":728},"}\n",[653,833,835],{"id":834},"_2-add-environment-variables","2. Add Environment Variables",[567,837,838,839,663],{},"Create or update your ",[583,840,841],{},".env",[576,843,845],{"className":578,"code":844,"language":580,"meta":581,"style":581},"# .env\nTENTO_API_KEY=your_api_key_here\nTENTO_BASE_URL=https:\u002F\u002Ftento-api.intelligentlending.co.uk\n",[583,846,847,852,862],{"__ignoreMap":581},[586,848,849],{"class":588,"line":589},[586,850,851],{"class":714},"# .env\n",[586,853,854,856,859],{"class":588,"line":718},[586,855,753],{"class":742},[586,857,858],{"class":728},"=",[586,860,861],{"class":596},"your_api_key_here\n",[586,863,864,866,868],{"class":588,"line":732},[586,865,775],{"class":742},[586,867,858],{"class":728},[586,869,870],{"class":596},"https:\u002F\u002Ftento-api.intelligentlending.co.uk\n",[567,872,873,874,877],{},"Never prefix the API key with ",[583,875,876],{},"PUBLIC_"," — that would expose it in the browser bundle. The base URL is safe to expose if needed.",[567,879,880,881,739],{},"Add to ",[583,882,883],{},".gitignore",[576,885,887],{"className":578,"code":886,"language":580,"meta":581,"style":581},"# .gitignore\n.env\n.env.*\n!.env.example\n",[583,888,889,894,899,904],{"__ignoreMap":581},[586,890,891],{"class":588,"line":589},[586,892,893],{"class":714},"# .gitignore\n",[586,895,896],{"class":588,"line":718},[586,897,898],{"class":592},".env\n",[586,900,901],{"class":588,"line":732},[586,902,903],{"class":592},".env.*\n",[586,905,906,909],{"class":588,"line":759},[586,907,908],{"class":728},"!",[586,910,911],{"class":592},".env.example\n",[567,913,914,917,918,920,921,924,925,927,928,739],{},[583,915,916],{},"generate"," loads a ",[583,919,841],{}," file into ",[583,922,923],{},"process.env"," before reading ",[583,926,753],{}," \u002F ",[583,929,775],{},[576,931,933],{"className":578,"code":932,"language":580,"meta":581,"style":581},"# Auto-loads .\u002F.env if present\ntentocms-typegen generate\n\n# Or point at an explicit file\ntentocms-typegen generate -e .\u002Fconfig\u002F.env.cms\n",[583,934,935,940,948,954,959],{"__ignoreMap":581},[586,936,937],{"class":588,"line":589},[586,938,939],{"class":714},"# Auto-loads .\u002F.env if present\n",[586,941,942,945],{"class":588,"line":718},[586,943,944],{"class":592},"tentocms-typegen",[586,946,947],{"class":596}," generate\n",[586,949,950],{"class":588,"line":732},[586,951,953],{"emptyLinePlaceholder":952},true,"\n",[586,955,956],{"class":588,"line":759},[586,957,958],{"class":714},"# Or point at an explicit file\n",[586,960,961,963,966,969],{"class":588,"line":780},[586,962,944],{"class":592},[586,964,965],{"class":596}," generate",[586,967,968],{"class":596}," -e",[586,970,971],{"class":596}," .\u002Fconfig\u002F.env.cms\n",[973,974,975,986],"ul",{},[976,977,978,981,982,985],"li",{},[583,979,980],{},"-e, --env \u003Cpath>"," loads the given file (errors if it's missing). With no flag, ",[583,983,984],{},".\u002F.env"," is auto-loaded if present.",[976,987,988,989,991,992,995],{},"Real environment variables are never overridden — existing ",[583,990,923],{}," values always win, so ",[583,993,994],{},"node --env-file=.env ..."," keeps working.",[605,997,998],{},[567,999,1000,1003,1004,1007,1008,640,1011,702],{},[610,1001,1002],{},"Node ≥ 22\u002F24:"," a bare ",[583,1005,1006],{},"--env-file"," is reserved by Node and won't reach this CLI — use ",[583,1009,1010],{},"-e",[583,1012,1013],{},"--env",[567,1015,1016,1018,1019,1022,1023,1022,1026,1029,1030,1033,1034,1036,1037,1042,1043,1046],{},[583,1017,916],{}," also accepts ",[583,1020,1021],{},"-o\u002F--output",", ",[583,1024,1025],{},"-k\u002F--api-key",[583,1027,1028],{},"-u\u002F--api-url",", and ",[583,1031,1032],{},"-i\u002F--interval"," (watch mode only) — each overrides the matching ",[583,1035,662],{}," value. See the ",[1038,1039,1041],"a",{"href":1040},"..\u002F..\u002F..\u002Fpackages\u002Ftypegen\u002Freadme#generate--flag-reference","full CLI flag reference"," for the complete list, including a caveat about ",[583,1044,1045],{},"-c\u002F--config"," currently being a no-op.",[653,1048,1050],{"id":1049},"_3-add-npm-scripts","3. Add npm Scripts",[567,1052,1053,1054,739],{},"Update your ",[583,1055,1056],{},"package.json",[576,1058,1062],{"className":1059,"code":1060,"language":1061,"meta":581,"style":581},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"scripts\": {\n    \"dev\": \"astro dev\",\n    \"build\": \"astro build\",\n    \"types:generate\": \"tentocms-typegen generate\",\n    \"types:watch\": \"tentocms-typegen generate --watch\",\n    \"postinstall\": \"npm run types:generate\"\n  }\n}\n","json",[583,1063,1064,1069,1085,1107,1127,1147,1167,1186,1191],{"__ignoreMap":581},[586,1065,1066],{"class":588,"line":589},[586,1067,1068],{"class":728},"{\n",[586,1070,1071,1074,1078,1081,1083],{"class":588,"line":718},[586,1072,1073],{"class":728},"  \"",[586,1075,1077],{"class":1076},"spNyl","scripts",[586,1079,1080],{"class":728},"\"",[586,1082,739],{"class":728},[586,1084,729],{"class":728},[586,1086,1087,1090,1093,1095,1097,1100,1103,1105],{"class":588,"line":732},[586,1088,1089],{"class":728},"    \"",[586,1091,1092],{"class":592},"dev",[586,1094,1080],{"class":728},[586,1096,739],{"class":728},[586,1098,1099],{"class":728}," \"",[586,1101,1102],{"class":596},"astro dev",[586,1104,1080],{"class":728},[586,1106,756],{"class":728},[586,1108,1109,1111,1114,1116,1118,1120,1123,1125],{"class":588,"line":759},[586,1110,1089],{"class":728},[586,1112,1113],{"class":592},"build",[586,1115,1080],{"class":728},[586,1117,739],{"class":728},[586,1119,1099],{"class":728},[586,1121,1122],{"class":596},"astro build",[586,1124,1080],{"class":728},[586,1126,756],{"class":728},[586,1128,1129,1131,1134,1136,1138,1140,1143,1145],{"class":588,"line":780},[586,1130,1089],{"class":728},[586,1132,1133],{"class":592},"types:generate",[586,1135,1080],{"class":728},[586,1137,739],{"class":728},[586,1139,1099],{"class":728},[586,1141,1142],{"class":596},"tentocms-typegen generate",[586,1144,1080],{"class":728},[586,1146,756],{"class":728},[586,1148,1149,1151,1154,1156,1158,1160,1163,1165],{"class":588,"line":798},[586,1150,1089],{"class":728},[586,1152,1153],{"class":592},"types:watch",[586,1155,1080],{"class":728},[586,1157,739],{"class":728},[586,1159,1099],{"class":728},[586,1161,1162],{"class":596},"tentocms-typegen generate --watch",[586,1164,1080],{"class":728},[586,1166,756],{"class":728},[586,1168,1169,1171,1174,1176,1178,1180,1183],{"class":588,"line":808},[586,1170,1089],{"class":728},[586,1172,1173],{"class":592},"postinstall",[586,1175,1080],{"class":728},[586,1177,739],{"class":728},[586,1179,1099],{"class":728},[586,1181,1182],{"class":596},"npm run types:generate",[586,1184,1185],{"class":728},"\"\n",[586,1187,1188],{"class":588,"line":822},[586,1189,1190],{"class":728},"  }\n",[586,1192,1193],{"class":588,"line":828},[586,1194,831],{"class":728},[653,1196,1198],{"id":1197},"_4-generate-types","4. Generate Types",[576,1200,1202],{"className":578,"code":1201,"language":580,"meta":581,"style":581},"npm run types:generate\n",[583,1203,1204],{"__ignoreMap":581},[586,1205,1206,1208,1211],{"class":588,"line":589},[586,1207,593],{"class":592},[586,1209,1210],{"class":596}," run",[586,1212,1213],{"class":596}," types:generate\n",[567,1215,1216,1217,1219],{},"This creates ",[583,1218,693],{}," with your page types, collections, and component types.",[571,1221,1223],{"id":1222},"usage-in-astro","Usage in Astro",[653,1225,1227],{"id":1226},"fetching-pages","Fetching Pages",[567,1229,1230],{},"Astro's server frontmatter runs at build time (or on the server for SSR) — the API key stays server-side:",[576,1232,1236],{"className":1233,"code":1234,"language":1235,"meta":581,"style":581},"language-astro shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","---\n\u002F\u002F src\u002Fpages\u002Fblog\u002F[slug].astro\nimport type { Page } from '@tentocms\u002Fclient'\nimport type { BlogPostFields } from '..\u002F..\u002Ftypes\u002Fcms'\n\nconst { slug } = Astro.params\n\n\u002F\u002F TENTO_API_KEY has no PUBLIC_ prefix — it is server-only\nconst response = await fetch(\n  `${import.meta.env.TENTO_BASE_URL}\u002Fapi\u002Fv1\u002Fpages\u002F${slug}`,\n  {\n    headers: {\n      'X-API-Key': import.meta.env.TENTO_API_KEY,\n    },\n  }\n)\n\nif (!response.ok) {\n  return Astro.redirect('\u002F404')\n}\n\n\u002F\u002F The REST API returns `Page\u003CBlogPostFields>` directly for this endpoint —\n\u002F\u002F `name`\u002F`fields`\u002F`seo` at the top level, custom content under `fields`.\nconst page: Page\u003CBlogPostFields> = await response.json()\n---\n\n\u003Carticle>\n  \u003Ch1>{page.name}\u003C\u002Fh1>\n\n  \u003C!-- Custom fields live under page.fields -->\n  \u003Cdiv class=\"meta\">\n    \u003Ctime>{page.fields.publishedDate}\u003C\u002Ftime>\n    \u003Cspan>{page.fields.author.name}\u003C\u002Fspan>\n  \u003C\u002Fdiv>\n\n  \u003Cdiv set:html={page.fields.body} \u002F>\n\n  \u003C!-- Render components — match on comp._type (kebab-case discriminant) -->\n  {page.fields.components.map((comp) => (\n    \u003CFragment>\n      {comp._type === 'hero' && \u003CHero {...comp} \u002F>}\n      {comp._type === 'text-block' && \u003CTextBlock {...comp} \u002F>}\n      {comp._type === 'image-gallery' && \u003CImageGallery {...comp} \u002F>}\n    \u003C\u002FFragment>\n  ))}\n\u003C\u002Farticle>\n","astro",[583,1237,1238,1243,1248,1253,1258,1262,1267,1271,1276,1281,1287,1293,1299,1305,1311,1316,1322,1327,1333,1339,1344,1349,1355,1361,1367,1372,1377,1383,1389,1394,1400,1406,1412,1418,1424,1429,1435,1440,1446,1452,1458,1464,1470,1476,1482,1488],{"__ignoreMap":581},[586,1239,1240],{"class":588,"line":589},[586,1241,1242],{},"---\n",[586,1244,1245],{"class":588,"line":718},[586,1246,1247],{},"\u002F\u002F src\u002Fpages\u002Fblog\u002F[slug].astro\n",[586,1249,1250],{"class":588,"line":732},[586,1251,1252],{},"import type { Page } from '@tentocms\u002Fclient'\n",[586,1254,1255],{"class":588,"line":759},[586,1256,1257],{},"import type { BlogPostFields } from '..\u002F..\u002Ftypes\u002Fcms'\n",[586,1259,1260],{"class":588,"line":780},[586,1261,953],{"emptyLinePlaceholder":952},[586,1263,1264],{"class":588,"line":798},[586,1265,1266],{},"const { slug } = Astro.params\n",[586,1268,1269],{"class":588,"line":808},[586,1270,953],{"emptyLinePlaceholder":952},[586,1272,1273],{"class":588,"line":822},[586,1274,1275],{},"\u002F\u002F TENTO_API_KEY has no PUBLIC_ prefix — it is server-only\n",[586,1277,1278],{"class":588,"line":828},[586,1279,1280],{},"const response = await fetch(\n",[586,1282,1284],{"class":588,"line":1283},10,[586,1285,1286],{},"  `${import.meta.env.TENTO_BASE_URL}\u002Fapi\u002Fv1\u002Fpages\u002F${slug}`,\n",[586,1288,1290],{"class":588,"line":1289},11,[586,1291,1292],{},"  {\n",[586,1294,1296],{"class":588,"line":1295},12,[586,1297,1298],{},"    headers: {\n",[586,1300,1302],{"class":588,"line":1301},13,[586,1303,1304],{},"      'X-API-Key': import.meta.env.TENTO_API_KEY,\n",[586,1306,1308],{"class":588,"line":1307},14,[586,1309,1310],{},"    },\n",[586,1312,1314],{"class":588,"line":1313},15,[586,1315,1190],{},[586,1317,1319],{"class":588,"line":1318},16,[586,1320,1321],{},")\n",[586,1323,1325],{"class":588,"line":1324},17,[586,1326,953],{"emptyLinePlaceholder":952},[586,1328,1330],{"class":588,"line":1329},18,[586,1331,1332],{},"if (!response.ok) {\n",[586,1334,1336],{"class":588,"line":1335},19,[586,1337,1338],{},"  return Astro.redirect('\u002F404')\n",[586,1340,1342],{"class":588,"line":1341},20,[586,1343,831],{},[586,1345,1347],{"class":588,"line":1346},21,[586,1348,953],{"emptyLinePlaceholder":952},[586,1350,1352],{"class":588,"line":1351},22,[586,1353,1354],{},"\u002F\u002F The REST API returns `Page\u003CBlogPostFields>` directly for this endpoint —\n",[586,1356,1358],{"class":588,"line":1357},23,[586,1359,1360],{},"\u002F\u002F `name`\u002F`fields`\u002F`seo` at the top level, custom content under `fields`.\n",[586,1362,1364],{"class":588,"line":1363},24,[586,1365,1366],{},"const page: Page\u003CBlogPostFields> = await response.json()\n",[586,1368,1370],{"class":588,"line":1369},25,[586,1371,1242],{},[586,1373,1375],{"class":588,"line":1374},26,[586,1376,953],{"emptyLinePlaceholder":952},[586,1378,1380],{"class":588,"line":1379},27,[586,1381,1382],{},"\u003Carticle>\n",[586,1384,1386],{"class":588,"line":1385},28,[586,1387,1388],{},"  \u003Ch1>{page.name}\u003C\u002Fh1>\n",[586,1390,1392],{"class":588,"line":1391},29,[586,1393,953],{"emptyLinePlaceholder":952},[586,1395,1397],{"class":588,"line":1396},30,[586,1398,1399],{},"  \u003C!-- Custom fields live under page.fields -->\n",[586,1401,1403],{"class":588,"line":1402},31,[586,1404,1405],{},"  \u003Cdiv class=\"meta\">\n",[586,1407,1409],{"class":588,"line":1408},32,[586,1410,1411],{},"    \u003Ctime>{page.fields.publishedDate}\u003C\u002Ftime>\n",[586,1413,1415],{"class":588,"line":1414},33,[586,1416,1417],{},"    \u003Cspan>{page.fields.author.name}\u003C\u002Fspan>\n",[586,1419,1421],{"class":588,"line":1420},34,[586,1422,1423],{},"  \u003C\u002Fdiv>\n",[586,1425,1427],{"class":588,"line":1426},35,[586,1428,953],{"emptyLinePlaceholder":952},[586,1430,1432],{"class":588,"line":1431},36,[586,1433,1434],{},"  \u003Cdiv set:html={page.fields.body} \u002F>\n",[586,1436,1438],{"class":588,"line":1437},37,[586,1439,953],{"emptyLinePlaceholder":952},[586,1441,1443],{"class":588,"line":1442},38,[586,1444,1445],{},"  \u003C!-- Render components — match on comp._type (kebab-case discriminant) -->\n",[586,1447,1449],{"class":588,"line":1448},39,[586,1450,1451],{},"  {page.fields.components.map((comp) => (\n",[586,1453,1455],{"class":588,"line":1454},40,[586,1456,1457],{},"    \u003CFragment>\n",[586,1459,1461],{"class":588,"line":1460},41,[586,1462,1463],{},"      {comp._type === 'hero' && \u003CHero {...comp} \u002F>}\n",[586,1465,1467],{"class":588,"line":1466},42,[586,1468,1469],{},"      {comp._type === 'text-block' && \u003CTextBlock {...comp} \u002F>}\n",[586,1471,1473],{"class":588,"line":1472},43,[586,1474,1475],{},"      {comp._type === 'image-gallery' && \u003CImageGallery {...comp} \u002F>}\n",[586,1477,1479],{"class":588,"line":1478},44,[586,1480,1481],{},"    \u003C\u002FFragment>\n",[586,1483,1485],{"class":588,"line":1484},45,[586,1486,1487],{},"  ))}\n",[586,1489,1491],{"class":588,"line":1490},46,[586,1492,1493],{},"\u003C\u002Farticle>\n",[653,1495,1497],{"id":1496},"static-paths-for-ssg","Static Paths for SSG",[567,1499,1500],{},"Generate static pages at build time:",[576,1502,1504],{"className":1233,"code":1503,"language":1235,"meta":581,"style":581},"---\n\u002F\u002F src\u002Fpages\u002Fblog\u002F[slug].astro\nimport type { Page } from '@tentocms\u002Fclient'\nimport type { BlogPostFields } from '..\u002F..\u002Ftypes\u002Fcms'\n\nexport async function getStaticPaths() {\n  const response = await fetch(\n    `${import.meta.env.TENTO_BASE_URL}\u002Fapi\u002Fv1\u002Fpages?pageType=blog`,\n    {\n      headers: {\n        'X-API-Key': import.meta.env.TENTO_API_KEY,\n      },\n    }\n  )\n\n  const pages: Page\u003CBlogPostFields>[] = await response.json()\n\n  return pages.map((page) => ({\n    params: { slug: page.slug },\n    props: { page },\n  }))\n}\n\nconst { page } = Astro.props as { page: Page\u003CBlogPostFields> }\n---\n\n\u003Carticle>\n  \u003Ch1>{page.name}\u003C\u002Fh1>\n  \u003Cdiv set:html={page.fields.body} \u002F>\n\u003C\u002Farticle>\n",[583,1505,1506,1510,1514,1518,1522,1526,1531,1536,1541,1546,1551,1556,1561,1566,1571,1575,1580,1584,1589,1594,1599,1604,1608,1612,1617,1621,1625,1629,1633,1637],{"__ignoreMap":581},[586,1507,1508],{"class":588,"line":589},[586,1509,1242],{},[586,1511,1512],{"class":588,"line":718},[586,1513,1247],{},[586,1515,1516],{"class":588,"line":732},[586,1517,1252],{},[586,1519,1520],{"class":588,"line":759},[586,1521,1257],{},[586,1523,1524],{"class":588,"line":780},[586,1525,953],{"emptyLinePlaceholder":952},[586,1527,1528],{"class":588,"line":798},[586,1529,1530],{},"export async function getStaticPaths() {\n",[586,1532,1533],{"class":588,"line":808},[586,1534,1535],{},"  const response = await fetch(\n",[586,1537,1538],{"class":588,"line":822},[586,1539,1540],{},"    `${import.meta.env.TENTO_BASE_URL}\u002Fapi\u002Fv1\u002Fpages?pageType=blog`,\n",[586,1542,1543],{"class":588,"line":828},[586,1544,1545],{},"    {\n",[586,1547,1548],{"class":588,"line":1283},[586,1549,1550],{},"      headers: {\n",[586,1552,1553],{"class":588,"line":1289},[586,1554,1555],{},"        'X-API-Key': import.meta.env.TENTO_API_KEY,\n",[586,1557,1558],{"class":588,"line":1295},[586,1559,1560],{},"      },\n",[586,1562,1563],{"class":588,"line":1301},[586,1564,1565],{},"    }\n",[586,1567,1568],{"class":588,"line":1307},[586,1569,1570],{},"  )\n",[586,1572,1573],{"class":588,"line":1313},[586,1574,953],{"emptyLinePlaceholder":952},[586,1576,1577],{"class":588,"line":1318},[586,1578,1579],{},"  const pages: Page\u003CBlogPostFields>[] = await response.json()\n",[586,1581,1582],{"class":588,"line":1324},[586,1583,953],{"emptyLinePlaceholder":952},[586,1585,1586],{"class":588,"line":1329},[586,1587,1588],{},"  return pages.map((page) => ({\n",[586,1590,1591],{"class":588,"line":1335},[586,1592,1593],{},"    params: { slug: page.slug },\n",[586,1595,1596],{"class":588,"line":1341},[586,1597,1598],{},"    props: { page },\n",[586,1600,1601],{"class":588,"line":1346},[586,1602,1603],{},"  }))\n",[586,1605,1606],{"class":588,"line":1351},[586,1607,831],{},[586,1609,1610],{"class":588,"line":1357},[586,1611,953],{"emptyLinePlaceholder":952},[586,1613,1614],{"class":588,"line":1363},[586,1615,1616],{},"const { page } = Astro.props as { page: Page\u003CBlogPostFields> }\n",[586,1618,1619],{"class":588,"line":1369},[586,1620,1242],{},[586,1622,1623],{"class":588,"line":1374},[586,1624,953],{"emptyLinePlaceholder":952},[586,1626,1627],{"class":588,"line":1379},[586,1628,1382],{},[586,1630,1631],{"class":588,"line":1385},[586,1632,1388],{},[586,1634,1635],{"class":588,"line":1391},[586,1636,1434],{},[586,1638,1639],{"class":588,"line":1396},[586,1640,1493],{},[653,1642,1644],{"id":1643},"fetching-collections","Fetching Collections",[576,1646,1648],{"className":1233,"code":1647,"language":1235,"meta":581,"style":581},"---\n\u002F\u002F src\u002Fpages\u002Fteam.astro\nimport type { TeamMemberItem } from '..\u002Ftypes\u002Fcms'\n\nconst response = await fetch(\n  `${import.meta.env.TENTO_BASE_URL}\u002Fapi\u002Fv1\u002Fcollections\u002Fteam-members`,\n  {\n    headers: {\n      'X-API-Key': import.meta.env.TENTO_API_KEY,\n    },\n  }\n)\n\nconst team: TeamMemberItem[] = await response.json()\n---\n\n\u003Cdiv class=\"team-grid\">\n  {team.map((member) => (\n    \u003Cdiv class=\"team-card\">\n      \u003Cimg src={member.photo} alt={member.name} \u002F>\n      \u003Ch3>{member.name}\u003C\u002Fh3>\n      \u003Cp>{member.role}\u003C\u002Fp>\n      \u003C!-- TypeScript autocompletes all your collection fields -->\n    \u003C\u002Fdiv>\n  ))}\n\u003C\u002Fdiv>\n",[583,1649,1650,1654,1659,1664,1668,1672,1677,1681,1685,1689,1693,1697,1701,1705,1710,1714,1718,1723,1728,1733,1738,1743,1748,1753,1758,1762],{"__ignoreMap":581},[586,1651,1652],{"class":588,"line":589},[586,1653,1242],{},[586,1655,1656],{"class":588,"line":718},[586,1657,1658],{},"\u002F\u002F src\u002Fpages\u002Fteam.astro\n",[586,1660,1661],{"class":588,"line":732},[586,1662,1663],{},"import type { TeamMemberItem } from '..\u002Ftypes\u002Fcms'\n",[586,1665,1666],{"class":588,"line":759},[586,1667,953],{"emptyLinePlaceholder":952},[586,1669,1670],{"class":588,"line":780},[586,1671,1280],{},[586,1673,1674],{"class":588,"line":798},[586,1675,1676],{},"  `${import.meta.env.TENTO_BASE_URL}\u002Fapi\u002Fv1\u002Fcollections\u002Fteam-members`,\n",[586,1678,1679],{"class":588,"line":808},[586,1680,1292],{},[586,1682,1683],{"class":588,"line":822},[586,1684,1298],{},[586,1686,1687],{"class":588,"line":828},[586,1688,1304],{},[586,1690,1691],{"class":588,"line":1283},[586,1692,1310],{},[586,1694,1695],{"class":588,"line":1289},[586,1696,1190],{},[586,1698,1699],{"class":588,"line":1295},[586,1700,1321],{},[586,1702,1703],{"class":588,"line":1301},[586,1704,953],{"emptyLinePlaceholder":952},[586,1706,1707],{"class":588,"line":1307},[586,1708,1709],{},"const team: TeamMemberItem[] = await response.json()\n",[586,1711,1712],{"class":588,"line":1313},[586,1713,1242],{},[586,1715,1716],{"class":588,"line":1318},[586,1717,953],{"emptyLinePlaceholder":952},[586,1719,1720],{"class":588,"line":1324},[586,1721,1722],{},"\u003Cdiv class=\"team-grid\">\n",[586,1724,1725],{"class":588,"line":1329},[586,1726,1727],{},"  {team.map((member) => (\n",[586,1729,1730],{"class":588,"line":1335},[586,1731,1732],{},"    \u003Cdiv class=\"team-card\">\n",[586,1734,1735],{"class":588,"line":1341},[586,1736,1737],{},"      \u003Cimg src={member.photo} alt={member.name} \u002F>\n",[586,1739,1740],{"class":588,"line":1346},[586,1741,1742],{},"      \u003Ch3>{member.name}\u003C\u002Fh3>\n",[586,1744,1745],{"class":588,"line":1351},[586,1746,1747],{},"      \u003Cp>{member.role}\u003C\u002Fp>\n",[586,1749,1750],{"class":588,"line":1357},[586,1751,1752],{},"      \u003C!-- TypeScript autocompletes all your collection fields -->\n",[586,1754,1755],{"class":588,"line":1363},[586,1756,1757],{},"    \u003C\u002Fdiv>\n",[586,1759,1760],{"class":588,"line":1369},[586,1761,1487],{},[586,1763,1764],{"class":588,"line":1374},[586,1765,1766],{},"\u003C\u002Fdiv>\n",[653,1768,1770],{"id":1769},"creating-a-utility-module","Creating a Utility Module",[567,1772,1773],{},"Create a typed API client for reuse across your project. This module is imported only from server-side Astro files, so the key never reaches the browser:",[576,1775,1779],{"className":1776,"code":1777,"language":1778,"meta":581,"style":581},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F src\u002Flib\u002Ftentocms.ts\n\u002F\u002F Pass a concrete type per call (e.g. getPage\u003CPage\u003CBlogPostFields>>(...)).\n\u002F\u002F The generator does not emit a page-envelope wrapper itself — `Page` comes\n\u002F\u002F from `@tentocms\u002Fclient` — so these helpers default to `unknown` and let\n\u002F\u002F each call site supply the exact type.\n\n\u002F\u002F Server-only env vars — no PUBLIC_ prefix\nconst API_URL = import.meta.env.TENTO_BASE_URL\nconst API_KEY = import.meta.env.TENTO_API_KEY\n\nasync function tentoFetch\u003CT>(endpoint: string): Promise\u003CT> {\n  const response = await fetch(`${API_URL}${endpoint}`, {\n    headers: {\n      'X-API-Key': API_KEY,\n    },\n  })\n\n  if (!response.ok) {\n    throw new Error(`TentoCMS API error: ${response.statusText}`)\n  }\n\n  return response.json()\n}\n\nexport const tentocms = {\n  \u002F\u002F Fetch a page by slug with type safety\n  getPage: \u003CT = unknown>(slug: string) => tentoFetch\u003CT>(`\u002Fapi\u002Fv1\u002Fpages\u002F${slug}`),\n\n  \u002F\u002F Fetch all pages of a specific type\n  getPages: \u003CT = unknown[]>(pageTypeSlug: string) =>\n    tentoFetch\u003CT>(`\u002Fapi\u002Fv1\u002Fpages?pageType=${pageTypeSlug}`),\n\n  \u002F\u002F Fetch collection entries\n  getCollection: \u003CT = any[]>(collectionSlug: string) =>\n    tentoFetch\u003CT>(`\u002Fapi\u002Fv1\u002Fcollections\u002F${collectionSlug}`),\n}\n","typescript",[583,1780,1781,1786,1791,1796,1801,1806,1810,1815,1842,1866,1870,1915,1954,1963,1980,1984,1991,1995,2018,2051,2055,2059,2073,2077,2081,2095,2100,2157,2161,2166,2198,2226,2230,2235,2266,2293],{"__ignoreMap":581},[586,1782,1783],{"class":588,"line":589},[586,1784,1785],{"class":714},"\u002F\u002F src\u002Flib\u002Ftentocms.ts\n",[586,1787,1788],{"class":588,"line":718},[586,1789,1790],{"class":714},"\u002F\u002F Pass a concrete type per call (e.g. getPage\u003CPage\u003CBlogPostFields>>(...)).\n",[586,1792,1793],{"class":588,"line":732},[586,1794,1795],{"class":714},"\u002F\u002F The generator does not emit a page-envelope wrapper itself — `Page` comes\n",[586,1797,1798],{"class":588,"line":759},[586,1799,1800],{"class":714},"\u002F\u002F from `@tentocms\u002Fclient` — so these helpers default to `unknown` and let\n",[586,1802,1803],{"class":588,"line":780},[586,1804,1805],{"class":714},"\u002F\u002F each call site supply the exact type.\n",[586,1807,1808],{"class":588,"line":798},[586,1809,953],{"emptyLinePlaceholder":952},[586,1811,1812],{"class":588,"line":808},[586,1813,1814],{"class":714},"\u002F\u002F Server-only env vars — no PUBLIC_ prefix\n",[586,1816,1817,1820,1823,1825,1828,1830,1833,1835,1837,1839],{"class":588,"line":822},[586,1818,1819],{"class":1076},"const",[586,1821,1822],{"class":742}," API_URL ",[586,1824,858],{"class":728},[586,1826,1827],{"class":721}," import",[586,1829,702],{"class":728},[586,1831,1832],{"class":742},"meta",[586,1834,702],{"class":728},[586,1836,748],{"class":742},[586,1838,702],{"class":728},[586,1840,1841],{"class":742},"TENTO_BASE_URL\n",[586,1843,1844,1846,1849,1851,1853,1855,1857,1859,1861,1863],{"class":588,"line":828},[586,1845,1819],{"class":1076},[586,1847,1848],{"class":742}," API_KEY ",[586,1850,858],{"class":728},[586,1852,1827],{"class":721},[586,1854,702],{"class":728},[586,1856,1832],{"class":742},[586,1858,702],{"class":728},[586,1860,748],{"class":742},[586,1862,702],{"class":728},[586,1864,1865],{"class":742},"TENTO_API_KEY\n",[586,1867,1868],{"class":588,"line":1283},[586,1869,953],{"emptyLinePlaceholder":952},[586,1871,1872,1875,1878,1882,1885,1888,1891,1895,1897,1900,1903,1906,1908,1910,1913],{"class":588,"line":1289},[586,1873,1874],{"class":1076},"async",[586,1876,1877],{"class":1076}," function",[586,1879,1881],{"class":1880},"s2Zo4"," tentoFetch",[586,1883,1884],{"class":728},"\u003C",[586,1886,1887],{"class":592},"T",[586,1889,1890],{"class":728},">(",[586,1892,1894],{"class":1893},"sHdIc","endpoint",[586,1896,739],{"class":728},[586,1898,1899],{"class":592}," string",[586,1901,1902],{"class":728},"):",[586,1904,1905],{"class":592}," Promise",[586,1907,1884],{"class":728},[586,1909,1887],{"class":592},[586,1911,1912],{"class":728},">",[586,1914,729],{"class":728},[586,1916,1917,1920,1923,1926,1929,1932,1935,1938,1941,1944,1946,1949,1952],{"class":588,"line":1295},[586,1918,1919],{"class":1076},"  const",[586,1921,1922],{"class":742}," response",[586,1924,1925],{"class":728}," =",[586,1927,1928],{"class":721}," await",[586,1930,1931],{"class":1880}," fetch",[586,1933,1934],{"class":735},"(",[586,1936,1937],{"class":728},"`${",[586,1939,1940],{"class":742},"API_URL",[586,1942,1943],{"class":728},"}${",[586,1945,1894],{"class":742},[586,1947,1948],{"class":728},"}`",[586,1950,1951],{"class":728},",",[586,1953,729],{"class":728},[586,1955,1956,1959,1961],{"class":588,"line":1301},[586,1957,1958],{"class":735},"    headers",[586,1960,739],{"class":728},[586,1962,729],{"class":728},[586,1964,1965,1968,1971,1973,1975,1978],{"class":588,"line":1307},[586,1966,1967],{"class":728},"      '",[586,1969,1970],{"class":735},"X-API-Key",[586,1972,793],{"class":728},[586,1974,739],{"class":728},[586,1976,1977],{"class":742}," API_KEY",[586,1979,756],{"class":728},[586,1981,1982],{"class":588,"line":1313},[586,1983,1310],{"class":728},[586,1985,1986,1989],{"class":588,"line":1318},[586,1987,1988],{"class":728},"  }",[586,1990,1321],{"class":735},[586,1992,1993],{"class":588,"line":1324},[586,1994,953],{"emptyLinePlaceholder":952},[586,1996,1997,2000,2003,2005,2008,2010,2013,2016],{"class":588,"line":1329},[586,1998,1999],{"class":721},"  if",[586,2001,2002],{"class":735}," (",[586,2004,908],{"class":728},[586,2006,2007],{"class":742},"response",[586,2009,702],{"class":728},[586,2011,2012],{"class":742},"ok",[586,2014,2015],{"class":735},") ",[586,2017,1068],{"class":728},[586,2019,2020,2023,2026,2029,2031,2034,2037,2040,2042,2044,2047,2049],{"class":588,"line":1335},[586,2021,2022],{"class":721},"    throw",[586,2024,2025],{"class":728}," new",[586,2027,2028],{"class":1880}," Error",[586,2030,1934],{"class":735},[586,2032,2033],{"class":728},"`",[586,2035,2036],{"class":596},"TentoCMS API error: ",[586,2038,2039],{"class":728},"${",[586,2041,2007],{"class":742},[586,2043,702],{"class":728},[586,2045,2046],{"class":742},"statusText",[586,2048,1948],{"class":728},[586,2050,1321],{"class":735},[586,2052,2053],{"class":588,"line":1341},[586,2054,1190],{"class":728},[586,2056,2057],{"class":588,"line":1346},[586,2058,953],{"emptyLinePlaceholder":952},[586,2060,2061,2064,2066,2068,2070],{"class":588,"line":1351},[586,2062,2063],{"class":721},"  return",[586,2065,1922],{"class":742},[586,2067,702],{"class":728},[586,2069,1061],{"class":1880},[586,2071,2072],{"class":735},"()\n",[586,2074,2075],{"class":588,"line":1357},[586,2076,831],{"class":728},[586,2078,2079],{"class":588,"line":1363},[586,2080,953],{"emptyLinePlaceholder":952},[586,2082,2083,2085,2088,2091,2093],{"class":588,"line":1369},[586,2084,722],{"class":721},[586,2086,2087],{"class":1076}," const",[586,2089,2090],{"class":742}," tentocms ",[586,2092,858],{"class":728},[586,2094,729],{"class":728},[586,2096,2097],{"class":588,"line":1374},[586,2098,2099],{"class":714},"  \u002F\u002F Fetch a page by slug with type safety\n",[586,2101,2102,2105,2107,2110,2112,2114,2117,2119,2122,2124,2126,2129,2132,2134,2136,2138,2140,2142,2144,2147,2149,2151,2153,2155],{"class":588,"line":1379},[586,2103,2104],{"class":1880},"  getPage",[586,2106,739],{"class":728},[586,2108,2109],{"class":728}," \u003C",[586,2111,1887],{"class":592},[586,2113,1925],{"class":728},[586,2115,2116],{"class":592}," unknown",[586,2118,1890],{"class":728},[586,2120,2121],{"class":1893},"slug",[586,2123,739],{"class":728},[586,2125,1899],{"class":592},[586,2127,2128],{"class":728},")",[586,2130,2131],{"class":1076}," =>",[586,2133,1881],{"class":1880},[586,2135,1884],{"class":728},[586,2137,1887],{"class":592},[586,2139,1912],{"class":728},[586,2141,1934],{"class":742},[586,2143,2033],{"class":728},[586,2145,2146],{"class":596},"\u002Fapi\u002Fv1\u002Fpages\u002F",[586,2148,2039],{"class":728},[586,2150,2121],{"class":742},[586,2152,1948],{"class":728},[586,2154,2128],{"class":742},[586,2156,756],{"class":728},[586,2158,2159],{"class":588,"line":1385},[586,2160,953],{"emptyLinePlaceholder":952},[586,2162,2163],{"class":588,"line":1391},[586,2164,2165],{"class":714},"  \u002F\u002F Fetch all pages of a specific type\n",[586,2167,2168,2171,2173,2175,2177,2179,2181,2184,2186,2189,2191,2193,2195],{"class":588,"line":1396},[586,2169,2170],{"class":1880},"  getPages",[586,2172,739],{"class":728},[586,2174,2109],{"class":728},[586,2176,1887],{"class":592},[586,2178,1925],{"class":728},[586,2180,2116],{"class":592},[586,2182,2183],{"class":742},"[]",[586,2185,1890],{"class":728},[586,2187,2188],{"class":1893},"pageTypeSlug",[586,2190,739],{"class":728},[586,2192,1899],{"class":592},[586,2194,2128],{"class":728},[586,2196,2197],{"class":1076}," =>\n",[586,2199,2200,2203,2205,2207,2209,2211,2213,2216,2218,2220,2222,2224],{"class":588,"line":1402},[586,2201,2202],{"class":1880},"    tentoFetch",[586,2204,1884],{"class":728},[586,2206,1887],{"class":592},[586,2208,1912],{"class":728},[586,2210,1934],{"class":742},[586,2212,2033],{"class":728},[586,2214,2215],{"class":596},"\u002Fapi\u002Fv1\u002Fpages?pageType=",[586,2217,2039],{"class":728},[586,2219,2188],{"class":742},[586,2221,1948],{"class":728},[586,2223,2128],{"class":742},[586,2225,756],{"class":728},[586,2227,2228],{"class":588,"line":1408},[586,2229,953],{"emptyLinePlaceholder":952},[586,2231,2232],{"class":588,"line":1414},[586,2233,2234],{"class":714},"  \u002F\u002F Fetch collection entries\n",[586,2236,2237,2240,2242,2244,2246,2248,2251,2253,2255,2258,2260,2262,2264],{"class":588,"line":1420},[586,2238,2239],{"class":1880},"  getCollection",[586,2241,739],{"class":728},[586,2243,2109],{"class":728},[586,2245,1887],{"class":592},[586,2247,1925],{"class":728},[586,2249,2250],{"class":592}," any",[586,2252,2183],{"class":742},[586,2254,1890],{"class":728},[586,2256,2257],{"class":1893},"collectionSlug",[586,2259,739],{"class":728},[586,2261,1899],{"class":592},[586,2263,2128],{"class":728},[586,2265,2197],{"class":1076},[586,2267,2268,2270,2272,2274,2276,2278,2280,2283,2285,2287,2289,2291],{"class":588,"line":1426},[586,2269,2202],{"class":1880},[586,2271,1884],{"class":728},[586,2273,1887],{"class":592},[586,2275,1912],{"class":728},[586,2277,1934],{"class":742},[586,2279,2033],{"class":728},[586,2281,2282],{"class":596},"\u002Fapi\u002Fv1\u002Fcollections\u002F",[586,2284,2039],{"class":728},[586,2286,2257],{"class":742},[586,2288,1948],{"class":728},[586,2290,2128],{"class":742},[586,2292,756],{"class":728},[586,2294,2295],{"class":588,"line":1431},[586,2296,831],{"class":728},[567,2298,2299],{},"Usage:",[576,2301,2303],{"className":1233,"code":2302,"language":1235,"meta":581,"style":581},"---\n\u002F\u002F src\u002Fpages\u002Fblog\u002F[slug].astro\nimport { tentocms } from '..\u002F..\u002Flib\u002Ftentocms'\nimport type { Page } from '@tentocms\u002Fclient'\nimport type { BlogPostFields } from '..\u002F..\u002Ftypes\u002Fcms'\n\nconst { slug } = Astro.params\nconst page = await tentocms.getPage\u003CPage\u003CBlogPostFields>>(slug)\n---\n\n\u003Carticle>\n  \u003Ch1>{page.name}\u003C\u002Fh1>\n  \u003Cdiv set:html={page.fields.body} \u002F>\n\u003C\u002Farticle>\n",[583,2304,2305,2309,2313,2318,2322,2326,2330,2334,2339,2343,2347,2351,2355,2359],{"__ignoreMap":581},[586,2306,2307],{"class":588,"line":589},[586,2308,1242],{},[586,2310,2311],{"class":588,"line":718},[586,2312,1247],{},[586,2314,2315],{"class":588,"line":732},[586,2316,2317],{},"import { tentocms } from '..\u002F..\u002Flib\u002Ftentocms'\n",[586,2319,2320],{"class":588,"line":759},[586,2321,1252],{},[586,2323,2324],{"class":588,"line":780},[586,2325,1257],{},[586,2327,2328],{"class":588,"line":798},[586,2329,953],{"emptyLinePlaceholder":952},[586,2331,2332],{"class":588,"line":808},[586,2333,1266],{},[586,2335,2336],{"class":588,"line":822},[586,2337,2338],{},"const page = await tentocms.getPage\u003CPage\u003CBlogPostFields>>(slug)\n",[586,2340,2341],{"class":588,"line":828},[586,2342,1242],{},[586,2344,2345],{"class":588,"line":1283},[586,2346,953],{"emptyLinePlaceholder":952},[586,2348,2349],{"class":588,"line":1289},[586,2350,1382],{},[586,2352,2353],{"class":588,"line":1295},[586,2354,1388],{},[586,2356,2357],{"class":588,"line":1301},[586,2358,1434],{},[586,2360,2361],{"class":588,"line":1307},[586,2362,1493],{},[653,2364,2366],{"id":2365},"dynamic-component-rendering","Dynamic Component Rendering",[567,2368,2369],{},"Create component mapping for flexible content:",[576,2371,2373],{"className":1233,"code":2372,"language":1235,"meta":581,"style":581},"---\n\u002F\u002F src\u002Fcomponents\u002FComponentRenderer.astro\nimport type { AnyComponent } from '..\u002Ftypes\u002Fcms'\nimport Hero from '.\u002FHero.astro'\nimport TextBlock from '.\u002FTextBlock.astro'\nimport ImageGallery from '.\u002FImageGallery.astro'\nimport CallToAction from '.\u002FCallToAction.astro'\n\ninterface Props {\n  component: AnyComponent\n}\n\nconst { component } = Astro.props\n\n\u002F\u002F Keys are the kebab-case _type values from the API\nconst componentMap = {\n  'hero': Hero,\n  'text-block': TextBlock,\n  'image-gallery': ImageGallery,\n  'cta-banner': CallToAction,\n}\n\n\u002F\u002F Match on component._type, not component.type\nconst ComponentToRender = componentMap[component._type as keyof typeof componentMap]\n---\n\n{ComponentToRender ? \u003CComponentToRender {...component} \u002F> : null}\n",[583,2374,2375,2379,2384,2389,2394,2399,2404,2409,2413,2418,2423,2427,2431,2436,2440,2445,2450,2455,2460,2465,2470,2474,2478,2483,2488,2492,2496],{"__ignoreMap":581},[586,2376,2377],{"class":588,"line":589},[586,2378,1242],{},[586,2380,2381],{"class":588,"line":718},[586,2382,2383],{},"\u002F\u002F src\u002Fcomponents\u002FComponentRenderer.astro\n",[586,2385,2386],{"class":588,"line":732},[586,2387,2388],{},"import type { AnyComponent } from '..\u002Ftypes\u002Fcms'\n",[586,2390,2391],{"class":588,"line":759},[586,2392,2393],{},"import Hero from '.\u002FHero.astro'\n",[586,2395,2396],{"class":588,"line":780},[586,2397,2398],{},"import TextBlock from '.\u002FTextBlock.astro'\n",[586,2400,2401],{"class":588,"line":798},[586,2402,2403],{},"import ImageGallery from '.\u002FImageGallery.astro'\n",[586,2405,2406],{"class":588,"line":808},[586,2407,2408],{},"import CallToAction from '.\u002FCallToAction.astro'\n",[586,2410,2411],{"class":588,"line":822},[586,2412,953],{"emptyLinePlaceholder":952},[586,2414,2415],{"class":588,"line":828},[586,2416,2417],{},"interface Props {\n",[586,2419,2420],{"class":588,"line":1283},[586,2421,2422],{},"  component: AnyComponent\n",[586,2424,2425],{"class":588,"line":1289},[586,2426,831],{},[586,2428,2429],{"class":588,"line":1295},[586,2430,953],{"emptyLinePlaceholder":952},[586,2432,2433],{"class":588,"line":1301},[586,2434,2435],{},"const { component } = Astro.props\n",[586,2437,2438],{"class":588,"line":1307},[586,2439,953],{"emptyLinePlaceholder":952},[586,2441,2442],{"class":588,"line":1313},[586,2443,2444],{},"\u002F\u002F Keys are the kebab-case _type values from the API\n",[586,2446,2447],{"class":588,"line":1318},[586,2448,2449],{},"const componentMap = {\n",[586,2451,2452],{"class":588,"line":1324},[586,2453,2454],{},"  'hero': Hero,\n",[586,2456,2457],{"class":588,"line":1329},[586,2458,2459],{},"  'text-block': TextBlock,\n",[586,2461,2462],{"class":588,"line":1335},[586,2463,2464],{},"  'image-gallery': ImageGallery,\n",[586,2466,2467],{"class":588,"line":1341},[586,2468,2469],{},"  'cta-banner': CallToAction,\n",[586,2471,2472],{"class":588,"line":1346},[586,2473,831],{},[586,2475,2476],{"class":588,"line":1351},[586,2477,953],{"emptyLinePlaceholder":952},[586,2479,2480],{"class":588,"line":1357},[586,2481,2482],{},"\u002F\u002F Match on component._type, not component.type\n",[586,2484,2485],{"class":588,"line":1363},[586,2486,2487],{},"const ComponentToRender = componentMap[component._type as keyof typeof componentMap]\n",[586,2489,2490],{"class":588,"line":1369},[586,2491,1242],{},[586,2493,2494],{"class":588,"line":1374},[586,2495,953],{"emptyLinePlaceholder":952},[586,2497,2498],{"class":588,"line":1379},[586,2499,2500],{},"{ComponentToRender ? \u003CComponentToRender {...component} \u002F> : null}\n",[567,2502,2503],{},"Usage in page:",[576,2505,2507],{"className":1233,"code":2506,"language":1235,"meta":581,"style":581},"---\nimport ComponentRenderer from '..\u002F..\u002Fcomponents\u002FComponentRenderer.astro'\nimport type { Page } from '@tentocms\u002Fclient'\nimport type { BlogPostFields } from '..\u002F..\u002Ftypes\u002Fcms'\n\nconst { slug } = Astro.params\nconst page = await tentocms.getPage\u003CPage\u003CBlogPostFields>>(slug)\n---\n\n\u003Carticle>\n  \u003Ch1>{page.name}\u003C\u002Fh1>\n\n  {page.fields.components.map((comp) => (\n    \u003CComponentRenderer component={comp} \u002F>\n  ))}\n\u003C\u002Farticle>\n",[583,2508,2509,2513,2518,2522,2526,2530,2534,2538,2542,2546,2550,2554,2558,2562,2567,2571],{"__ignoreMap":581},[586,2510,2511],{"class":588,"line":589},[586,2512,1242],{},[586,2514,2515],{"class":588,"line":718},[586,2516,2517],{},"import ComponentRenderer from '..\u002F..\u002Fcomponents\u002FComponentRenderer.astro'\n",[586,2519,2520],{"class":588,"line":732},[586,2521,1252],{},[586,2523,2524],{"class":588,"line":759},[586,2525,1257],{},[586,2527,2528],{"class":588,"line":780},[586,2529,953],{"emptyLinePlaceholder":952},[586,2531,2532],{"class":588,"line":798},[586,2533,1266],{},[586,2535,2536],{"class":588,"line":808},[586,2537,2338],{},[586,2539,2540],{"class":588,"line":822},[586,2541,1242],{},[586,2543,2544],{"class":588,"line":828},[586,2545,953],{"emptyLinePlaceholder":952},[586,2547,2548],{"class":588,"line":1283},[586,2549,1382],{},[586,2551,2552],{"class":588,"line":1289},[586,2553,1388],{},[586,2555,2556],{"class":588,"line":1295},[586,2557,953],{"emptyLinePlaceholder":952},[586,2559,2560],{"class":588,"line":1301},[586,2561,1451],{},[586,2563,2564],{"class":588,"line":1307},[586,2565,2566],{},"    \u003CComponentRenderer component={comp} \u002F>\n",[586,2568,2569],{"class":588,"line":1313},[586,2570,1487],{},[586,2572,2573],{"class":588,"line":1318},[586,2574,1493],{},[653,2576,2578],{"id":2577},"client-side-hydration-with-islands","Client-Side Hydration with Islands",[567,2580,2581],{},"For interactive client-side components, proxy the API through an Astro endpoint to keep the key server-side:",[576,2583,2585],{"className":1776,"code":2584,"language":1778,"meta":581,"style":581},"\u002F\u002F src\u002Fpages\u002Fapi\u002Fcms\u002Fpages\u002F[slug].ts\nimport type { APIRoute } from 'astro'\n\nexport const GET: APIRoute = async ({ params }) => {\n  if (!params.slug) {\n    return new Response(JSON.stringify({ error: 'Missing slug' }), { status: 400 })\n  }\n\n  const response = await fetch(\n    `${import.meta.env.TENTO_BASE_URL}\u002Fapi\u002Fv1\u002Fpages\u002F${params.slug}`,\n    {\n      headers: { 'X-API-Key': import.meta.env.TENTO_API_KEY },\n    }\n  )\n\n  if (!response.ok) {\n    return new Response(JSON.stringify({ error: 'Not found' }), { status: response.status })\n  }\n\n  \u002F\u002F The REST API wraps the page in an envelope: { data, redirect }. Return just the page.\n  const { data } = await response.json()\n  return new Response(JSON.stringify(data), {\n    headers: { 'Content-Type': 'application\u002Fjson' },\n  })\n}\n",[583,2586,2587,2592,2619,2623,2654,2673,2730,2734,2738,2753,2789,2793,2827,2831,2835,2839,2857,2911,2915,2919,2924,2947,2974,3000,3006],{"__ignoreMap":581},[586,2588,2589],{"class":588,"line":589},[586,2590,2591],{"class":714},"\u002F\u002F src\u002Fpages\u002Fapi\u002Fcms\u002Fpages\u002F[slug].ts\n",[586,2593,2594,2597,2600,2603,2606,2609,2612,2614,2616],{"class":588,"line":718},[586,2595,2596],{"class":721},"import",[586,2598,2599],{"class":721}," type",[586,2601,2602],{"class":728}," {",[586,2604,2605],{"class":742}," APIRoute",[586,2607,2608],{"class":728}," }",[586,2610,2611],{"class":721}," from",[586,2613,788],{"class":728},[586,2615,1235],{"class":596},[586,2617,2618],{"class":728},"'\n",[586,2620,2621],{"class":588,"line":732},[586,2622,953],{"emptyLinePlaceholder":952},[586,2624,2625,2627,2629,2632,2634,2636,2638,2641,2644,2647,2650,2652],{"class":588,"line":759},[586,2626,722],{"class":721},[586,2628,2087],{"class":1076},[586,2630,2631],{"class":742}," GET",[586,2633,739],{"class":728},[586,2635,2605],{"class":592},[586,2637,1925],{"class":728},[586,2639,2640],{"class":1076}," async",[586,2642,2643],{"class":728}," ({",[586,2645,2646],{"class":1893}," params",[586,2648,2649],{"class":728}," })",[586,2651,2131],{"class":1076},[586,2653,729],{"class":728},[586,2655,2656,2658,2660,2662,2665,2667,2669,2671],{"class":588,"line":780},[586,2657,1999],{"class":721},[586,2659,2002],{"class":735},[586,2661,908],{"class":728},[586,2663,2664],{"class":742},"params",[586,2666,702],{"class":728},[586,2668,2121],{"class":742},[586,2670,2015],{"class":735},[586,2672,1068],{"class":728},[586,2674,2675,2678,2680,2683,2685,2688,2690,2693,2695,2698,2701,2703,2705,2708,2710,2712,2714,2716,2718,2721,2723,2726,2728],{"class":588,"line":798},[586,2676,2677],{"class":721},"    return",[586,2679,2025],{"class":728},[586,2681,2682],{"class":1880}," Response",[586,2684,1934],{"class":735},[586,2686,2687],{"class":742},"JSON",[586,2689,702],{"class":728},[586,2691,2692],{"class":1880},"stringify",[586,2694,1934],{"class":735},[586,2696,2697],{"class":728},"{",[586,2699,2700],{"class":735}," error",[586,2702,739],{"class":728},[586,2704,788],{"class":728},[586,2706,2707],{"class":596},"Missing slug",[586,2709,793],{"class":728},[586,2711,2608],{"class":728},[586,2713,2128],{"class":735},[586,2715,1951],{"class":728},[586,2717,2602],{"class":728},[586,2719,2720],{"class":735}," status",[586,2722,739],{"class":728},[586,2724,2725],{"class":816}," 400",[586,2727,2608],{"class":728},[586,2729,1321],{"class":735},[586,2731,2732],{"class":588,"line":808},[586,2733,1190],{"class":728},[586,2735,2736],{"class":588,"line":822},[586,2737,953],{"emptyLinePlaceholder":952},[586,2739,2740,2742,2744,2746,2748,2750],{"class":588,"line":828},[586,2741,1919],{"class":1076},[586,2743,1922],{"class":742},[586,2745,1925],{"class":728},[586,2747,1928],{"class":721},[586,2749,1931],{"class":1880},[586,2751,2752],{"class":735},"(\n",[586,2754,2755,2758,2760,2762,2764,2766,2768,2770,2772,2775,2777,2779,2781,2783,2785,2787],{"class":588,"line":1283},[586,2756,2757],{"class":728},"    `${",[586,2759,2596],{"class":721},[586,2761,702],{"class":728},[586,2763,1832],{"class":742},[586,2765,702],{"class":728},[586,2767,748],{"class":742},[586,2769,702],{"class":728},[586,2771,775],{"class":742},[586,2773,2774],{"class":728},"}",[586,2776,2146],{"class":596},[586,2778,2039],{"class":728},[586,2780,2664],{"class":742},[586,2782,702],{"class":728},[586,2784,2121],{"class":742},[586,2786,1948],{"class":728},[586,2788,756],{"class":728},[586,2790,2791],{"class":588,"line":1289},[586,2792,1545],{"class":728},[586,2794,2795,2798,2800,2802,2804,2806,2808,2810,2812,2814,2816,2818,2820,2822,2824],{"class":588,"line":1295},[586,2796,2797],{"class":735},"      headers",[586,2799,739],{"class":728},[586,2801,2602],{"class":728},[586,2803,788],{"class":728},[586,2805,1970],{"class":735},[586,2807,793],{"class":728},[586,2809,739],{"class":728},[586,2811,1827],{"class":721},[586,2813,702],{"class":728},[586,2815,1832],{"class":742},[586,2817,702],{"class":728},[586,2819,748],{"class":742},[586,2821,702],{"class":728},[586,2823,753],{"class":742},[586,2825,2826],{"class":728}," },\n",[586,2828,2829],{"class":588,"line":1301},[586,2830,1565],{"class":728},[586,2832,2833],{"class":588,"line":1307},[586,2834,1570],{"class":735},[586,2836,2837],{"class":588,"line":1313},[586,2838,953],{"emptyLinePlaceholder":952},[586,2840,2841,2843,2845,2847,2849,2851,2853,2855],{"class":588,"line":1318},[586,2842,1999],{"class":721},[586,2844,2002],{"class":735},[586,2846,908],{"class":728},[586,2848,2007],{"class":742},[586,2850,702],{"class":728},[586,2852,2012],{"class":742},[586,2854,2015],{"class":735},[586,2856,1068],{"class":728},[586,2858,2859,2861,2863,2865,2867,2869,2871,2873,2875,2877,2879,2881,2883,2886,2888,2890,2892,2894,2896,2898,2900,2902,2904,2907,2909],{"class":588,"line":1324},[586,2860,2677],{"class":721},[586,2862,2025],{"class":728},[586,2864,2682],{"class":1880},[586,2866,1934],{"class":735},[586,2868,2687],{"class":742},[586,2870,702],{"class":728},[586,2872,2692],{"class":1880},[586,2874,1934],{"class":735},[586,2876,2697],{"class":728},[586,2878,2700],{"class":735},[586,2880,739],{"class":728},[586,2882,788],{"class":728},[586,2884,2885],{"class":596},"Not found",[586,2887,793],{"class":728},[586,2889,2608],{"class":728},[586,2891,2128],{"class":735},[586,2893,1951],{"class":728},[586,2895,2602],{"class":728},[586,2897,2720],{"class":735},[586,2899,739],{"class":728},[586,2901,1922],{"class":742},[586,2903,702],{"class":728},[586,2905,2906],{"class":742},"status",[586,2908,2608],{"class":728},[586,2910,1321],{"class":735},[586,2912,2913],{"class":588,"line":1329},[586,2914,1190],{"class":728},[586,2916,2917],{"class":588,"line":1335},[586,2918,953],{"emptyLinePlaceholder":952},[586,2920,2921],{"class":588,"line":1341},[586,2922,2923],{"class":714},"  \u002F\u002F The REST API wraps the page in an envelope: { data, redirect }. Return just the page.\n",[586,2925,2926,2928,2930,2933,2935,2937,2939,2941,2943,2945],{"class":588,"line":1346},[586,2927,1919],{"class":1076},[586,2929,2602],{"class":728},[586,2931,2932],{"class":742}," data",[586,2934,2608],{"class":728},[586,2936,1925],{"class":728},[586,2938,1928],{"class":721},[586,2940,1922],{"class":742},[586,2942,702],{"class":728},[586,2944,1061],{"class":1880},[586,2946,2072],{"class":735},[586,2948,2949,2951,2953,2955,2957,2959,2961,2963,2965,2968,2970,2972],{"class":588,"line":1351},[586,2950,2063],{"class":721},[586,2952,2025],{"class":728},[586,2954,2682],{"class":1880},[586,2956,1934],{"class":735},[586,2958,2687],{"class":742},[586,2960,702],{"class":728},[586,2962,2692],{"class":1880},[586,2964,1934],{"class":735},[586,2966,2967],{"class":742},"data",[586,2969,2128],{"class":735},[586,2971,1951],{"class":728},[586,2973,729],{"class":728},[586,2975,2976,2978,2980,2982,2984,2987,2989,2991,2993,2996,2998],{"class":588,"line":1357},[586,2977,1958],{"class":735},[586,2979,739],{"class":728},[586,2981,2602],{"class":728},[586,2983,788],{"class":728},[586,2985,2986],{"class":735},"Content-Type",[586,2988,793],{"class":728},[586,2990,739],{"class":728},[586,2992,788],{"class":728},[586,2994,2995],{"class":596},"application\u002Fjson",[586,2997,793],{"class":728},[586,2999,2826],{"class":728},[586,3001,3002,3004],{"class":588,"line":1363},[586,3003,1988],{"class":728},[586,3005,1321],{"class":735},[586,3007,3008],{"class":588,"line":1369},[586,3009,831],{"class":728},[567,3011,3012],{},"Use the endpoint from client-side framework components:",[576,3014,3018],{"className":3015,"code":3016,"language":3017,"meta":581,"style":581},"language-tsx shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F src\u002Fcomponents\u002FInteractivePageLoader.tsx\nimport { useState, useEffect } from 'react'\nimport type { Page } from '@tentocms\u002Fclient'\nimport type { BlogPostFields } from '..\u002Ftypes\u002Fcms'\n\nexport default function InteractivePageLoader() {\n  const [slug, setSlug] = useState('')\n  const [page, setPage] = useState\u003CPage\u003CBlogPostFields> | null>(null)\n\n  useEffect(() => {\n    if (!slug) return\n\n    \u002F\u002F Calls the [slug] Astro API endpoint defined above — no API key in the browser\n    fetch(`\u002Fapi\u002Fcms\u002Fpages\u002F${encodeURIComponent(slug)}`)\n      .then((res) => (res.ok ? res.json() : null))\n      .then(setPage)\n  }, [slug])\n\n  return (\n    \u003Cdiv>\n      \u003Cinput\n        type=\"search\"\n        value={slug}\n        onChange={(e) => setSlug(e.target.value)}\n        placeholder=\"Enter a page slug...\"\n      \u002F>\n      {page && \u003Ch3>{page.name}\u003C\u002Fh3>}\n    \u003C\u002Fdiv>\n  )\n}\n","tsx",[583,3019,3020,3025,3030,3034,3039,3043,3048,3053,3058,3062,3067,3072,3076,3081,3086,3091,3096,3101,3105,3110,3115,3120,3125,3130,3135,3140,3145,3150,3154,3158],{"__ignoreMap":581},[586,3021,3022],{"class":588,"line":589},[586,3023,3024],{},"\u002F\u002F src\u002Fcomponents\u002FInteractivePageLoader.tsx\n",[586,3026,3027],{"class":588,"line":718},[586,3028,3029],{},"import { useState, useEffect } from 'react'\n",[586,3031,3032],{"class":588,"line":732},[586,3033,1252],{},[586,3035,3036],{"class":588,"line":759},[586,3037,3038],{},"import type { BlogPostFields } from '..\u002Ftypes\u002Fcms'\n",[586,3040,3041],{"class":588,"line":780},[586,3042,953],{"emptyLinePlaceholder":952},[586,3044,3045],{"class":588,"line":798},[586,3046,3047],{},"export default function InteractivePageLoader() {\n",[586,3049,3050],{"class":588,"line":808},[586,3051,3052],{},"  const [slug, setSlug] = useState('')\n",[586,3054,3055],{"class":588,"line":822},[586,3056,3057],{},"  const [page, setPage] = useState\u003CPage\u003CBlogPostFields> | null>(null)\n",[586,3059,3060],{"class":588,"line":828},[586,3061,953],{"emptyLinePlaceholder":952},[586,3063,3064],{"class":588,"line":1283},[586,3065,3066],{},"  useEffect(() => {\n",[586,3068,3069],{"class":588,"line":1289},[586,3070,3071],{},"    if (!slug) return\n",[586,3073,3074],{"class":588,"line":1295},[586,3075,953],{"emptyLinePlaceholder":952},[586,3077,3078],{"class":588,"line":1301},[586,3079,3080],{},"    \u002F\u002F Calls the [slug] Astro API endpoint defined above — no API key in the browser\n",[586,3082,3083],{"class":588,"line":1307},[586,3084,3085],{},"    fetch(`\u002Fapi\u002Fcms\u002Fpages\u002F${encodeURIComponent(slug)}`)\n",[586,3087,3088],{"class":588,"line":1313},[586,3089,3090],{},"      .then((res) => (res.ok ? res.json() : null))\n",[586,3092,3093],{"class":588,"line":1318},[586,3094,3095],{},"      .then(setPage)\n",[586,3097,3098],{"class":588,"line":1324},[586,3099,3100],{},"  }, [slug])\n",[586,3102,3103],{"class":588,"line":1329},[586,3104,953],{"emptyLinePlaceholder":952},[586,3106,3107],{"class":588,"line":1335},[586,3108,3109],{},"  return (\n",[586,3111,3112],{"class":588,"line":1341},[586,3113,3114],{},"    \u003Cdiv>\n",[586,3116,3117],{"class":588,"line":1346},[586,3118,3119],{},"      \u003Cinput\n",[586,3121,3122],{"class":588,"line":1351},[586,3123,3124],{},"        type=\"search\"\n",[586,3126,3127],{"class":588,"line":1357},[586,3128,3129],{},"        value={slug}\n",[586,3131,3132],{"class":588,"line":1363},[586,3133,3134],{},"        onChange={(e) => setSlug(e.target.value)}\n",[586,3136,3137],{"class":588,"line":1369},[586,3138,3139],{},"        placeholder=\"Enter a page slug...\"\n",[586,3141,3142],{"class":588,"line":1374},[586,3143,3144],{},"      \u002F>\n",[586,3146,3147],{"class":588,"line":1379},[586,3148,3149],{},"      {page && \u003Ch3>{page.name}\u003C\u002Fh3>}\n",[586,3151,3152],{"class":588,"line":1385},[586,3153,1757],{},[586,3155,3156],{"class":588,"line":1391},[586,3157,1570],{},[586,3159,3160],{"class":588,"line":1396},[586,3161,831],{},[567,3163,3164],{},"Mount with client directive:",[576,3166,3168],{"className":1233,"code":3167,"language":1235,"meta":581,"style":581},"---\nimport InteractivePageLoader from '..\u002Fcomponents\u002FInteractivePageLoader'\n---\n\n\u003CInteractivePageLoader client:load \u002F>\n",[583,3169,3170,3174,3179,3183,3187],{"__ignoreMap":581},[586,3171,3172],{"class":588,"line":589},[586,3173,1242],{},[586,3175,3176],{"class":588,"line":718},[586,3177,3178],{},"import InteractivePageLoader from '..\u002Fcomponents\u002FInteractivePageLoader'\n",[586,3180,3181],{"class":588,"line":732},[586,3182,1242],{},[586,3184,3185],{"class":588,"line":759},[586,3186,953],{"emptyLinePlaceholder":952},[586,3188,3189],{"class":588,"line":780},[586,3190,3191],{},"\u003CInteractivePageLoader client:load \u002F>\n",[571,3193,3195,3196,3199,3200,3202,3203],{"id":3194},"typing-pagefields-fields-vs-content","Typing ",[583,3197,3198],{},"page.fields"," — ",[583,3201,643],{}," vs ",[583,3204,639],{},[567,3206,3207],{},"For each page type the generator emits two interfaces:",[973,3209,3210,3233],{},[976,3211,3212,3216,3217,3220,3221,1022,3224,1022,3226,1022,3229,3232],{},[610,3213,3214],{},[583,3215,639],{}," (e.g. ",[583,3218,3219],{},"BlogPostContent",") — base fields (",[583,3222,3223],{},"id",[583,3225,2121],{},[583,3227,3228],{},"title",[583,3230,3231],{},"seo?",") plus the custom fields.",[976,3234,3235,3216,3239,3242],{},[610,3236,3237],{},[583,3238,643],{},[583,3240,3241],{},"BlogPostFields",") — only the custom fields.",[567,3244,3245,3246,3248,3249,3252,3253,3256,3257,3259,3260,3262],{},"The runtime ",[583,3247,3198],{}," object contains only the custom fields (the system id\u002Fslug\u002Ftitle are top-level, ",[583,3250,3251],{},"seo"," lives under ",[583,3254,3255],{},"page.seo","). Use ",[583,3258,643],{}," to type ",[583,3261,3198],{}," directly:",[576,3264,3266],{"className":1776,"code":3265,"language":1778,"meta":581,"style":581},"import type { BlogPostFields } from '..\u002Ftypes\u002Fcms'\n\nconst fields: BlogPostFields = page.fields \u002F\u002F exact custom-field shape\n",[583,3267,3268,3290,3294],{"__ignoreMap":581},[586,3269,3270,3272,3274,3276,3279,3281,3283,3285,3288],{"class":588,"line":589},[586,3271,2596],{"class":721},[586,3273,2599],{"class":721},[586,3275,2602],{"class":728},[586,3277,3278],{"class":742}," BlogPostFields",[586,3280,2608],{"class":728},[586,3282,2611],{"class":721},[586,3284,788],{"class":728},[586,3286,3287],{"class":596},"..\u002Ftypes\u002Fcms",[586,3289,2618],{"class":728},[586,3291,3292],{"class":588,"line":718},[586,3293,953],{"emptyLinePlaceholder":952},[586,3295,3296,3298,3301,3303,3305,3307,3310,3312,3315],{"class":588,"line":732},[586,3297,1819],{"class":1076},[586,3299,3300],{"class":742}," fields",[586,3302,739],{"class":728},[586,3304,3278],{"class":592},[586,3306,1925],{"class":728},[586,3308,3309],{"class":742}," page",[586,3311,702],{"class":728},[586,3313,3314],{"class":742},"fields ",[586,3316,3317],{"class":714},"\u002F\u002F exact custom-field shape\n",[567,3319,3320,3323,3324,1022,3326,1022,3328,3330,3331,3333,3334,3336,3337,3339,3340,3342,3343,3347],{},[610,3321,3322],{},"Exception:"," if a page type declares its own content field named ",[583,3325,3228],{},[583,3327,2121],{},[583,3329,3223],{},", or ",[583,3332,3251],{},", that field appears in ",[583,3335,3198],{}," at runtime — and ",[583,3338,643],{}," includes it. ",[583,3341,643],{}," excludes the ",[3344,3345,3346],"em",{},"system"," base fields, not any same-named content field the page type itself declares.",[567,3349,3350,3351,3353],{},"Both interfaces are exported; ",[583,3352,639],{}," is unchanged for back-compat.",[571,3355,3357],{"id":3356},"known-limitations","Known Limitations",[973,3359,3360,3381],{},[976,3361,3362,3370,3371,3374,3375,3377,3378,702],{},[610,3363,3364,3366,3367],{},[583,3365,1061],{}," fields are typed ",[583,3368,3369],{},"unknown",", not ",[583,3372,3373],{},"Record\u003Cstring, unknown>",", because a ",[583,3376,1061],{}," field may hold an array or an object. Narrow or cast at the use site before accessing properties — for example: ",[583,3379,3380],{},"const facts = fields.stats as Array\u003C{ metric: string }>",[976,3382,3383,3386,3387,3390,3391,3394,3395,3397,3398,3401],{},[610,3384,3385],{},"Resolved-reference and repeater field types can differ across components when the source schema models the same field differently."," A ",[583,3388,3389],{},"background"," field defined as a reference in one component resolves to ",[583,3392,3393],{},"ResolvedReference",", while the same field modelled as a plain object elsewhere becomes ",[583,3396,3373],{},". An untyped repeater (no sub-fields defined) falls back to ",[583,3399,3400],{},"Record\u003Cstring, unknown>[]",". The generator reflects the source schema faithfully — align the field definitions in your TentoCMS schema for consistent, fully-typed output.",[571,3403,3405],{"id":3404},"development-workflow","Development Workflow",[653,3407,3409],{"id":3408},"watch-mode-for-development","Watch Mode for Development",[567,3411,3412],{},"Run the type generator in watch mode during development:",[576,3414,3416],{"className":578,"code":3415,"language":580,"meta":581,"style":581},"# Terminal 1\nnpm run types:watch\n\n# Terminal 2\nnpm run dev\n",[583,3417,3418,3423,3432,3436,3441],{"__ignoreMap":581},[586,3419,3420],{"class":588,"line":589},[586,3421,3422],{"class":714},"# Terminal 1\n",[586,3424,3425,3427,3429],{"class":588,"line":718},[586,3426,593],{"class":592},[586,3428,1210],{"class":596},[586,3430,3431],{"class":596}," types:watch\n",[586,3433,3434],{"class":588,"line":732},[586,3435,953],{"emptyLinePlaceholder":952},[586,3437,3438],{"class":588,"line":759},[586,3439,3440],{"class":714},"# Terminal 2\n",[586,3442,3443,3445,3447],{"class":588,"line":780},[586,3444,593],{"class":592},[586,3446,1210],{"class":596},[586,3448,3449],{"class":596}," dev\n",[567,3451,3452],{},"The type generator will automatically regenerate types when your CMS schemas change (polls every 30 seconds by default).",[653,3454,3456],{"id":3455},"recommended-workflow","Recommended Workflow",[3458,3459,3460,3463,3466,3469,3472],"ol",{},[976,3461,3462],{},"Update your page types or collections in TentoCMS admin",[976,3464,3465],{},"Types regenerate automatically (in watch mode)",[976,3467,3468],{},"TypeScript shows errors in your IDE immediately",[976,3470,3471],{},"Update your components to match the new schema",[976,3473,3474],{},"Astro rebuilds pages automatically",[571,3476,3478],{"id":3477},"configuration-options","Configuration Options",[567,3480,3481,3482,739],{},"Full configuration reference for ",[583,3483,662],{},[576,3485,3487],{"className":705,"code":3486,"language":707,"meta":581,"style":581},"export default {\n  \u002F\u002F Your TentoCMS API key (use environment variable)\n  apiKey: process.env.TENTO_API_KEY,\n\n  \u002F\u002F TentoCMS API URL\n  apiUrl: process.env.TENTO_BASE_URL,\n\n  \u002F\u002F Output path for generated types\n  output: '.\u002Fsrc\u002Ftypes\u002Fcms.ts',\n\n  \u002F\u002F Watch mode configuration\n  watch: {\n    \u002F\u002F Polling interval in seconds\n    interval: 30,\n  },\n}\n",[583,3488,3489,3497,3502,3520,3524,3529,3547,3551,3556,3570,3574,3579,3587,3592,3602,3606],{"__ignoreMap":581},[586,3490,3491,3493,3495],{"class":588,"line":589},[586,3492,722],{"class":721},[586,3494,725],{"class":721},[586,3496,729],{"class":728},[586,3498,3499],{"class":588,"line":718},[586,3500,3501],{"class":714},"  \u002F\u002F Your TentoCMS API key (use environment variable)\n",[586,3503,3504,3506,3508,3510,3512,3514,3516,3518],{"class":588,"line":732},[586,3505,736],{"class":735},[586,3507,739],{"class":728},[586,3509,743],{"class":742},[586,3511,702],{"class":728},[586,3513,748],{"class":742},[586,3515,702],{"class":728},[586,3517,753],{"class":742},[586,3519,756],{"class":728},[586,3521,3522],{"class":588,"line":759},[586,3523,953],{"emptyLinePlaceholder":952},[586,3525,3526],{"class":588,"line":780},[586,3527,3528],{"class":714},"  \u002F\u002F TentoCMS API URL\n",[586,3530,3531,3533,3535,3537,3539,3541,3543,3545],{"class":588,"line":798},[586,3532,762],{"class":735},[586,3534,739],{"class":728},[586,3536,743],{"class":742},[586,3538,702],{"class":728},[586,3540,748],{"class":742},[586,3542,702],{"class":728},[586,3544,775],{"class":742},[586,3546,756],{"class":728},[586,3548,3549],{"class":588,"line":808},[586,3550,953],{"emptyLinePlaceholder":952},[586,3552,3553],{"class":588,"line":822},[586,3554,3555],{"class":714},"  \u002F\u002F Output path for generated types\n",[586,3557,3558,3560,3562,3564,3566,3568],{"class":588,"line":828},[586,3559,783],{"class":735},[586,3561,739],{"class":728},[586,3563,788],{"class":728},[586,3565,693],{"class":596},[586,3567,793],{"class":728},[586,3569,756],{"class":728},[586,3571,3572],{"class":588,"line":1283},[586,3573,953],{"emptyLinePlaceholder":952},[586,3575,3576],{"class":588,"line":1289},[586,3577,3578],{"class":714},"  \u002F\u002F Watch mode configuration\n",[586,3580,3581,3583,3585],{"class":588,"line":1295},[586,3582,801],{"class":735},[586,3584,739],{"class":728},[586,3586,729],{"class":728},[586,3588,3589],{"class":588,"line":1301},[586,3590,3591],{"class":714},"    \u002F\u002F Polling interval in seconds\n",[586,3593,3594,3596,3598,3600],{"class":588,"line":1307},[586,3595,811],{"class":735},[586,3597,739],{"class":728},[586,3599,817],{"class":816},[586,3601,756],{"class":728},[586,3603,3604],{"class":588,"line":1313},[586,3605,825],{"class":728},[586,3607,3608],{"class":588,"line":1318},[586,3609,831],{"class":728},[571,3611,54],{"id":3612},"troubleshooting",[653,3614,3616],{"id":3615},"types-not-updating","Types Not Updating",[3458,3618,3619,3628,3631,3637],{},[976,3620,3621,3622,3624,3625,3627],{},"Check that ",[583,3623,753],{}," is set in your ",[583,3626,841],{}," file",[976,3629,3630],{},"Verify the API key has read permissions",[976,3632,3633,3634,3636],{},"Run ",[583,3635,1182],{}," manually to see error messages",[976,3638,3639],{},"Check the generated file timestamp",[653,3641,3643],{"id":3642},"typescript-errors-after-schema-changes","TypeScript Errors After Schema Changes",[3458,3645,3646,3651,3658],{},[976,3647,3648,3649],{},"Regenerate types: ",[583,3650,1182],{},[976,3652,3653,3654,3657],{},"Restart your TypeScript server in VSCode: ",[583,3655,3656],{},"Cmd+Shift+P"," → \"TypeScript: Restart TS Server\"",[976,3659,3660],{},"If errors persist, check that your components match the new schema",[653,3662,3664],{"id":3663},"environment-variables-not-available","Environment Variables Not Available",[567,3666,3667,3668,3670],{},"In Astro, server-only variables must NOT have the ",[583,3669,876],{}," prefix:",[576,3672,3674],{"className":578,"code":3673,"language":580,"meta":581,"style":581},"# .env\nTENTO_API_KEY=secret_key_here    # Server-only (never use PUBLIC_ for this)\nTENTO_BASE_URL=https:\u002F\u002Ftento-api.intelligentlending.co.uk  # Server-only\n",[583,3675,3676,3680,3692],{"__ignoreMap":581},[586,3677,3678],{"class":588,"line":589},[586,3679,851],{"class":714},[586,3681,3682,3684,3686,3689],{"class":588,"line":718},[586,3683,753],{"class":742},[586,3685,858],{"class":728},[586,3687,3688],{"class":596},"secret_key_here",[586,3690,3691],{"class":714},"    # Server-only (never use PUBLIC_ for this)\n",[586,3693,3694,3696,3698,3701],{"class":588,"line":732},[586,3695,775],{"class":742},[586,3697,858],{"class":728},[586,3699,3700],{"class":596},"https:\u002F\u002Ftento-api.intelligentlending.co.uk",[586,3702,3703],{"class":714},"  # Server-only\n",[567,3705,3706,3707,3710],{},"Access server variables with ",[583,3708,3709],{},"import.meta.env.TENTO_API_KEY"," (available only in server-side Astro files and API endpoints).",[653,3712,3714],{"id":3713},"build-fails-with-type-errors","Build Fails with Type Errors",[567,3716,3717],{},"Ensure types are generated before building:",[576,3719,3721],{"className":1059,"code":3720,"language":1061,"meta":581,"style":581},"{\n  \"scripts\": {\n    \"prebuild\": \"npm run types:generate\",\n    \"build\": \"astro build\"\n  }\n}\n",[583,3722,3723,3727,3739,3758,3774,3778],{"__ignoreMap":581},[586,3724,3725],{"class":588,"line":589},[586,3726,1068],{"class":728},[586,3728,3729,3731,3733,3735,3737],{"class":588,"line":718},[586,3730,1073],{"class":728},[586,3732,1077],{"class":1076},[586,3734,1080],{"class":728},[586,3736,739],{"class":728},[586,3738,729],{"class":728},[586,3740,3741,3743,3746,3748,3750,3752,3754,3756],{"class":588,"line":732},[586,3742,1089],{"class":728},[586,3744,3745],{"class":592},"prebuild",[586,3747,1080],{"class":728},[586,3749,739],{"class":728},[586,3751,1099],{"class":728},[586,3753,1182],{"class":596},[586,3755,1080],{"class":728},[586,3757,756],{"class":728},[586,3759,3760,3762,3764,3766,3768,3770,3772],{"class":588,"line":759},[586,3761,1089],{"class":728},[586,3763,1113],{"class":592},[586,3765,1080],{"class":728},[586,3767,739],{"class":728},[586,3769,1099],{"class":728},[586,3771,1122],{"class":596},[586,3773,1185],{"class":728},[586,3775,3776],{"class":588,"line":780},[586,3777,1190],{"class":728},[586,3779,3780],{"class":588,"line":798},[586,3781,831],{"class":728},[571,3783,3785],{"id":3784},"next-steps","Next Steps",[973,3787,3788,3796,3804],{},[976,3789,3790,3791,3795],{},"Read the ",[1038,3792,3794],{"href":3793},".\u002Fastro","Astro Integration Guide"," for preview mode and SSR patterns",[976,3797,3798,3799,3803],{},"Browse the ",[1038,3800,3802],{"href":3801},"..\u002Fsdk\u002Freference\u002Freadme","SDK Reference"," for the full client API surface",[976,3805,3806,3807],{},"Learn about ",[1038,3808,3812],{"href":3809,"rel":3810},"https:\u002F\u002Fdocs.astro.build\u002Fen\u002Fconcepts\u002Fislands\u002F",[3811],"nofollow","Astro Islands",[3814,3815,3816],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":581,"searchDepth":718,"depth":718,"links":3818},[3819,3820,3826,3834,3836,3837,3841,3842,3848],{"id":573,"depth":718,"text":574},{"id":650,"depth":718,"text":651,"children":3821},[3822,3823,3824,3825],{"id":655,"depth":732,"text":656},{"id":834,"depth":732,"text":835},{"id":1049,"depth":732,"text":1050},{"id":1197,"depth":732,"text":1198},{"id":1222,"depth":718,"text":1223,"children":3827},[3828,3829,3830,3831,3832,3833],{"id":1226,"depth":732,"text":1227},{"id":1496,"depth":732,"text":1497},{"id":1643,"depth":732,"text":1644},{"id":1769,"depth":732,"text":1770},{"id":2365,"depth":732,"text":2366},{"id":2577,"depth":732,"text":2578},{"id":3194,"depth":718,"text":3835},"Typing page.fields — *Fields vs *Content",{"id":3356,"depth":718,"text":3357},{"id":3404,"depth":718,"text":3405,"children":3838},[3839,3840],{"id":3408,"depth":732,"text":3409},{"id":3455,"depth":732,"text":3456},{"id":3477,"depth":718,"text":3478},{"id":3612,"depth":718,"text":54,"children":3843},[3844,3845,3846,3847],{"id":3615,"depth":732,"text":3616},{"id":3642,"depth":732,"text":3643},{"id":3663,"depth":732,"text":3664},{"id":3713,"depth":732,"text":3714},{"id":3784,"depth":718,"text":3785},"Generating typed content from your schemas in an Astro project.","md",{},{"title":133,"description":3849},"NSaE9Od_Wzx1c8iekPP-dFW23jbd9U58e0BUUsxEzRQ",[3855,3857],{"title":402,"path":403,"stem":404,"description":3856,"children":-1},"Media serialization mode for public reads.",{"title":137,"path":414,"stem":415,"description":3858,"children":-1},"Generating typed content from your schemas in a Next.js project.",1787919221533]