+
diff --git a/src/components/storyblok/About.js b/src/components/storyblok/About.js
deleted file mode 100644
index 3b92237..0000000
--- a/src/components/storyblok/About.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import { storyblokEditable } from '@storyblok/react';
-
-import { RichTextRenderer } from '@/utils/richTextRenderer';
-
-const About = ({ blok }) => (
-
-
-
- {blok.caption}
-
-
- {blok.header_text}
- {blok.header_span}
-
-
- {blok.content.map((item, index) => (
-
- ))}
-
-
-
-);
-
-export default About;
diff --git a/src/components/storyblok/Compare.js b/src/components/storyblok/Compare.js
deleted file mode 100644
index 43f0976..0000000
--- a/src/components/storyblok/Compare.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import { storyblokEditable } from '@storyblok/react';
-import React from 'react';
-
-import ButtonLink from '@/components/common/links/ButtonLink';
-import StoryblokImage from '@/components/storyblok/StoryblokImage';
-import { RichTextRenderer } from '@/utils/richTextRenderer';
-
-const Compare = ({ blok }) => (
-
-
-
-
- VS
-
-
-
-
- {blok.caption}
-
- {blok.description.map((desc, index) => (
-
-
-
- ))}
-
-
- Try Fix Security for free
-
-
-
-);
-
-export default Compare;
diff --git a/src/components/storyblok/Customers.js b/src/components/storyblok/Customers.js
deleted file mode 100644
index d7b5588..0000000
--- a/src/components/storyblok/Customers.js
+++ /dev/null
@@ -1,41 +0,0 @@
-import { storyblokEditable } from '@storyblok/react';
-
-import StoryblokImage from '@/components/storyblok/StoryblokImage';
-
-const Customers = ({ blok }) => {
- if (!blok || !Array.isArray(blok.pictures)) {
- return
Error
;
- }
-
- const editableProps = storyblokEditable(blok);
-
- return (
- <>
-
- {blok.caption}
-
-
- {blok.pictures.map((customer, index) => (
-
- {customer.alt}
-
-
- ))}
-
- >
- );
-};
-
-export default Customers;
diff --git a/src/components/storyblok/Dashboard.js b/src/components/storyblok/Dashboard.js
deleted file mode 100644
index d070a1e..0000000
--- a/src/components/storyblok/Dashboard.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import React from 'react';
-
-import StoryblokImage from '@/components/storyblok/StoryblokImage';
-
-const Dashboard = ({ blok }) => (
-
-);
-
-export default Dashboard;
diff --git a/src/components/storyblok/Div.js b/src/components/storyblok/Div.js
deleted file mode 100644
index 63f03bb..0000000
--- a/src/components/storyblok/Div.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import { StoryblokComponent, storyblokEditable } from '@storyblok/react';
-
-const Div = ({ blok }) => {
- return (
-
- {blok.value.map((nestedBlok) => (
-
- ))}
-
- );
-};
-
-export default Div;
diff --git a/src/components/storyblok/Header1.js b/src/components/storyblok/Header1.js
deleted file mode 100644
index cf134c8..0000000
--- a/src/components/storyblok/Header1.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import { StoryblokComponent, storyblokEditable } from '@storyblok/react';
-
-const Header1 = ({ blok }) => {
- return (
-
- {blok.data.map((nestedBlok) => (
-
- ))}
-
- );
-};
-
-export default Header1;
diff --git a/src/components/storyblok/HeadlineTextBlock.js b/src/components/storyblok/HeadlineTextBlock.js
deleted file mode 100644
index 8c24142..0000000
--- a/src/components/storyblok/HeadlineTextBlock.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import { renderRichText, storyblokEditable } from '@storyblok/react';
-import parse from 'html-react-parser';
-import React from 'react';
-
-const HeadlineTextBlock = ({ blok }) => {
- const renderText = (text) => {
- if (typeof text === 'object' && text !== null) {
- // Render the rich text as HTML string
- return renderRichText(text);
- }
- return text;
- };
-
- return (
- <>
-
- {blok.eyebrow}
-
-
- {parse(renderText(blok.headline))}
-
-
- {parse(renderText(blok.introduction))}
-
- >
- );
-};
-
-export default HeadlineTextBlock;
diff --git a/src/components/storyblok/HeadlineTextBlockMinimal.js b/src/components/storyblok/HeadlineTextBlockMinimal.js
deleted file mode 100644
index 3fe29be..0000000
--- a/src/components/storyblok/HeadlineTextBlockMinimal.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import { renderRichText, storyblokEditable } from '@storyblok/react';
-import parse from 'html-react-parser';
-import React from 'react';
-
-const HeadlineTextBlockMinimal = ({ blok }) => {
- const renderText = (text) => {
- if (typeof text === 'object' && text !== null) {
- // Render the rich text as HTML string
- return renderRichText(text);
- }
- return text;
- };
-
- return (
- <>
-
- {blok.headline}
-
-
- {parse(renderText(blok.introduction))}
-
- >
- );
-};
-
-export default HeadlineTextBlockMinimal;
diff --git a/src/components/storyblok/Hero.js b/src/components/storyblok/Hero.js
deleted file mode 100644
index 253b1b7..0000000
--- a/src/components/storyblok/Hero.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import { StoryblokComponent, storyblokEditable } from '@storyblok/react';
-
-import ButtonLink from '@/components/common/links/ButtonLink';
-import StoryblokImage from '@/components/storyblok/StoryblokImage';
-import { siteConfig } from '@/constants/config';
-
-const Hero = ({ blok }) => {
- if (!blok) {
- return
No content available
;
- }
-
- return (
- <>
-
- {blok.leftColumn &&
- blok.leftColumn.map((nestedBlok) => (
-
- ))}
-
-
- Start for free
-
-
-
-
- {blok.picture && (
-
- )}
- {blok.pictureMobile && (
-
- )}
- >
- );
-};
-
-export default Hero;
diff --git a/src/components/storyblok/Motivation.js b/src/components/storyblok/Motivation.js
deleted file mode 100644
index b43a113..0000000
--- a/src/components/storyblok/Motivation.js
+++ /dev/null
@@ -1,104 +0,0 @@
-import { storyblokEditable } from '@storyblok/react';
-import React from 'react';
-import {
- LuBug,
- LuCloudy,
- LuDatabase,
- LuGithub,
- LuListChecks,
- LuListTree,
- LuNetwork,
- LuPencilRuler,
- LuSearchCode,
- LuSendToBack,
- LuShuffle,
-} from 'react-icons/lu';
-
-const features = [
- {
- name: 'CSPM',
- icon: (props) =>
,
- },
- {
- name: 'Inventory',
- icon: (props) =>
,
- },
- {
- name: 'Remediation',
- icon: (props) =>
,
- },
- {
- name: 'Cloud asset inventory',
- icon: (props) =>
,
- },
- {
- name: 'Compliance checks',
- icon: (props) =>
,
- },
- {
- name: 'Resource relationships',
- icon: (props) =>
,
- },
- {
- name: 'Agentless coverage',
- icon: (props) =>
,
- },
- {
- name: 'Security graph',
- icon: (props) =>
,
- },
- {
- name: 'Multi-cloud visibility',
- icon: (props) =>
,
- },
- {
- name: 'Open source',
- icon: (props) =>
,
- },
- {
- name: 'Data model',
- icon: (props) =>
,
- },
- {
- name: 'Customization',
- icon: (props) =>
,
- },
- {
- name: 'Full-text search',
- icon: (props) =>
,
- },
-];
-
-const Motivation = ({ blok }) => (
- <>
-
- {blok.motivation_items.map((feature, index) => (
-
-
-
-
- {features.filter((f) => f.name === feature.caption)[0] &&
- features
- .filter((f) => f.name === feature.caption)[0]
- .icon({
- className: 'h-6 w-6 text-cornflower-blue-600',
- 'aria-hidden': 'true',
- })}
-
- {feature.caption}
-
-
-
-
{feature.text}
-
-
- ))}
-
- >
-);
-
-export default Motivation;
diff --git a/src/components/storyblok/Page.js b/src/components/storyblok/Page.js
deleted file mode 100644
index 5d6e3bb..0000000
--- a/src/components/storyblok/Page.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import { StoryblokComponent, storyblokEditable } from '@storyblok/react/rsc';
-
-const Page = ({ blok }) => (
- <>
- {blok.body.map((nestedBlok) => (
-
- ))}
- >
-);
-
-export default Page;
diff --git a/src/components/storyblok/Picture.js b/src/components/storyblok/Picture.js
deleted file mode 100644
index e7c89af..0000000
--- a/src/components/storyblok/Picture.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import { storyblokEditable } from '@storyblok/react';
-import Image from 'next/image';
-
-const Picture = ({ blok }) => {
- const srcUrl = `${blok.value.filename}${blok.appearance ? blok.appearance : ''}`;
- const className = `${blok.value.className ? blok.value.className : ''}`;
- return (
-
- );
-};
-
-export default Picture;
diff --git a/src/components/storyblok/RichText.js b/src/components/storyblok/RichText.js
deleted file mode 100644
index b834df6..0000000
--- a/src/components/storyblok/RichText.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import { storyblokEditable } from '@storyblok/react';
-
-import { RichTextRenderer } from '@/utils/richTextRenderer';
-
-const RichText = ({ blok }) => {
- return (
-
- );
-};
-
-export default RichText;
diff --git a/src/components/storyblok/Section.js b/src/components/storyblok/Section.js
deleted file mode 100644
index 0d3b3c5..0000000
--- a/src/components/storyblok/Section.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import { StoryblokComponent, storyblokEditable } from '@storyblok/react';
-
-import { sanitizeClassName } from '@/utils/sanitizeClass';
-
-const Section = ({ blok }) => {
- return (
-
-
- {blok.data.map((nestedBlok) => (
-
- ))}
-
-
- );
-};
-
-export default Section;
diff --git a/src/components/storyblok/Span.js b/src/components/storyblok/Span.js
deleted file mode 100644
index 0bf704b..0000000
--- a/src/components/storyblok/Span.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import { StoryblokComponent, storyblokEditable } from '@storyblok/react';
-
-const Span = ({ blok }) => {
- return (
-
- {blok.data.map((nestedBlok) => (
-
- ))}
-
- );
-};
-
-export default Span;
diff --git a/src/components/storyblok/StoryblokBridgeLoader.js b/src/components/storyblok/StoryblokBridgeLoader.js
deleted file mode 100644
index e1ea2f6..0000000
--- a/src/components/storyblok/StoryblokBridgeLoader.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use client'; // Ensure this component runs on the client side
-
-import { useEffect } from 'react';
-
-const StoryblokBridgeLoader = () => {
- useEffect(() => {
- // Only load the Storyblok Bridge if we're in the Storyblok Visual Editor
- if (window.location.search.includes('_storyblok')) {
- const script = document.createElement('script');
- script.src = 'https://app.storyblok.com/f/storyblok-v2-latest.js';
- script.async = true;
- document.body.appendChild(script);
-
- script.onload = () => {};
-
- return () => {
- if (script) {
- document.body.removeChild(script);
- }
- };
- }
- }, []);
-
- return null;
-};
-
-export default StoryblokBridgeLoader;
diff --git a/src/components/storyblok/StoryblokImage.js b/src/components/storyblok/StoryblokImage.js
deleted file mode 100644
index fa3d193..0000000
--- a/src/components/storyblok/StoryblokImage.js
+++ /dev/null
@@ -1,53 +0,0 @@
-import { storyblokEditable } from '@storyblok/react';
-
-const extractDimensionsFromUrl = (url) => {
- const regex = /\/(\d+)x(\d+)\//;
- const match = url.match(regex);
- if (match) {
- return {
- width: parseInt(match[1], 10),
- height: parseInt(match[2], 10),
- };
- }
- return { width: 100, height: 100 };
-};
-
-const StoryblokImage = ({ blok, picture, className }) => {
- const isSVG = picture.filename.endsWith('.svg');
- const { width, height } = extractDimensionsFromUrl(picture.filename);
- className =
- `${className || ''} ${blok.roundedCorners || ''} ${blok.shadow || ''}`.trim();
-
- if (isSVG) {
- return (
- // eslint-disable-next-line @next/next/no-img-element
-
- );
- }
-
- return (
-
- );
-};
-
-export default StoryblokImage;
diff --git a/src/components/storyblok/Team.js b/src/components/storyblok/Team.js
deleted file mode 100644
index 28a4bdb..0000000
--- a/src/components/storyblok/Team.js
+++ /dev/null
@@ -1,73 +0,0 @@
-import { storyblokEditable } from '@storyblok/react';
-import React from 'react';
-import { FaGithub, FaLinkedin } from 'react-icons/fa6';
-
-import UnstyledLink from '@/components/common/links/UnstyledLink';
-import StoryblokImage from '@/components/storyblok/StoryblokImage';
-import { RichTextRenderer } from '@/utils/richTextRenderer';
-
-const Team = ({ blok }) => (
-
-
-
- {blok.caption}
-
- {blok.description.map((desc, index) => (
-
{desc.value}
- ))}
-
-
- {blok.members.map((person) => (
- -
-
-
-
- {person.name}
-
-
{person.role}
-
- {person.description.map((desc, index) => (
-
- ))}
-
-
- -
-
- LinkedIn
-
-
-
- -
-
- GitHub
-
-
-
-
-
-
- ))}
-
-
-);
-
-export default Team;
diff --git a/src/components/storyblok/Teaser.js b/src/components/storyblok/Teaser.js
deleted file mode 100644
index 79a956b..0000000
--- a/src/components/storyblok/Teaser.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import { storyblokEditable } from '@storyblok/react';
-
-const Teaser = ({ blok }) => {
- return (
-
- {blok.headline}
-
- );
-};
-
-export default Teaser;
diff --git a/src/components/storyblok/Testimonials.js b/src/components/storyblok/Testimonials.js
deleted file mode 100644
index a765e55..0000000
--- a/src/components/storyblok/Testimonials.js
+++ /dev/null
@@ -1,58 +0,0 @@
-import { storyblokEditable } from '@storyblok/react';
-import React from 'react';
-
-import StoryblokImage from '@/components/storyblok/StoryblokImage';
-
-const Testimonials = ({ blok }) => (
-
- {blok.div.map((testimonial, index) => (
-
-
{testimonial.company_name}
-
-
-
- ))}
- {blok.name}
-
-);
-
-export default Testimonials;
diff --git a/src/components/storyblok/Text.js b/src/components/storyblok/Text.js
deleted file mode 100644
index 496ec32..0000000
--- a/src/components/storyblok/Text.js
+++ /dev/null
@@ -1,5 +0,0 @@
-const Text = ({ blok }) => {
- return blok.value;
-};
-
-export default Text;
diff --git a/src/components/storyblok/faq/FAQ.js b/src/components/storyblok/faq/FAQ.js
deleted file mode 100644
index 090022e..0000000
--- a/src/components/storyblok/faq/FAQ.js
+++ /dev/null
@@ -1,57 +0,0 @@
-'use client';
-
-import {
- Disclosure,
- DisclosureButton,
- DisclosurePanel,
-} from '@headlessui/react';
-import { storyblokEditable } from '@storyblok/react';
-import { LuMinus, LuPlus } from 'react-icons/lu';
-
-import { RichTextRenderer } from '@/utils/richTextRenderer';
-
-const FAQ = ({ blok }) => {
- return (
-
-
-
{blok.caption}
-
- {blok.faq_items.map((faq, index) => (
-
- {({ open }) => (
- <>
-
- {faq.question}
-
- {open ? (
-
- ) : (
-
- )}
-
-
-
-
-
- >
- )}
-
- ))}
-
-
-
- );
-};
-
-export default FAQ;
diff --git a/src/components/storyblok/pricing/Pricing.js b/src/components/storyblok/pricing/Pricing.js
deleted file mode 100644
index fa600ba..0000000
--- a/src/components/storyblok/pricing/Pricing.js
+++ /dev/null
@@ -1,153 +0,0 @@
-import { storyblokEditable } from '@storyblok/react';
-import {
- LuBuilding,
- LuBuilding2,
- LuCheck,
- LuPersonStanding,
- LuWarehouse,
-} from 'react-icons/lu';
-
-import ButtonLink from '@/components/common/links/ButtonLink';
-import { cn } from '@/utils/css';
-
-const Pricing = ({ blok }) => {
- if (!blok || !blok.body) {
- return
Pricing blok incorrect: {JSON.stringify(blok)}
;
- }
- const icons = [
- {
- name: 'Free',
- icon: (props) =>
,
- },
- {
- name: 'Plus',
- icon: (props) =>
,
- },
- {
- name: 'Business',
- icon: (props) =>
,
- },
- {
- name: 'Enterprise',
- icon: (props) =>
,
- },
- ];
-
- return (
- <>
-
- {blok.body.map((tier, index) => (
-
-
- {icons.filter((it) => it.name === tier.name)[0].icon()}
- {tier.name}
- {tier.mostPopular ? (
-
- Most popular
-
- ) : null}
-
-
-
- {tier.description}
-
-
-
-
-
- {tier.price}
-
-
- {tier.price_description.length === 1 ? (
-
- {tier.price_description[0].value}
-
- ) : (
- tier.price_description.map((pd, index) =>
- index === 0 ? (
-
- {pd.value}
-
- ) : (
-
{pd.value}
- ),
- )
- )}
-
-
-
- {tier.scans.map((scan, index) => (
-
{scan.value}
- ))}
-
-
- {index === 0
- ? 'Features:'
- : `Everything in ${blok.body[index - 1].name}, and:`}
-
-
- {tier.price_feature_items.map((feature, index) => (
- -
-
- {feature.value}
-
- ))}
-
-
- Support:
-
-
- {tier.support_items.map((option, index) => (
- -
-
- {option.value}
-
- ))}
-
-
- {tier.cta}
-
-
- ))}
-
- >
- );
-};
-
-export default Pricing;
diff --git a/src/components/storyblok/pricing/Pricing_Additional_Seats.js b/src/components/storyblok/pricing/Pricing_Additional_Seats.js
deleted file mode 100644
index b87ee49..0000000
--- a/src/components/storyblok/pricing/Pricing_Additional_Seats.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import { storyblokEditable } from '@storyblok/react';
-import { LuArmchair } from 'react-icons/lu';
-
-const Pricing_Additional_Seats = ({ blok }) => {
- return (
-
-
-
- {blok.caption}
-
-
-
- {blok.price}
-
-
- {blok.price_description}
-
-
-
{blok.price_definition}
-
- );
-};
-
-export default Pricing_Additional_Seats;
diff --git a/src/components/storyblok/pricing/Pricing_Custom_Plans.js b/src/components/storyblok/pricing/Pricing_Custom_Plans.js
deleted file mode 100644
index cf5c8ae..0000000
--- a/src/components/storyblok/pricing/Pricing_Custom_Plans.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import { storyblokEditable } from '@storyblok/react';
-import { LuPencilRuler } from 'react-icons/lu';
-
-import UnstyledLink from '@/components/common/links/UnstyledLink';
-
-const Pricing_Custom_Plans = ({ blok }) => {
- return (
-
-
-
- {blok.caption}
-
-
-
- {blok.mailer_caption} →
-
-
-
{blok.description}
-
- );
-};
-
-export default Pricing_Custom_Plans;
diff --git a/src/components/storyblok/pricing/Pricing_Span.js b/src/components/storyblok/pricing/Pricing_Span.js
deleted file mode 100644
index 80259b7..0000000
--- a/src/components/storyblok/pricing/Pricing_Span.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import { storyblokEditable } from '@storyblok/react';
-
-const Pricing_Span = ({ blok }) => {
- return (
-
- {blok.value}
-
- );
-};
-export default Pricing_Span;
diff --git a/src/constants/config.ts b/src/constants/config.ts
index 632bc21..dd027de 100644
--- a/src/constants/config.ts
+++ b/src/constants/config.ts
@@ -1,10 +1,12 @@
export const siteConfig = {
title: 'Fix Security',
- tagline: 'Continuous cloud security',
+ shortTitle: 'Fix',
+ tagline: 'Get a secure and compliant cloud',
description:
- 'Your cloud is dynamic and changes by the hour. Built on open source, Fix Security regularly scans and checks your cloud so you stay secure and compliant.',
+ 'Simple cloud security to help you "fix" the hidden risks in your cloud. Inventory, misconfigurations, compliance checks, and remediation—all in one place.',
url: 'https://fix.security',
copyright: `© ${new Date().getFullYear()} Some Engineering Inc. All rights reserved.`,
registerUrl: 'https://app.fix.security/auth/register',
loginUrl: 'https://app.fix.security/auth/login',
+ demoUrl: 'https://calendly.com/larskamp/30-min',
};
diff --git a/src/constants/cookiebot.ts b/src/constants/cookiebot.ts
new file mode 100644
index 0000000..72f5cc3
--- /dev/null
+++ b/src/constants/cookiebot.ts
@@ -0,0 +1 @@
+export const COOKIEBOT_ID = process.env.NEXT_PUBLIC_COOKIEBOT_ID;
diff --git a/src/constants/google.ts b/src/constants/google.ts
index 118998c..dce7c3b 100644
--- a/src/constants/google.ts
+++ b/src/constants/google.ts
@@ -1 +1,2 @@
+export const GTM_CONTAINER_ID = process.env.NEXT_PUBLIC_GTM_CONTAINER_ID;
export const RECAPTCHA_SECRET = process.env.RECAPTCHA_SECRET;
diff --git a/src/constants/posthog.ts b/src/constants/posthog.ts
deleted file mode 100644
index 4a7f352..0000000
--- a/src/constants/posthog.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export const POSTHOG_PROJECT_API_KEY =
- process.env.NEXT_PUBLIC_POSTHOG_PROJECT_API_KEY;
-export const POSTHOG_API_HOST =
- process.env.NEXT_PUBLIC_POSTHOG_API_HOST || '/api/ingest';
-export const POSTHOG_UI_HOST =
- process.env.NEXT_PUBLIC_POSTHOG_UI_HOST || 'https://eu.posthog.com';
diff --git a/src/generated/hashnode/graphql.ts b/src/generated/hashnode/graphql.ts
index c4065ca..03225df 100644
--- a/src/generated/hashnode/graphql.ts
+++ b/src/generated/hashnode/graphql.ts
@@ -28,9 +28,42 @@ export type Scalars = {
Float: { input: number; output: number };
DateTime: { input: string; output: string };
ObjectId: { input: string; output: string };
+ TimeZone: { input: any; output: any };
URL: { input: any; output: any };
};
+export type AbsoluteTimeRange = {
+ /**
+ * The start date of the views.
+ * The time range will include this date (using >=).
+ *
+ * Defaults to the unix epoch start (1970-01-01).
+ */
+ from?: InputMaybe
;
+ /**
+ * The end date of the views.
+ * The time range will include this date (using <=).
+ *
+ * Defaults to the current date.
+ */
+ to?: InputMaybe;
+};
+
+/** The input for accepting an invitation to join a documentation project. */
+export type AcceptInviteToDocumentationProjectInput = {
+ /** The invitation token to accept. */
+ inviteToken: Scalars['String']['input'];
+};
+
+/** Response to accepting an invitation to join a documentation project. */
+export type AcceptInviteToDocumentationProjectPayload = {
+ __typename?: 'AcceptInviteToDocumentationProjectPayload';
+ /** The documentation project that the user has been invited to. */
+ project?: Maybe;
+ /** Signifies the success of the mutation. */
+ success: Scalars['Boolean']['output'];
+};
+
export type AcceptInviteToPublicationInput = {
/** The invitation token to accept. */
inviteToken: Scalars['String']['input'];
@@ -66,6 +99,23 @@ export type AddCommentPayload = {
comment?: Maybe;
};
+export type AddDocumentationProjectCustomDomainInput = {
+ domain: Scalars['String']['input'];
+ projectId: Scalars['ID']['input'];
+ wwwDomain: Scalars['Boolean']['input'];
+};
+
+export type AddDocumentationProjectCustomDomainPayload = {
+ __typename?: 'AddDocumentationProjectCustomDomainPayload';
+ /**
+ * Additional DNS entries required to verify the domain.
+ * There are cases where additional records in the DNS config are required to successfully verify the domain.
+ */
+ dnsVerificationEntries: Array;
+ project?: Maybe;
+ wwwRedirectDnsVerificationEntries: Array;
+};
+
export type AddPostToSeriesInput = {
/** The ID of the post to be added to the series. */
postId: Scalars['ObjectId']['input'];
@@ -214,6 +264,28 @@ export type ChangePublicationMemberVisibilityPayload = {
member: PublicationMember;
};
+export type CheckCustomDomainAvailabilityInput = {
+ domain: Scalars['String']['input'];
+ withWWWRedirect: Scalars['Boolean']['input'];
+};
+
+export type CheckCustomDomainAvailabilityResult = {
+ __typename?: 'CheckCustomDomainAvailabilityResult';
+ domainAvailable: Scalars['Boolean']['output'];
+};
+
+export type CheckSubdomainAvailabilityResult = {
+ __typename?: 'CheckSubdomainAvailabilityResult';
+ subdomainAvailable: Scalars['Boolean']['output'];
+};
+
+/** Contains the flag indicating if the collaboration feature is enabled or not. */
+export type CollaborationFeature = Feature & {
+ __typename?: 'CollaborationFeature';
+ /** A flag indicating if the collaboration feature is enabled or not. */
+ isEnabled: Scalars['Boolean']['output'];
+};
+
/**
* Contains basic information about the comment.
* A comment is a response to a post.
@@ -826,6 +898,136 @@ export type CoverImageOptionsInput = {
stickCoverToBottom?: InputMaybe;
};
+export type CreateDocumentationApiReferenceInput = {
+ name?: InputMaybe;
+ projectId: Scalars['ID']['input'];
+ slug?: InputMaybe;
+ url: Scalars['String']['input'];
+};
+
+export type CreateDocumentationApiReferencePayload = {
+ __typename?: 'CreateDocumentationApiReferencePayload';
+ guide: DocumentationApiReference;
+};
+
+export type CreateDocumentationGuideInput = {
+ name: Scalars['String']['input'];
+ projectId: Scalars['ID']['input'];
+ slug?: InputMaybe;
+};
+
+export type CreateDocumentationGuidePayload = {
+ __typename?: 'CreateDocumentationGuidePayload';
+ guide: DocumentationGuide;
+};
+
+export type CreateDocumentationLinkInput = {
+ guideSlug: Scalars['String']['input'];
+ label: Scalars['String']['input'];
+ projectId: Scalars['ID']['input'];
+ url: Scalars['String']['input'];
+ /**
+ * The slug of the version the new link should be created in.
+ *
+ * Defaults to the default version slug.
+ */
+ versionSlug?: InputMaybe;
+};
+
+export type CreateDocumentationLinkPayload = {
+ __typename?: 'CreateDocumentationLinkPayload';
+ guide?: Maybe;
+ link?: Maybe;
+};
+
+export type CreateDocumentationPageDraftInput = {
+ content?: InputMaybe;
+ description?: InputMaybe;
+ guideSlug: Scalars['String']['input'];
+ label?: InputMaybe;
+ /** The meta tags for the page. */
+ metaTags?: InputMaybe;
+ parentId?: InputMaybe;
+ projectId: Scalars['ID']['input'];
+ /** The slug of the path used to generate the path. */
+ slug?: InputMaybe;
+ title?: InputMaybe;
+ /**
+ * The slug of the version the new page should be created in.
+ *
+ * Defaults to the default version slug.
+ */
+ versionSlug?: InputMaybe;
+ /** The visibility of the page. */
+ visibility?: InputMaybe;
+};
+
+export type CreateDocumentationPageDraftPayload = {
+ __typename?: 'CreateDocumentationPageDraftPayload';
+ guide?: Maybe;
+ page?: Maybe;
+};
+
+/** The input for creating a documentation preview page */
+export type CreateDocumentationPreviewPageInput = {
+ /** The content of the page */
+ content?: InputMaybe;
+ /** The description of the page */
+ description?: InputMaybe;
+ /** The format of the page. Could be MDX or MD. */
+ format?: InputMaybe;
+ /** The ID of the page to create */
+ id?: InputMaybe;
+ /** The label of the page on the sidebar */
+ label: Scalars['String']['input'];
+ /** The meta tags of the page */
+ metaTags?: InputMaybe;
+ /** The nested pages of the page */
+ pages: Array;
+ /** The slug of the page used to create the path */
+ slug?: InputMaybe;
+ /** The title of the page */
+ title?: InputMaybe;
+ /** The visibility of the page */
+ visibility?: InputMaybe;
+};
+
+export type CreateDocumentationProjectInput = {
+ description?: InputMaybe;
+ favIconUrl?: InputMaybe;
+ links?: InputMaybe;
+ logoDarkThemeUrl?: InputMaybe;
+ logoUrl?: InputMaybe;
+ name: Scalars['String']['input'];
+ settings?: InputMaybe;
+ subdomain: Scalars['String']['input'];
+};
+
+export type CreateDocumentationProjectPayload = {
+ __typename?: 'CreateDocumentationProjectPayload';
+ project: DocumentationProject;
+};
+
+export type CreateDocumentationSectionInput = {
+ guideSlug: Scalars['String']['input'];
+ label?: InputMaybe;
+ projectId: Scalars['ID']['input'];
+ /** The slug of the section used to generate the path. */
+ slug?: InputMaybe;
+ /**
+ * The slug of the version the new section should be created in.
+ *
+ * Defaults to the default version slug.
+ */
+ versionSlug?: InputMaybe;
+};
+
+export type CreateDocumentationSectionPayload = {
+ __typename?: 'CreateDocumentationSectionPayload';
+ guide?: Maybe;
+ section?: Maybe;
+};
+
export type CreateDraftInput = {
/** Ids of the co-authors of the resulting draft. */
coAuthors?: InputMaybe>;
@@ -1015,6 +1217,11 @@ export type DarkModePreferences = {
logo?: Maybe;
};
+export enum DefaultDocsTheme {
+ Dark = 'DARK',
+ Light = 'LIGHT',
+}
+
/** Input to delete a role based invite. */
export type DeleteRoleBasedInviteInput = {
/** The ID of the role based invite. */
@@ -1041,6 +1248,94 @@ export enum DeviceType {
Tablet = 'TABLET',
}
+/** The input for disabling AI search for a documentation project */
+export type DisableDocumentationProjectAiSearchInput = {
+ /** The ID of the documentation project */
+ projectId: Scalars['ID']['input'];
+};
+
+/** The response to disabling AI search for a documentation project */
+export type DisableDocumentationProjectAiSearchPayload = {
+ __typename?: 'DisableDocumentationProjectAISearchPayload';
+ project?: Maybe;
+};
+
+export type DisableDocumentationProjectHeadlessCmsInput = {
+ projectId: Scalars['ID']['input'];
+};
+
+export type DisableDocumentationProjectHeadlessCmsPayload = {
+ __typename?: 'DisableDocumentationProjectHeadlessCmsPayload';
+ project?: Maybe;
+};
+
+export type DnsVerificationEntry = {
+ __typename?: 'DnsVerificationEntry';
+ name: Scalars['String']['output'];
+ type: DnsVerificationType;
+ value: Scalars['String']['output'];
+};
+
+export enum DnsVerificationType {
+ ARecord = 'A_RECORD',
+ CnameRecord = 'CNAME_RECORD',
+ TxtRecord = 'TXT_RECORD',
+}
+
+export enum DocsAnalyticsDimension {
+ ApiReferenceGuide = 'API_REFERENCE_GUIDE',
+ Browser = 'BROWSER',
+ Country = 'COUNTRY',
+ DeviceType = 'DEVICE_TYPE',
+ DocumentationGuide = 'DOCUMENTATION_GUIDE',
+ OperatingSystem = 'OPERATING_SYSTEM',
+ Page = 'PAGE',
+ Path = 'PATH',
+ ReferrerHost = 'REFERRER_HOST',
+}
+
+/**
+ * Contains basic information about the docs custom page.
+ * Docs custom pages are pages that can be written in mdx and can be added to docs. It can be used for changelog or other such requirements.
+ */
+export type DocsCustomPage = Node & {
+ __typename?: 'DocsCustomPage';
+ /** Content of the docs custom page. Contains mdx version of the docs custom page's content. */
+ content: DocumentationPageContent;
+ /** The ID of the docs custom page. */
+ id: Scalars['ID']['output'];
+ /** Last modified date of the docs custom page. */
+ lastModified: Scalars['DateTime']['output'];
+ /** Information about the docs custom page's Open Graph metadata i.e. image. */
+ ogMetaData?: Maybe;
+ /** Information about the docs custom page's SEO metadata i.e. title and description */
+ seo?: Maybe;
+ /** the slug of the docs custom page. Used to access docs custom page. Example `https://mydocs.com/my-page`. */
+ slug: Scalars['String']['output'];
+ /** The title of the docs custom page. */
+ title: Scalars['String']['output'];
+ /** Visibility of the docs custom page. */
+ visibility: DocumentationSidebarItemVisibility;
+};
+
+export type DocsCustomPageConnection = PageConnection & {
+ __typename?: 'DocsCustomPageConnection';
+ /** A list docs custom pages */
+ nodes: Array;
+ /** Information to aid in pagination. */
+ pageInfo: OffsetPageInfo;
+ /** Total number of docs custom pages. */
+ totalDocuments: Scalars['Int']['output'];
+};
+
+export type DocsProjectInvitedMembers = {
+ __typename?: 'DocsProjectInvitedMembers';
+ email: Scalars['String']['output'];
+ role: DocumentationMemberRole;
+ /** Invited Hashnode user, returns null if the user is not a Hashnode user. */
+ user?: Maybe;
+};
+
export type DocsViews = {
id: Scalars['ID']['output'];
/** The aggregated views. */
@@ -1053,24 +1348,77 @@ export type DocsVisitors = {
total: Scalars['Int']['output'];
};
+export type DocumentationApiReference = IGuide & {
+ __typename?: 'DocumentationApiReference';
+ /** The base64 encoded gzip compressed string of the parsed OpenAPI Definition of the API Reference. */
+ definition: Scalars['String']['output'];
+ id: Scalars['ID']['output'];
+ /**
+ * A guide can be locked if the subscription doesn't cover to having this guide.
+ *
+ * A locked guide is readonly. It can only be removed or edited after subscribing.
+ */
+ isLocked: Scalars['Boolean']['output'];
+ lastModified: Scalars['DateTime']['output'];
+ name: Scalars['String']['output'];
+ /** OG meta-data of the page. Contains image url used in open graph meta tags. */
+ ogMetaData?: Maybe;
+ /** The provider of the guide. */
+ provider: GuideProvider;
+ /** URL of the published api reference. */
+ publishedUrl?: Maybe;
+ /** SEO information of the page. Contains title and description used in meta tags. */
+ seo?: Maybe;
+ slug: Scalars['String']['output'];
+ status: DocumentationGuideItemStatus;
+ /** URL of the OpenAPI definition used by the default version of this guide. */
+ url: Scalars['String']['output'];
+ /** The ID of the default version. */
+ versionId?: Maybe;
+};
+
export type DocumentationGuide = IGuide & {
__typename?: 'DocumentationGuide';
hasChanges: Scalars['Boolean']['output'];
id: Scalars['ID']['output'];
+ /**
+ * A guide can be locked if the subscription doesn't cover to having this guide.
+ *
+ * A locked guide is readonly. It can only be removed or edited after subscribing.
+ */
+ isLocked: Scalars['Boolean']['output'];
lastModified: Scalars['DateTime']['output'];
name: Scalars['String']['output'];
/** OG meta-data of the page. Contains image url used in open graph meta tags. */
ogMetaData?: Maybe;
+ /** Page of any version of this guide. */
page?: Maybe;
+ provider: GuideProvider;
+ /** Only published page of any version of this guide. */
publishedPage?: Maybe;
+ /** Only published sidebar items of the default version of this guide. */
publishedSidebarItems: Array;
+ /**
+ * Only published page of any version of this guide. The path may include the version slug.
+ *
+ * Takes redirects into account and may return the page that the requested page redirects to.
+ *
+ * If the path is only a version slug, it will redirect to the first page of that version.
+ */
+ redirectedPublishedPage?: Maybe;
/** SEO information of the page. Contains title and description used in meta tags. */
seo?: Maybe;
+ /** Sidebar items of the default version of this guide. */
sidebarItems: Array;
slug: Scalars['String']['output'];
status: DocumentationGuideItemStatus;
- /** Url of the published guide. */
+ /**
+ * URL of the published guide.
+ *
+ * Example: `https://example.com/my-guide-slug`
+ */
url?: Maybe;
+ /** The ID of the default version. */
versionId?: Maybe;
};
@@ -1084,7 +1432,14 @@ export type DocumentationGuidePublishedPageArgs = {
path?: InputMaybe;
};
-export type DocumentationGuideItem = DocumentationGuide;
+export type DocumentationGuideRedirectedPublishedPageArgs = {
+ id?: InputMaybe;
+ path?: InputMaybe;
+};
+
+export type DocumentationGuideItem =
+ | DocumentationApiReference
+ | DocumentationGuide;
export enum DocumentationGuideItemStatus {
Deleted = 'DELETED',
@@ -1092,6 +1447,14 @@ export enum DocumentationGuideItemStatus {
Unpublished = 'UNPUBLISHED',
}
+/** Visibility options for documentation guides. */
+export enum DocumentationGuideVisibility {
+ /** Not visible in public listings. Only visible to users with access to the project. */
+ Hidden = 'HIDDEN',
+ /** Visible to all users. */
+ Public = 'PUBLIC',
+}
+
export type DocumentationLink = IDocumentationSidebarItem & {
__typename?: 'DocumentationLink';
createdAt: Scalars['DateTime']['output'];
@@ -1103,10 +1466,87 @@ export type DocumentationLink = IDocumentationSidebarItem & {
visibility: DocumentationSidebarItemVisibility;
};
+export enum DocumentationMemberRole {
+ Admin = 'ADMIN',
+ Owner = 'OWNER',
+}
+
+/** A column for the navigation. Used in the footer */
+export type DocumentationNavbarColumn = Node & {
+ __typename?: 'DocumentationNavbarColumn';
+ /** The date the column was created. */
+ createdAt: Scalars['DateTime']['output'];
+ /** The ID of the column. */
+ id: Scalars['ID']['output'];
+ /** The navigation items in the column. */
+ items: Array;
+ /** The label of the column. */
+ label: Scalars['String']['output'];
+ /** The date the column was last updated. */
+ updatedAt?: Maybe;
+};
+
+export type DocumentationNavbarItem =
+ | DocumentationNavbarItemGuide
+ | DocumentationNavbarItemLink
+ | DocumentationNavbarItemPage;
+
+/** A navigation item pointing to a guide. */
+export type DocumentationNavbarItemGuide = Node & {
+ __typename?: 'DocumentationNavbarItemGuide';
+ /** The date the item was created. */
+ createdAt: Scalars['DateTime']['output'];
+ /** The guide the item points to. */
+ guide: DocumentationGuideItem;
+ /** The ID of the item. */
+ id: Scalars['ID']['output'];
+ /** The label of the item. */
+ label: Scalars['String']['output'];
+ /** The date the item was last updated. */
+ updatedAt?: Maybe;
+};
+
+/** A navigation item pointing to an external URL. */
+export type DocumentationNavbarItemLink = Node & {
+ __typename?: 'DocumentationNavbarItemLink';
+ /** The date the item was created. */
+ createdAt: Scalars['DateTime']['output'];
+ /** The ID of the item. */
+ id: Scalars['ID']['output'];
+ /** The label of the item. */
+ label: Scalars['String']['output'];
+ /** Indicates if the link should open in a new tab. */
+ openInNewTab: Scalars['Boolean']['output'];
+ /** The date the item was last updated. */
+ updatedAt?: Maybe;
+ /** The URL the item points to. */
+ url: Scalars['String']['output'];
+};
+
+/** A navigation item pointing to an custom page */
+export type DocumentationNavbarItemPage = Node & {
+ __typename?: 'DocumentationNavbarItemPage';
+ /** The date the item was created. */
+ createdAt: Scalars['DateTime']['output'];
+ /** The ID of the item. */
+ id: Scalars['ID']['output'];
+ /** The label of the item. */
+ label: Scalars['String']['output'];
+ /** Indicates if the page should open in a new tab. */
+ openInNewTab: Scalars['Boolean']['output'];
+ /** The page this item points to. */
+ page: DocsCustomPage;
+ /** The date the item was last updated. */
+ updatedAt?: Maybe;
+};
+
export type DocumentationPage = {
__typename?: 'DocumentationPage';
+ content: DocumentationPageContent;
createdAt: Scalars['DateTime']['output'];
description?: Maybe;
+ draft: DocumentationPageDraft;
+ format: DocumentationPageFormat;
guideSlug: Scalars['String']['output'];
id: Scalars['ID']['output'];
/** OG meta-data of the page. Contains image url used in open graph meta tags. */
@@ -1117,11 +1557,400 @@ export type DocumentationPage = {
status: DocumentationSidebarItemStatus;
title: Scalars['String']['output'];
updatedAt?: Maybe;
- /** Url of the published page. */
+ /** URL of the published page. */
url?: Maybe;
visibility: DocumentationSidebarItemVisibility;
};
+export type DocumentationPageContent = {
+ __typename?: 'DocumentationPageContent';
+ md?: Maybe;
+ mdx?: Maybe;
+};
+
+export type DocumentationPageDraft = {
+ __typename?: 'DocumentationPageDraft';
+ content: DocumentationPageContent;
+ description?: Maybe;
+ title: Scalars['String']['output'];
+};
+
+export enum DocumentationPageFormat {
+ Md = 'MD',
+ Mdx = 'MDX',
+}
+
+export type DocumentationProject = Node & {
+ __typename?: 'DocumentationProject';
+ ai?: Maybe;
+ analytics: DocumentationProjectAnalytics;
+ appearance: DocumentationProjectAppearance;
+ createdAt: Scalars['DateTime']['output'];
+ /** Returns a custom page with the given slug. */
+ customPage?: Maybe;
+ /** Returns a list of custom pages belonging to the project. */
+ customPages: DocsCustomPageConnection;
+ defaultGuide?: Maybe;
+ description?: Maybe;
+ domain?: Maybe;
+ /** Object containing information about beta features enabled for the documentation project. */
+ features: DocumentationProjectFeatures;
+ guide?: Maybe;
+ guides: Array;
+ id: Scalars['ID']['output'];
+ integrations?: Maybe;
+ links: DocumentationProjectLinks;
+ /** @deprecated Use membersV2 */
+ members: Array;
+ membersV2: DocumentationProjectMemberConnection;
+ name: Scalars['String']['output'];
+ /** The navigation configuration for the documentation project. */
+ navigation: DocumentationProjectNavigation;
+ /** The Owner of the documentation project. */
+ owner: User;
+ /** Details of publication invites. Returns null if publication is not a team publication. */
+ pendingInvites: DocumentationProjectPendingInviteConnection;
+ publishedGuide?: Maybe;
+ publishedGuides: Array;
+ /** A user search to find users with a specific status */
+ searchUsers: DocumentationProjectSearchUserConnection;
+ settings: DocumentationProjectSettings;
+ subscription?: Maybe;
+ updatedAt?: Maybe;
+ /** URL of the documentation project. */
+ url: Scalars['String']['output'];
+};
+
+export type DocumentationProjectCustomPageArgs = {
+ slug: Scalars['String']['input'];
+};
+
+export type DocumentationProjectCustomPagesArgs = {
+ page: Scalars['Int']['input'];
+ pageSize: Scalars['Int']['input'];
+};
+
+export type DocumentationProjectGuideArgs = {
+ id?: InputMaybe;
+ slug?: InputMaybe;
+};
+
+export type DocumentationProjectMembersV2Args = {
+ filter?: InputMaybe;
+ page: Scalars['Int']['input'];
+ pageSize: Scalars['Int']['input'];
+};
+
+export type DocumentationProjectPendingInvitesArgs = {
+ page: Scalars['Int']['input'];
+ pageSize: Scalars['Int']['input'];
+};
+
+export type DocumentationProjectPublishedGuideArgs = {
+ id?: InputMaybe;
+ slug?: InputMaybe;
+};
+
+export type DocumentationProjectSearchUsersArgs = {
+ input: DocumentationProjectSearchUsersInput;
+};
+
+export type DocumentationProjectAiPreference = {
+ __typename?: 'DocumentationProjectAIPreference';
+ /** The prompts for the documentation project. These prompts are shown to the user when AI Search chatbot is opened. */
+ prompts: Array;
+ /** The settings for the AI feature. */
+ settings: DocumentationProjectAiSettings;
+};
+
+export type DocumentationProjectAiPrompt = {
+ __typename?: 'DocumentationProjectAIPrompt';
+ /** The date the prompt was created. */
+ createdAt: Scalars['DateTime']['output'];
+ /** The ID of the prompt. */
+ id: Scalars['ID']['output'];
+ /** The prompt text. */
+ prompt: Scalars['String']['output'];
+};
+
+export type DocumentationProjectAiSettings = {
+ __typename?: 'DocumentationProjectAISettings';
+ /** A flag to indicate if the AI search feature is enabled. */
+ isSearchEnabled: Scalars['Boolean']['output'];
+};
+
+export type DocumentationProjectAnalytics = {
+ __typename?: 'DocumentationProjectAnalytics';
+ views?: Maybe;
+ visitors: ProjectVisitorsConnection;
+};
+
+export type DocumentationProjectAnalyticsViewsArgs = {
+ after?: InputMaybe;
+ filter?: InputMaybe;
+ first: Scalars['Int']['input'];
+ groupBy?: InputMaybe;
+ options?: InputMaybe;
+ sortBy?: InputMaybe;
+};
+
+export type DocumentationProjectAnalyticsVisitorsArgs = {
+ after?: InputMaybe;
+ filter?: InputMaybe;
+ first: Scalars['Int']['input'];
+ groupBy?: InputMaybe;
+ options?: InputMaybe;
+};
+
+export type DocumentationProjectAppearance = {
+ __typename?: 'DocumentationProjectAppearance';
+ customScript?: Maybe;
+ defaultDocsTheme: DefaultDocsTheme;
+ favIconUrl?: Maybe;
+ getStarted?: Maybe;
+ logoDarkThemeUrl?: Maybe;
+ logoUrl?: Maybe;
+ primaryColor?: Maybe;
+};
+
+export type DocumentationProjectAppearanceInput = {
+ customScript?: InputMaybe;
+ defaultDocsTheme?: InputMaybe;
+ favIconUrl?: InputMaybe;
+ getStarted?: InputMaybe;
+ logoDarkThemeUrl?: InputMaybe;
+ logoUrl?: InputMaybe;
+ primaryColor?: InputMaybe;
+};
+
+export type DocumentationProjectCustomDomain = {
+ __typename?: 'DocumentationProjectCustomDomain';
+ domain: Scalars['String']['output'];
+ status: CustomDomainStatus;
+ verifiedAt?: Maybe;
+ wwwDomain?: Maybe;
+};
+
+export type DocumentationProjectCustomWwwDomain = {
+ __typename?: 'DocumentationProjectCustomWwwDomain';
+ status: CustomDomainStatus;
+ verifiedAt?: Maybe;
+};
+
+export type DocumentationProjectDomainSettings = {
+ __typename?: 'DocumentationProjectDomainSettings';
+ customDomain?: Maybe;
+ hashnodeSubDomain: Scalars['String']['output'];
+};
+
+/** Contains the documentation project's beta features. */
+export type DocumentationProjectFeatures = {
+ __typename?: 'DocumentationProjectFeatures';
+ /** Collaboration feature for the docs project which enables collaborative editing in the page editor. */
+ collaboration: CollaborationFeature;
+ /** GitHub sync feature for the docs project which enables syncing the docs project with a GitHub repository. */
+ ghSync: GitHubSyncFeature;
+};
+
+export type DocumentationProjectGetStarted = {
+ __typename?: 'DocumentationProjectGetStarted';
+ label: Scalars['String']['output'];
+ url: Scalars['URL']['output'];
+};
+
+export type DocumentationProjectGetStartedInput = {
+ label?: InputMaybe;
+ url?: InputMaybe;
+};
+
+export type DocumentationProjectIntegrations = {
+ __typename?: 'DocumentationProjectIntegrations';
+ /** FB Pixel ID for integration with Facebook Pixel. */
+ fbPixelID?: Maybe;
+ /** Google Tag Manager ID for integration with Google Tag Manager. */
+ gTagManagerID?: Maybe;
+ /** Google Analytics Tracking ID for integration with Google Analytics. */
+ gaTrackingID?: Maybe;
+ /** Hotjar Site ID for integration with Hotjar. */
+ hotjarSiteID?: Maybe;
+ /** Intercom ID for integration with Intercom */
+ intercomID?: Maybe;
+ /** The meta tags associated with the documentation project. */
+ metaTags?: Maybe;
+};
+
+export type DocumentationProjectIntegrationsInput = {
+ fbPixelID?: InputMaybe;
+ gTagManagerID?: InputMaybe;
+ gaTrackingID?: InputMaybe;
+ hotjarSiteID?: InputMaybe;
+ intercomID?: InputMaybe;
+ metaTags?: InputMaybe;
+};
+
+/** Contains the pending invite information. */
+export type DocumentationProjectInvite = Node & {
+ __typename?: 'DocumentationProjectInvite';
+ /** The ID of the pending invite. */
+ id: Scalars['ID']['output'];
+ /** The role assigned to the user in the publication. */
+ role: DocumentationMemberRole;
+ /** Invited Hashnode user, returns null if the user is not a Hashnode user. */
+ user: User;
+};
+
+export type DocumentationProjectLinks = {
+ __typename?: 'DocumentationProjectLinks';
+ /** Daily.dev URL of the documentation project. */
+ dailydev?: Maybe;
+ /** GitHub URL of the documentation project. */
+ github?: Maybe;
+ /** The GitHub repository of the documentation project. */
+ githubRepository?: Maybe;
+ /** Hashnode profile of author of the documentation project. */
+ hashnode?: Maybe;
+ /** Instagram URL of the documentation project. */
+ instagram?: Maybe;
+ /** LinkedIn URL of the documentation project. */
+ linkedin?: Maybe;
+ /** Mastodon URL of the documentation project. */
+ mastodon?: Maybe;
+ /** Twitter URL of the documentation project. */
+ twitter?: Maybe;
+ /** Website URL of the documentation project. */
+ website?: Maybe;
+ /** YouTube URL of the documentation project. */
+ youtube?: Maybe;
+};
+
+export type DocumentationProjectLinksInput = {
+ dailydev?: InputMaybe;
+ github?: InputMaybe;
+ githubRepository?: InputMaybe;
+ hashnode?: InputMaybe;
+ instagram?: InputMaybe;
+ linkedin?: InputMaybe;
+ mastodon?: InputMaybe;
+ twitter?: InputMaybe;
+ website?: InputMaybe;
+ youtube?: InputMaybe;
+};
+
+export type DocumentationProjectMember = {
+ __typename?: 'DocumentationProjectMember';
+ /** The role of the member in the documentation project. */
+ role: DocumentationMemberRole;
+ /** The user who is a member of the documentation project. */
+ user: User;
+};
+
+export type DocumentationProjectMemberConnection = PageConnection & {
+ __typename?: 'DocumentationProjectMemberConnection';
+ /** A list of members. */
+ nodes: Array;
+ /** Information to aid in pagination. */
+ pageInfo: OffsetPageInfo;
+ /** Total number of nodes available i.e. number of members. */
+ totalDocuments: Scalars['Int']['output'];
+};
+
+/** The filter for the documentation member connection. */
+export type DocumentationProjectMemberConnectionFilter = {
+ /** Search filter can be used to filter members by their username or email. */
+ searchTerm?: InputMaybe;
+};
+
+export type DocumentationProjectMemberV2 = Node & {
+ __typename?: 'DocumentationProjectMemberV2';
+ /** The ID of the member. */
+ id: Scalars['ID']['output'];
+ /** The role of the member in the documentation project. */
+ role: DocumentationMemberRole;
+ /** The user who is a member of the documentation project. */
+ user: User;
+};
+
+/** Contains the header and footer navigation for the documentation project. */
+export type DocumentationProjectNavigation = {
+ __typename?: 'DocumentationProjectNavigation';
+ /** The columns in the footer navigation. */
+ footer: Array;
+ /** The items in the header navigation. */
+ header: Array;
+};
+
+/** A connection for the user search result. */
+export type DocumentationProjectPendingInviteConnection = PageConnection & {
+ __typename?: 'DocumentationProjectPendingInviteConnection';
+ /** A list of invites */
+ nodes: Array;
+ /** Information to aid in pagination. */
+ pageInfo: OffsetPageInfo;
+ /** The total number of invites. */
+ totalDocuments: Scalars['Int']['output'];
+};
+
+export enum DocumentationProjectProductName {
+ Enterprise = 'ENTERPRISE',
+ Startup = 'STARTUP',
+}
+
+/** A connection for the user search result. */
+export type DocumentationProjectSearchUserConnection = PageConnection & {
+ __typename?: 'DocumentationProjectSearchUserConnection';
+ /** The edges containing the user and the status of the user. */
+ edges: Array;
+ /** A list user nodes. */
+ nodes: Array;
+ /** Information to aid in pagination. */
+ pageInfo: OffsetPageInfo;
+ /** Total number of nodes available i.e. number of user search results. */
+ totalDocuments: Scalars['Int']['output'];
+};
+
+export type DocumentationProjectSearchUserEdge = PageEdge & {
+ __typename?: 'DocumentationProjectSearchUserEdge';
+ node: User;
+ status: UserInviteStatus;
+};
+
+export type DocumentationProjectSearchUsersInput = {
+ /** The page number that should be returned. */
+ page: Scalars['Int']['input'];
+ /** The number of users to return on a single page. */
+ pageSize: Scalars['Int']['input'];
+ searchTerm: Scalars['String']['input'];
+ status: UserInviteStatus;
+};
+
+export type DocumentationProjectSettings = {
+ __typename?: 'DocumentationProjectSettings';
+ isHashnodeLoginAllowed: Scalars['Boolean']['output'];
+ /** A flag to indicate if the documentation project is using Headless CMS. */
+ isHeadless: Scalars['Boolean']['output'];
+ isRobotsAllowed: Scalars['Boolean']['output'];
+};
+
+export type DocumentationProjectSettingsInput = {
+ allowHashnodeLogin?: InputMaybe;
+ allowRobots?: InputMaybe;
+};
+
+export type DocumentationProjectSubscription = {
+ __typename?: 'DocumentationProjectSubscription';
+ maxSeats: Scalars['Int']['output'];
+ nextBillingCycle?: Maybe;
+ productName: DocumentationProjectProductName;
+ status: DocumentationProjectSubscriptionStatus;
+};
+
+export enum DocumentationProjectSubscriptionStatus {
+ Active = 'ACTIVE',
+ Canceled = 'CANCELED',
+ PastDue = 'PAST_DUE',
+ Unpaid = 'UNPAID',
+}
+
export type DocumentationSection = IDocumentationNestableSidebarItem &
IDocumentationSidebarItem & {
__typename?: 'DocumentationSection';
@@ -1129,6 +1958,7 @@ export type DocumentationSection = IDocumentationNestableSidebarItem &
id: Scalars['ID']['output'];
label: Scalars['String']['output'];
pages: Array;
+ path: Scalars['String']['output'];
status: DocumentationSidebarItemStatus;
updatedAt?: Maybe;
visibility: DocumentationSidebarItemVisibility;
@@ -1150,7 +1980,7 @@ export type DocumentationSidebarItemPage = IDocumentationNestableSidebarItem &
path: Scalars['String']['output'];
status: DocumentationSidebarItemStatus;
updatedAt?: Maybe;
- /** Url of the published page. */
+ /** URL of the published page. */
url?: Maybe;
visibility: DocumentationSidebarItemVisibility;
};
@@ -1241,6 +2071,8 @@ export type Draft = Node & {
/** The publication the draft belongs to. */
publication?: Maybe;
publishAs?: Maybe;
+ /** Returns the published post when the draft is published, returns null otherwise */
+ publishedPost?: Maybe;
readTimeInMinutes: Scalars['Int']['output'];
/** The date the draft is scheduled to be published. */
scheduledDate?: Maybe;
@@ -1422,6 +2254,27 @@ export type EmailNotificationPreferences = {
weeklyNewsletterEmails: Scalars['Boolean']['output'];
};
+/** The input for enabling AI search for a documentation project */
+export type EnableDocumentationProjectAiSearchInput = {
+ /** The ID of the documentation project */
+ projectId: Scalars['ID']['input'];
+};
+
+/** The response to enabling AI search for a documentation project */
+export type EnableDocumentationProjectAiSearchPayload = {
+ __typename?: 'EnableDocumentationProjectAISearchPayload';
+ project?: Maybe;
+};
+
+export type EnableDocumentationProjectHeadlessCmsInput = {
+ projectId: Scalars['ID']['input'];
+};
+
+export type EnableDocumentationProjectHeadlessCmsPayload = {
+ __typename?: 'EnableDocumentationProjectHeadlessCmsPayload';
+ project?: Maybe;
+};
+
/** Invitations that failed to be sent to the user */
export type FailedInvite = {
__typename?: 'FailedInvite';
@@ -1489,12 +2342,85 @@ export enum FeedType {
Relevant = 'RELEVANT',
}
+export type FollowTagsInput = {
+ /** List of tag ids to follow. */
+ ids: Array;
+};
+
+export type FollowTagsPayload = {
+ __typename?: 'FollowTagsPayload';
+ /** List of tags followed by the user. */
+ tags?: Maybe>;
+};
+
export type GptBotCrawlingFeature = Feature & {
__typename?: 'GPTBotCrawlingFeature';
/** A flag indicating if the GPT Bot Crawler feature is enabled or not. */
isEnabled: Scalars['Boolean']['output'];
};
+/** The input for the exchange of token to a JWT to preview token for a documentation project. */
+export type GenerateDocumentationProjectPreviewAuthorizationTokenInput = {
+ token: Scalars['String']['input'];
+};
+
+/** The payload for the exchange of token to a JWT to preview token for a documentation project. */
+export type GenerateDocumentationProjectPreviewAuthorizationTokenPayload = {
+ __typename?: 'GenerateDocumentationProjectPreviewAuthorizationTokenPayload';
+ /** The JWT that can be used to preview the documentation project. */
+ authorizationToken?: Maybe;
+ /** The project for which the JWT is generated. With this request, authenticated fields are not accessible. */
+ project?: Maybe;
+};
+
+/** The input for the generation of a exchangeable preview token for a documentation project. */
+export type GenerateDocumentationProjectPreviewTokenInput = {
+ projectId: Scalars['ID']['input'];
+};
+
+/** The payload for the generation of a exchangeable preview token for a documentation project. */
+export type GenerateDocumentationProjectPreviewTokenPayload = {
+ __typename?: 'GenerateDocumentationProjectPreviewTokenPayload';
+ /** The project for which the token is generated. */
+ project?: Maybe;
+ /** The token that can be exchanged for a JWT to preview the documentation project. */
+ token?: Maybe