diff --git a/docs-yml.schema.json b/docs-yml.schema.json index 56b3368dfe1d..e548727b19f7 100644 --- a/docs-yml.schema.json +++ b/docs-yml.schema.json @@ -356,6 +356,16 @@ } ] }, + "feedback": { + "oneOf": [ + { + "$ref": "#/definitions/docs.FeedbackConfig" + }, + { + "type": "null" + } + ] + }, "settings": { "oneOf": [ { @@ -5956,6 +5966,35 @@ "grouped" ] }, + "docs.FeedbackConfig": { + "type": "object", + "properties": { + "hide-feedback": { + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "If `hide-feedback` is set to true, the feedback widget will not be rendered.\nIf either this property or `layout.hide-feedback` is true, feedback is hidden.\n\n@default: false" + }, + "require-email": { + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "If `require-email` is set to true, the email field in the feedback form will be required.\nUsers can still click submit, but an inline validation error will appear if the email is empty.\n\n@default: false" + } + }, + "additionalProperties": false, + "description": "Configuration for the feedback widget displayed on documentation pages." + }, "docs.DocsSettingsConfig": { "type": "object", "properties": { diff --git a/fern/apis/docs-yml/definition/docs.yml b/fern/apis/docs-yml/definition/docs.yml index 94ed453b8f58..79efd4c2171c 100644 --- a/fern/apis/docs-yml/definition/docs.yml +++ b/fern/apis/docs-yml/definition/docs.yml @@ -355,6 +355,7 @@ types: colors: optional typography: optional layout: optional + feedback: optional settings: optional theme: optional @@ -910,6 +911,25 @@ types: docs: | If `mobile-toc` is set to true, a sticky collapsible table of contents bar will be shown on mobile viewports for guide and overview layout pages. + FeedbackConfig: + docs: | + Configuration for the feedback widget displayed on documentation pages. + properties: + hide-feedback: + type: optional + docs: | + If `hide-feedback` is set to true, the feedback widget will not be rendered. + If either this property or `layout.hide-feedback` is true, feedback is hidden. + + @default: false + require-email: + type: optional + docs: | + If `require-email` is set to true, the email field in the feedback form will be required. + Users can still click submit, but an inline validation error will appear if the email is empty. + + @default: false + DocsSettingsConfig: properties: search-text: diff --git a/packages/cli/cli/changes/unreleased/add-feedback-config.yml b/packages/cli/cli/changes/unreleased/add-feedback-config.yml new file mode 100644 index 000000000000..9e0a3ff62fe3 --- /dev/null +++ b/packages/cli/cli/changes/unreleased/add-feedback-config.yml @@ -0,0 +1,3 @@ +- summary: | + Add support for `feedback` configuration object in `docs.yml` with `hide-feedback` and `require-email` properties. + type: feat diff --git a/packages/cli/configuration-loader/src/docs-yml/parseDocsConfiguration.ts b/packages/cli/configuration-loader/src/docs-yml/parseDocsConfiguration.ts index ec9395583965..b05edd2f8a85 100644 --- a/packages/cli/configuration-loader/src/docs-yml/parseDocsConfiguration.ts +++ b/packages/cli/configuration-loader/src/docs-yml/parseDocsConfiguration.ts @@ -73,6 +73,7 @@ export async function parseDocsConfiguration({ colors, typography: rawTypography, layout, + feedback, /* integrations */ integrations, @@ -258,6 +259,7 @@ export async function parseDocsConfiguration({ colors: convertColorsConfiguration(colors, context), typography, layout: convertLayoutConfig(layout, tabsObj?.alignment, tabsObj?.placement), + feedback: convertFeedbackConfig(feedback), settings: convertSettingsConfig(rawDocsConfiguration.settings), context7File, llmsTxtFile, @@ -630,6 +632,19 @@ function convertLayoutConfig( } as unknown as docsYml.ParsedDocsConfiguration["layout"]; } +function convertFeedbackConfig( + feedback: docsYml.RawSchemas.FeedbackConfig | undefined +): docsYml.ParsedDocsConfiguration["feedback"] { + if (feedback == null) { + return undefined; + } + + return { + hideFeedback: feedback.hideFeedback ?? false, + requireEmail: feedback.requireEmail ?? false + }; +} + function parseSizeConfig(sizeAsString: string | undefined): CjsFdrSdk.docs.v1.commons.SizeConfig | undefined { if (sizeAsString == null) { return undefined; diff --git a/packages/cli/configuration/src/docs-yml/DocsYmlSchemas.ts b/packages/cli/configuration/src/docs-yml/DocsYmlSchemas.ts index 26ca7f476d15..e3cc4b55ba45 100644 --- a/packages/cli/configuration/src/docs-yml/DocsYmlSchemas.ts +++ b/packages/cli/configuration/src/docs-yml/DocsYmlSchemas.ts @@ -306,6 +306,13 @@ export const LayoutConfig = z.object({ "mobile-toc": z.boolean().optional() }); +// ===== Feedback ===== + +export const FeedbackConfig = z.object({ + "hide-feedback": z.boolean().optional(), + "require-email": z.boolean().optional() +}); + // ===== Settings ===== export const DocsSettingsConfig = z.object({ @@ -1010,6 +1017,7 @@ export const DocsConfiguration = z.object({ colors: ColorsConfiguration.optional(), typography: DocsTypographyConfig.optional(), layout: LayoutConfig.optional(), + feedback: FeedbackConfig.optional(), settings: DocsSettingsConfig.optional(), theme: ThemeConfig.optional(), "global-theme": z.string().optional(), diff --git a/packages/cli/configuration/src/docs-yml/ParsedDocsConfiguration.ts b/packages/cli/configuration/src/docs-yml/ParsedDocsConfiguration.ts index 172cc34c307b..4fd6a8e9bccd 100644 --- a/packages/cli/configuration/src/docs-yml/ParsedDocsConfiguration.ts +++ b/packages/cli/configuration/src/docs-yml/ParsedDocsConfiguration.ts @@ -40,6 +40,11 @@ export interface ParsedPageActionsConfig { }; } +export interface ParsedFeedbackConfig { + hideFeedback: boolean; + requireEmail: boolean; +} + // TODO(kafkas): Remove this when we upgrade the fdr-sdk to latest interface ParsedDocsSettingsConfig extends Omit { language: string | undefined; @@ -83,6 +88,7 @@ export interface ParsedDocsConfiguration { colors: CjsFdrSdk.docs.v1.write.ColorsConfigV3 | undefined; typography: TypographyConfig | undefined; layout: CjsFdrSdk.docs.v1.commons.DocsLayoutConfig | undefined; + feedback: ParsedFeedbackConfig | undefined; settings: ParsedDocsSettingsConfig | undefined; context7File: AbsoluteFilePath | undefined; llmsTxtFile: AbsoluteFilePath | undefined; diff --git a/packages/cli/configuration/src/docs-yml/schemas/sdk/api/resources/docs/types/DocsConfiguration.ts b/packages/cli/configuration/src/docs-yml/schemas/sdk/api/resources/docs/types/DocsConfiguration.ts index f65854c86fd9..494fbe99f6df 100644 --- a/packages/cli/configuration/src/docs-yml/schemas/sdk/api/resources/docs/types/DocsConfiguration.ts +++ b/packages/cli/configuration/src/docs-yml/schemas/sdk/api/resources/docs/types/DocsConfiguration.ts @@ -102,6 +102,7 @@ export interface DocsConfiguration { colors?: FernDocsConfig.ColorsConfiguration; typography?: FernDocsConfig.DocsTypographyConfig; layout?: FernDocsConfig.LayoutConfig; + feedback?: FernDocsConfig.FeedbackConfig; settings?: FernDocsConfig.DocsSettingsConfig; theme?: FernDocsConfig.ThemeConfig; integrations?: FernDocsConfig.IntegrationsConfig; diff --git a/packages/cli/configuration/src/docs-yml/schemas/sdk/api/resources/docs/types/FeedbackConfig.ts b/packages/cli/configuration/src/docs-yml/schemas/sdk/api/resources/docs/types/FeedbackConfig.ts new file mode 100644 index 000000000000..f547b008420f --- /dev/null +++ b/packages/cli/configuration/src/docs-yml/schemas/sdk/api/resources/docs/types/FeedbackConfig.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface FeedbackConfig { + /** + * If `hide-feedback` is set to true, the feedback widget will not be rendered. + * If either this property or `layout.hide-feedback` is true, feedback is hidden. + * + * @default: false + */ + hideFeedback?: boolean; + /** + * If `require-email` is set to true, the email field in the feedback form will be required. + * Users can still click submit, but an inline validation error will appear if the email is empty. + * + * @default: false + */ + requireEmail?: boolean; +} diff --git a/packages/cli/configuration/src/docs-yml/schemas/sdk/api/resources/docs/types/index.ts b/packages/cli/configuration/src/docs-yml/schemas/sdk/api/resources/docs/types/index.ts index 2be3237b49ad..059738f1236a 100644 --- a/packages/cli/configuration/src/docs-yml/schemas/sdk/api/resources/docs/types/index.ts +++ b/packages/cli/configuration/src/docs-yml/schemas/sdk/api/resources/docs/types/index.ts @@ -43,6 +43,7 @@ export * from "./EditThisPageConfig.js"; export * from "./EditThisPageLaunch.js"; export * from "./ExperimentalConfig.js"; export * from "./ExternalProduct.js"; +export * from "./FeedbackConfig.js"; export * from "./FeatureFlag.js"; export * from "./FeatureFlagConfiguration.js"; export * from "./FolderConfiguration.js"; diff --git a/packages/cli/configuration/src/docs-yml/schemas/sdk/serialization/resources/docs/types/DocsConfiguration.ts b/packages/cli/configuration/src/docs-yml/schemas/sdk/serialization/resources/docs/types/DocsConfiguration.ts index 6424eb755c29..0b7194150646 100644 --- a/packages/cli/configuration/src/docs-yml/schemas/sdk/serialization/resources/docs/types/DocsConfiguration.ts +++ b/packages/cli/configuration/src/docs-yml/schemas/sdk/serialization/resources/docs/types/DocsConfiguration.ts @@ -15,6 +15,7 @@ import { CssConfig } from "./CssConfig.js"; import { DocsInstance } from "./DocsInstance.js"; import { DocsSettingsConfig } from "./DocsSettingsConfig.js"; import { DocsTypographyConfig } from "./DocsTypographyConfig.js"; +import { FeedbackConfig } from "./FeedbackConfig.js"; import { ExperimentalConfig } from "./ExperimentalConfig.js"; import { FooterLinksConfig } from "./FooterLinksConfig.js"; import { IntegrationsConfig } from "./IntegrationsConfig.js"; @@ -74,6 +75,7 @@ export const DocsConfiguration: core.serialization.ObjectSchema< colors: ColorsConfiguration.optional(), typography: DocsTypographyConfig.optional(), layout: LayoutConfig.optional(), + feedback: FeedbackConfig.optional(), settings: DocsSettingsConfig.optional(), theme: ThemeConfig.optional(), integrations: IntegrationsConfig.optional(), @@ -117,6 +119,7 @@ export declare namespace DocsConfiguration { colors?: ColorsConfiguration.Raw | null; typography?: DocsTypographyConfig.Raw | null; layout?: LayoutConfig.Raw | null; + feedback?: FeedbackConfig.Raw | null; settings?: DocsSettingsConfig.Raw | null; theme?: ThemeConfig.Raw | null; integrations?: IntegrationsConfig.Raw | null; diff --git a/packages/cli/configuration/src/docs-yml/schemas/sdk/serialization/resources/docs/types/FeedbackConfig.ts b/packages/cli/configuration/src/docs-yml/schemas/sdk/serialization/resources/docs/types/FeedbackConfig.ts new file mode 100644 index 000000000000..fbec74b11452 --- /dev/null +++ b/packages/cli/configuration/src/docs-yml/schemas/sdk/serialization/resources/docs/types/FeedbackConfig.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as FernDocsConfig from "../../../../api/index.js"; +import * as core from "../../../../core/index.js"; +import type * as serializers from "../../../index.js"; + +export const FeedbackConfig: core.serialization.ObjectSchema< + serializers.FeedbackConfig.Raw, + FernDocsConfig.FeedbackConfig +> = core.serialization.object({ + hideFeedback: core.serialization.property("hide-feedback", core.serialization.boolean().optional()), + requireEmail: core.serialization.property("require-email", core.serialization.boolean().optional()), +}); + +export declare namespace FeedbackConfig { + export interface Raw { + "hide-feedback"?: boolean | null; + "require-email"?: boolean | null; + } +} diff --git a/packages/cli/configuration/src/docs-yml/schemas/sdk/serialization/resources/docs/types/index.ts b/packages/cli/configuration/src/docs-yml/schemas/sdk/serialization/resources/docs/types/index.ts index 2be3237b49ad..059738f1236a 100644 --- a/packages/cli/configuration/src/docs-yml/schemas/sdk/serialization/resources/docs/types/index.ts +++ b/packages/cli/configuration/src/docs-yml/schemas/sdk/serialization/resources/docs/types/index.ts @@ -43,6 +43,7 @@ export * from "./EditThisPageConfig.js"; export * from "./EditThisPageLaunch.js"; export * from "./ExperimentalConfig.js"; export * from "./ExternalProduct.js"; +export * from "./FeedbackConfig.js"; export * from "./FeatureFlag.js"; export * from "./FeatureFlagConfiguration.js"; export * from "./FolderConfiguration.js"; diff --git a/packages/cli/docs-resolver/src/DocsDefinitionResolver.ts b/packages/cli/docs-resolver/src/DocsDefinitionResolver.ts index 68576bd51ec1..03629599b0cc 100644 --- a/packages/cli/docs-resolver/src/DocsDefinitionResolver.ts +++ b/packages/cli/docs-resolver/src/DocsDefinitionResolver.ts @@ -889,6 +889,13 @@ export class DocsDefinitionResolver { }), typographyV2: this.convertDocsTypographyConfiguration(), layout: this.parsedDocsConfig.layout, + feedback: + this.parsedDocsConfig.feedback != null + ? { + hideFeedback: this.parsedDocsConfig.feedback.hideFeedback, + requireEmail: this.parsedDocsConfig.feedback.requireEmail + } + : undefined, settings: this.parsedDocsConfig.settings, css: this.parsedDocsConfig.css, js: this.convertJavascriptConfiguration(),