From f6f420d2d63ae9eebc4944fd5585238e9e222df9 Mon Sep 17 00:00:00 2001 From: harika kondur Date: Wed, 17 Dec 2025 09:37:20 -0700 Subject: [PATCH 01/16] wip --- apps/google-docs/contentful-app-manifest.json | 15 ++ .../functions/agents/planAgent/plan.agent.ts | 167 ++++++++++++++++++ .../functions/agents/planAgent/schema.ts | 58 ++++++ apps/google-docs/functions/createPlan.ts | 74 ++++++++ 4 files changed, 314 insertions(+) create mode 100644 apps/google-docs/functions/agents/planAgent/plan.agent.ts create mode 100644 apps/google-docs/functions/agents/planAgent/schema.ts create mode 100644 apps/google-docs/functions/createPlan.ts diff --git a/apps/google-docs/contentful-app-manifest.json b/apps/google-docs/contentful-app-manifest.json index a38d1c2ef6..1e91059731 100644 --- a/apps/google-docs/contentful-app-manifest.json +++ b/apps/google-docs/contentful-app-manifest.json @@ -21,6 +21,21 @@ ] }, "functions": [ + { + "id": "createPlanFunction", + "name": "Create plan from document function", + "description": "Function to create an entry creation plan from a document (step 1 of 2-step flow).", + "path": "functions/createPlan.js", + "entryFile": "functions/createPlan.ts", + "allowNetworks": [ + "https://api.openai.com", + "https://docs.googleapis.com", + "https://docs.google.com" + ], + "accepts": [ + "appaction.call" + ] + }, { "id": "createEntriesFromDocumentFunction", "name": "Create content entries from document function", diff --git a/apps/google-docs/functions/agents/planAgent/plan.agent.ts b/apps/google-docs/functions/agents/planAgent/plan.agent.ts new file mode 100644 index 0000000000..c6512081fc --- /dev/null +++ b/apps/google-docs/functions/agents/planAgent/plan.agent.ts @@ -0,0 +1,167 @@ +/** + * Plan Agent + * + * Agent that analyzes an array of content types to understand their relationships. + * This is used to visualize the content model in the UI before creating entries. + */ + +import { createOpenAI } from '@ai-sdk/openai'; +import { generateObject } from 'ai'; +import { ContentTypeProps } from 'contentful-management'; +import { ContentTypeRelationshipAnalysisSchema, ContentTypeRelationshipAnalysis } from './schema'; + +/** + * Configuration for the plan agent + */ +export interface PlanAgentConfig { + openAiApiKey: string; + contentTypes: ContentTypeProps[]; +} + +/** + * AI Agent that analyzes content types to understand their relationships. + * Returns a structured analysis for UI visualization. + * + * @param config - Plan agent configuration including API key and content types + * @returns Promise resolving to a relationship analysis + */ +export async function analyzeContentTypeRelationships( + config: PlanAgentConfig +): Promise { + const modelVersion = 'gpt-4o'; + const temperature = 0.3; + + const { openAiApiKey, contentTypes } = config; + + const openaiClient = createOpenAI({ + apiKey: openAiApiKey, + }); + + console.log( + 'Plan Agent - Analyzing content types:', + contentTypes.map((ct) => ct.name).join(', ') + ); + + const prompt = buildAnalysisPrompt(contentTypes); + + const result = await generateObject({ + model: openaiClient(modelVersion), + schema: ContentTypeRelationshipAnalysisSchema, + temperature, + system: buildSystemPrompt(), + prompt, + }); + + const analysis = result.object as ContentTypeRelationshipAnalysis; + console.log('Plan Agent - Relationship Analysis:', JSON.stringify(analysis, null, 2)); + + return analysis; +} + +function buildSystemPrompt(): string { + return `You are an expert at analyzing Contentful content models and understanding relationships between content types. + +Your role is to: +1. Analyze the structure of each content type +2. Identify reference fields (fields that link to other entries) +3. Determine relationships between content types +4. Provide a clear summary for UI visualization + +REFERENCE FIELD IDENTIFICATION: +- Type "Link" with linkType "Entry" = reference to another entry +- Type "Array" with items.type "Link" and items.linkType "Entry" = array of references +- Check validations for "linkContentType" to see which content types can be referenced + +RELATIONSHIP ANALYSIS: +For each reference field: +- Source: The content type that HAS the reference field +- Target: The content type(s) that can be referenced +- relationType: "single" for Link, "many" for Array +- Check if the target is in the selected content types set + +OUTPUT REQUIREMENTS: +- For each content type: summary with counts and reference fields +- For each relationship: clear source → target mapping with field info +- Overall summary: describe the content model structure +- Be concise and clear for UI display + +Example: "3 content types selected: Blog Post references Author and Category"`; +} + +function buildAnalysisPrompt(contentTypes: ContentTypeProps[]): string { + const contentTypeIds = contentTypes.map((ct) => ct.sys.id); + const contentTypeNames = contentTypes.map((ct) => ct.name).join(', '); + + // Create detailed content type information focusing on reference fields + const contentTypeDetails = contentTypes.map((ct) => { + const referenceFields = + ct.fields + ?.filter((field) => { + const isLink = field.type === 'Link' && (field as any).linkType === 'Entry'; + const isArrayOfLinks = + field.type === 'Array' && + (field.items as any)?.type === 'Link' && + (field.items as any)?.linkType === 'Entry'; + return isLink || isArrayOfLinks; + }) + .map((field) => { + const linkContentType = field.validations?.find((v: any) => v.linkContentType); + return { + id: field.id, + name: field.name, + type: field.type, + linkType: (field as any).linkType, + items: field.type === 'Array' ? (field.items as any) : undefined, + validations: linkContentType, + }; + }) || []; + + return { + id: ct.sys.id, + name: ct.name, + description: ct.description, + totalFields: ct.fields?.length || 0, + referenceFields, + }; + }); + + return `Analyze the following Contentful content types and their relationships. + +SELECTED CONTENT TYPES: ${contentTypeNames} +CONTENT TYPE IDS: ${contentTypeIds.join(', ')} +TOTAL: ${contentTypes.length} + +CONTENT TYPE DETAILS: +${JSON.stringify(contentTypeDetails, null, 2)} + +YOUR TASK: + +1. **Analyze Each Content Type**: + - Summarize each content type + - List its reference fields (if any) + - Determine if it has incoming or outgoing references + +2. **Identify Relationships**: + - For each reference field, create a ContentTypeRelationship + - Source = content type that HAS the reference field + - Target = content type(s) that can be referenced (from linkContentType validation) + - If linkContentType validation is missing, the field can reference ANY content type + - relationType = "single" for Link, "many" for Array + - isInSelectedSet = true if target content type is in the selected set + +3. **Generate Summary**: + - Describe the content model in 1-2 sentences + - Example: "3 content types selected: Blog Post references Author (single) and Category (many)" + - Example: "2 content types with no relationships between them" + +4. **Count Relationships**: + - Total number of reference relationships identified + +IMPORTANT NOTES: +- A reference field may reference multiple content types (check linkContentType array) +- Create a separate relationship entry for EACH referenced content type +- If a field can reference ANY content type (no linkContentType validation), still include it +- Only analyze the provided content types - don't invent relationships + +Provide a structured analysis that can be used to visualize the content model in a UI.`; +} diff --git a/apps/google-docs/functions/agents/planAgent/schema.ts b/apps/google-docs/functions/agents/planAgent/schema.ts new file mode 100644 index 0000000000..cc9dcbafad --- /dev/null +++ b/apps/google-docs/functions/agents/planAgent/schema.ts @@ -0,0 +1,58 @@ +import { z } from 'zod'; + +// Schema Definitions for the Plan Agent + +/** + * Represents a reference field in a content type + */ +export const ReferenceFieldSchema = z.object({ + fieldId: z.string().describe('The ID of the reference field'), + fieldName: z.string().describe('Human-readable name of the field'), + linkType: z.enum(['Entry', 'Asset']).describe('Type of link'), + validations: z.any().optional().describe('Field validations (e.g., linkContentType)'), +}); + +/** + * Represents a relationship between two content types + */ +export const ContentTypeRelationshipSchema = z.object({ + sourceContentTypeId: z.string().describe('Content type that has the reference field'), + sourceContentTypeName: z.string().describe('Human-readable name of source content type'), + targetContentTypeId: z.string().describe('Content type being referenced'), + targetContentTypeName: z.string().describe('Human-readable name of target content type'), + fieldId: z.string().describe('The reference field ID'), + fieldName: z.string().describe('Human-readable field name'), + relationType: z.enum(['single', 'many']).describe('Single reference or array'), + isInSelectedSet: z.boolean().describe('Whether the target content type is in the selected set'), +}); + +/** + * Summary of a content type for visualization + */ +export const ContentTypeSummarySchema = z.object({ + contentTypeId: z.string().describe('The content type ID'), + contentTypeName: z.string().describe('Human-readable name'), + description: z.string().optional().describe('Content type description'), + totalFields: z.number().describe('Total number of fields'), + referenceFields: z.array(ReferenceFieldSchema).describe('Fields that reference other entries'), + hasIncomingReferences: z.boolean().describe('Whether other content types reference this one'), + hasOutgoingReferences: z.boolean().describe('Whether this content type references others'), +}); + +/** + * The complete relationship analysis output schema + */ +export const ContentTypeRelationshipAnalysisSchema = z.object({ + contentTypes: z.array(ContentTypeSummarySchema).describe('Summary of each selected content type'), + relationships: z + .array(ContentTypeRelationshipSchema) + .describe('All relationships between the selected content types'), + summary: z.string().describe('Brief summary of the content types and their relationships'), + totalContentTypes: z.number().describe('Total number of content types'), + totalRelationships: z.number().describe('Total number of relationships'), +}); + +export type ReferenceField = z.infer; +export type ContentTypeRelationship = z.infer; +export type ContentTypeSummary = z.infer; +export type ContentTypeRelationshipAnalysis = z.infer; diff --git a/apps/google-docs/functions/createPlan.ts b/apps/google-docs/functions/createPlan.ts new file mode 100644 index 0000000000..f595783698 --- /dev/null +++ b/apps/google-docs/functions/createPlan.ts @@ -0,0 +1,74 @@ +import type { + FunctionEventContext, + FunctionEventHandler, + FunctionTypeEnum, + AppActionRequest, +} from '@contentful/node-apps-toolkit'; +import { analyzeContentTypeRelationships } from './agents/planAgent/plan.agent'; +import { fetchContentTypes } from './service/contentTypeService'; +import { initContentfulManagementClient } from './service/initCMAClient'; + +export type CreatePlanParameters = { + contentTypeIds: string[]; +}; + +interface AppInstallationParameters { + openAiApiKey: string; +} + +/** + * App Action: Create Plan + * + * This is the first step in the two-step flow for creating entries from a Google Doc. + * It analyzes the selected content types to understand their relationships. + * + * The relationship analysis is returned to the UI for visualization, showing: + * - What content types have been selected + * - How they relate to each other (which fields reference which content types) + * - A visual map of the content model + * + * After the user reviews the plan and uploads a document, the createEntries action + * will use this structure to create the actual entries. + */ +export const handler: FunctionEventHandler< + FunctionTypeEnum.AppActionCall, + CreatePlanParameters +> = async ( + event: AppActionRequest<'Custom', CreatePlanParameters>, + context: FunctionEventContext +) => { + const { contentTypeIds } = event.body; + const { openAiApiKey } = context.appInstallationParameters as AppInstallationParameters; + + if (!contentTypeIds || contentTypeIds.length === 0) { + throw new Error('At least one content type ID is required'); + } + + const cma = initContentfulManagementClient(context); + const contentTypes = await fetchContentTypes(cma, new Set(contentTypeIds)); + + console.log( + 'Analyzing relationships for content types:', + contentTypes.map((ct) => ct.name).join(', ') + ); + + // Analyze the content type relationships + const analysis = await analyzeContentTypeRelationships({ + openAiApiKey, + contentTypes, + }); + + console.log('Content type relationship analysis completed:', analysis.summary); + + return { + success: true, + analysis, + response: { + summary: analysis.summary, + totalContentTypes: analysis.totalContentTypes, + totalRelationships: analysis.totalRelationships, + contentTypes: analysis.contentTypes, + relationships: analysis.relationships, + }, + }; +}; From 278d6947e72eb0794ca90883c38f48df0d03d069 Mon Sep 17 00:00:00 2001 From: harika kondur Date: Wed, 17 Dec 2025 12:47:26 -0700 Subject: [PATCH 02/16] simplify agent --- apps/google-docs/contentful-app-manifest.json | 4 +- .../functions/agents/planAgent/plan.agent.ts | 166 +++++++++--------- .../functions/agents/planAgent/schema.ts | 69 +++----- apps/google-docs/functions/createPlan.ts | 35 ++-- 4 files changed, 124 insertions(+), 150 deletions(-) diff --git a/apps/google-docs/contentful-app-manifest.json b/apps/google-docs/contentful-app-manifest.json index 1e91059731..5a8f6d75e9 100644 --- a/apps/google-docs/contentful-app-manifest.json +++ b/apps/google-docs/contentful-app-manifest.json @@ -23,8 +23,8 @@ "functions": [ { "id": "createPlanFunction", - "name": "Create plan from document function", - "description": "Function to create an entry creation plan from a document (step 1 of 2-step flow).", + "name": "Create plan ", + "description": "Function to create an entry creation plan", "path": "functions/createPlan.js", "entryFile": "functions/createPlan.ts", "allowNetworks": [ diff --git a/apps/google-docs/functions/agents/planAgent/plan.agent.ts b/apps/google-docs/functions/agents/planAgent/plan.agent.ts index c6512081fc..083aa7effd 100644 --- a/apps/google-docs/functions/agents/planAgent/plan.agent.ts +++ b/apps/google-docs/functions/agents/planAgent/plan.agent.ts @@ -1,14 +1,14 @@ /** * Plan Agent * - * Agent that analyzes an array of content types to understand their relationships. - * This is used to visualize the content model in the UI before creating entries. + * Agent that analyzes an array of content types to build a simple relationship graph. + * Returns a nested JSON structure showing which content types reference which others. */ import { createOpenAI } from '@ai-sdk/openai'; import { generateObject } from 'ai'; import { ContentTypeProps } from 'contentful-management'; -import { ContentTypeRelationshipAnalysisSchema, ContentTypeRelationshipAnalysis } from './schema'; +import { ContentTypeRelationshipGraphSchema, ContentTypeRelationshipGraph } from './schema'; /** * Configuration for the plan agent @@ -19,15 +19,15 @@ export interface PlanAgentConfig { } /** - * AI Agent that analyzes content types to understand their relationships. - * Returns a structured analysis for UI visualization. + * AI Agent that analyzes content types and builds a nested relationship graph. + * Returns a simple tree structure for UI visualization. * * @param config - Plan agent configuration including API key and content types - * @returns Promise resolving to a relationship analysis + * @returns Promise resolving to a nested relationship graph */ -export async function analyzeContentTypeRelationships( +export async function buildContentTypeGraph( config: PlanAgentConfig -): Promise { +): Promise { const modelVersion = 'gpt-4o'; const temperature = 0.3; @@ -38,61 +38,73 @@ export async function analyzeContentTypeRelationships( }); console.log( - 'Plan Agent - Analyzing content types:', + 'Plan Agent - Building graph for content types:', contentTypes.map((ct) => ct.name).join(', ') ); - const prompt = buildAnalysisPrompt(contentTypes); + const prompt = buildGraphPrompt(contentTypes); const result = await generateObject({ model: openaiClient(modelVersion), - schema: ContentTypeRelationshipAnalysisSchema, + schema: ContentTypeRelationshipGraphSchema, temperature, system: buildSystemPrompt(), prompt, }); - const analysis = result.object as ContentTypeRelationshipAnalysis; - console.log('Plan Agent - Relationship Analysis:', JSON.stringify(analysis, null, 2)); + const graph = result.object as ContentTypeRelationshipGraph; + console.log('Plan Agent - Relationship Graph:', JSON.stringify(graph, null, 2)); - return analysis; + return graph; } function buildSystemPrompt(): string { - return `You are an expert at analyzing Contentful content models and understanding relationships between content types. + return `You are an expert at analyzing Contentful content models and creating visual relationship graphs. Your role is to: -1. Analyze the structure of each content type -2. Identify reference fields (fields that link to other entries) -3. Determine relationships between content types -4. Provide a clear summary for UI visualization - -REFERENCE FIELD IDENTIFICATION: -- Type "Link" with linkType "Entry" = reference to another entry -- Type "Array" with items.type "Link" and items.linkType "Entry" = array of references -- Check validations for "linkContentType" to see which content types can be referenced - -RELATIONSHIP ANALYSIS: -For each reference field: -- Source: The content type that HAS the reference field -- Target: The content type(s) that can be referenced -- relationType: "single" for Link, "many" for Array -- Check if the target is in the selected content types set - -OUTPUT REQUIREMENTS: -- For each content type: summary with counts and reference fields -- For each relationship: clear source → target mapping with field info -- Overall summary: describe the content model structure -- Be concise and clear for UI display - -Example: "3 content types selected: Blog Post references Author and Category"`; +1. Identify reference fields in content types (type "Link" or Array of "Link") +2. Build a nested JSON structure showing the relationship hierarchy +3. Create a simple tree that shows which content types reference which others + +OUTPUT FORMAT: +Create a nested JSON graph where: +- Each node has: { id: "contentTypeId", name: "Content Type Name", references: [...nested nodes...] } +- "references" array contains content types that this one references +- Nest the structure to show the hierarchy clearly +- Content types with no outgoing references have no "references" field or an empty array +- Content types with no incoming references should be at the root level + +EXAMPLE OUTPUT: +\`\`\`json +{ + "graph": [ + { + "id": "blogPost", + "name": "Blog Post", + "references": [ + { + "id": "author", + "name": "Author" + }, + { + "id": "category", + "name": "Category" + } + ] + } + ], + "summary": "Blog Post references Author and Category" } +\`\`\` -function buildAnalysisPrompt(contentTypes: ContentTypeProps[]): string { +Keep it simple and focused on the visual hierarchy for UI purposes.`; +} + +function buildGraphPrompt(contentTypes: ContentTypeProps[]): string { const contentTypeIds = contentTypes.map((ct) => ct.sys.id); const contentTypeNames = contentTypes.map((ct) => ct.name).join(', '); - // Create detailed content type information focusing on reference fields + // Extract reference information const contentTypeDetails = contentTypes.map((ct) => { const referenceFields = ct.fields @@ -107,61 +119,57 @@ function buildAnalysisPrompt(contentTypes: ContentTypeProps[]): string { .map((field) => { const linkContentType = field.validations?.find((v: any) => v.linkContentType); return { - id: field.id, - name: field.name, - type: field.type, - linkType: (field as any).linkType, - items: field.type === 'Array' ? (field.items as any) : undefined, - validations: linkContentType, + fieldId: field.id, + fieldName: field.name, + canReference: linkContentType?.linkContentType || ['any'], }; }) || []; return { id: ct.sys.id, name: ct.name, - description: ct.description, - totalFields: ct.fields?.length || 0, referenceFields, }; }); - return `Analyze the following Contentful content types and their relationships. + return `Build a nested relationship graph for the following Contentful content types. SELECTED CONTENT TYPES: ${contentTypeNames} CONTENT TYPE IDS: ${contentTypeIds.join(', ')} -TOTAL: ${contentTypes.length} CONTENT TYPE DETAILS: ${JSON.stringify(contentTypeDetails, null, 2)} YOUR TASK: -1. **Analyze Each Content Type**: - - Summarize each content type - - List its reference fields (if any) - - Determine if it has incoming or outgoing references - -2. **Identify Relationships**: - - For each reference field, create a ContentTypeRelationship - - Source = content type that HAS the reference field - - Target = content type(s) that can be referenced (from linkContentType validation) - - If linkContentType validation is missing, the field can reference ANY content type - - relationType = "single" for Link, "many" for Array - - isInSelectedSet = true if target content type is in the selected set - -3. **Generate Summary**: - - Describe the content model in 1-2 sentences - - Example: "3 content types selected: Blog Post references Author (single) and Category (many)" - - Example: "2 content types with no relationships between them" - -4. **Count Relationships**: - - Total number of reference relationships identified - -IMPORTANT NOTES: -- A reference field may reference multiple content types (check linkContentType array) -- Create a separate relationship entry for EACH referenced content type -- If a field can reference ANY content type (no linkContentType validation), still include it -- Only analyze the provided content types - don't invent relationships - -Provide a structured analysis that can be used to visualize the content model in a UI.`; +1. **Identify Root Content Types**: Content types that are NOT referenced by others should be at the root level +2. **Build Nested Structure**: For each content type that has reference fields, nest the referenced content types +3. **Keep It Simple**: Only include id and name for each node, plus nested references +4. **Avoid Duplicates**: If a content type appears in multiple places, that's okay (show the relationship) + +STRUCTURE RULES: +- Start with content types that reference others (usually the "parent" content types) +- Nest their referenced content types in the "references" array +- Each node: { id: "contentTypeId", name: "Content Type Name", references?: [...] } +- If a content type doesn't reference anything, omit "references" or use empty array + +EXAMPLE: +If Blog Post references Author and Category: +\`\`\`json +{ + "graph": [ + { + "id": "blogPost", + "name": "Blog Post", + "references": [ + { "id": "author", "name": "Author" }, + { "id": "category", "name": "Category" } + ] + } + ], + "summary": "Blog Post references Author and Category" +} +\`\`\` + +Now create the graph for the provided content types.`; } diff --git a/apps/google-docs/functions/agents/planAgent/schema.ts b/apps/google-docs/functions/agents/planAgent/schema.ts index cc9dcbafad..bca50eeb27 100644 --- a/apps/google-docs/functions/agents/planAgent/schema.ts +++ b/apps/google-docs/functions/agents/planAgent/schema.ts @@ -3,56 +3,33 @@ import { z } from 'zod'; // Schema Definitions for the Plan Agent /** - * Represents a reference field in a content type + * Represents a content type node in the relationship graph */ -export const ReferenceFieldSchema = z.object({ - fieldId: z.string().describe('The ID of the reference field'), - fieldName: z.string().describe('Human-readable name of the field'), - linkType: z.enum(['Entry', 'Asset']).describe('Type of link'), - validations: z.any().optional().describe('Field validations (e.g., linkContentType)'), -}); - -/** - * Represents a relationship between two content types - */ -export const ContentTypeRelationshipSchema = z.object({ - sourceContentTypeId: z.string().describe('Content type that has the reference field'), - sourceContentTypeName: z.string().describe('Human-readable name of source content type'), - targetContentTypeId: z.string().describe('Content type being referenced'), - targetContentTypeName: z.string().describe('Human-readable name of target content type'), - fieldId: z.string().describe('The reference field ID'), - fieldName: z.string().describe('Human-readable field name'), - relationType: z.enum(['single', 'many']).describe('Single reference or array'), - isInSelectedSet: z.boolean().describe('Whether the target content type is in the selected set'), -}); +export const ContentTypeNodeSchema: z.ZodType = z.lazy(() => + z.object({ + id: z.string().describe('Content type ID'), + name: z.string().describe('Content type name'), + references: z + .array(ContentTypeNodeSchema) + .optional() + .describe('Content types that this one references (nested)'), + }) +); /** - * Summary of a content type for visualization + * The simple relationship graph output schema */ -export const ContentTypeSummarySchema = z.object({ - contentTypeId: z.string().describe('The content type ID'), - contentTypeName: z.string().describe('Human-readable name'), - description: z.string().optional().describe('Content type description'), - totalFields: z.number().describe('Total number of fields'), - referenceFields: z.array(ReferenceFieldSchema).describe('Fields that reference other entries'), - hasIncomingReferences: z.boolean().describe('Whether other content types reference this one'), - hasOutgoingReferences: z.boolean().describe('Whether this content type references others'), +export const ContentTypeRelationshipGraphSchema = z.object({ + graph: z + .array(ContentTypeNodeSchema) + .describe('Nested relationship graph showing content type hierarchy'), + summary: z.string().describe('Brief summary of the content model'), }); -/** - * The complete relationship analysis output schema - */ -export const ContentTypeRelationshipAnalysisSchema = z.object({ - contentTypes: z.array(ContentTypeSummarySchema).describe('Summary of each selected content type'), - relationships: z - .array(ContentTypeRelationshipSchema) - .describe('All relationships between the selected content types'), - summary: z.string().describe('Brief summary of the content types and their relationships'), - totalContentTypes: z.number().describe('Total number of content types'), - totalRelationships: z.number().describe('Total number of relationships'), -}); +export type ContentTypeNode = { + id: string; + name: string; + references?: ContentTypeNode[]; +}; -export type ReferenceField = z.infer; -export type ContentTypeRelationship = z.infer; -export type ContentTypeSummary = z.infer; -export type ContentTypeRelationshipAnalysis = z.infer; +export type ContentTypeRelationshipGraph = z.infer; diff --git a/apps/google-docs/functions/createPlan.ts b/apps/google-docs/functions/createPlan.ts index f595783698..c1243ffdc5 100644 --- a/apps/google-docs/functions/createPlan.ts +++ b/apps/google-docs/functions/createPlan.ts @@ -4,9 +4,10 @@ import type { FunctionTypeEnum, AppActionRequest, } from '@contentful/node-apps-toolkit'; -import { analyzeContentTypeRelationships } from './agents/planAgent/plan.agent'; +import { buildContentTypeGraph } from './agents/planAgent/plan.agent'; import { fetchContentTypes } from './service/contentTypeService'; import { initContentfulManagementClient } from './service/initCMAClient'; +import { ContentTypeProps } from 'contentful-management'; export type CreatePlanParameters = { contentTypeIds: string[]; @@ -19,16 +20,10 @@ interface AppInstallationParameters { /** * App Action: Create Plan * - * This is the first step in the two-step flow for creating entries from a Google Doc. - * It analyzes the selected content types to understand their relationships. + * Analyzes selected content types and builds a nested relationship graph + * showing which content types reference which others. * - * The relationship analysis is returned to the UI for visualization, showing: - * - What content types have been selected - * - How they relate to each other (which fields reference which content types) - * - A visual map of the content model - * - * After the user reviews the plan and uploads a document, the createEntries action - * will use this structure to create the actual entries. + * Returns a simple JSON structure for UI visualization. */ export const handler: FunctionEventHandler< FunctionTypeEnum.AppActionCall, @@ -48,27 +43,21 @@ export const handler: FunctionEventHandler< const contentTypes = await fetchContentTypes(cma, new Set(contentTypeIds)); console.log( - 'Analyzing relationships for content types:', - contentTypes.map((ct) => ct.name).join(', ') + 'Building relationship graph for content types:', + contentTypes.map((ct: ContentTypeProps) => ct.name).join(', ') ); - // Analyze the content type relationships - const analysis = await analyzeContentTypeRelationships({ + // Build the content type relationship graph + const graph = await buildContentTypeGraph({ openAiApiKey, contentTypes, }); - console.log('Content type relationship analysis completed:', analysis.summary); + console.log('Content type relationship graph completed:', graph.summary); return { success: true, - analysis, - response: { - summary: analysis.summary, - totalContentTypes: analysis.totalContentTypes, - totalRelationships: analysis.totalRelationships, - contentTypes: analysis.contentTypes, - relationships: analysis.relationships, - }, + graph: graph.graph, + summary: graph.summary, }; }; From 516c7afe3bda2555a2040f8d6df5a2f8eae6fa24 Mon Sep 17 00:00:00 2001 From: harika kondur Date: Wed, 17 Dec 2025 13:59:52 -0700 Subject: [PATCH 03/16] organize oauth functions --- .../functions/createEntriesFromDocument.ts | 25 ++----------- .../functions/{ => oauth}/checkStatus.ts | 0 .../functions/{ => oauth}/completeOauth.ts | 0 .../functions/{ => oauth}/disconnect.ts | 0 .../functions/{ => oauth}/initiateOauth.ts | 0 apps/google-docs/src/locations/Page.tsx | 32 ++++++++++++++++- .../google-docs/src/utils/appFunctionUtils.ts | 35 ++++++++++++++++++- 7 files changed, 68 insertions(+), 24 deletions(-) rename apps/google-docs/functions/{ => oauth}/checkStatus.ts (100%) rename apps/google-docs/functions/{ => oauth}/completeOauth.ts (100%) rename apps/google-docs/functions/{ => oauth}/disconnect.ts (100%) rename apps/google-docs/functions/{ => oauth}/initiateOauth.ts (100%) diff --git a/apps/google-docs/functions/createEntriesFromDocument.ts b/apps/google-docs/functions/createEntriesFromDocument.ts index 6dcc9298ba..f8c20e10d1 100644 --- a/apps/google-docs/functions/createEntriesFromDocument.ts +++ b/apps/google-docs/functions/createEntriesFromDocument.ts @@ -70,7 +70,7 @@ export const handler: FunctionEventHandler< const contentTypes = await fetchContentTypes(cma, new Set(contentTypeIds)); // Commented out to preserver as much time as possible due to the 30 second limit for App functions - // const contentTypeParserAgentResult = await analyzeContentTypes({ contentTypes, openAiApiKey }); + const contentTypeParserAgentResult = await analyzeContentTypes({ contentTypes, openAiApiKey }); // INTEG-3261: Pass the ai content type response to the observer for analysis // createContentTypeObservationsFromLLMResponse() @@ -81,33 +81,14 @@ export const handler: FunctionEventHandler< contentTypes, }); - // INTEG-3261: Pass the ai document response to the observer for analysis - // createDocumentObservationsFromLLMResponse() - - // INTEG-3264: Create the entries in Contentful using the entry service - // The aiDocumentResponse.entries is now ready to be passed to the CMA client - const creationResult = await createEntries(cma, aiDocumentResponse.entries, { - spaceId: context.spaceId, - environmentId: context.environmentId, - contentTypes, - }); - console.log('Created Entries Result:', creationResult); - - // INTEG-3265: Create the assets in Contentful using the asset service - // await createAssets() + console.log('AI Document Response:', aiDocumentResponse); return { success: true, response: { - // contentTypeParserAgentResult, + contentTypeParserAgentResult, summary: aiDocumentResponse.summary, totalEntriesExtracted: aiDocumentResponse.totalEntries, - createdEntries: creationResult.createdEntries.map((entry) => ({ - id: entry.sys.id, - contentType: entry.sys.contentType.sys.id, - })), - errors: creationResult.errors, - successRate: `${creationResult.createdEntries.length}/${aiDocumentResponse.totalEntries}`, }, }; }; diff --git a/apps/google-docs/functions/checkStatus.ts b/apps/google-docs/functions/oauth/checkStatus.ts similarity index 100% rename from apps/google-docs/functions/checkStatus.ts rename to apps/google-docs/functions/oauth/checkStatus.ts diff --git a/apps/google-docs/functions/completeOauth.ts b/apps/google-docs/functions/oauth/completeOauth.ts similarity index 100% rename from apps/google-docs/functions/completeOauth.ts rename to apps/google-docs/functions/oauth/completeOauth.ts diff --git a/apps/google-docs/functions/disconnect.ts b/apps/google-docs/functions/oauth/disconnect.ts similarity index 100% rename from apps/google-docs/functions/disconnect.ts rename to apps/google-docs/functions/oauth/disconnect.ts diff --git a/apps/google-docs/functions/initiateOauth.ts b/apps/google-docs/functions/oauth/initiateOauth.ts similarity index 100% rename from apps/google-docs/functions/initiateOauth.ts rename to apps/google-docs/functions/oauth/initiateOauth.ts diff --git a/apps/google-docs/src/locations/Page.tsx b/apps/google-docs/src/locations/Page.tsx index 49e05b309c..302e0a123c 100644 --- a/apps/google-docs/src/locations/Page.tsx +++ b/apps/google-docs/src/locations/Page.tsx @@ -110,7 +110,37 @@ const Page = () => { `Selected ${contentTypes.length} content type${contentTypes.length > 1 ? 's' : ''}: ${names}` ); - // Call create entries function after content types are selected + // Step 1: Call createPlan to analyze content type relationships + try { + console.log('🎯 Step 1: Creating relationship graph for selected content types...'); + console.log('📋 Selected Content Types:', names); + console.log('📋 Content Type IDs:', ids); + + const { createPlanAction } = await import('../utils/appFunctionUtils'); + const planResult = await createPlanAction(sdk, ids); + + console.log('✅ Plan created successfully!'); + console.log('📊 Full Result:', JSON.stringify(planResult, null, 2)); + + // Access the response data + const graph = (planResult as any).graph; + const summary = (planResult as any).summary; + + if (graph) { + console.log('📊 Graph Structure:', JSON.stringify(graph, null, 2)); + } + if (summary) { + console.log('📊 Summary:', summary); + sdk.notifier.success(`Plan: ${summary}`); + } + } catch (error) { + console.error('❌ Error creating plan:', error); + sdk.notifier.error( + `Failed to create plan: ${error instanceof Error ? error.message : 'Unknown error'}` + ); + } + + // Step 2: Call create entries function after content types are selected await submit(ids); }; diff --git a/apps/google-docs/src/utils/appFunctionUtils.ts b/apps/google-docs/src/utils/appFunctionUtils.ts index f57e0d46f3..a79b5abbb6 100644 --- a/apps/google-docs/src/utils/appFunctionUtils.ts +++ b/apps/google-docs/src/utils/appFunctionUtils.ts @@ -23,6 +23,39 @@ export async function getAppActionId( return appAction.sys.id; } +export const createPlanAction = async ( + sdk: PageAppSDK | ConfigAppSDK, + contentTypeIds: string[] +) => { + try { + const appDefinitionId = sdk.ids.app; + + if (!appDefinitionId) { + throw new Error('App definition ID not found'); + } + + const appActionId = await getAppActionId(sdk, 'createPlanFunction'); + const result = await sdk.cma.appActionCall.createWithResult( + { + appDefinitionId, + appActionId, + }, + { + parameters: { contentTypeIds }, + } + ); + + if ('errors' in result && result.errors) { + throw new Error(JSON.stringify(result.errors)); + } + + return result; + } catch (error) { + console.error('Error creating plan', error); + throw new Error(error instanceof Error ? error.message : 'Failed to create plan'); + } +}; + export const createEntriesFromDocumentAction = async ( sdk: PageAppSDK | ConfigAppSDK, contentTypeIds: string[], @@ -55,7 +88,7 @@ export const createEntriesFromDocumentAction = async ( } } - const appActionId = await getAppActionId(sdk, 'createEntriesFromDocumentAction'); + const appActionId = await getAppActionId(sdk, 'createEntriesFromDocumentFunction'); const result = await sdk.cma.appActionCall.createWithResult( { appDefinitionId, From 93c62529a1467564b620008d808f9c7a13d5ed50 Mon Sep 17 00:00:00 2001 From: harika kondur Date: Wed, 17 Dec 2025 14:07:35 -0700 Subject: [PATCH 04/16] reorganizing function handlers --- apps/google-docs/contentful-app-manifest.json | 24 ++--- .../{ => agents}/observer/observer.ts | 0 .../createEntriesFromDocument.ts | 43 +++------ .../functions/{ => handlers}/createPlan.ts | 6 +- .../utils/documentValidationUtils.ts | 48 ++++++++++ .../google-docs/src/utils/appFunctionUtils.ts | 89 +++++++------------ 6 files changed, 106 insertions(+), 104 deletions(-) rename apps/google-docs/functions/{ => agents}/observer/observer.ts (100%) rename apps/google-docs/functions/{ => handlers}/createEntriesFromDocument.ts (56%) rename apps/google-docs/functions/{ => handlers}/createPlan.ts (88%) create mode 100644 apps/google-docs/functions/utils/documentValidationUtils.ts diff --git a/apps/google-docs/contentful-app-manifest.json b/apps/google-docs/contentful-app-manifest.json index 5a8f6d75e9..68b757e721 100644 --- a/apps/google-docs/contentful-app-manifest.json +++ b/apps/google-docs/contentful-app-manifest.json @@ -25,8 +25,8 @@ "id": "createPlanFunction", "name": "Create plan ", "description": "Function to create an entry creation plan", - "path": "functions/createPlan.js", - "entryFile": "functions/createPlan.ts", + "path": "functions/handlers/createPlan.js", + "entryFile": "functions/handlers/createPlan.ts", "allowNetworks": [ "https://api.openai.com", "https://docs.googleapis.com", @@ -40,8 +40,8 @@ "id": "createEntriesFromDocumentFunction", "name": "Create content entries from document function", "description": "Function to create content blocks from App Action.", - "path": "functions/createEntriesFromDocument.js", - "entryFile": "functions/createEntriesFromDocument.ts", + "path": "functions/handlers/createEntriesFromDocument.js", + "entryFile": "functions/handlers/createEntriesFromDocument.ts", "allowNetworks": [ "https://api.openai.com", "https://docs.googleapis.com", @@ -56,8 +56,8 @@ "id": "initiateGdocOauth", "name": "Initiate Gdoc OAuth Flow", "description": "Initiates the OAuth flow for Google Docs", - "path": "functions/initiateOauth.js", - "entryFile": "functions/initiateOauth.ts", + "path": "functions/oauth/initiateOauth.js", + "entryFile": "functions/oauth/initiateOauth.ts", "allowNetworks": [ "oauth2.googleapis.com" ], @@ -69,8 +69,8 @@ "id": "completeGdocOauth", "name": "Complete Gdoc OAuth Flow", "description": "Completes the OAuth flow for Google Docs", - "path": "functions/completeOauth.js", - "entryFile": "functions/completeOauth.ts", + "path": "functions/oauth/completeOauth.js", + "entryFile": "functions/oauth/completeOauth.ts", "allowNetworks": [ "oauth2.googleapis.com" ], @@ -82,8 +82,8 @@ "id": "revokeGdocOauthToken", "name": "Revoke Gdoc OAuth Token", "description": "Revoke token for the Google Docs app to disconnect from the app", - "path": "functions/disconnect.js", - "entryFile": "functions/disconnect.ts", + "path": "functions/oauth/disconnect.js", + "entryFile": "functions/oauth/disconnect.ts", "allowNetworks": [ "oauth2.googleapis.com" ], @@ -95,8 +95,8 @@ "id": "checkGdocOauthTokenStatus", "name": "Check Gdoc OAuth Token Status", "description": "Checks the status of the Google Docs OAuth token to see if it is valid", - "path": "functions/checkStatus.js", - "entryFile": "functions/checkStatus.ts", + "path": "functions/oauth/checkStatus.js", + "entryFile": "functions/oauth/checkStatus.ts", "allowNetworks": [ "oauth2.googleapis.com" ], diff --git a/apps/google-docs/functions/observer/observer.ts b/apps/google-docs/functions/agents/observer/observer.ts similarity index 100% rename from apps/google-docs/functions/observer/observer.ts rename to apps/google-docs/functions/agents/observer/observer.ts diff --git a/apps/google-docs/functions/createEntriesFromDocument.ts b/apps/google-docs/functions/handlers/createEntriesFromDocument.ts similarity index 56% rename from apps/google-docs/functions/createEntriesFromDocument.ts rename to apps/google-docs/functions/handlers/createEntriesFromDocument.ts index f8c20e10d1..3c14a3d4e4 100644 --- a/apps/google-docs/functions/createEntriesFromDocument.ts +++ b/apps/google-docs/functions/handlers/createEntriesFromDocument.ts @@ -4,12 +4,13 @@ import type { FunctionTypeEnum, AppActionRequest, } from '@contentful/node-apps-toolkit'; -import { analyzeContentTypes } from './agents/contentTypeParserAgent/contentTypeParser.agent'; -import { createDocument } from './agents/documentParserAgent/documentParser.agent'; -import { fetchContentTypes } from './service/contentTypeService'; -import { initContentfulManagementClient } from './service/initCMAClient'; -import { fetchGoogleDoc } from './service/googleDriveService'; -import { createEntries } from './service/entryService'; +import { analyzeContentTypes } from '../agents/contentTypeParserAgent/contentTypeParser.agent'; +import { createDocument } from '../agents/documentParserAgent/documentParser.agent'; +import { fetchContentTypes } from '../service/contentTypeService'; +import { initContentfulManagementClient } from '../service/initCMAClient'; +import { fetchGoogleDoc } from '../service/googleDriveService'; +import { createEntries } from '../service/entryService'; +import { parseDocument, validateDocument } from '../utils/documentValidationUtils'; export type AppActionParameters = { contentTypeIds: string[]; @@ -34,37 +35,15 @@ export const handler: FunctionEventHandler< const { contentTypeIds, document } = event.body; const { openAiApiKey } = context.appInstallationParameters as AppInstallationParameters; - if (!document) { - throw new Error('Document is required'); - } + // Validate inputs + validateDocument(document); if (!contentTypeIds || contentTypeIds.length === 0) { throw new Error('At least one content type ID is required'); } - // Parse document if it's a string (may be JSON stringified during transmission) - let parsedDocument: unknown = document; - if (typeof document === 'string') { - // Check if it's a URL (starts with http:// or https://) - if (document.startsWith('http://') || document.startsWith('https://')) { - throw new Error( - 'Document URL provided but fetching from Google Docs API is not yet implemented. Please provide the document JSON object directly.' - ); - } - - // Try to parse as JSON - try { - parsedDocument = JSON.parse(document); - } catch (e) { - // Provide more helpful error message - const preview = document.substring(0, 100); - throw new Error( - `Failed to parse document as JSON. Document appears to be a string but is not valid JSON. ` + - `Preview: ${preview}${document.length > 100 ? '...' : ''}. ` + - `Error: ${e instanceof Error ? e.message : String(e)}` - ); - } - } + // Parse document using shared utility + const parsedDocument = parseDocument(document); const cma = initContentfulManagementClient(context); const contentTypes = await fetchContentTypes(cma, new Set(contentTypeIds)); diff --git a/apps/google-docs/functions/createPlan.ts b/apps/google-docs/functions/handlers/createPlan.ts similarity index 88% rename from apps/google-docs/functions/createPlan.ts rename to apps/google-docs/functions/handlers/createPlan.ts index c1243ffdc5..0d05bba375 100644 --- a/apps/google-docs/functions/createPlan.ts +++ b/apps/google-docs/functions/handlers/createPlan.ts @@ -4,9 +4,9 @@ import type { FunctionTypeEnum, AppActionRequest, } from '@contentful/node-apps-toolkit'; -import { buildContentTypeGraph } from './agents/planAgent/plan.agent'; -import { fetchContentTypes } from './service/contentTypeService'; -import { initContentfulManagementClient } from './service/initCMAClient'; +import { buildContentTypeGraph } from '../agents/planAgent/plan.agent'; +import { fetchContentTypes } from '../service/contentTypeService'; +import { initContentfulManagementClient } from '../service/initCMAClient'; import { ContentTypeProps } from 'contentful-management'; export type CreatePlanParameters = { diff --git a/apps/google-docs/functions/utils/documentValidationUtils.ts b/apps/google-docs/functions/utils/documentValidationUtils.ts new file mode 100644 index 0000000000..05adc56af9 --- /dev/null +++ b/apps/google-docs/functions/utils/documentValidationUtils.ts @@ -0,0 +1,48 @@ +/** + * Shared utility for parsing and validating Google Docs documents + * Used by both client-side and server-side code + */ + +/** + * Parses a document parameter that may be a JSON string, URL, or object + * @param document - The document to parse (string URL, JSON string, or object) + * @returns The parsed document object + * @throws Error if the document cannot be parsed + */ +export function parseDocument(document: unknown): unknown { + // If already an object, return as-is + if (typeof document !== 'string') { + return document; + } + + // Check if it's a URL (starts with http:// or https://) + if (document.startsWith('http://') || document.startsWith('https://')) { + throw new Error( + 'Document URL provided but fetching from Google Docs API is not yet implemented. Please provide the document JSON object directly.' + ); + } + + // Try to parse as JSON + try { + return JSON.parse(document); + } catch (e) { + // Provide more helpful error message + const preview = document.substring(0, 100); + throw new Error( + `Failed to parse document as JSON. Document appears to be a string but is not valid JSON. ` + + `Preview: ${preview}${document.length > 100 ? '...' : ''}. ` + + `Error: ${e instanceof Error ? e.message : String(e)}` + ); + } +} + +/** + * Validates that a document is provided + * @param document - The document to validate + * @throws Error if the document is null, undefined, or empty + */ +export function validateDocument(document: unknown): void { + if (!document) { + throw new Error('Document is required'); + } +} diff --git a/apps/google-docs/src/utils/appFunctionUtils.ts b/apps/google-docs/src/utils/appFunctionUtils.ts index a79b5abbb6..828ef2e653 100644 --- a/apps/google-docs/src/utils/appFunctionUtils.ts +++ b/apps/google-docs/src/utils/appFunctionUtils.ts @@ -1,4 +1,5 @@ import { PageAppSDK, ConfigAppSDK } from '@contentful/app-sdk'; +import { parseDocument } from '../../functions/utils/documentValidationUtils'; /** * Fetches the app action ID by name from the current environment @@ -23,10 +24,19 @@ export async function getAppActionId( return appAction.sys.id; } -export const createPlanAction = async ( +/** + * Generic helper to call an app action with parameters + * @param sdk - The Contentful SDK instance + * @param actionName - The name of the app action to call + * @param parameters - The parameters to pass to the app action + * @returns The result from the app action + * @throws Error if the app action fails + */ +async function callAppAction( sdk: PageAppSDK | ConfigAppSDK, - contentTypeIds: string[] -) => { + actionName: string, + parameters: Record +): Promise { try { const appDefinitionId = sdk.ids.app; @@ -34,14 +44,14 @@ export const createPlanAction = async ( throw new Error('App definition ID not found'); } - const appActionId = await getAppActionId(sdk, 'createPlanFunction'); + const appActionId = await getAppActionId(sdk, actionName); const result = await sdk.cma.appActionCall.createWithResult( { appDefinitionId, appActionId, }, { - parameters: { contentTypeIds }, + parameters, } ); @@ -49,11 +59,20 @@ export const createPlanAction = async ( throw new Error(JSON.stringify(result.errors)); } - return result; + return result as T; } catch (error) { - console.error('Error creating plan', error); - throw new Error(error instanceof Error ? error.message : 'Failed to create plan'); + console.error(`Error calling app action "${actionName}"`, error); + throw new Error( + error instanceof Error ? error.message : `Failed to call app action "${actionName}"` + ); } +} + +export const createPlanAction = async ( + sdk: PageAppSDK | ConfigAppSDK, + contentTypeIds: string[] +) => { + return callAppAction(sdk, 'createPlanFunction', { contentTypeIds }); }; export const createEntriesFromDocumentAction = async ( @@ -61,53 +80,9 @@ export const createEntriesFromDocumentAction = async ( contentTypeIds: string[], document: unknown ) => { - try { - const appDefinitionId = sdk.ids.app; - - if (!appDefinitionId) { - throw new Error('App definition ID not found'); - } - - // Parse document if it's a JSON string (Contentful API expects an object, not a string) - let parsedDocument: unknown = document; - if (typeof document === 'string') { - // Check if it's a URL (starts with http:// or https://) - if (document.startsWith('http://') || document.startsWith('https://')) { - throw new Error( - 'Document URL provided but fetching from Google Docs API is not yet implemented. Please provide the document JSON object directly.' - ); - } - - // Try to parse as JSON - try { - parsedDocument = JSON.parse(document); - } catch (e) { - throw new Error( - `Failed to parse document as JSON: ${e instanceof Error ? e.message : String(e)}` - ); - } - } - - const appActionId = await getAppActionId(sdk, 'createEntriesFromDocumentFunction'); - const result = await sdk.cma.appActionCall.createWithResult( - { - appDefinitionId, - appActionId, - }, - { - parameters: { contentTypeIds, document: parsedDocument }, - } - ); - - if ('errors' in result && result.errors) { - throw new Error(JSON.stringify(result.errors)); - } - - return result; - } catch (error) { - console.error('Error creating entries from document', error); - throw new Error( - error instanceof Error ? error.message : 'Failed to create entries from document' - ); - } + const parsedDocument = parseDocument(document); + return callAppAction(sdk, 'createEntriesFromDocumentFunction', { + contentTypeIds, + document: parsedDocument, + }); }; From 9c237cbe45d7f2baf285d5ae0b76c8d99e276248 Mon Sep 17 00:00:00 2001 From: harika kondur Date: Wed, 17 Dec 2025 14:17:42 -0700 Subject: [PATCH 05/16] reorganizing function handlers (prev `createEntriesfromDocument`) calling each agent in a separate function, + removing plan agent for now --- apps/google-docs/contentful-app-manifest.json | 23 ++- .../functions/agents/planAgent/plan.agent.ts | 175 ------------------ .../functions/agents/planAgent/schema.ts | 35 ---- .../{createPlan.ts => analyzeContentTypes.ts} | 32 ++-- ...riesFromDocument.ts => processDocument.ts} | 42 +++-- .../utils/documentValidationUtils.ts | 5 - .../src/hooks/useDocumentSubmission.ts | 2 +- apps/google-docs/src/locations/Page.tsx | 31 ---- ...{appFunctionUtils.ts => appActionUtils.ts} | 26 ++- 9 files changed, 76 insertions(+), 295 deletions(-) delete mode 100644 apps/google-docs/functions/agents/planAgent/plan.agent.ts delete mode 100644 apps/google-docs/functions/agents/planAgent/schema.ts rename apps/google-docs/functions/handlers/{createPlan.ts => analyzeContentTypes.ts} (54%) rename apps/google-docs/functions/handlers/{createEntriesFromDocument.ts => processDocument.ts} (61%) rename apps/google-docs/src/utils/{appFunctionUtils.ts => appActionUtils.ts} (72%) diff --git a/apps/google-docs/contentful-app-manifest.json b/apps/google-docs/contentful-app-manifest.json index 68b757e721..28ead1d30e 100644 --- a/apps/google-docs/contentful-app-manifest.json +++ b/apps/google-docs/contentful-app-manifest.json @@ -37,11 +37,11 @@ ] }, { - "id": "createEntriesFromDocumentFunction", - "name": "Create content entries from document function", - "description": "Function to create content blocks from App Action.", - "path": "functions/handlers/createEntriesFromDocument.js", - "entryFile": "functions/handlers/createEntriesFromDocument.ts", + "id": "processDocumentFunction", + "name": "Process Document", + "description": "Processes a Google Doc and creates Contentful entries based on document structure.", + "path": "functions/handlers/processDocument.js", + "entryFile": "functions/handlers/processDocument.ts", "allowNetworks": [ "https://api.openai.com", "https://docs.googleapis.com", @@ -52,6 +52,19 @@ "appaction.call" ] }, + { + "id": "analyzeContentTypesFunction", + "name": "Analyze Content Types", + "description": "Analyzes content type structure and relationships using AI.", + "path": "functions/handlers/analyzeContentTypes.js", + "entryFile": "functions/handlers/analyzeContentTypes.ts", + "allowNetworks": [ + "https://api.openai.com" + ], + "accepts": [ + "appaction.call" + ] + }, { "id": "initiateGdocOauth", "name": "Initiate Gdoc OAuth Flow", diff --git a/apps/google-docs/functions/agents/planAgent/plan.agent.ts b/apps/google-docs/functions/agents/planAgent/plan.agent.ts deleted file mode 100644 index 083aa7effd..0000000000 --- a/apps/google-docs/functions/agents/planAgent/plan.agent.ts +++ /dev/null @@ -1,175 +0,0 @@ -/** - * Plan Agent - * - * Agent that analyzes an array of content types to build a simple relationship graph. - * Returns a nested JSON structure showing which content types reference which others. - */ - -import { createOpenAI } from '@ai-sdk/openai'; -import { generateObject } from 'ai'; -import { ContentTypeProps } from 'contentful-management'; -import { ContentTypeRelationshipGraphSchema, ContentTypeRelationshipGraph } from './schema'; - -/** - * Configuration for the plan agent - */ -export interface PlanAgentConfig { - openAiApiKey: string; - contentTypes: ContentTypeProps[]; -} - -/** - * AI Agent that analyzes content types and builds a nested relationship graph. - * Returns a simple tree structure for UI visualization. - * - * @param config - Plan agent configuration including API key and content types - * @returns Promise resolving to a nested relationship graph - */ -export async function buildContentTypeGraph( - config: PlanAgentConfig -): Promise { - const modelVersion = 'gpt-4o'; - const temperature = 0.3; - - const { openAiApiKey, contentTypes } = config; - - const openaiClient = createOpenAI({ - apiKey: openAiApiKey, - }); - - console.log( - 'Plan Agent - Building graph for content types:', - contentTypes.map((ct) => ct.name).join(', ') - ); - - const prompt = buildGraphPrompt(contentTypes); - - const result = await generateObject({ - model: openaiClient(modelVersion), - schema: ContentTypeRelationshipGraphSchema, - temperature, - system: buildSystemPrompt(), - prompt, - }); - - const graph = result.object as ContentTypeRelationshipGraph; - console.log('Plan Agent - Relationship Graph:', JSON.stringify(graph, null, 2)); - - return graph; -} - -function buildSystemPrompt(): string { - return `You are an expert at analyzing Contentful content models and creating visual relationship graphs. - -Your role is to: -1. Identify reference fields in content types (type "Link" or Array of "Link") -2. Build a nested JSON structure showing the relationship hierarchy -3. Create a simple tree that shows which content types reference which others - -OUTPUT FORMAT: -Create a nested JSON graph where: -- Each node has: { id: "contentTypeId", name: "Content Type Name", references: [...nested nodes...] } -- "references" array contains content types that this one references -- Nest the structure to show the hierarchy clearly -- Content types with no outgoing references have no "references" field or an empty array -- Content types with no incoming references should be at the root level - -EXAMPLE OUTPUT: -\`\`\`json -{ - "graph": [ - { - "id": "blogPost", - "name": "Blog Post", - "references": [ - { - "id": "author", - "name": "Author" - }, - { - "id": "category", - "name": "Category" - } - ] - } - ], - "summary": "Blog Post references Author and Category" -} -\`\`\` - -Keep it simple and focused on the visual hierarchy for UI purposes.`; -} - -function buildGraphPrompt(contentTypes: ContentTypeProps[]): string { - const contentTypeIds = contentTypes.map((ct) => ct.sys.id); - const contentTypeNames = contentTypes.map((ct) => ct.name).join(', '); - - // Extract reference information - const contentTypeDetails = contentTypes.map((ct) => { - const referenceFields = - ct.fields - ?.filter((field) => { - const isLink = field.type === 'Link' && (field as any).linkType === 'Entry'; - const isArrayOfLinks = - field.type === 'Array' && - (field.items as any)?.type === 'Link' && - (field.items as any)?.linkType === 'Entry'; - return isLink || isArrayOfLinks; - }) - .map((field) => { - const linkContentType = field.validations?.find((v: any) => v.linkContentType); - return { - fieldId: field.id, - fieldName: field.name, - canReference: linkContentType?.linkContentType || ['any'], - }; - }) || []; - - return { - id: ct.sys.id, - name: ct.name, - referenceFields, - }; - }); - - return `Build a nested relationship graph for the following Contentful content types. - -SELECTED CONTENT TYPES: ${contentTypeNames} -CONTENT TYPE IDS: ${contentTypeIds.join(', ')} - -CONTENT TYPE DETAILS: -${JSON.stringify(contentTypeDetails, null, 2)} - -YOUR TASK: - -1. **Identify Root Content Types**: Content types that are NOT referenced by others should be at the root level -2. **Build Nested Structure**: For each content type that has reference fields, nest the referenced content types -3. **Keep It Simple**: Only include id and name for each node, plus nested references -4. **Avoid Duplicates**: If a content type appears in multiple places, that's okay (show the relationship) - -STRUCTURE RULES: -- Start with content types that reference others (usually the "parent" content types) -- Nest their referenced content types in the "references" array -- Each node: { id: "contentTypeId", name: "Content Type Name", references?: [...] } -- If a content type doesn't reference anything, omit "references" or use empty array - -EXAMPLE: -If Blog Post references Author and Category: -\`\`\`json -{ - "graph": [ - { - "id": "blogPost", - "name": "Blog Post", - "references": [ - { "id": "author", "name": "Author" }, - { "id": "category", "name": "Category" } - ] - } - ], - "summary": "Blog Post references Author and Category" -} -\`\`\` - -Now create the graph for the provided content types.`; -} diff --git a/apps/google-docs/functions/agents/planAgent/schema.ts b/apps/google-docs/functions/agents/planAgent/schema.ts deleted file mode 100644 index bca50eeb27..0000000000 --- a/apps/google-docs/functions/agents/planAgent/schema.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { z } from 'zod'; - -// Schema Definitions for the Plan Agent - -/** - * Represents a content type node in the relationship graph - */ -export const ContentTypeNodeSchema: z.ZodType = z.lazy(() => - z.object({ - id: z.string().describe('Content type ID'), - name: z.string().describe('Content type name'), - references: z - .array(ContentTypeNodeSchema) - .optional() - .describe('Content types that this one references (nested)'), - }) -); - -/** - * The simple relationship graph output schema - */ -export const ContentTypeRelationshipGraphSchema = z.object({ - graph: z - .array(ContentTypeNodeSchema) - .describe('Nested relationship graph showing content type hierarchy'), - summary: z.string().describe('Brief summary of the content model'), -}); - -export type ContentTypeNode = { - id: string; - name: string; - references?: ContentTypeNode[]; -}; - -export type ContentTypeRelationshipGraph = z.infer; diff --git a/apps/google-docs/functions/handlers/createPlan.ts b/apps/google-docs/functions/handlers/analyzeContentTypes.ts similarity index 54% rename from apps/google-docs/functions/handlers/createPlan.ts rename to apps/google-docs/functions/handlers/analyzeContentTypes.ts index 0d05bba375..f9f486e95b 100644 --- a/apps/google-docs/functions/handlers/createPlan.ts +++ b/apps/google-docs/functions/handlers/analyzeContentTypes.ts @@ -4,12 +4,11 @@ import type { FunctionTypeEnum, AppActionRequest, } from '@contentful/node-apps-toolkit'; -import { buildContentTypeGraph } from '../agents/planAgent/plan.agent'; +import { analyzeContentTypes as analyzeContentTypesAgent } from '../agents/contentTypeParserAgent/contentTypeParser.agent'; import { fetchContentTypes } from '../service/contentTypeService'; import { initContentfulManagementClient } from '../service/initCMAClient'; -import { ContentTypeProps } from 'contentful-management'; -export type CreatePlanParameters = { +export type AnalyzeContentTypesParameters = { contentTypeIds: string[]; }; @@ -18,18 +17,17 @@ interface AppInstallationParameters { } /** - * App Action: Create Plan + * App Action: Analyze Content Types * - * Analyzes selected content types and builds a nested relationship graph - * showing which content types reference which others. + * Analyzes the structure and relationships of selected content types + * using AI to understand their fields, validations, and relationships. * - * Returns a simple JSON structure for UI visualization. */ export const handler: FunctionEventHandler< FunctionTypeEnum.AppActionCall, - CreatePlanParameters + AnalyzeContentTypesParameters > = async ( - event: AppActionRequest<'Custom', CreatePlanParameters>, + event: AppActionRequest<'Custom', AnalyzeContentTypesParameters>, context: FunctionEventContext ) => { const { contentTypeIds } = event.body; @@ -42,22 +40,14 @@ export const handler: FunctionEventHandler< const cma = initContentfulManagementClient(context); const contentTypes = await fetchContentTypes(cma, new Set(contentTypeIds)); - console.log( - 'Building relationship graph for content types:', - contentTypes.map((ct: ContentTypeProps) => ct.name).join(', ') - ); - - // Build the content type relationship graph - const graph = await buildContentTypeGraph({ - openAiApiKey, + const contentTypeParserAgentResult = await analyzeContentTypesAgent({ contentTypes, + openAiApiKey, }); - console.log('Content type relationship graph completed:', graph.summary); - + console.log('Content type analysis completed', contentTypeParserAgentResult); return { success: true, - graph: graph.graph, - summary: graph.summary, + analysis: contentTypeParserAgentResult, }; }; diff --git a/apps/google-docs/functions/handlers/createEntriesFromDocument.ts b/apps/google-docs/functions/handlers/processDocument.ts similarity index 61% rename from apps/google-docs/functions/handlers/createEntriesFromDocument.ts rename to apps/google-docs/functions/handlers/processDocument.ts index 3c14a3d4e4..711d01dff8 100644 --- a/apps/google-docs/functions/handlers/createEntriesFromDocument.ts +++ b/apps/google-docs/functions/handlers/processDocument.ts @@ -4,7 +4,7 @@ import type { FunctionTypeEnum, AppActionRequest, } from '@contentful/node-apps-toolkit'; -import { analyzeContentTypes } from '../agents/contentTypeParserAgent/contentTypeParser.agent'; +import { ContentTypeProps } from 'contentful-management'; import { createDocument } from '../agents/documentParserAgent/documentParser.agent'; import { fetchContentTypes } from '../service/contentTypeService'; import { initContentfulManagementClient } from '../service/initCMAClient'; @@ -12,7 +12,7 @@ import { fetchGoogleDoc } from '../service/googleDriveService'; import { createEntries } from '../service/entryService'; import { parseDocument, validateDocument } from '../utils/documentValidationUtils'; -export type AppActionParameters = { +export type ProcessDocumentParameters = { contentTypeIds: string[]; document: unknown; // JSON document from Google Docs API or test data }; @@ -21,15 +21,21 @@ interface AppInstallationParameters { openAiApiKey: string; } -/* - * Important Caveat: App Functions have a 30 second limit on execution time. - * There is a likely future where we will need to break down the function into smaller functions. +/** + * App Action: Process Document + * + * Processes a Google Doc and creates Contentful entries based on the document structure + * and the provided content types. This function focuses solely on document processing + * and entry creation. + * + * Note: Content type analysis should be done separately using the analyzeContentTypes + * function to avoid timeout issues. */ export const handler: FunctionEventHandler< FunctionTypeEnum.AppActionCall, - AppActionParameters + ProcessDocumentParameters > = async ( - event: AppActionRequest<'Custom', AppActionParameters>, + event: AppActionRequest<'Custom', ProcessDocumentParameters>, context: FunctionEventContext ) => { const { contentTypeIds, document } = event.body; @@ -48,26 +54,26 @@ export const handler: FunctionEventHandler< const cma = initContentfulManagementClient(context); const contentTypes = await fetchContentTypes(cma, new Set(contentTypeIds)); - // Commented out to preserver as much time as possible due to the 30 second limit for App functions - const contentTypeParserAgentResult = await analyzeContentTypes({ contentTypes, openAiApiKey }); - - // INTEG-3261: Pass the ai content type response to the observer for analysis - // createContentTypeObservationsFromLLMResponse() + console.log( + 'Processing document with content types:', + contentTypes.map((ct: ContentTypeProps) => ct.name).join(', ') + ); + // Process the document and create entries const aiDocumentResponse = await createDocument({ document: parsedDocument, openAiApiKey, contentTypes, }); - console.log('AI Document Response:', aiDocumentResponse); + console.log('Document processing completed:', { + summary: aiDocumentResponse.summary, + totalEntries: aiDocumentResponse.totalEntries, + }); return { success: true, - response: { - contentTypeParserAgentResult, - summary: aiDocumentResponse.summary, - totalEntriesExtracted: aiDocumentResponse.totalEntries, - }, + summary: aiDocumentResponse.summary, + totalEntriesExtracted: aiDocumentResponse.totalEntries, }; }; diff --git a/apps/google-docs/functions/utils/documentValidationUtils.ts b/apps/google-docs/functions/utils/documentValidationUtils.ts index 05adc56af9..b345036f9e 100644 --- a/apps/google-docs/functions/utils/documentValidationUtils.ts +++ b/apps/google-docs/functions/utils/documentValidationUtils.ts @@ -1,8 +1,3 @@ -/** - * Shared utility for parsing and validating Google Docs documents - * Used by both client-side and server-side code - */ - /** * Parses a document parameter that may be a JSON string, URL, or object * @param document - The document to parse (string URL, JSON string, or object) diff --git a/apps/google-docs/src/hooks/useDocumentSubmission.ts b/apps/google-docs/src/hooks/useDocumentSubmission.ts index 2b324345a7..61b28a25bd 100644 --- a/apps/google-docs/src/hooks/useDocumentSubmission.ts +++ b/apps/google-docs/src/hooks/useDocumentSubmission.ts @@ -1,6 +1,6 @@ import { useState, useCallback } from 'react'; import { PageAppSDK } from '@contentful/app-sdk'; -import { createEntriesFromDocumentAction } from '../utils/appFunctionUtils'; +import { createEntriesFromDocumentAction } from '../utils/appActionUtils'; import { ERROR_MESSAGES, SUCCESS_MESSAGES } from '../constants/messages'; interface UseDocumentSubmissionReturn { diff --git a/apps/google-docs/src/locations/Page.tsx b/apps/google-docs/src/locations/Page.tsx index 302e0a123c..58c7fccba5 100644 --- a/apps/google-docs/src/locations/Page.tsx +++ b/apps/google-docs/src/locations/Page.tsx @@ -110,37 +110,6 @@ const Page = () => { `Selected ${contentTypes.length} content type${contentTypes.length > 1 ? 's' : ''}: ${names}` ); - // Step 1: Call createPlan to analyze content type relationships - try { - console.log('🎯 Step 1: Creating relationship graph for selected content types...'); - console.log('📋 Selected Content Types:', names); - console.log('📋 Content Type IDs:', ids); - - const { createPlanAction } = await import('../utils/appFunctionUtils'); - const planResult = await createPlanAction(sdk, ids); - - console.log('✅ Plan created successfully!'); - console.log('📊 Full Result:', JSON.stringify(planResult, null, 2)); - - // Access the response data - const graph = (planResult as any).graph; - const summary = (planResult as any).summary; - - if (graph) { - console.log('📊 Graph Structure:', JSON.stringify(graph, null, 2)); - } - if (summary) { - console.log('📊 Summary:', summary); - sdk.notifier.success(`Plan: ${summary}`); - } - } catch (error) { - console.error('❌ Error creating plan:', error); - sdk.notifier.error( - `Failed to create plan: ${error instanceof Error ? error.message : 'Unknown error'}` - ); - } - - // Step 2: Call create entries function after content types are selected await submit(ids); }; diff --git a/apps/google-docs/src/utils/appFunctionUtils.ts b/apps/google-docs/src/utils/appActionUtils.ts similarity index 72% rename from apps/google-docs/src/utils/appFunctionUtils.ts rename to apps/google-docs/src/utils/appActionUtils.ts index 828ef2e653..07cd58b3cb 100644 --- a/apps/google-docs/src/utils/appFunctionUtils.ts +++ b/apps/google-docs/src/utils/appActionUtils.ts @@ -68,21 +68,39 @@ async function callAppAction( } } -export const createPlanAction = async ( +/** + * Analyzes content type structure and relationships using AI + * @param sdk - The Contentful SDK instance + * @param contentTypeIds - Array of content type IDs to analyze + * @returns Analysis result from the app action + */ +export const analyzeContentTypesAction = async ( sdk: PageAppSDK | ConfigAppSDK, contentTypeIds: string[] ) => { - return callAppAction(sdk, 'createPlanFunction', { contentTypeIds }); + return callAppAction(sdk, 'analyzeContentTypesFunction', { contentTypeIds }); }; -export const createEntriesFromDocumentAction = async ( +/** + * Processes a document and creates Contentful entries + * @param sdk - The Contentful SDK instance + * @param contentTypeIds - Array of content type IDs to use for entry creation + * @param document - The document to process (JSON object or string) + * @returns Processing result from the app action + */ +export const processDocumentAction = async ( sdk: PageAppSDK | ConfigAppSDK, contentTypeIds: string[], document: unknown ) => { const parsedDocument = parseDocument(document); - return callAppAction(sdk, 'createEntriesFromDocumentFunction', { + return callAppAction(sdk, 'processDocumentFunction', { contentTypeIds, document: parsedDocument, }); }; + +/** + * @deprecated Use processDocumentAction instead + */ +export const createEntriesFromDocumentAction = processDocumentAction; From 13b2ca3017f4a032500ef23770dcc32372cef476 Mon Sep 17 00:00:00 2001 From: harika kondur Date: Wed, 17 Dec 2025 14:26:10 -0700 Subject: [PATCH 06/16] fix: function manifest --- apps/google-docs/contentful-app-manifest.json | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/apps/google-docs/contentful-app-manifest.json b/apps/google-docs/contentful-app-manifest.json index 28ead1d30e..8033fa70eb 100644 --- a/apps/google-docs/contentful-app-manifest.json +++ b/apps/google-docs/contentful-app-manifest.json @@ -21,25 +21,10 @@ ] }, "functions": [ - { - "id": "createPlanFunction", - "name": "Create plan ", - "description": "Function to create an entry creation plan", - "path": "functions/handlers/createPlan.js", - "entryFile": "functions/handlers/createPlan.ts", - "allowNetworks": [ - "https://api.openai.com", - "https://docs.googleapis.com", - "https://docs.google.com" - ], - "accepts": [ - "appaction.call" - ] - }, { "id": "processDocumentFunction", "name": "Process Document", - "description": "Processes a Google Doc and creates Contentful entries based on document structure.", + "description": "Processes a Google Doc and returns entry drafts", "path": "functions/handlers/processDocument.js", "entryFile": "functions/handlers/processDocument.ts", "allowNetworks": [ From 02993807001c2c7d251a145f1629fe5f8a8604d2 Mon Sep 17 00:00:00 2001 From: harika kondur Date: Wed, 17 Dec 2025 14:38:35 -0700 Subject: [PATCH 07/16] minor edit to manifest --- apps/google-docs/contentful-app-manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/google-docs/contentful-app-manifest.json b/apps/google-docs/contentful-app-manifest.json index 8033fa70eb..5169f84723 100644 --- a/apps/google-docs/contentful-app-manifest.json +++ b/apps/google-docs/contentful-app-manifest.json @@ -22,7 +22,7 @@ }, "functions": [ { - "id": "processDocumentFunction", + "id": "processDocument", "name": "Process Document", "description": "Processes a Google Doc and returns entry drafts", "path": "functions/handlers/processDocument.js", @@ -38,7 +38,7 @@ ] }, { - "id": "analyzeContentTypesFunction", + "id": "analyzeContentTypes", "name": "Analyze Content Types", "description": "Analyzes content type structure and relationships using AI.", "path": "functions/handlers/analyzeContentTypes.js", From 2c4f8d7f4296bd8f4a30068f61855f403c8da2d4 Mon Sep 17 00:00:00 2001 From: harika kondur Date: Thu, 18 Dec 2025 09:27:13 -0700 Subject: [PATCH 08/16] replacing single function with 2: one for analyzing ct + one for document processing --- .../functions/handlers/analyzeContentTypes.ts | 2 ++ .../src/components/page/ContentTypePickerModal.tsx | 2 +- .../google-docs/src/hooks/useDocumentSubmission.ts | 14 +++++++++++--- apps/google-docs/src/utils/appActionUtils.ts | 2 +- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/apps/google-docs/functions/handlers/analyzeContentTypes.ts b/apps/google-docs/functions/handlers/analyzeContentTypes.ts index f9f486e95b..702d61373f 100644 --- a/apps/google-docs/functions/handlers/analyzeContentTypes.ts +++ b/apps/google-docs/functions/handlers/analyzeContentTypes.ts @@ -37,6 +37,8 @@ export const handler: FunctionEventHandler< throw new Error('At least one content type ID is required'); } + console.log('contentTypeIds', contentTypeIds); + console.log('In analyzeContentTypes handler'); const cma = initContentfulManagementClient(context); const contentTypes = await fetchContentTypes(cma, new Set(contentTypeIds)); diff --git a/apps/google-docs/src/components/page/ContentTypePickerModal.tsx b/apps/google-docs/src/components/page/ContentTypePickerModal.tsx index 32d1b34804..b3355e5a5e 100644 --- a/apps/google-docs/src/components/page/ContentTypePickerModal.tsx +++ b/apps/google-docs/src/components/page/ContentTypePickerModal.tsx @@ -177,7 +177,7 @@ export const ContentTypePickerModal = ({ variant="primary" isDisabled={isLoading || isSubmitting} endIcon={isSubmitting ? : undefined}> - Create + Next diff --git a/apps/google-docs/src/hooks/useDocumentSubmission.ts b/apps/google-docs/src/hooks/useDocumentSubmission.ts index 3fdbd38f94..8467abfd52 100644 --- a/apps/google-docs/src/hooks/useDocumentSubmission.ts +++ b/apps/google-docs/src/hooks/useDocumentSubmission.ts @@ -1,6 +1,10 @@ import { useState, useCallback } from 'react'; import { PageAppSDK } from '@contentful/app-sdk'; -import { createEntriesFromDocumentAction } from '../utils/appActionUtils'; +import { + analyzeContentTypesAction, + createEntriesFromDocumentAction, + processDocumentAction, +} from '../utils/appActionUtils'; import { ERROR_MESSAGES, SUCCESS_MESSAGES } from '../constants/messages'; interface UseDocumentSubmissionReturn { @@ -58,13 +62,17 @@ export const useDocumentSubmission = ( setResult(null); try { - const response = await createEntriesFromDocumentAction( + const response = await analyzeContentTypesAction(sdk, contentTypeIds); + console.log('response', response); + const processDocumentResponse = await processDocumentAction( sdk, contentTypeIds, documentId, oauthToken ); - setResult(response); + console.log('processDocumentResponse', processDocumentResponse); + + setResult([response, processDocumentResponse]); setSuccessMessage(SUCCESS_MESSAGES.ENTRIES_CREATED); } catch (error) { setErrorMessage(error instanceof Error ? error.message : ERROR_MESSAGES.SUBMISSION_FAILED); diff --git a/apps/google-docs/src/utils/appActionUtils.ts b/apps/google-docs/src/utils/appActionUtils.ts index 2e84b66dd7..64c9775bb6 100644 --- a/apps/google-docs/src/utils/appActionUtils.ts +++ b/apps/google-docs/src/utils/appActionUtils.ts @@ -78,7 +78,7 @@ export const analyzeContentTypesAction = async ( sdk: PageAppSDK | ConfigAppSDK, contentTypeIds: string[] ) => { - return callAppAction(sdk, 'analyzeContentTypesFunction', { contentTypeIds }); + return callAppAction(sdk, 'analyzeContentTypes', { contentTypeIds }); }; /** From c97af79000f6c2d03bbcbfe2bcb8d3e6691a6b89 Mon Sep 17 00:00:00 2001 From: harika kondur Date: Thu, 18 Dec 2025 10:49:12 -0700 Subject: [PATCH 09/16] fix: add oauth token to analyze content type function --- apps/google-docs/src/hooks/useDocumentSubmission.ts | 11 ++++++++--- apps/google-docs/src/utils/appActionUtils.ts | 5 +++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/apps/google-docs/src/hooks/useDocumentSubmission.ts b/apps/google-docs/src/hooks/useDocumentSubmission.ts index 8467abfd52..5d483890af 100644 --- a/apps/google-docs/src/hooks/useDocumentSubmission.ts +++ b/apps/google-docs/src/hooks/useDocumentSubmission.ts @@ -62,8 +62,13 @@ export const useDocumentSubmission = ( setResult(null); try { - const response = await analyzeContentTypesAction(sdk, contentTypeIds); - console.log('response', response); + const analyzeContentTypesResponse = await analyzeContentTypesAction( + sdk, + contentTypeIds, + oauthToken + ); + console.log('analyzeContentTypesResponse', analyzeContentTypesResponse); + const processDocumentResponse = await processDocumentAction( sdk, contentTypeIds, @@ -72,7 +77,7 @@ export const useDocumentSubmission = ( ); console.log('processDocumentResponse', processDocumentResponse); - setResult([response, processDocumentResponse]); + setResult([analyzeContentTypesResponse, processDocumentResponse]); setSuccessMessage(SUCCESS_MESSAGES.ENTRIES_CREATED); } catch (error) { setErrorMessage(error instanceof Error ? error.message : ERROR_MESSAGES.SUBMISSION_FAILED); diff --git a/apps/google-docs/src/utils/appActionUtils.ts b/apps/google-docs/src/utils/appActionUtils.ts index 64c9775bb6..7f7d47f520 100644 --- a/apps/google-docs/src/utils/appActionUtils.ts +++ b/apps/google-docs/src/utils/appActionUtils.ts @@ -76,9 +76,10 @@ async function callAppAction( */ export const analyzeContentTypesAction = async ( sdk: PageAppSDK | ConfigAppSDK, - contentTypeIds: string[] + contentTypeIds: string[], + oauthToken: string ) => { - return callAppAction(sdk, 'analyzeContentTypes', { contentTypeIds }); + return callAppAction(sdk, 'analyzeContentTypes', { contentTypeIds, oauthToken }); }; /** From 0e4e4d5a9796d169ffa57790a90ec98529599d06 Mon Sep 17 00:00:00 2001 From: harika kondur Date: Thu, 18 Dec 2025 10:57:43 -0700 Subject: [PATCH 10/16] fix: adding entries to document processor o/p --- apps/google-docs/functions/handlers/processDocument.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/google-docs/functions/handlers/processDocument.ts b/apps/google-docs/functions/handlers/processDocument.ts index f8b12d1ab4..783f0d936b 100644 --- a/apps/google-docs/functions/handlers/processDocument.ts +++ b/apps/google-docs/functions/handlers/processDocument.ts @@ -63,11 +63,13 @@ export const handler: FunctionEventHandler< console.log('Document processing completed:', { summary: aiDocumentResponse.summary, totalEntries: aiDocumentResponse.totalEntries, + entries: aiDocumentResponse.entries, }); return { success: true, summary: aiDocumentResponse.summary, totalEntriesExtracted: aiDocumentResponse.totalEntries, + entries: aiDocumentResponse.entries, }; }; From 9c4b953580f8517f0965beb81c0bce87eb9bb1cc Mon Sep 17 00:00:00 2001 From: harika kondur Date: Thu, 18 Dec 2025 14:15:31 -0700 Subject: [PATCH 11/16] feat: new app action to create entries, preview modal --- apps/google-docs/contentful-app-manifest.json | 11 + .../handlers/createEntriesHandler.ts | 53 +++++ .../src/components/page/ViewPreviewModal.tsx | 189 ++++++++++++++++++ .../src/hooks/useDocumentSubmission.ts | 9 +- .../src/hooks/useModalManagement.ts | 12 ++ apps/google-docs/src/locations/Page.tsx | 103 +++++----- apps/google-docs/src/utils/appActionUtils.ts | 16 ++ 7 files changed, 340 insertions(+), 53 deletions(-) create mode 100644 apps/google-docs/functions/handlers/createEntriesHandler.ts create mode 100644 apps/google-docs/src/components/page/ViewPreviewModal.tsx diff --git a/apps/google-docs/contentful-app-manifest.json b/apps/google-docs/contentful-app-manifest.json index 7d4880d7b7..645f266d4a 100644 --- a/apps/google-docs/contentful-app-manifest.json +++ b/apps/google-docs/contentful-app-manifest.json @@ -50,6 +50,17 @@ "appaction.call" ] }, + { + "id": "createEntries", + "name": "Create Entries", + "description": "Creates entries in Contentful", + "path": "functions/handlers/createEntriesHandler.js", + "entryFile": "functions/handlers/createEntriesHandler.ts", + "allowNetworks": [], + "accepts": [ + "appaction.call" + ] + }, { "id": "initiateGdocOauth", "name": "Initiate Gdoc OAuth Flow", diff --git a/apps/google-docs/functions/handlers/createEntriesHandler.ts b/apps/google-docs/functions/handlers/createEntriesHandler.ts new file mode 100644 index 0000000000..d164f362a2 --- /dev/null +++ b/apps/google-docs/functions/handlers/createEntriesHandler.ts @@ -0,0 +1,53 @@ +import { AppActionRequest, FunctionEventHandler } from '@contentful/node-apps-toolkit'; +import { createEntries } from '../service/entryService'; +import { initContentfulManagementClient } from '../service/initCMAClient'; +import { EntryToCreate } from '../agents/documentParserAgent/schema'; +import { FunctionTypeEnum, FunctionEventContext } from '@contentful/node-apps-toolkit'; +import { ProcessDocumentParameters } from './processDocument'; + +interface CreateEntriesParameters { + entries: EntryToCreate[]; + contentTypeIds: string[]; +} + +export const handler: FunctionEventHandler< + FunctionTypeEnum.AppActionCall, + CreateEntriesParameters +> = async ( + event: AppActionRequest<'Custom', CreateEntriesParameters>, + context: FunctionEventContext +) => { + const { entries, contentTypeIds } = event.body; + + if (!entries || !Array.isArray(entries) || entries.length === 0) { + throw new Error('entries parameter is required and must be a non-empty array'); + } + + if (!contentTypeIds || !Array.isArray(contentTypeIds) || contentTypeIds.length === 0) { + throw new Error('contentTypeIds parameter is required and must be a non-empty array'); + } + + const cma = initContentfulManagementClient(context); + + // Fetch content types + const contentTypesResponse = await cma.contentType.getMany({}); + const contentTypes = contentTypesResponse.items.filter((ct) => + contentTypeIds.includes(ct.sys.id) + ); + + if (contentTypes.length === 0) { + throw new Error('No matching content types found'); + } + + // Create entries + const result = await createEntries(cma, entries, { + spaceId: context.spaceId, + environmentId: context.environmentId, + contentTypes: contentTypes, + }); + + return { + success: true, + result: result, + }; +}; diff --git a/apps/google-docs/src/components/page/ViewPreviewModal.tsx b/apps/google-docs/src/components/page/ViewPreviewModal.tsx new file mode 100644 index 0000000000..e8118b2cec --- /dev/null +++ b/apps/google-docs/src/components/page/ViewPreviewModal.tsx @@ -0,0 +1,189 @@ +import React, { useMemo } from 'react'; +import { + Box, + Button, + Card, + Flex, + Heading, + Modal, + Paragraph, + Table, + Text, + Badge, +} from '@contentful/f36-components'; +import tokens from '@contentful/f36-tokens'; +import { EntryToCreate } from '../../../functions/agents/documentParserAgent/schema'; + +interface ViewPreviewModalProps { + isOpen: boolean; + onClose: () => void; + entries: EntryToCreate[] | null; + onConfirm: () => void; + isSubmitting: boolean; +} + +export const ViewPreviewModal: React.FC = ({ + isOpen, + onClose, + entries, + onConfirm, + isSubmitting, +}) => { + const entriesByContentType = useMemo(() => { + if (!entries) return {}; + + return entries.reduce((acc, entry) => { + if (!acc[entry.contentTypeId]) { + acc[entry.contentTypeId] = []; + } + acc[entry.contentTypeId].push(entry); + return acc; + }, {} as Record); + }, [entries]); + + const totalEntries = useMemo(() => entries?.length || 0, [entries]); + + const renderFieldValue = (value: any, maxLength: number = 100): string => { + if (value === null || value === undefined) { + return '—'; + } + + if (typeof value === 'object') { + const stringified = JSON.stringify(value, null, 2); + return stringified.length > maxLength + ? stringified.substring(0, maxLength) + '...' + : stringified; + } + + const stringValue = String(value); + return stringValue.length > maxLength + ? stringValue.substring(0, maxLength) + '...' + : stringValue; + }; + + const handleClose = () => { + if (isSubmitting) return; + onClose(); + }; + + const handleConfirm = () => { + if (isSubmitting) return; + onConfirm(); + }; + + if (!entries || entries.length === 0) { + return null; + } + + return ( + + {() => ( + <> + + + + + + + Based off the document, the following entries are being suggested: + + + + {totalEntries} {totalEntries === 1 ? 'entry' : 'entries'} + + + {Object.keys(entriesByContentType).length} content{' '} + {Object.keys(entriesByContentType).length === 1 ? 'type' : 'types'} + + + + + + {/* Entries by Content Type */} + {Object.entries(entriesByContentType).map(([contentTypeId, entries], ctIndex) => ( + + + + + {contentTypeId} + + {entries.length} entries + + + {entries.map((entry, entryIndex) => ( + + + + Entry {entryIndex + 1} + + + + + + + Field + Locale + Value + + + + {Object.entries(entry.fields).map(([fieldId, localizedValue]) => { + // localizedValue is a record like { 'en-US': actualValue } + return Object.entries(localizedValue).map(([locale, value]) => ( + + + {fieldId} + + + + {locale} + + + + + {renderFieldValue(value)} + + + + )); + })} + +
+
+
+
+ ))} +
+
+ ))} +
+
+ + + + + + )} +
+ ); +}; diff --git a/apps/google-docs/src/hooks/useDocumentSubmission.ts b/apps/google-docs/src/hooks/useDocumentSubmission.ts index 5d483890af..ac619851e2 100644 --- a/apps/google-docs/src/hooks/useDocumentSubmission.ts +++ b/apps/google-docs/src/hooks/useDocumentSubmission.ts @@ -1,10 +1,6 @@ import { useState, useCallback } from 'react'; import { PageAppSDK } from '@contentful/app-sdk'; -import { - analyzeContentTypesAction, - createEntriesFromDocumentAction, - processDocumentAction, -} from '../utils/appActionUtils'; +import { analyzeContentTypesAction, processDocumentAction } from '../utils/appActionUtils'; import { ERROR_MESSAGES, SUCCESS_MESSAGES } from '../constants/messages'; interface UseDocumentSubmissionReturn { @@ -77,8 +73,7 @@ export const useDocumentSubmission = ( ); console.log('processDocumentResponse', processDocumentResponse); - setResult([analyzeContentTypesResponse, processDocumentResponse]); - setSuccessMessage(SUCCESS_MESSAGES.ENTRIES_CREATED); + setResult(processDocumentResponse); } catch (error) { setErrorMessage(error instanceof Error ? error.message : ERROR_MESSAGES.SUBMISSION_FAILED); } finally { diff --git a/apps/google-docs/src/hooks/useModalManagement.ts b/apps/google-docs/src/hooks/useModalManagement.ts index 91a1062aac..a06b0d95a8 100644 --- a/apps/google-docs/src/hooks/useModalManagement.ts +++ b/apps/google-docs/src/hooks/useModalManagement.ts @@ -4,24 +4,28 @@ interface ModalStates { isUploadModalOpen: boolean; isContentTypePickerOpen: boolean; isConfirmCancelModalOpen: boolean; + isPreviewModalOpen: boolean; } interface ModalSetters { setIsUploadModalOpen: (value: boolean) => void; setIsContentTypePickerOpen: (value: boolean) => void; setIsConfirmCancelModalOpen: (value: boolean) => void; + setIsPreviewModalOpen: (value: boolean) => void; } export enum ModalType { UPLOAD = 'upload', CONTENT_TYPE_PICKER = 'contentTypePicker', CONFIRM_CANCEL = 'confirmCancel', + PREVIEW = 'preview', } export const useModalManagement = () => { const [isUploadModalOpen, setIsUploadModalOpen] = useState(false); const [isContentTypePickerOpen, setIsContentTypePickerOpen] = useState(false); const [isConfirmCancelModalOpen, setIsConfirmCancelModalOpen] = useState(false); + const [isPreviewModalOpen, setIsPreviewModalOpen] = useState(false); const openModal = (modalType: ModalType) => { switch (modalType) { @@ -34,6 +38,9 @@ export const useModalManagement = () => { case ModalType.CONFIRM_CANCEL: setIsConfirmCancelModalOpen(true); break; + case ModalType.PREVIEW: + setIsPreviewModalOpen(true); + break; } }; @@ -48,6 +55,9 @@ export const useModalManagement = () => { case ModalType.CONFIRM_CANCEL: setIsConfirmCancelModalOpen(false); break; + case ModalType.PREVIEW: + setIsPreviewModalOpen(false); + break; } }; @@ -56,11 +66,13 @@ export const useModalManagement = () => { isUploadModalOpen, isContentTypePickerOpen, isConfirmCancelModalOpen, + isPreviewModalOpen, } as ModalStates, setModalStates: { setIsUploadModalOpen, setIsContentTypePickerOpen, setIsConfirmCancelModalOpen, + setIsPreviewModalOpen, } as ModalSetters, openModal, closeModal, diff --git a/apps/google-docs/src/locations/Page.tsx b/apps/google-docs/src/locations/Page.tsx index 653e5a1d00..2a421a2bcc 100644 --- a/apps/google-docs/src/locations/Page.tsx +++ b/apps/google-docs/src/locations/Page.tsx @@ -12,11 +12,14 @@ import { useModalManagement, ModalType } from '../hooks/useModalManagement'; import { useProgressTracking } from '../hooks/useProgressTracking'; import { useDocumentSubmission } from '../hooks/useDocumentSubmission'; import SelectDocumentModal from '../components/page/SelectDocumentModal'; +import { ViewPreviewModal } from '../components/page/ViewPreviewModal'; +import { createEntriesAction } from '../utils/appActionUtils'; const Page = () => { const sdk = useSDK(); const { modalStates, openModal, closeModal } = useModalManagement(); const [oauthToken, setOauthToken] = useState(''); + const [isCreatingEntries, setIsCreatingEntries] = useState(false); const { hasStarted, setHasStarted, @@ -113,16 +116,60 @@ const Page = () => { await submit(ids); }; - // Close the ContentTypePickerModal when submission completes + const handlePreviewModalConfirm = async (contentTypes: SelectedContentType[]) => { + const entries = result?.sys?.result?.entries; + + if (!entries || entries.length === 0) { + sdk.notifier.error('No entries to create'); + return; + } + + setIsCreatingEntries(true); + try { + const ids = contentTypes.map((ct) => ct.id); + const entryResult: any = await createEntriesAction(sdk, entries, ids); + + if (entryResult.errorCount > 0) { + sdk.notifier.warning( + `Created ${entryResult.createdCount} entries with ${entryResult.errorCount} errors` + ); + console.error('Entry creation errors:', entryResult.errors); + } else { + sdk.notifier.success(`Successfully created ${entryResult.createdCount} entries`); + } + + // Close the preview modal and reset progress after creating entries + closeModal(ModalType.PREVIEW); + resetProgress(); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'; + sdk.notifier.error(`Failed to create entries: ${errorMessage}`); + console.error('Entry creation failed:', error); + } finally { + setIsCreatingEntries(false); + } + }; + + // Close the ContentTypePickerModal when submission completes and open preview modal useEffect(() => { const submissionJustCompleted = prevIsSubmittingRef.current && !isSubmitting; if (submissionJustCompleted && modalStates.isContentTypePickerOpen) { + console.log('Document processing completed, result:', result); closeModal(ModalType.CONTENT_TYPE_PICKER); + + // Open preview modal if we have entries + const entries = result?.sys?.result?.entries; + if (entries && entries.length > 0) { + console.log('Opening preview modal with', entries.length, 'entries'); + openModal(ModalType.PREVIEW); + } else { + console.log('No entries to preview. Full result:', result); + } } prevIsSubmittingRef.current = isSubmitting; - }, [isSubmitting, modalStates.isContentTypePickerOpen, closeModal]); + }, [isSubmitting, modalStates.isContentTypePickerOpen, closeModal, openModal, result]); // Show getting started page if not started yet if (!hasStarted) { @@ -157,50 +204,14 @@ const Page = () => { onConfirm={handleConfirmCancel} onCancel={handleKeepCreating} /> - {(result || successMessage || errorMessage) && ( - - - - - {successMessage && {successMessage}} - {errorMessage && {errorMessage}} - - {result && ( - - - Response - - - {JSON.stringify(result, null, 2)} - - - )} - - - - - - - )} + + closeModal(ModalType.PREVIEW)} + entries={result?.sys?.result?.entries || null} + onConfirm={() => handlePreviewModalConfirm(selectedContentTypes)} + isSubmitting={isCreatingEntries} + /> ); }; diff --git a/apps/google-docs/src/utils/appActionUtils.ts b/apps/google-docs/src/utils/appActionUtils.ts index 7f7d47f520..c88531a75e 100644 --- a/apps/google-docs/src/utils/appActionUtils.ts +++ b/apps/google-docs/src/utils/appActionUtils.ts @@ -1,5 +1,6 @@ import { PageAppSDK, ConfigAppSDK } from '@contentful/app-sdk'; import { parseDocument } from '../../functions/utils/documentValidationUtils'; +import { EntryToCreate } from '../../functions/agents/documentParserAgent/schema'; /** * Fetches the app action ID by name from the current environment @@ -102,6 +103,21 @@ export const processDocumentAction = async ( }); }; +/** + * Creates entries in Contentful from parsed document data + * @param sdk - The Contentful SDK instance + * @param entries - Array of entries to create + * @param contentTypeIds - Array of content type IDs used in the entries + * @returns Creation result with created entries and errors + */ +export const createEntriesAction = async ( + sdk: PageAppSDK | ConfigAppSDK, + entries: EntryToCreate[], + contentTypeIds: string[] +) => { + return callAppAction(sdk, 'createEntries', { entries, contentTypeIds }); +}; + /** * @deprecated Use processDocumentAction instead */ From a713f51c78be92b67cf278378e51d8323e1b360a Mon Sep 17 00:00:00 2001 From: harika kondur Date: Thu, 18 Dec 2025 14:31:32 -0700 Subject: [PATCH 12/16] cleanup + rename preview function --- apps/google-docs/contentful-app-manifest.json | 10 ++--- .../handlers/createEntriesHandler.ts | 1 - ...essDocument.ts => createPreviewHandler.ts} | 31 ++++--------- .../google-docs/functions/oauth/disconnect.ts | 6 +-- .../functions/oauth/initiateOauth.ts | 2 +- .../functions/{types => oauth}/oauth.types.ts | 0 .../utils/documentValidationUtils.ts | 43 ------------------- .../src/hooks/useDocumentSubmission.ts | 4 +- apps/google-docs/src/utils/appActionUtils.ts | 7 ++- 9 files changed, 20 insertions(+), 84 deletions(-) rename apps/google-docs/functions/handlers/{processDocument.ts => createPreviewHandler.ts} (58%) rename apps/google-docs/functions/{types => oauth}/oauth.types.ts (100%) delete mode 100644 apps/google-docs/functions/utils/documentValidationUtils.ts diff --git a/apps/google-docs/contentful-app-manifest.json b/apps/google-docs/contentful-app-manifest.json index 645f266d4a..e9178bcf4f 100644 --- a/apps/google-docs/contentful-app-manifest.json +++ b/apps/google-docs/contentful-app-manifest.json @@ -22,11 +22,11 @@ }, "functions": [ { - "id": "processDocument", - "name": "Process Document", - "description": "Processes a Google Doc and returns entry drafts", - "path": "functions/handlers/processDocument.js", - "entryFile": "functions/handlers/processDocument.ts", + "id": "createPreview", + "name": "Create Preview", + "description": "Parses the Google Doc and creates preview entries", + "path": "functions/handlers/createPreviewHandler.js", + "entryFile": "functions/handlers/createPreviewHandler.ts", "allowNetworks": [ "https://api.openai.com", "*.googleapis.com", diff --git a/apps/google-docs/functions/handlers/createEntriesHandler.ts b/apps/google-docs/functions/handlers/createEntriesHandler.ts index d164f362a2..6257be1b97 100644 --- a/apps/google-docs/functions/handlers/createEntriesHandler.ts +++ b/apps/google-docs/functions/handlers/createEntriesHandler.ts @@ -3,7 +3,6 @@ import { createEntries } from '../service/entryService'; import { initContentfulManagementClient } from '../service/initCMAClient'; import { EntryToCreate } from '../agents/documentParserAgent/schema'; import { FunctionTypeEnum, FunctionEventContext } from '@contentful/node-apps-toolkit'; -import { ProcessDocumentParameters } from './processDocument'; interface CreateEntriesParameters { entries: EntryToCreate[]; diff --git a/apps/google-docs/functions/handlers/processDocument.ts b/apps/google-docs/functions/handlers/createPreviewHandler.ts similarity index 58% rename from apps/google-docs/functions/handlers/processDocument.ts rename to apps/google-docs/functions/handlers/createPreviewHandler.ts index 783f0d936b..864e31204e 100644 --- a/apps/google-docs/functions/handlers/processDocument.ts +++ b/apps/google-docs/functions/handlers/createPreviewHandler.ts @@ -4,16 +4,13 @@ import type { FunctionTypeEnum, AppActionRequest, } from '@contentful/node-apps-toolkit'; -import { ContentTypeProps } from 'contentful-management'; import { analyzeDocumentWithAgent } from '../agents/documentParserAgent/documentParser.agent'; import { fetchContentTypes } from '../service/contentTypeService'; import { initContentfulManagementClient } from '../service/initCMAClient'; -import { parseDocument, validateDocument } from '../utils/documentValidationUtils'; - -export type ProcessDocumentParameters = { +export type CreatePreviewParameters = { contentTypeIds: string[]; - documentId: string; // JSON document from Google Docs API or test data + documentId: string; oauthToken: string; }; @@ -22,28 +19,22 @@ interface AppInstallationParameters { } /** - * App Action: Process Document + * Create Preview * - * Processes a Google Doc and creates Contentful entries based on the document structure - * and the provided content types. This function focuses solely on document processing - * and entry creation. + * Processes a Google Doc and creates preview entries based on the document structure + * and the provided content types. * - * Note: Content type analysis should be done separately using the analyzeContentTypes - * function to avoid timeout issues. */ export const handler: FunctionEventHandler< FunctionTypeEnum.AppActionCall, - ProcessDocumentParameters + CreatePreviewParameters > = async ( - event: AppActionRequest<'Custom', ProcessDocumentParameters>, + event: AppActionRequest<'Custom', CreatePreviewParameters>, context: FunctionEventContext ) => { const { contentTypeIds, documentId, oauthToken } = event.body; const { openAiApiKey } = context.appInstallationParameters as AppInstallationParameters; - // Validate inputs - validateDocument(documentId); - if (!contentTypeIds || contentTypeIds.length === 0) { throw new Error('At least one content type ID is required'); } @@ -52,7 +43,7 @@ export const handler: FunctionEventHandler< const contentTypes = await fetchContentTypes(cma, new Set(contentTypeIds)); - // Process the document and create entries + // Process the document and create preview entries const aiDocumentResponse = await analyzeDocumentWithAgent({ documentId, oauthToken, @@ -60,12 +51,6 @@ export const handler: FunctionEventHandler< contentTypes, }); - console.log('Document processing completed:', { - summary: aiDocumentResponse.summary, - totalEntries: aiDocumentResponse.totalEntries, - entries: aiDocumentResponse.entries, - }); - return { success: true, summary: aiDocumentResponse.summary, diff --git a/apps/google-docs/functions/oauth/disconnect.ts b/apps/google-docs/functions/oauth/disconnect.ts index 7392b86235..566e9b83e3 100644 --- a/apps/google-docs/functions/oauth/disconnect.ts +++ b/apps/google-docs/functions/oauth/disconnect.ts @@ -1,8 +1,4 @@ -import { - AppEventHandlerRequest, - AppEventHandlerResponse, - AppEventContext, -} from '../types/oauth.types'; +import { AppEventHandlerRequest, AppEventHandlerResponse, AppEventContext } from './oauth.types'; export const handler = async ( event: AppEventHandlerRequest, diff --git a/apps/google-docs/functions/oauth/initiateOauth.ts b/apps/google-docs/functions/oauth/initiateOauth.ts index 425ac24b2a..71c58a5437 100644 --- a/apps/google-docs/functions/oauth/initiateOauth.ts +++ b/apps/google-docs/functions/oauth/initiateOauth.ts @@ -6,7 +6,7 @@ import { AppEventHandlerRequest, AppEventContext, AppEventHandlerResponse, -} from './types/oauth.types'; +} from './oauth.types'; export type OAuthSDK = { init: () => Promise; diff --git a/apps/google-docs/functions/types/oauth.types.ts b/apps/google-docs/functions/oauth/oauth.types.ts similarity index 100% rename from apps/google-docs/functions/types/oauth.types.ts rename to apps/google-docs/functions/oauth/oauth.types.ts diff --git a/apps/google-docs/functions/utils/documentValidationUtils.ts b/apps/google-docs/functions/utils/documentValidationUtils.ts deleted file mode 100644 index b345036f9e..0000000000 --- a/apps/google-docs/functions/utils/documentValidationUtils.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Parses a document parameter that may be a JSON string, URL, or object - * @param document - The document to parse (string URL, JSON string, or object) - * @returns The parsed document object - * @throws Error if the document cannot be parsed - */ -export function parseDocument(document: unknown): unknown { - // If already an object, return as-is - if (typeof document !== 'string') { - return document; - } - - // Check if it's a URL (starts with http:// or https://) - if (document.startsWith('http://') || document.startsWith('https://')) { - throw new Error( - 'Document URL provided but fetching from Google Docs API is not yet implemented. Please provide the document JSON object directly.' - ); - } - - // Try to parse as JSON - try { - return JSON.parse(document); - } catch (e) { - // Provide more helpful error message - const preview = document.substring(0, 100); - throw new Error( - `Failed to parse document as JSON. Document appears to be a string but is not valid JSON. ` + - `Preview: ${preview}${document.length > 100 ? '...' : ''}. ` + - `Error: ${e instanceof Error ? e.message : String(e)}` - ); - } -} - -/** - * Validates that a document is provided - * @param document - The document to validate - * @throws Error if the document is null, undefined, or empty - */ -export function validateDocument(document: unknown): void { - if (!document) { - throw new Error('Document is required'); - } -} diff --git a/apps/google-docs/src/hooks/useDocumentSubmission.ts b/apps/google-docs/src/hooks/useDocumentSubmission.ts index ac619851e2..06f9b76c22 100644 --- a/apps/google-docs/src/hooks/useDocumentSubmission.ts +++ b/apps/google-docs/src/hooks/useDocumentSubmission.ts @@ -1,6 +1,6 @@ import { useState, useCallback } from 'react'; import { PageAppSDK } from '@contentful/app-sdk'; -import { analyzeContentTypesAction, processDocumentAction } from '../utils/appActionUtils'; +import { analyzeContentTypesAction, createPreviewAction } from '../utils/appActionUtils'; import { ERROR_MESSAGES, SUCCESS_MESSAGES } from '../constants/messages'; interface UseDocumentSubmissionReturn { @@ -65,7 +65,7 @@ export const useDocumentSubmission = ( ); console.log('analyzeContentTypesResponse', analyzeContentTypesResponse); - const processDocumentResponse = await processDocumentAction( + const processDocumentResponse = await createPreviewAction( sdk, contentTypeIds, documentId, diff --git a/apps/google-docs/src/utils/appActionUtils.ts b/apps/google-docs/src/utils/appActionUtils.ts index c88531a75e..78d0c0074f 100644 --- a/apps/google-docs/src/utils/appActionUtils.ts +++ b/apps/google-docs/src/utils/appActionUtils.ts @@ -1,5 +1,4 @@ import { PageAppSDK, ConfigAppSDK } from '@contentful/app-sdk'; -import { parseDocument } from '../../functions/utils/documentValidationUtils'; import { EntryToCreate } from '../../functions/agents/documentParserAgent/schema'; /** @@ -90,13 +89,13 @@ export const analyzeContentTypesAction = async ( * @param document - The document to process (JSON object or string) * @returns Processing result from the app action */ -export const processDocumentAction = async ( +export const createPreviewAction = async ( sdk: PageAppSDK | ConfigAppSDK, contentTypeIds: string[], documentId: string, oauthToken: string ) => { - return callAppAction(sdk, 'processDocument', { + return callAppAction(sdk, 'createPreview', { contentTypeIds, documentId, oauthToken, @@ -121,4 +120,4 @@ export const createEntriesAction = async ( /** * @deprecated Use processDocumentAction instead */ -export const createEntriesFromDocumentAction = processDocumentAction; +export const createEntriesFromDocumentAction = createPreviewAction; From 2ab39257a8d85f4b6c372d9c604bc778145c3697 Mon Sep 17 00:00:00 2001 From: harika kondur Date: Thu, 18 Dec 2025 14:32:00 -0700 Subject: [PATCH 13/16] cleanup --- apps/google-docs/src/utils/appActionUtils.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/apps/google-docs/src/utils/appActionUtils.ts b/apps/google-docs/src/utils/appActionUtils.ts index 78d0c0074f..118426665e 100644 --- a/apps/google-docs/src/utils/appActionUtils.ts +++ b/apps/google-docs/src/utils/appActionUtils.ts @@ -116,8 +116,3 @@ export const createEntriesAction = async ( ) => { return callAppAction(sdk, 'createEntries', { entries, contentTypeIds }); }; - -/** - * @deprecated Use processDocumentAction instead - */ -export const createEntriesFromDocumentAction = createPreviewAction; From b2666c16227580f473b1ac92d2a226f0dd7b6027 Mon Sep 17 00:00:00 2001 From: harika kondur Date: Thu, 18 Dec 2025 14:34:47 -0700 Subject: [PATCH 14/16] chore: delete test docs --- .../Doc_1_Basic_Structure_Test.json | 2543 ------ .../Doc_2_Rich_Text_Formatting_Test.json | 3474 -------- ...Nested_Structures_And_References_Test.json | 2430 ----- .../Doc_4_Media_Embeds_Test.json | 2040 ----- .../Doc_5_Bulk_Entry_Stress_Test.json | 6435 -------------- .../Doc_6_Multilingual_Test.json | 1875 ---- .../test_docs_json/Doc_7_Edge_Cases_Test.json | 5063 ----------- .../Doc_8_DXP_benefits - Sample.json | 7791 ----------------- .../src/utils/test_docs_json/index.ts | 26 - 9 files changed, 31677 deletions(-) delete mode 100644 apps/google-docs/src/utils/test_docs_json/Doc_1_Basic_Structure_Test.json delete mode 100644 apps/google-docs/src/utils/test_docs_json/Doc_2_Rich_Text_Formatting_Test.json delete mode 100644 apps/google-docs/src/utils/test_docs_json/Doc_3_Nested_Structures_And_References_Test.json delete mode 100644 apps/google-docs/src/utils/test_docs_json/Doc_4_Media_Embeds_Test.json delete mode 100644 apps/google-docs/src/utils/test_docs_json/Doc_5_Bulk_Entry_Stress_Test.json delete mode 100644 apps/google-docs/src/utils/test_docs_json/Doc_6_Multilingual_Test.json delete mode 100644 apps/google-docs/src/utils/test_docs_json/Doc_7_Edge_Cases_Test.json delete mode 100644 apps/google-docs/src/utils/test_docs_json/Doc_8_DXP_benefits - Sample.json delete mode 100644 apps/google-docs/src/utils/test_docs_json/index.ts diff --git a/apps/google-docs/src/utils/test_docs_json/Doc_1_Basic_Structure_Test.json b/apps/google-docs/src/utils/test_docs_json/Doc_1_Basic_Structure_Test.json deleted file mode 100644 index ccb5969cbf..0000000000 --- a/apps/google-docs/src/utils/test_docs_json/Doc_1_Basic_Structure_Test.json +++ /dev/null @@ -1,2543 +0,0 @@ -{ - "documentId": "12ohHh1SR47s-hm2lRtwK0NY-cRi_Nc6coAIrb9vylOM", - "suggestionsViewMode": "PREVIEW_WITHOUT_SUGGESTIONS", - "tabs": [ - { - "documentTab": { - "body": { - "content": [ - { - "endIndex": 1, - "sectionBreak": { - "sectionStyle": { - "columnSeparatorStyle": "NONE", - "contentDirection": "LEFT_TO_RIGHT", - "sectionType": "CONTINUOUS" - } - } - }, - { - "endIndex": 40, - "paragraph": { - "elements": [ - { - "endIndex": 40, - "startIndex": 1, - "textRun": { - "content": "Document Import \u2014 Basic Structure Test\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 1 - }, - { - "endIndex": 49, - "paragraph": { - "elements": [ - { - "endIndex": 49, - "startIndex": 40, - "textRun": { - "content": "Overview\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 40 - }, - { - "endIndex": 312, - "paragraph": { - "elements": [ - { - "endIndex": 312, - "startIndex": 49, - "textRun": { - "content": "This document is designed to validate that the document importer correctly identifies and parses basic content structures including headings, paragraphs, and list items. The expected result is that all elements are represented as structured fields in Contentful.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 49 - }, - { - "endIndex": 329, - "paragraph": { - "elements": [ - { - "endIndex": 329, - "startIndex": 312, - "textRun": { - "content": "Headings Example\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 312 - }, - { - "endIndex": 422, - "paragraph": { - "elements": [ - { - "endIndex": 422, - "startIndex": 329, - "textRun": { - "content": "Below is a nested heading example to ensure the importer recognizes hierarchical structures.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 329 - }, - { - "endIndex": 441, - "paragraph": { - "elements": [ - { - "endIndex": 441, - "startIndex": 422, - "textRun": { - "content": "Subsection Example\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 422 - }, - { - "endIndex": 502, - "paragraph": { - "elements": [ - { - "endIndex": 502, - "startIndex": 441, - "textRun": { - "content": "This subsection demonstrates heading depth beyond level two.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 441 - }, - { - "endIndex": 521, - "paragraph": { - "elements": [ - { - "endIndex": 521, - "startIndex": 502, - "textRun": { - "content": "Paragraph Examples\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 502 - }, - { - "endIndex": 615, - "paragraph": { - "elements": [ - { - "endIndex": 615, - "startIndex": 521, - "textRun": { - "content": "This is a normal paragraph with a few sentences. The quick brown fox jumps over the lazy dog.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 521 - }, - { - "endIndex": 743, - "paragraph": { - "elements": [ - { - "endIndex": 743, - "startIndex": 615, - "textRun": { - "content": "This is another paragraph meant to simulate multiple blocks of text. Each should appear as a separate content node when parsed.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 615 - }, - { - "endIndex": 765, - "paragraph": { - "elements": [ - { - "endIndex": 765, - "startIndex": 743, - "textRun": { - "content": "Bulleted List Example\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 743 - }, - { - "endIndex": 772, - "paragraph": { - "bullet": { - "listId": "kix.list.1", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 772, - "startIndex": 765, - "textRun": { - "content": "Apples\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Cambria", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 765 - }, - { - "endIndex": 780, - "paragraph": { - "bullet": { - "listId": "kix.list.1", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 780, - "startIndex": 772, - "textRun": { - "content": "Bananas\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Cambria", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 772 - }, - { - "endIndex": 789, - "paragraph": { - "bullet": { - "listId": "kix.list.1", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 789, - "startIndex": 780, - "textRun": { - "content": "Cherries\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Cambria", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 10, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 780 - }, - { - "endIndex": 811, - "paragraph": { - "elements": [ - { - "endIndex": 811, - "startIndex": 789, - "textRun": { - "content": "Numbered List Example\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 789 - }, - { - "endIndex": 845, - "paragraph": { - "bullet": { - "listId": "kix.list.5", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 845, - "startIndex": 811, - "textRun": { - "content": "Step One \u2014 Initialize the import.\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Cambria", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 811 - }, - { - "endIndex": 886, - "paragraph": { - "bullet": { - "listId": "kix.list.5", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 886, - "startIndex": 845, - "textRun": { - "content": "Step Two \u2014 Parse the document structure.\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Cambria", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 845 - }, - { - "endIndex": 931, - "paragraph": { - "bullet": { - "listId": "kix.list.5", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 931, - "startIndex": 886, - "textRun": { - "content": "Step Three \u2014 Validate results in Contentful.\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Cambria", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 10, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 886 - }, - { - "endIndex": 948, - "paragraph": { - "elements": [ - { - "endIndex": 948, - "startIndex": 931, - "textRun": { - "content": "Expected Outcome\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 931 - }, - { - "endIndex": 1102, - "paragraph": { - "elements": [ - { - "endIndex": 1102, - "startIndex": 948, - "textRun": { - "content": "Each heading, paragraph, and list item should be recognized and transformed into appropriate structured content fields without losing order or hierarchy.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 948 - } - ] - }, - "documentStyle": { - "background": { - "color": {} - }, - "documentFormat": { - "documentMode": "PAGES" - }, - "marginBottom": { - "magnitude": 72, - "unit": "PT" - }, - "marginFooter": { - "magnitude": 36, - "unit": "PT" - }, - "marginHeader": { - "magnitude": 36, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 90, - "unit": "PT" - }, - "marginRight": { - "magnitude": 90, - "unit": "PT" - }, - "marginTop": { - "magnitude": 72, - "unit": "PT" - }, - "pageNumberStart": 1, - "pageSize": { - "height": { - "magnitude": 792, - "unit": "PT" - }, - "width": { - "magnitude": 612, - "unit": "PT" - } - }, - "useCustomHeaderFooterMargins": true - }, - "lists": { - "kix.list.1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.3": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 36, - "unit": "PT" - }, - "indentStart": { - "magnitude": 54, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 36, - "unit": "PT" - }, - "indentStart": { - "magnitude": 54, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 72, - "unit": "PT" - }, - "indentStart": { - "magnitude": 90, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - } - }, - "namedStyles": { - "styles": [ - { - "namedStyleType": "NORMAL_TEXT", - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 10, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Cambria", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_1", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 24, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 14, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5686275, - "green": 0.3764706, - "red": 0.21176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_2", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 13, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_3", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_4", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_5", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.38039216, - "green": 0.24705882, - "red": 0.14117648 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_6", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.38039216, - "green": 0.24705882, - "red": 0.14117648 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "TITLE", - "paragraphStyle": { - "borderBottom": { - "color": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "dashStyle": "SOLID", - "padding": { - "magnitude": 4, - "unit": "PT" - }, - "width": { - "magnitude": 1, - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "spaceBelow": { - "magnitude": 15, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "fontSize": { - "magnitude": 26, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.3647059, - "green": 0.21176471, - "red": 0.09019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "SUBTITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - }, - "textStyle": { - "fontSize": { - "magnitude": 12, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - } - ] - } - }, - "tabProperties": { - "index": 0, - "tabId": "t.0", - "title": "Tab 1" - } - } - ], - "title": "Doc_1_Basic_Structure_Test" -} \ No newline at end of file diff --git a/apps/google-docs/src/utils/test_docs_json/Doc_2_Rich_Text_Formatting_Test.json b/apps/google-docs/src/utils/test_docs_json/Doc_2_Rich_Text_Formatting_Test.json deleted file mode 100644 index dda05c28b4..0000000000 --- a/apps/google-docs/src/utils/test_docs_json/Doc_2_Rich_Text_Formatting_Test.json +++ /dev/null @@ -1,3474 +0,0 @@ -{ - "documentId": "1Ufzr1TNu5SPEbrKHqPW_GA7iTH0A6jqB2FH5vaIHfcg", - "revisionId": "AOuX7-bW88EH4C0h-4f72CtHsTHW3qibgy7XhqIc72dtpwcXOu4OML5YwdE6x1QPwqy90OMMtCceqJE0i4IPSw", - "suggestionsViewMode": "SUGGESTIONS_INLINE", - "tabs": [ - { - "documentTab": { - "body": { - "content": [ - { - "endIndex": 1, - "sectionBreak": { - "sectionStyle": { - "columnSeparatorStyle": "NONE", - "contentDirection": "LEFT_TO_RIGHT", - "sectionType": "CONTINUOUS" - } - } - }, - { - "endIndex": 45, - "paragraph": { - "elements": [ - { - "endIndex": 45, - "startIndex": 1, - "textRun": { - "content": "Document Import \u2014 Rich Text Formatting Test\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 1 - }, - { - "endIndex": 54, - "paragraph": { - "elements": [ - { - "endIndex": 54, - "startIndex": 45, - "textRun": { - "content": "Overview\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 45 - }, - { - "endIndex": 327, - "paragraph": { - "elements": [ - { - "endIndex": 327, - "startIndex": 54, - "textRun": { - "content": "This document is designed to validate that the document importer accurately preserves and represents rich text formatting such as bold, italic, underline, and combinations thereof. The goal is to ensure all style data is correctly parsed into the structured content model.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 54 - }, - { - "endIndex": 347, - "paragraph": { - "elements": [ - { - "endIndex": 347, - "startIndex": 327, - "textRun": { - "content": "Formatting Examples\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 327 - }, - { - "endIndex": 413, - "paragraph": { - "elements": [ - { - "endIndex": 371, - "startIndex": 347, - "textRun": { - "content": "This sentence contains \u000b", - "textStyle": {} - } - }, - { - "endIndex": 375, - "startIndex": 371, - "textRun": { - "content": "bold", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 377, - "startIndex": 375, - "textRun": { - "content": ", ", - "textStyle": {} - } - }, - { - "endIndex": 383, - "startIndex": 377, - "textRun": { - "content": "italic", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 389, - "startIndex": 383, - "textRun": { - "content": ", and ", - "textStyle": {} - } - }, - { - "endIndex": 399, - "startIndex": 389, - "textRun": { - "content": "underlined", - "textStyle": { - "underline": true - } - } - }, - { - "endIndex": 413, - "startIndex": 399, - "textRun": { - "content": " text styles.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 347 - }, - { - "endIndex": 538, - "paragraph": { - "elements": [ - { - "endIndex": 538, - "startIndex": 413, - "textRun": { - "content": "The importer should retain these inline formatting features within paragraph fields, including nested or overlapping styles.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 413 - }, - { - "endIndex": 567, - "paragraph": { - "elements": [ - { - "endIndex": 567, - "startIndex": 538, - "textRun": { - "content": "Combined Formatting Examples\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 538 - }, - { - "endIndex": 631, - "paragraph": { - "elements": [ - { - "endIndex": 597, - "startIndex": 567, - "textRun": { - "content": "This text is bold and italic. ", - "textStyle": { - "bold": true, - "italic": true - } - } - }, - { - "endIndex": 630, - "startIndex": 597, - "textRun": { - "content": "This text is underlined and bold.", - "textStyle": { - "bold": true, - "underline": true - } - } - }, - { - "endIndex": 631, - "startIndex": 630, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 567 - }, - { - "endIndex": 655, - "paragraph": { - "elements": [ - { - "endIndex": 655, - "startIndex": 631, - "textRun": { - "content": "Mixed Content Paragraph\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 631 - }, - { - "endIndex": 759, - "paragraph": { - "elements": [ - { - "endIndex": 697, - "startIndex": 655, - "textRun": { - "content": "This paragraph contains mixed formatting: ", - "textStyle": {} - } - }, - { - "endIndex": 710, - "startIndex": 697, - "textRun": { - "content": "normal text, ", - "textStyle": { - "italic": false - } - } - }, - { - "endIndex": 724, - "startIndex": 710, - "textRun": { - "content": "italic words, ", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 738, - "startIndex": 724, - "textRun": { - "content": "bold phrases, ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 759, - "startIndex": 738, - "textRun": { - "content": "underlined sections.\n", - "textStyle": { - "bold": false, - "italic": false, - "underline": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 655 - }, - { - "endIndex": 787, - "paragraph": { - "elements": [ - { - "endIndex": 787, - "startIndex": 759, - "textRun": { - "content": "Further Formatting Examples\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.8j7x8f9gg5xs", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 759 - }, - { - "endIndex": 827, - "paragraph": { - "bullet": { - "listId": "kix.fwj8bl2edzyz", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Cambria", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 808, - "startIndex": 787, - "textRun": { - "content": "This text includes a ", - "textStyle": {} - } - }, - { - "endIndex": 825, - "startIndex": 808, - "textRun": { - "content": "hyperlink example", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.google.com/search?q=https://www.example.com" - }, - "underline": true - } - } - }, - { - "endIndex": 827, - "startIndex": 825, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 787 - }, - { - "endIndex": 862, - "paragraph": { - "bullet": { - "listId": "kix.fwj8bl2edzyz", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Cambria", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 849, - "startIndex": 827, - "textRun": { - "content": "This is an example of ", - "textStyle": {} - } - }, - { - "endIndex": 860, - "startIndex": 849, - "textRun": { - "content": "inline code", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 862, - "startIndex": 860, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 827 - }, - { - "endIndex": 863, - "paragraph": { - "elements": [ - { - "endIndex": 863, - "startIndex": 862, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 10, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 862 - }, - { - "endIndex": 896, - "paragraph": { - "elements": [ - { - "endIndex": 864, - "startIndex": 863, - "textRun": { - "content": "\ue907", - "textStyle": {} - } - }, - { - "endIndex": 866, - "startIndex": 864, - "textRun": { - "content": "//", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 867, - "startIndex": 866, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.44705883, - "green": 0.023529412, - "red": 0.72156864 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 871, - "startIndex": 867, - "textRun": { - "content": "This", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 872, - "startIndex": 871, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.44705883, - "green": 0.023529412, - "red": 0.72156864 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 874, - "startIndex": 872, - "textRun": { - "content": "is", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 875, - "startIndex": 874, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.44705883, - "green": 0.023529412, - "red": 0.72156864 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 876, - "startIndex": 875, - "textRun": { - "content": "a", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 877, - "startIndex": 876, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.44705883, - "green": 0.023529412, - "red": 0.72156864 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 881, - "startIndex": 877, - "textRun": { - "content": "code", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 882, - "startIndex": 881, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.44705883, - "green": 0.023529412, - "red": 0.72156864 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 887, - "startIndex": 882, - "textRun": { - "content": "block", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 888, - "startIndex": 887, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.44705883, - "green": 0.023529412, - "red": 0.72156864 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 895, - "startIndex": 888, - "textRun": { - "content": "example", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 896, - "startIndex": 895, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.44705883, - "green": 0.023529412, - "red": 0.72156864 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 863 - }, - { - "endIndex": 920, - "paragraph": { - "elements": [ - { - "endIndex": 904, - "startIndex": 896, - "textRun": { - "content": "function", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 905, - "startIndex": 904, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 917, - "startIndex": 905, - "textRun": { - "content": "helloWorld()", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 918, - "startIndex": 917, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 919, - "startIndex": 918, - "textRun": { - "content": "{", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 920, - "startIndex": 919, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 896 - }, - { - "endIndex": 952, - "paragraph": { - "elements": [ - { - "endIndex": 922, - "startIndex": 920, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 951, - "startIndex": 922, - "textRun": { - "content": "console.log(\"Hello, World!\");", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 952, - "startIndex": 951, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 920 - }, - { - "endIndex": 954, - "paragraph": { - "elements": [ - { - "endIndex": 953, - "startIndex": 952, - "textRun": { - "content": "}", - "textStyle": { - "fontSize": { - "magnitude": 9, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 954, - "startIndex": 953, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 952 - }, - { - "endIndex": 956, - "paragraph": { - "elements": [ - { - "endIndex": 956, - "startIndex": 954, - "textRun": { - "content": "\ue907\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 10, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 954 - }, - { - "endIndex": 969, - "paragraph": { - "bullet": { - "listId": "kix.fwj8bl2edzyz", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Cambria", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 968, - "startIndex": 956, - "textRun": { - "content": "Blockquotes:", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 969, - "startIndex": 968, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 956 - }, - { - "endIndex": 970, - "paragraph": { - "elements": [ - { - "endIndex": 970, - "startIndex": 969, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 10, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 969 - }, - { - "endIndex": 1093, - "paragraph": { - "elements": [ - { - "endIndex": 1092, - "startIndex": 970, - "textRun": { - "content": "This is an example of a blockquote, often used for citations or emphasized text that stands apart from the main narrative.", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 1093, - "startIndex": 1092, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 970 - }, - { - "endIndex": 1094, - "paragraph": { - "elements": [ - { - "endIndex": 1094, - "startIndex": 1093, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1093 - }, - { - "endIndex": 1096, - "paragraph": { - "elements": [ - { - "endIndex": 1095, - "horizontalRule": { - "textStyle": {} - }, - "startIndex": 1094 - }, - { - "endIndex": 1096, - "startIndex": 1095, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1094 - }, - { - "endIndex": 1097, - "paragraph": { - "elements": [ - { - "endIndex": 1097, - "startIndex": 1096, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 10, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1096 - }, - { - "endIndex": 1142, - "paragraph": { - "elements": [ - { - "endIndex": 1142, - "startIndex": 1097, - "textRun": { - "content": "This is a horizontal rule (HR) placed above.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1097 - }, - { - "endIndex": 1143, - "paragraph": { - "elements": [ - { - "endIndex": 1143, - "startIndex": 1142, - "textRun": { - "content": "\n", - "textStyle": { - "underline": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1142 - }, - { - "endIndex": 1160, - "paragraph": { - "elements": [ - { - "endIndex": 1160, - "startIndex": 1143, - "textRun": { - "content": "Expected Outcome\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 1143 - }, - { - "endIndex": 1383, - "paragraph": { - "elements": [ - { - "endIndex": 1383, - "startIndex": 1160, - "textRun": { - "content": "All inline text styles (bold, italic, underline, and their combinations) should be represented in the structured content output with correct style attributes preserved. No formatting loss or incorrect nesting should occur.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1160 - } - ] - }, - "documentStyle": { - "background": { - "color": {} - }, - "documentFormat": { - "documentMode": "PAGES" - }, - "marginBottom": { - "magnitude": 72, - "unit": "PT" - }, - "marginFooter": { - "magnitude": 36, - "unit": "PT" - }, - "marginHeader": { - "magnitude": 36, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 90, - "unit": "PT" - }, - "marginRight": { - "magnitude": 90, - "unit": "PT" - }, - "marginTop": { - "magnitude": 72, - "unit": "PT" - }, - "pageNumberStart": 1, - "pageSize": { - "height": { - "magnitude": 792, - "unit": "PT" - }, - "width": { - "magnitude": 612, - "unit": "PT" - } - }, - "useCustomHeaderFooterMargins": true - }, - "lists": { - "kix.fwj8bl2edzyz": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "\u25cb", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "\u25a0", - "indentFirstLine": { - "magnitude": 90, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 126, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "\u25cb", - "indentFirstLine": { - "magnitude": 162, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "\u25a0", - "indentFirstLine": { - "magnitude": 198, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 234, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "\u25cb", - "indentFirstLine": { - "magnitude": 270, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "\u25a0", - "indentFirstLine": { - "magnitude": 306, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.list.1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.3": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 36, - "unit": "PT" - }, - "indentStart": { - "magnitude": 54, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 36, - "unit": "PT" - }, - "indentStart": { - "magnitude": 54, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 72, - "unit": "PT" - }, - "indentStart": { - "magnitude": 90, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - } - }, - "namedStyles": { - "styles": [ - { - "namedStyleType": "NORMAL_TEXT", - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 10, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Cambria", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_1", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 24, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 14, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5686275, - "green": 0.3764706, - "red": 0.21176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_2", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 13, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_3", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_4", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_5", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.38039216, - "green": 0.24705882, - "red": 0.14117648 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_6", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.38039216, - "green": 0.24705882, - "red": 0.14117648 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "TITLE", - "paragraphStyle": { - "borderBottom": { - "color": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "dashStyle": "SOLID", - "padding": { - "magnitude": 4, - "unit": "PT" - }, - "width": { - "magnitude": 1, - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "spaceBelow": { - "magnitude": 15, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "fontSize": { - "magnitude": 26, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.3647059, - "green": 0.21176471, - "red": 0.09019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "SUBTITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - }, - "textStyle": { - "fontSize": { - "magnitude": 12, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - } - ] - } - }, - "tabProperties": { - "index": 0, - "tabId": "t.0", - "title": "Tab 1" - } - } - ], - "title": "Doc_2_Rich_Text_Formatting_Test" -} \ No newline at end of file diff --git a/apps/google-docs/src/utils/test_docs_json/Doc_3_Nested_Structures_And_References_Test.json b/apps/google-docs/src/utils/test_docs_json/Doc_3_Nested_Structures_And_References_Test.json deleted file mode 100644 index 5ce9e0758a..0000000000 --- a/apps/google-docs/src/utils/test_docs_json/Doc_3_Nested_Structures_And_References_Test.json +++ /dev/null @@ -1,2430 +0,0 @@ -{ - "documentId": "1NLGmOqvzFfZtHDBfhvUYaO5Z-v9O-WKe_KTDc5KOxRk", - "suggestionsViewMode": "PREVIEW_WITHOUT_SUGGESTIONS", - "tabs": [ - { - "documentTab": { - "body": { - "content": [ - { - "endIndex": 1, - "sectionBreak": { - "sectionStyle": { - "columnSeparatorStyle": "NONE", - "contentDirection": "LEFT_TO_RIGHT", - "sectionType": "CONTINUOUS" - } - } - }, - { - "endIndex": 55, - "paragraph": { - "elements": [ - { - "endIndex": 55, - "startIndex": 1, - "textRun": { - "content": "Document Import \u2014 Nested Structures & References Test\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 1 - }, - { - "endIndex": 64, - "paragraph": { - "elements": [ - { - "endIndex": 64, - "startIndex": 55, - "textRun": { - "content": "Overview\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 55 - }, - { - "endIndex": 344, - "paragraph": { - "elements": [ - { - "endIndex": 344, - "startIndex": 64, - "textRun": { - "content": "This document is intended to test the importer\u2019s ability to handle nested structures, including multi-level lists, deeply nested headings, and references to other documents. It also includes cases that exceed normal nesting depth to ensure the importer gracefully handles limits.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 64 - }, - { - "endIndex": 368, - "paragraph": { - "elements": [ - { - "endIndex": 368, - "startIndex": 344, - "textRun": { - "content": "Nested Headings Example\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 344 - }, - { - "endIndex": 384, - "paragraph": { - "elements": [ - { - "endIndex": 384, - "startIndex": 368, - "textRun": { - "content": "Heading Level 1\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 368 - }, - { - "endIndex": 400, - "paragraph": { - "elements": [ - { - "endIndex": 400, - "startIndex": 384, - "textRun": { - "content": "Heading Level 2\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 384 - }, - { - "endIndex": 416, - "paragraph": { - "elements": [ - { - "endIndex": 416, - "startIndex": 400, - "textRun": { - "content": "Heading Level 3\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 400 - }, - { - "endIndex": 432, - "paragraph": { - "elements": [ - { - "endIndex": 432, - "startIndex": 416, - "textRun": { - "content": "Heading Level 4\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_4" - } - }, - "startIndex": 416 - }, - { - "endIndex": 448, - "paragraph": { - "elements": [ - { - "endIndex": 448, - "startIndex": 432, - "textRun": { - "content": "Heading Level 5\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_5" - } - }, - "startIndex": 432 - }, - { - "endIndex": 464, - "paragraph": { - "elements": [ - { - "endIndex": 464, - "startIndex": 448, - "textRun": { - "content": "Heading Level 6\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_6" - } - }, - "startIndex": 448 - }, - { - "endIndex": 538, - "paragraph": { - "elements": [ - { - "endIndex": 538, - "startIndex": 464, - "textRun": { - "content": "This section demonstrates heading depth beyond normal content structures.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 464 - }, - { - "endIndex": 563, - "paragraph": { - "elements": [ - { - "endIndex": 563, - "startIndex": 538, - "textRun": { - "content": "Multi-Level List Example\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 538 - }, - { - "endIndex": 580, - "paragraph": { - "bullet": { - "listId": "kix.list.1", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 580, - "startIndex": 563, - "textRun": { - "content": "Level 1 \u2014 Item A\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Cambria", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 563 - }, - { - "endIndex": 613, - "paragraph": { - "bullet": { - "listId": "kix.list.1", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 613, - "startIndex": 580, - "textRun": { - "content": " Level 2 \u2014 Item A.1 (indented)\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Cambria", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 580 - }, - { - "endIndex": 656, - "paragraph": { - "bullet": { - "listId": "kix.list.1", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 656, - "startIndex": 613, - "textRun": { - "content": " Level 3 \u2014 Item A.1.1 (indented more)\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Cambria", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 613 - }, - { - "endIndex": 673, - "paragraph": { - "bullet": { - "listId": "kix.list.1", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 673, - "startIndex": 656, - "textRun": { - "content": "Level 1 \u2014 Item B\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Cambria", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 10, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 656 - }, - { - "endIndex": 692, - "paragraph": { - "elements": [ - { - "endIndex": 692, - "startIndex": 673, - "textRun": { - "content": "References Example\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 673 - }, - { - "endIndex": 867, - "paragraph": { - "elements": [ - { - "endIndex": 867, - "startIndex": 692, - "textRun": { - "content": "This section includes references to other test documents used in the suite. These references should be detected and represented as relationships or cross-links in Contentful.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 692 - }, - { - "endIndex": 956, - "paragraph": { - "elements": [ - { - "endIndex": 888, - "startIndex": 867, - "textRun": { - "content": "Referenced Documents:", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 899, - "startIndex": 888, - "textRun": { - "content": "\u000b- Doc 1 \u2014 ", - "textStyle": {} - } - }, - { - "endIndex": 919, - "startIndex": 899, - "textRun": { - "content": "Basic Structure Test", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.google.com/document/d/12ohHh1SR47s-hm2lRtwK0NY-cRi_Nc6coAIrb9vylOM/edit?tab=t.0" - }, - "underline": true - } - } - }, - { - "endIndex": 930, - "startIndex": 919, - "textRun": { - "content": "\u000b- Doc 2 \u2014 ", - "textStyle": {} - } - }, - { - "endIndex": 955, - "startIndex": 930, - "textRun": { - "content": "Rich Text Formatting Test", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.google.com/document/u/0/d/1Ufzr1TNu5SPEbrKHqPW_GA7iTH0A6jqB2FH5vaIHfcg/edit" - }, - "underline": true - } - } - }, - { - "endIndex": 956, - "startIndex": 955, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 867 - }, - { - "endIndex": 973, - "paragraph": { - "elements": [ - { - "endIndex": 973, - "startIndex": 956, - "textRun": { - "content": "Expected Outcome\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 956 - }, - { - "endIndex": 1216, - "paragraph": { - "elements": [ - { - "endIndex": 1216, - "startIndex": 973, - "textRun": { - "content": "Nested content should be preserved up to the supported depth. Any content exceeding nesting or reference depth limits should be handled gracefully. Circular references should be detected and safely ignored or reported without breaking import.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 973 - } - ] - }, - "documentStyle": { - "background": { - "color": {} - }, - "documentFormat": { - "documentMode": "PAGES" - }, - "marginBottom": { - "magnitude": 72, - "unit": "PT" - }, - "marginFooter": { - "magnitude": 36, - "unit": "PT" - }, - "marginHeader": { - "magnitude": 36, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 90, - "unit": "PT" - }, - "marginRight": { - "magnitude": 90, - "unit": "PT" - }, - "marginTop": { - "magnitude": 72, - "unit": "PT" - }, - "pageNumberStart": 1, - "pageSize": { - "height": { - "magnitude": 792, - "unit": "PT" - }, - "width": { - "magnitude": 612, - "unit": "PT" - } - }, - "useCustomHeaderFooterMargins": true - }, - "lists": { - "kix.list.1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.3": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 36, - "unit": "PT" - }, - "indentStart": { - "magnitude": 54, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 36, - "unit": "PT" - }, - "indentStart": { - "magnitude": 54, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 72, - "unit": "PT" - }, - "indentStart": { - "magnitude": 90, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - } - }, - "namedStyles": { - "styles": [ - { - "namedStyleType": "NORMAL_TEXT", - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 10, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Cambria", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_1", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 24, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 14, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5686275, - "green": 0.3764706, - "red": 0.21176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_2", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 13, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_3", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_4", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_5", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.38039216, - "green": 0.24705882, - "red": 0.14117648 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_6", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.38039216, - "green": 0.24705882, - "red": 0.14117648 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "TITLE", - "paragraphStyle": { - "borderBottom": { - "color": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "dashStyle": "SOLID", - "padding": { - "magnitude": 4, - "unit": "PT" - }, - "width": { - "magnitude": 1, - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "spaceBelow": { - "magnitude": 15, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "fontSize": { - "magnitude": 26, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.3647059, - "green": 0.21176471, - "red": 0.09019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "SUBTITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - }, - "textStyle": { - "fontSize": { - "magnitude": 12, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - } - ] - } - }, - "tabProperties": { - "index": 0, - "tabId": "t.0", - "title": "Tab 1" - } - } - ], - "title": "Doc_3_Nested_Structures_And_References_Test" -} \ No newline at end of file diff --git a/apps/google-docs/src/utils/test_docs_json/Doc_4_Media_Embeds_Test.json b/apps/google-docs/src/utils/test_docs_json/Doc_4_Media_Embeds_Test.json deleted file mode 100644 index 178a526341..0000000000 --- a/apps/google-docs/src/utils/test_docs_json/Doc_4_Media_Embeds_Test.json +++ /dev/null @@ -1,2040 +0,0 @@ -{ - "documentId": "1p_LoSc6rDQsfiuxneHwtpIyXAweLz0FxOzVVQe2kAVs", - "suggestionsViewMode": "PREVIEW_WITHOUT_SUGGESTIONS", - "tabs": [ - { - "documentTab": { - "body": { - "content": [ - { - "endIndex": 1, - "sectionBreak": { - "sectionStyle": { - "columnSeparatorStyle": "NONE", - "contentDirection": "LEFT_TO_RIGHT", - "sectionType": "CONTINUOUS" - } - } - }, - { - "endIndex": 37, - "paragraph": { - "elements": [ - { - "endIndex": 37, - "startIndex": 1, - "textRun": { - "content": "Document Import \u2014 Media Embeds Test\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 1 - }, - { - "endIndex": 46, - "paragraph": { - "elements": [ - { - "endIndex": 46, - "startIndex": 37, - "textRun": { - "content": "Overview\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 37 - }, - { - "endIndex": 349, - "paragraph": { - "elements": [ - { - "endIndex": 349, - "startIndex": 46, - "textRun": { - "content": "This document is intended to validate that the importer correctly identifies and processes embedded media elements such as images, captions, and external media embeds (e.g., YouTube videos or Google Drawings). The goal is to ensure that media objects are imported with correct metadata and positioning.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 46 - }, - { - "endIndex": 364, - "paragraph": { - "elements": [ - { - "endIndex": 364, - "startIndex": 349, - "textRun": { - "content": "Image Examples\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 349 - }, - { - "endIndex": 563, - "paragraph": { - "elements": [ - { - "endIndex": 563, - "startIndex": 364, - "textRun": { - "content": "Below are placeholder references for images that should be tested during the import process. Replace these descriptions with actual image inserts in the Google Docs version to validate asset import.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 364 - }, - { - "endIndex": 565, - "paragraph": { - "elements": [ - { - "endIndex": 564, - "inlineObjectElement": { - "inlineObjectId": "kix.r4b17zjhyycx", - "textStyle": {} - }, - "startIndex": 563 - }, - { - "endIndex": 565, - "startIndex": 564, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 563 - }, - { - "endIndex": 567, - "paragraph": { - "elements": [ - { - "endIndex": 566, - "inlineObjectElement": { - "inlineObjectId": "kix.ix5oc1rpyqg1", - "textStyle": {} - }, - "startIndex": 565 - }, - { - "endIndex": 567, - "startIndex": 566, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 565 - }, - { - "endIndex": 591, - "paragraph": { - "elements": [ - { - "endIndex": 591, - "startIndex": 567, - "textRun": { - "content": "Embedded Media Examples\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 567 - }, - { - "endIndex": 740, - "paragraph": { - "elements": [ - { - "endIndex": 740, - "startIndex": 591, - "textRun": { - "content": "This section contains text placeholders for external embeds. When converting to Google Docs, actual embedded content should be inserted for testing.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 591 - }, - { - "endIndex": 742, - "paragraph": { - "elements": [ - { - "endIndex": 741, - "richLink": { - "richLinkId": "kix.c2zu47dosj3v", - "richLinkProperties": { - "title": "Contentful Platform: Overview + Demo", - "uri": "https://www.youtube.com/watch?v=uLd5pJi3OYM" - }, - "textStyle": {} - }, - "startIndex": 740 - }, - { - "endIndex": 742, - "startIndex": 741, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 740 - }, - { - "endIndex": 744, - "paragraph": { - "elements": [ - { - "endIndex": 743, - "richLink": { - "richLinkId": "kix.6m5hlc69y106", - "richLinkProperties": { - "title": "Headless CMS | Part 1: Introduction to Contentful", - "uri": "https://www.youtube.com/watch?v=dor1VKFwAl4" - }, - "textStyle": {} - }, - "startIndex": 742 - }, - { - "endIndex": 744, - "startIndex": 743, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 742 - }, - { - "endIndex": 766, - "paragraph": { - "elements": [ - { - "endIndex": 766, - "startIndex": 744, - "textRun": { - "content": "Media Context Example\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 744 - }, - { - "endIndex": 919, - "paragraph": { - "elements": [ - { - "endIndex": 829, - "startIndex": 766, - "textRun": { - "content": "This is an example paragraph with an image placeholder inline: ", - "textStyle": {} - } - }, - { - "endIndex": 830, - "inlineObjectElement": { - "inlineObjectId": "kix.qzqzrlhpvms8", - "textStyle": {} - }, - "startIndex": 829 - }, - { - "endIndex": 919, - "startIndex": 830, - "textRun": { - "content": ". The importer should maintain the media placement relative to surrounding text content.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 766 - }, - { - "endIndex": 936, - "paragraph": { - "elements": [ - { - "endIndex": 936, - "startIndex": 919, - "textRun": { - "content": "Expected Outcome\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 919 - }, - { - "endIndex": 1214, - "paragraph": { - "elements": [ - { - "endIndex": 1214, - "startIndex": 936, - "textRun": { - "content": "Media assets should import with correct order, captions, and contextual placement. Inline images should remain embedded in related text, and external embeds (e.g., videos, drawings) should appear as linked content. Missing media should be flagged without causing import errors.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 936 - } - ] - }, - "documentStyle": { - "background": { - "color": {} - }, - "documentFormat": { - "documentMode": "PAGES" - }, - "marginBottom": { - "magnitude": 72, - "unit": "PT" - }, - "marginFooter": { - "magnitude": 36, - "unit": "PT" - }, - "marginHeader": { - "magnitude": 36, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 90, - "unit": "PT" - }, - "marginRight": { - "magnitude": 90, - "unit": "PT" - }, - "marginTop": { - "magnitude": 72, - "unit": "PT" - }, - "pageNumberStart": 1, - "pageSize": { - "height": { - "magnitude": 792, - "unit": "PT" - }, - "width": { - "magnitude": 612, - "unit": "PT" - } - }, - "useCustomHeaderFooterMargins": true - }, - "inlineObjects": { - "kix.ix5oc1rpyqg1": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh7-rt.googleusercontent.com/docsz/AD_4nXc1uaXTu7tNpRnV3c4TwNXwNwixRnsZoLorp2yCL1BL9n5Vzv2H107Ea79fvRRyJlfmzSVb-Yx2CrzyXXiTo7qA2mznNDV52aLjJDAsOlptzlNbU-qLeeHUwItLKFYT_sgNtvBQcsYimQSNbL6q_CCNM2fV?key=5mLCyMA29Yboa2INQ3olIA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 89, - "unit": "PT" - }, - "width": { - "magnitude": 432, - "unit": "PT" - } - } - } - }, - "objectId": "kix.ix5oc1rpyqg1" - }, - "kix.qzqzrlhpvms8": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh7-rt.googleusercontent.com/docsz/AD_4nXfeOPnRy7ULMVDY35HvmpsxhS3UGa3EAKNiYHIWMLlkxb0pBvsMHjIfysGB8vFBKnP3iq2ofcGu03t-w_MEKQl1ZDBj-VUWcOFHRZwZdglSSCSKM8zEg6LLLPfOs_nhk8zHm4UNBMF2bFF3EORGoGsffLWo?key=5mLCyMA29Yboa2INQ3olIA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 56.54509277343743, - "unit": "PT" - }, - "width": { - "magnitude": 101.15865220936054, - "unit": "PT" - } - } - } - }, - "objectId": "kix.qzqzrlhpvms8" - }, - "kix.r4b17zjhyycx": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh7-rt.googleusercontent.com/docsz/AD_4nXdp5ab3Adf1MZkFdy6WuZQlUqE4Rqyhnp7FB2_kJy951JzNlTAYFUiRsjOYpn0wnfwgtXrCuOtz_i9aIGQAzD1-7OpMr9JvUDDwuzMUCoX_Vk6cVZd67QfiU1mxUMu06xFRy2-pJY2saQ7NmlwOhPSUWsiZ?key=5mLCyMA29Yboa2INQ3olIA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 150, - "unit": "PT" - }, - "width": { - "magnitude": 150, - "unit": "PT" - } - } - } - }, - "objectId": "kix.r4b17zjhyycx" - } - }, - "lists": { - "kix.list.1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.3": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 36, - "unit": "PT" - }, - "indentStart": { - "magnitude": 54, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 36, - "unit": "PT" - }, - "indentStart": { - "magnitude": 54, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 72, - "unit": "PT" - }, - "indentStart": { - "magnitude": 90, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - } - }, - "namedStyles": { - "styles": [ - { - "namedStyleType": "NORMAL_TEXT", - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 10, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Cambria", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_1", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 24, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 14, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5686275, - "green": 0.3764706, - "red": 0.21176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_2", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 13, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_3", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_4", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_5", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.38039216, - "green": 0.24705882, - "red": 0.14117648 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_6", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.38039216, - "green": 0.24705882, - "red": 0.14117648 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "TITLE", - "paragraphStyle": { - "borderBottom": { - "color": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "dashStyle": "SOLID", - "padding": { - "magnitude": 4, - "unit": "PT" - }, - "width": { - "magnitude": 1, - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "spaceBelow": { - "magnitude": 15, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "fontSize": { - "magnitude": 26, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.3647059, - "green": 0.21176471, - "red": 0.09019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "SUBTITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - }, - "textStyle": { - "fontSize": { - "magnitude": 12, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - } - ] - } - }, - "tabProperties": { - "index": 0, - "tabId": "t.0", - "title": "Tab 1" - } - } - ], - "title": "Doc_4_Media_Embeds_Test" -} \ No newline at end of file diff --git a/apps/google-docs/src/utils/test_docs_json/Doc_5_Bulk_Entry_Stress_Test.json b/apps/google-docs/src/utils/test_docs_json/Doc_5_Bulk_Entry_Stress_Test.json deleted file mode 100644 index 89106e2445..0000000000 --- a/apps/google-docs/src/utils/test_docs_json/Doc_5_Bulk_Entry_Stress_Test.json +++ /dev/null @@ -1,6435 +0,0 @@ -{ - "documentId": "1TVfsjJIphBnMi0qNFCJzZ1boCS0H0YZymA2H0gC6UKs", - "suggestionsViewMode": "PREVIEW_WITHOUT_SUGGESTIONS", - "tabs": [ - { - "documentTab": { - "body": { - "content": [ - { - "endIndex": 1, - "sectionBreak": { - "sectionStyle": { - "columnSeparatorStyle": "NONE", - "contentDirection": "LEFT_TO_RIGHT", - "sectionType": "CONTINUOUS" - } - } - }, - { - "endIndex": 42, - "paragraph": { - "elements": [ - { - "endIndex": 42, - "startIndex": 1, - "textRun": { - "content": "Document Import \u2014 Bulk Entry Stress Test\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 1 - }, - { - "endIndex": 51, - "paragraph": { - "elements": [ - { - "endIndex": 51, - "startIndex": 42, - "textRun": { - "content": "Overview\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 42 - }, - { - "endIndex": 302, - "paragraph": { - "elements": [ - { - "endIndex": 302, - "startIndex": 51, - "textRun": { - "content": "This document is designed to test the importer's ability to handle large-scale document parsing, specifically to validate rate-limit management and pagination logic. It contains over 100 heading-and-paragraph pairs to simulate heavy import workloads.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 51 - }, - { - "endIndex": 310, - "paragraph": { - "elements": [ - { - "endIndex": 310, - "startIndex": 302, - "textRun": { - "content": "Entry 1\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 302 - }, - { - "endIndex": 497, - "paragraph": { - "elements": [ - { - "endIndex": 497, - "startIndex": 310, - "textRun": { - "content": "This is the content paragraph for Entry 1. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 1.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 310 - }, - { - "endIndex": 505, - "paragraph": { - "elements": [ - { - "endIndex": 505, - "startIndex": 497, - "textRun": { - "content": "Entry 2\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 497 - }, - { - "endIndex": 692, - "paragraph": { - "elements": [ - { - "endIndex": 692, - "startIndex": 505, - "textRun": { - "content": "This is the content paragraph for Entry 2. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 2.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 505 - }, - { - "endIndex": 700, - "paragraph": { - "elements": [ - { - "endIndex": 700, - "startIndex": 692, - "textRun": { - "content": "Entry 3\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 692 - }, - { - "endIndex": 887, - "paragraph": { - "elements": [ - { - "endIndex": 887, - "startIndex": 700, - "textRun": { - "content": "This is the content paragraph for Entry 3. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 3.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 700 - }, - { - "endIndex": 895, - "paragraph": { - "elements": [ - { - "endIndex": 895, - "startIndex": 887, - "textRun": { - "content": "Entry 4\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 887 - }, - { - "endIndex": 1082, - "paragraph": { - "elements": [ - { - "endIndex": 1082, - "startIndex": 895, - "textRun": { - "content": "This is the content paragraph for Entry 4. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 4.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 895 - }, - { - "endIndex": 1090, - "paragraph": { - "elements": [ - { - "endIndex": 1090, - "startIndex": 1082, - "textRun": { - "content": "Entry 5\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 1082 - }, - { - "endIndex": 1277, - "paragraph": { - "elements": [ - { - "endIndex": 1277, - "startIndex": 1090, - "textRun": { - "content": "This is the content paragraph for Entry 5. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 5.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1090 - }, - { - "endIndex": 1285, - "paragraph": { - "elements": [ - { - "endIndex": 1285, - "startIndex": 1277, - "textRun": { - "content": "Entry 6\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 1277 - }, - { - "endIndex": 1472, - "paragraph": { - "elements": [ - { - "endIndex": 1472, - "startIndex": 1285, - "textRun": { - "content": "This is the content paragraph for Entry 6. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 6.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1285 - }, - { - "endIndex": 1480, - "paragraph": { - "elements": [ - { - "endIndex": 1480, - "startIndex": 1472, - "textRun": { - "content": "Entry 7\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 1472 - }, - { - "endIndex": 1667, - "paragraph": { - "elements": [ - { - "endIndex": 1667, - "startIndex": 1480, - "textRun": { - "content": "This is the content paragraph for Entry 7. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 7.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1480 - }, - { - "endIndex": 1675, - "paragraph": { - "elements": [ - { - "endIndex": 1675, - "startIndex": 1667, - "textRun": { - "content": "Entry 8\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 1667 - }, - { - "endIndex": 1862, - "paragraph": { - "elements": [ - { - "endIndex": 1862, - "startIndex": 1675, - "textRun": { - "content": "This is the content paragraph for Entry 8. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 8.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1675 - }, - { - "endIndex": 1870, - "paragraph": { - "elements": [ - { - "endIndex": 1870, - "startIndex": 1862, - "textRun": { - "content": "Entry 9\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 1862 - }, - { - "endIndex": 2057, - "paragraph": { - "elements": [ - { - "endIndex": 2057, - "startIndex": 1870, - "textRun": { - "content": "This is the content paragraph for Entry 9. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 9.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1870 - }, - { - "endIndex": 2066, - "paragraph": { - "elements": [ - { - "endIndex": 2066, - "startIndex": 2057, - "textRun": { - "content": "Entry 10\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 2057 - }, - { - "endIndex": 2255, - "paragraph": { - "elements": [ - { - "endIndex": 2255, - "startIndex": 2066, - "textRun": { - "content": "This is the content paragraph for Entry 10. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 10.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2066 - }, - { - "endIndex": 2264, - "paragraph": { - "elements": [ - { - "endIndex": 2264, - "startIndex": 2255, - "textRun": { - "content": "Entry 11\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 2255 - }, - { - "endIndex": 2453, - "paragraph": { - "elements": [ - { - "endIndex": 2453, - "startIndex": 2264, - "textRun": { - "content": "This is the content paragraph for Entry 11. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 11.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2264 - }, - { - "endIndex": 2462, - "paragraph": { - "elements": [ - { - "endIndex": 2462, - "startIndex": 2453, - "textRun": { - "content": "Entry 12\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 2453 - }, - { - "endIndex": 2651, - "paragraph": { - "elements": [ - { - "endIndex": 2651, - "startIndex": 2462, - "textRun": { - "content": "This is the content paragraph for Entry 12. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 12.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2462 - }, - { - "endIndex": 2660, - "paragraph": { - "elements": [ - { - "endIndex": 2660, - "startIndex": 2651, - "textRun": { - "content": "Entry 13\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 2651 - }, - { - "endIndex": 2849, - "paragraph": { - "elements": [ - { - "endIndex": 2849, - "startIndex": 2660, - "textRun": { - "content": "This is the content paragraph for Entry 13. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 13.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2660 - }, - { - "endIndex": 2858, - "paragraph": { - "elements": [ - { - "endIndex": 2858, - "startIndex": 2849, - "textRun": { - "content": "Entry 14\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 2849 - }, - { - "endIndex": 3047, - "paragraph": { - "elements": [ - { - "endIndex": 3047, - "startIndex": 2858, - "textRun": { - "content": "This is the content paragraph for Entry 14. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 14.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2858 - }, - { - "endIndex": 3056, - "paragraph": { - "elements": [ - { - "endIndex": 3056, - "startIndex": 3047, - "textRun": { - "content": "Entry 15\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 3047 - }, - { - "endIndex": 3245, - "paragraph": { - "elements": [ - { - "endIndex": 3245, - "startIndex": 3056, - "textRun": { - "content": "This is the content paragraph for Entry 15. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 15.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3056 - }, - { - "endIndex": 3254, - "paragraph": { - "elements": [ - { - "endIndex": 3254, - "startIndex": 3245, - "textRun": { - "content": "Entry 16\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 3245 - }, - { - "endIndex": 3443, - "paragraph": { - "elements": [ - { - "endIndex": 3443, - "startIndex": 3254, - "textRun": { - "content": "This is the content paragraph for Entry 16. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 16.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3254 - }, - { - "endIndex": 3452, - "paragraph": { - "elements": [ - { - "endIndex": 3452, - "startIndex": 3443, - "textRun": { - "content": "Entry 17\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 3443 - }, - { - "endIndex": 3641, - "paragraph": { - "elements": [ - { - "endIndex": 3641, - "startIndex": 3452, - "textRun": { - "content": "This is the content paragraph for Entry 17. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 17.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3452 - }, - { - "endIndex": 3650, - "paragraph": { - "elements": [ - { - "endIndex": 3650, - "startIndex": 3641, - "textRun": { - "content": "Entry 18\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 3641 - }, - { - "endIndex": 3839, - "paragraph": { - "elements": [ - { - "endIndex": 3839, - "startIndex": 3650, - "textRun": { - "content": "This is the content paragraph for Entry 18. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 18.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3650 - }, - { - "endIndex": 3848, - "paragraph": { - "elements": [ - { - "endIndex": 3848, - "startIndex": 3839, - "textRun": { - "content": "Entry 19\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 3839 - }, - { - "endIndex": 4037, - "paragraph": { - "elements": [ - { - "endIndex": 4037, - "startIndex": 3848, - "textRun": { - "content": "This is the content paragraph for Entry 19. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 19.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3848 - }, - { - "endIndex": 4046, - "paragraph": { - "elements": [ - { - "endIndex": 4046, - "startIndex": 4037, - "textRun": { - "content": "Entry 20\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 4037 - }, - { - "endIndex": 4235, - "paragraph": { - "elements": [ - { - "endIndex": 4235, - "startIndex": 4046, - "textRun": { - "content": "This is the content paragraph for Entry 20. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 20.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4046 - }, - { - "endIndex": 4244, - "paragraph": { - "elements": [ - { - "endIndex": 4244, - "startIndex": 4235, - "textRun": { - "content": "Entry 21\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 4235 - }, - { - "endIndex": 4433, - "paragraph": { - "elements": [ - { - "endIndex": 4433, - "startIndex": 4244, - "textRun": { - "content": "This is the content paragraph for Entry 21. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 21.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4244 - }, - { - "endIndex": 4442, - "paragraph": { - "elements": [ - { - "endIndex": 4442, - "startIndex": 4433, - "textRun": { - "content": "Entry 22\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 4433 - }, - { - "endIndex": 4631, - "paragraph": { - "elements": [ - { - "endIndex": 4631, - "startIndex": 4442, - "textRun": { - "content": "This is the content paragraph for Entry 22. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 22.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4442 - }, - { - "endIndex": 4640, - "paragraph": { - "elements": [ - { - "endIndex": 4640, - "startIndex": 4631, - "textRun": { - "content": "Entry 23\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 4631 - }, - { - "endIndex": 4829, - "paragraph": { - "elements": [ - { - "endIndex": 4829, - "startIndex": 4640, - "textRun": { - "content": "This is the content paragraph for Entry 23. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 23.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4640 - }, - { - "endIndex": 4838, - "paragraph": { - "elements": [ - { - "endIndex": 4838, - "startIndex": 4829, - "textRun": { - "content": "Entry 24\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 4829 - }, - { - "endIndex": 5027, - "paragraph": { - "elements": [ - { - "endIndex": 5027, - "startIndex": 4838, - "textRun": { - "content": "This is the content paragraph for Entry 24. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 24.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4838 - }, - { - "endIndex": 5036, - "paragraph": { - "elements": [ - { - "endIndex": 5036, - "startIndex": 5027, - "textRun": { - "content": "Entry 25\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 5027 - }, - { - "endIndex": 5225, - "paragraph": { - "elements": [ - { - "endIndex": 5225, - "startIndex": 5036, - "textRun": { - "content": "This is the content paragraph for Entry 25. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 25.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5036 - }, - { - "endIndex": 5234, - "paragraph": { - "elements": [ - { - "endIndex": 5234, - "startIndex": 5225, - "textRun": { - "content": "Entry 26\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 5225 - }, - { - "endIndex": 5423, - "paragraph": { - "elements": [ - { - "endIndex": 5423, - "startIndex": 5234, - "textRun": { - "content": "This is the content paragraph for Entry 26. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 26.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5234 - }, - { - "endIndex": 5432, - "paragraph": { - "elements": [ - { - "endIndex": 5432, - "startIndex": 5423, - "textRun": { - "content": "Entry 27\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 5423 - }, - { - "endIndex": 5621, - "paragraph": { - "elements": [ - { - "endIndex": 5621, - "startIndex": 5432, - "textRun": { - "content": "This is the content paragraph for Entry 27. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 27.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5432 - }, - { - "endIndex": 5630, - "paragraph": { - "elements": [ - { - "endIndex": 5630, - "startIndex": 5621, - "textRun": { - "content": "Entry 28\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 5621 - }, - { - "endIndex": 5819, - "paragraph": { - "elements": [ - { - "endIndex": 5819, - "startIndex": 5630, - "textRun": { - "content": "This is the content paragraph for Entry 28. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 28.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5630 - }, - { - "endIndex": 5828, - "paragraph": { - "elements": [ - { - "endIndex": 5828, - "startIndex": 5819, - "textRun": { - "content": "Entry 29\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 5819 - }, - { - "endIndex": 6017, - "paragraph": { - "elements": [ - { - "endIndex": 6017, - "startIndex": 5828, - "textRun": { - "content": "This is the content paragraph for Entry 29. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 29.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5828 - }, - { - "endIndex": 6026, - "paragraph": { - "elements": [ - { - "endIndex": 6026, - "startIndex": 6017, - "textRun": { - "content": "Entry 30\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 6017 - }, - { - "endIndex": 6215, - "paragraph": { - "elements": [ - { - "endIndex": 6215, - "startIndex": 6026, - "textRun": { - "content": "This is the content paragraph for Entry 30. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 30.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6026 - }, - { - "endIndex": 6224, - "paragraph": { - "elements": [ - { - "endIndex": 6224, - "startIndex": 6215, - "textRun": { - "content": "Entry 31\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 6215 - }, - { - "endIndex": 6413, - "paragraph": { - "elements": [ - { - "endIndex": 6413, - "startIndex": 6224, - "textRun": { - "content": "This is the content paragraph for Entry 31. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 31.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6224 - }, - { - "endIndex": 6422, - "paragraph": { - "elements": [ - { - "endIndex": 6422, - "startIndex": 6413, - "textRun": { - "content": "Entry 32\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 6413 - }, - { - "endIndex": 6611, - "paragraph": { - "elements": [ - { - "endIndex": 6611, - "startIndex": 6422, - "textRun": { - "content": "This is the content paragraph for Entry 32. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 32.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6422 - }, - { - "endIndex": 6620, - "paragraph": { - "elements": [ - { - "endIndex": 6620, - "startIndex": 6611, - "textRun": { - "content": "Entry 33\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 6611 - }, - { - "endIndex": 6809, - "paragraph": { - "elements": [ - { - "endIndex": 6809, - "startIndex": 6620, - "textRun": { - "content": "This is the content paragraph for Entry 33. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 33.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6620 - }, - { - "endIndex": 6818, - "paragraph": { - "elements": [ - { - "endIndex": 6818, - "startIndex": 6809, - "textRun": { - "content": "Entry 34\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 6809 - }, - { - "endIndex": 7007, - "paragraph": { - "elements": [ - { - "endIndex": 7007, - "startIndex": 6818, - "textRun": { - "content": "This is the content paragraph for Entry 34. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 34.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6818 - }, - { - "endIndex": 7016, - "paragraph": { - "elements": [ - { - "endIndex": 7016, - "startIndex": 7007, - "textRun": { - "content": "Entry 35\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 7007 - }, - { - "endIndex": 7205, - "paragraph": { - "elements": [ - { - "endIndex": 7205, - "startIndex": 7016, - "textRun": { - "content": "This is the content paragraph for Entry 35. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 35.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7016 - }, - { - "endIndex": 7214, - "paragraph": { - "elements": [ - { - "endIndex": 7214, - "startIndex": 7205, - "textRun": { - "content": "Entry 36\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 7205 - }, - { - "endIndex": 7403, - "paragraph": { - "elements": [ - { - "endIndex": 7403, - "startIndex": 7214, - "textRun": { - "content": "This is the content paragraph for Entry 36. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 36.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7214 - }, - { - "endIndex": 7412, - "paragraph": { - "elements": [ - { - "endIndex": 7412, - "startIndex": 7403, - "textRun": { - "content": "Entry 37\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 7403 - }, - { - "endIndex": 7601, - "paragraph": { - "elements": [ - { - "endIndex": 7601, - "startIndex": 7412, - "textRun": { - "content": "This is the content paragraph for Entry 37. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 37.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7412 - }, - { - "endIndex": 7610, - "paragraph": { - "elements": [ - { - "endIndex": 7610, - "startIndex": 7601, - "textRun": { - "content": "Entry 38\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 7601 - }, - { - "endIndex": 7799, - "paragraph": { - "elements": [ - { - "endIndex": 7799, - "startIndex": 7610, - "textRun": { - "content": "This is the content paragraph for Entry 38. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 38.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7610 - }, - { - "endIndex": 7808, - "paragraph": { - "elements": [ - { - "endIndex": 7808, - "startIndex": 7799, - "textRun": { - "content": "Entry 39\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 7799 - }, - { - "endIndex": 7997, - "paragraph": { - "elements": [ - { - "endIndex": 7997, - "startIndex": 7808, - "textRun": { - "content": "This is the content paragraph for Entry 39. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 39.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7808 - }, - { - "endIndex": 8006, - "paragraph": { - "elements": [ - { - "endIndex": 8006, - "startIndex": 7997, - "textRun": { - "content": "Entry 40\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 7997 - }, - { - "endIndex": 8195, - "paragraph": { - "elements": [ - { - "endIndex": 8195, - "startIndex": 8006, - "textRun": { - "content": "This is the content paragraph for Entry 40. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 40.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8006 - }, - { - "endIndex": 8204, - "paragraph": { - "elements": [ - { - "endIndex": 8204, - "startIndex": 8195, - "textRun": { - "content": "Entry 41\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 8195 - }, - { - "endIndex": 8393, - "paragraph": { - "elements": [ - { - "endIndex": 8393, - "startIndex": 8204, - "textRun": { - "content": "This is the content paragraph for Entry 41. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 41.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8204 - }, - { - "endIndex": 8402, - "paragraph": { - "elements": [ - { - "endIndex": 8402, - "startIndex": 8393, - "textRun": { - "content": "Entry 42\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 8393 - }, - { - "endIndex": 8591, - "paragraph": { - "elements": [ - { - "endIndex": 8591, - "startIndex": 8402, - "textRun": { - "content": "This is the content paragraph for Entry 42. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 42.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8402 - }, - { - "endIndex": 8600, - "paragraph": { - "elements": [ - { - "endIndex": 8600, - "startIndex": 8591, - "textRun": { - "content": "Entry 43\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 8591 - }, - { - "endIndex": 8789, - "paragraph": { - "elements": [ - { - "endIndex": 8789, - "startIndex": 8600, - "textRun": { - "content": "This is the content paragraph for Entry 43. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 43.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8600 - }, - { - "endIndex": 8798, - "paragraph": { - "elements": [ - { - "endIndex": 8798, - "startIndex": 8789, - "textRun": { - "content": "Entry 44\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 8789 - }, - { - "endIndex": 8987, - "paragraph": { - "elements": [ - { - "endIndex": 8987, - "startIndex": 8798, - "textRun": { - "content": "This is the content paragraph for Entry 44. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 44.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8798 - }, - { - "endIndex": 8996, - "paragraph": { - "elements": [ - { - "endIndex": 8996, - "startIndex": 8987, - "textRun": { - "content": "Entry 45\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 8987 - }, - { - "endIndex": 9185, - "paragraph": { - "elements": [ - { - "endIndex": 9185, - "startIndex": 8996, - "textRun": { - "content": "This is the content paragraph for Entry 45. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 45.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8996 - }, - { - "endIndex": 9194, - "paragraph": { - "elements": [ - { - "endIndex": 9194, - "startIndex": 9185, - "textRun": { - "content": "Entry 46\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 9185 - }, - { - "endIndex": 9383, - "paragraph": { - "elements": [ - { - "endIndex": 9383, - "startIndex": 9194, - "textRun": { - "content": "This is the content paragraph for Entry 46. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 46.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9194 - }, - { - "endIndex": 9392, - "paragraph": { - "elements": [ - { - "endIndex": 9392, - "startIndex": 9383, - "textRun": { - "content": "Entry 47\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 9383 - }, - { - "endIndex": 9581, - "paragraph": { - "elements": [ - { - "endIndex": 9581, - "startIndex": 9392, - "textRun": { - "content": "This is the content paragraph for Entry 47. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 47.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9392 - }, - { - "endIndex": 9590, - "paragraph": { - "elements": [ - { - "endIndex": 9590, - "startIndex": 9581, - "textRun": { - "content": "Entry 48\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 9581 - }, - { - "endIndex": 9779, - "paragraph": { - "elements": [ - { - "endIndex": 9779, - "startIndex": 9590, - "textRun": { - "content": "This is the content paragraph for Entry 48. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 48.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9590 - }, - { - "endIndex": 9788, - "paragraph": { - "elements": [ - { - "endIndex": 9788, - "startIndex": 9779, - "textRun": { - "content": "Entry 49\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 9779 - }, - { - "endIndex": 9977, - "paragraph": { - "elements": [ - { - "endIndex": 9977, - "startIndex": 9788, - "textRun": { - "content": "This is the content paragraph for Entry 49. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 49.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9788 - }, - { - "endIndex": 9986, - "paragraph": { - "elements": [ - { - "endIndex": 9986, - "startIndex": 9977, - "textRun": { - "content": "Entry 50\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 9977 - }, - { - "endIndex": 10175, - "paragraph": { - "elements": [ - { - "endIndex": 10175, - "startIndex": 9986, - "textRun": { - "content": "This is the content paragraph for Entry 50. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 50.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9986 - }, - { - "endIndex": 10184, - "paragraph": { - "elements": [ - { - "endIndex": 10184, - "startIndex": 10175, - "textRun": { - "content": "Entry 51\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 10175 - }, - { - "endIndex": 10373, - "paragraph": { - "elements": [ - { - "endIndex": 10373, - "startIndex": 10184, - "textRun": { - "content": "This is the content paragraph for Entry 51. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 51.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10184 - }, - { - "endIndex": 10382, - "paragraph": { - "elements": [ - { - "endIndex": 10382, - "startIndex": 10373, - "textRun": { - "content": "Entry 52\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 10373 - }, - { - "endIndex": 10571, - "paragraph": { - "elements": [ - { - "endIndex": 10571, - "startIndex": 10382, - "textRun": { - "content": "This is the content paragraph for Entry 52. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 52.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10382 - }, - { - "endIndex": 10580, - "paragraph": { - "elements": [ - { - "endIndex": 10580, - "startIndex": 10571, - "textRun": { - "content": "Entry 53\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 10571 - }, - { - "endIndex": 10769, - "paragraph": { - "elements": [ - { - "endIndex": 10769, - "startIndex": 10580, - "textRun": { - "content": "This is the content paragraph for Entry 53. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 53.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10580 - }, - { - "endIndex": 10778, - "paragraph": { - "elements": [ - { - "endIndex": 10778, - "startIndex": 10769, - "textRun": { - "content": "Entry 54\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 10769 - }, - { - "endIndex": 10967, - "paragraph": { - "elements": [ - { - "endIndex": 10967, - "startIndex": 10778, - "textRun": { - "content": "This is the content paragraph for Entry 54. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 54.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10778 - }, - { - "endIndex": 10976, - "paragraph": { - "elements": [ - { - "endIndex": 10976, - "startIndex": 10967, - "textRun": { - "content": "Entry 55\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 10967 - }, - { - "endIndex": 11165, - "paragraph": { - "elements": [ - { - "endIndex": 11165, - "startIndex": 10976, - "textRun": { - "content": "This is the content paragraph for Entry 55. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 55.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10976 - }, - { - "endIndex": 11174, - "paragraph": { - "elements": [ - { - "endIndex": 11174, - "startIndex": 11165, - "textRun": { - "content": "Entry 56\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 11165 - }, - { - "endIndex": 11363, - "paragraph": { - "elements": [ - { - "endIndex": 11363, - "startIndex": 11174, - "textRun": { - "content": "This is the content paragraph for Entry 56. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 56.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11174 - }, - { - "endIndex": 11372, - "paragraph": { - "elements": [ - { - "endIndex": 11372, - "startIndex": 11363, - "textRun": { - "content": "Entry 57\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 11363 - }, - { - "endIndex": 11561, - "paragraph": { - "elements": [ - { - "endIndex": 11561, - "startIndex": 11372, - "textRun": { - "content": "This is the content paragraph for Entry 57. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 57.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11372 - }, - { - "endIndex": 11570, - "paragraph": { - "elements": [ - { - "endIndex": 11570, - "startIndex": 11561, - "textRun": { - "content": "Entry 58\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 11561 - }, - { - "endIndex": 11759, - "paragraph": { - "elements": [ - { - "endIndex": 11759, - "startIndex": 11570, - "textRun": { - "content": "This is the content paragraph for Entry 58. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 58.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11570 - }, - { - "endIndex": 11768, - "paragraph": { - "elements": [ - { - "endIndex": 11768, - "startIndex": 11759, - "textRun": { - "content": "Entry 59\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 11759 - }, - { - "endIndex": 11957, - "paragraph": { - "elements": [ - { - "endIndex": 11957, - "startIndex": 11768, - "textRun": { - "content": "This is the content paragraph for Entry 59. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 59.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11768 - }, - { - "endIndex": 11966, - "paragraph": { - "elements": [ - { - "endIndex": 11966, - "startIndex": 11957, - "textRun": { - "content": "Entry 60\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 11957 - }, - { - "endIndex": 12155, - "paragraph": { - "elements": [ - { - "endIndex": 12155, - "startIndex": 11966, - "textRun": { - "content": "This is the content paragraph for Entry 60. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 60.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11966 - }, - { - "endIndex": 12164, - "paragraph": { - "elements": [ - { - "endIndex": 12164, - "startIndex": 12155, - "textRun": { - "content": "Entry 61\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 12155 - }, - { - "endIndex": 12353, - "paragraph": { - "elements": [ - { - "endIndex": 12353, - "startIndex": 12164, - "textRun": { - "content": "This is the content paragraph for Entry 61. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 61.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12164 - }, - { - "endIndex": 12362, - "paragraph": { - "elements": [ - { - "endIndex": 12362, - "startIndex": 12353, - "textRun": { - "content": "Entry 62\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 12353 - }, - { - "endIndex": 12551, - "paragraph": { - "elements": [ - { - "endIndex": 12551, - "startIndex": 12362, - "textRun": { - "content": "This is the content paragraph for Entry 62. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 62.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12362 - }, - { - "endIndex": 12560, - "paragraph": { - "elements": [ - { - "endIndex": 12560, - "startIndex": 12551, - "textRun": { - "content": "Entry 63\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 12551 - }, - { - "endIndex": 12749, - "paragraph": { - "elements": [ - { - "endIndex": 12749, - "startIndex": 12560, - "textRun": { - "content": "This is the content paragraph for Entry 63. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 63.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12560 - }, - { - "endIndex": 12758, - "paragraph": { - "elements": [ - { - "endIndex": 12758, - "startIndex": 12749, - "textRun": { - "content": "Entry 64\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 12749 - }, - { - "endIndex": 12947, - "paragraph": { - "elements": [ - { - "endIndex": 12947, - "startIndex": 12758, - "textRun": { - "content": "This is the content paragraph for Entry 64. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 64.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12758 - }, - { - "endIndex": 12956, - "paragraph": { - "elements": [ - { - "endIndex": 12956, - "startIndex": 12947, - "textRun": { - "content": "Entry 65\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 12947 - }, - { - "endIndex": 13145, - "paragraph": { - "elements": [ - { - "endIndex": 13145, - "startIndex": 12956, - "textRun": { - "content": "This is the content paragraph for Entry 65. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 65.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12956 - }, - { - "endIndex": 13154, - "paragraph": { - "elements": [ - { - "endIndex": 13154, - "startIndex": 13145, - "textRun": { - "content": "Entry 66\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 13145 - }, - { - "endIndex": 13343, - "paragraph": { - "elements": [ - { - "endIndex": 13343, - "startIndex": 13154, - "textRun": { - "content": "This is the content paragraph for Entry 66. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 66.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13154 - }, - { - "endIndex": 13352, - "paragraph": { - "elements": [ - { - "endIndex": 13352, - "startIndex": 13343, - "textRun": { - "content": "Entry 67\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 13343 - }, - { - "endIndex": 13541, - "paragraph": { - "elements": [ - { - "endIndex": 13541, - "startIndex": 13352, - "textRun": { - "content": "This is the content paragraph for Entry 67. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 67.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13352 - }, - { - "endIndex": 13550, - "paragraph": { - "elements": [ - { - "endIndex": 13550, - "startIndex": 13541, - "textRun": { - "content": "Entry 68\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 13541 - }, - { - "endIndex": 13739, - "paragraph": { - "elements": [ - { - "endIndex": 13739, - "startIndex": 13550, - "textRun": { - "content": "This is the content paragraph for Entry 68. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 68.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13550 - }, - { - "endIndex": 13748, - "paragraph": { - "elements": [ - { - "endIndex": 13748, - "startIndex": 13739, - "textRun": { - "content": "Entry 69\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 13739 - }, - { - "endIndex": 13937, - "paragraph": { - "elements": [ - { - "endIndex": 13937, - "startIndex": 13748, - "textRun": { - "content": "This is the content paragraph for Entry 69. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 69.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13748 - }, - { - "endIndex": 13946, - "paragraph": { - "elements": [ - { - "endIndex": 13946, - "startIndex": 13937, - "textRun": { - "content": "Entry 70\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 13937 - }, - { - "endIndex": 14135, - "paragraph": { - "elements": [ - { - "endIndex": 14135, - "startIndex": 13946, - "textRun": { - "content": "This is the content paragraph for Entry 70. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 70.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13946 - }, - { - "endIndex": 14144, - "paragraph": { - "elements": [ - { - "endIndex": 14144, - "startIndex": 14135, - "textRun": { - "content": "Entry 71\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 14135 - }, - { - "endIndex": 14333, - "paragraph": { - "elements": [ - { - "endIndex": 14333, - "startIndex": 14144, - "textRun": { - "content": "This is the content paragraph for Entry 71. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 71.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14144 - }, - { - "endIndex": 14342, - "paragraph": { - "elements": [ - { - "endIndex": 14342, - "startIndex": 14333, - "textRun": { - "content": "Entry 72\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 14333 - }, - { - "endIndex": 14531, - "paragraph": { - "elements": [ - { - "endIndex": 14531, - "startIndex": 14342, - "textRun": { - "content": "This is the content paragraph for Entry 72. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 72.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14342 - }, - { - "endIndex": 14540, - "paragraph": { - "elements": [ - { - "endIndex": 14540, - "startIndex": 14531, - "textRun": { - "content": "Entry 73\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 14531 - }, - { - "endIndex": 14729, - "paragraph": { - "elements": [ - { - "endIndex": 14729, - "startIndex": 14540, - "textRun": { - "content": "This is the content paragraph for Entry 73. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 73.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14540 - }, - { - "endIndex": 14738, - "paragraph": { - "elements": [ - { - "endIndex": 14738, - "startIndex": 14729, - "textRun": { - "content": "Entry 74\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 14729 - }, - { - "endIndex": 14927, - "paragraph": { - "elements": [ - { - "endIndex": 14927, - "startIndex": 14738, - "textRun": { - "content": "This is the content paragraph for Entry 74. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 74.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14738 - }, - { - "endIndex": 14936, - "paragraph": { - "elements": [ - { - "endIndex": 14936, - "startIndex": 14927, - "textRun": { - "content": "Entry 75\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 14927 - }, - { - "endIndex": 15125, - "paragraph": { - "elements": [ - { - "endIndex": 15125, - "startIndex": 14936, - "textRun": { - "content": "This is the content paragraph for Entry 75. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 75.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14936 - }, - { - "endIndex": 15134, - "paragraph": { - "elements": [ - { - "endIndex": 15134, - "startIndex": 15125, - "textRun": { - "content": "Entry 76\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 15125 - }, - { - "endIndex": 15323, - "paragraph": { - "elements": [ - { - "endIndex": 15323, - "startIndex": 15134, - "textRun": { - "content": "This is the content paragraph for Entry 76. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 76.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15134 - }, - { - "endIndex": 15332, - "paragraph": { - "elements": [ - { - "endIndex": 15332, - "startIndex": 15323, - "textRun": { - "content": "Entry 77\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 15323 - }, - { - "endIndex": 15521, - "paragraph": { - "elements": [ - { - "endIndex": 15521, - "startIndex": 15332, - "textRun": { - "content": "This is the content paragraph for Entry 77. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 77.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15332 - }, - { - "endIndex": 15530, - "paragraph": { - "elements": [ - { - "endIndex": 15530, - "startIndex": 15521, - "textRun": { - "content": "Entry 78\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 15521 - }, - { - "endIndex": 15719, - "paragraph": { - "elements": [ - { - "endIndex": 15719, - "startIndex": 15530, - "textRun": { - "content": "This is the content paragraph for Entry 78. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 78.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15530 - }, - { - "endIndex": 15728, - "paragraph": { - "elements": [ - { - "endIndex": 15728, - "startIndex": 15719, - "textRun": { - "content": "Entry 79\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 15719 - }, - { - "endIndex": 15917, - "paragraph": { - "elements": [ - { - "endIndex": 15917, - "startIndex": 15728, - "textRun": { - "content": "This is the content paragraph for Entry 79. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 79.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15728 - }, - { - "endIndex": 15926, - "paragraph": { - "elements": [ - { - "endIndex": 15926, - "startIndex": 15917, - "textRun": { - "content": "Entry 80\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 15917 - }, - { - "endIndex": 16115, - "paragraph": { - "elements": [ - { - "endIndex": 16115, - "startIndex": 15926, - "textRun": { - "content": "This is the content paragraph for Entry 80. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 80.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15926 - }, - { - "endIndex": 16124, - "paragraph": { - "elements": [ - { - "endIndex": 16124, - "startIndex": 16115, - "textRun": { - "content": "Entry 81\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 16115 - }, - { - "endIndex": 16313, - "paragraph": { - "elements": [ - { - "endIndex": 16313, - "startIndex": 16124, - "textRun": { - "content": "This is the content paragraph for Entry 81. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 81.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 16124 - }, - { - "endIndex": 16322, - "paragraph": { - "elements": [ - { - "endIndex": 16322, - "startIndex": 16313, - "textRun": { - "content": "Entry 82\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 16313 - }, - { - "endIndex": 16511, - "paragraph": { - "elements": [ - { - "endIndex": 16511, - "startIndex": 16322, - "textRun": { - "content": "This is the content paragraph for Entry 82. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 82.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 16322 - }, - { - "endIndex": 16520, - "paragraph": { - "elements": [ - { - "endIndex": 16520, - "startIndex": 16511, - "textRun": { - "content": "Entry 83\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 16511 - }, - { - "endIndex": 16709, - "paragraph": { - "elements": [ - { - "endIndex": 16709, - "startIndex": 16520, - "textRun": { - "content": "This is the content paragraph for Entry 83. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 83.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 16520 - }, - { - "endIndex": 16718, - "paragraph": { - "elements": [ - { - "endIndex": 16718, - "startIndex": 16709, - "textRun": { - "content": "Entry 84\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 16709 - }, - { - "endIndex": 16907, - "paragraph": { - "elements": [ - { - "endIndex": 16907, - "startIndex": 16718, - "textRun": { - "content": "This is the content paragraph for Entry 84. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 84.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 16718 - }, - { - "endIndex": 16916, - "paragraph": { - "elements": [ - { - "endIndex": 16916, - "startIndex": 16907, - "textRun": { - "content": "Entry 85\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 16907 - }, - { - "endIndex": 17105, - "paragraph": { - "elements": [ - { - "endIndex": 17105, - "startIndex": 16916, - "textRun": { - "content": "This is the content paragraph for Entry 85. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 85.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 16916 - }, - { - "endIndex": 17114, - "paragraph": { - "elements": [ - { - "endIndex": 17114, - "startIndex": 17105, - "textRun": { - "content": "Entry 86\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 17105 - }, - { - "endIndex": 17303, - "paragraph": { - "elements": [ - { - "endIndex": 17303, - "startIndex": 17114, - "textRun": { - "content": "This is the content paragraph for Entry 86. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 86.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17114 - }, - { - "endIndex": 17312, - "paragraph": { - "elements": [ - { - "endIndex": 17312, - "startIndex": 17303, - "textRun": { - "content": "Entry 87\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 17303 - }, - { - "endIndex": 17501, - "paragraph": { - "elements": [ - { - "endIndex": 17501, - "startIndex": 17312, - "textRun": { - "content": "This is the content paragraph for Entry 87. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 87.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17312 - }, - { - "endIndex": 17510, - "paragraph": { - "elements": [ - { - "endIndex": 17510, - "startIndex": 17501, - "textRun": { - "content": "Entry 88\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 17501 - }, - { - "endIndex": 17699, - "paragraph": { - "elements": [ - { - "endIndex": 17699, - "startIndex": 17510, - "textRun": { - "content": "This is the content paragraph for Entry 88. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 88.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17510 - }, - { - "endIndex": 17708, - "paragraph": { - "elements": [ - { - "endIndex": 17708, - "startIndex": 17699, - "textRun": { - "content": "Entry 89\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 17699 - }, - { - "endIndex": 17897, - "paragraph": { - "elements": [ - { - "endIndex": 17897, - "startIndex": 17708, - "textRun": { - "content": "This is the content paragraph for Entry 89. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 89.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17708 - }, - { - "endIndex": 17906, - "paragraph": { - "elements": [ - { - "endIndex": 17906, - "startIndex": 17897, - "textRun": { - "content": "Entry 90\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 17897 - }, - { - "endIndex": 18095, - "paragraph": { - "elements": [ - { - "endIndex": 18095, - "startIndex": 17906, - "textRun": { - "content": "This is the content paragraph for Entry 90. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 90.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17906 - }, - { - "endIndex": 18104, - "paragraph": { - "elements": [ - { - "endIndex": 18104, - "startIndex": 18095, - "textRun": { - "content": "Entry 91\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 18095 - }, - { - "endIndex": 18293, - "paragraph": { - "elements": [ - { - "endIndex": 18293, - "startIndex": 18104, - "textRun": { - "content": "This is the content paragraph for Entry 91. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 91.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18104 - }, - { - "endIndex": 18302, - "paragraph": { - "elements": [ - { - "endIndex": 18302, - "startIndex": 18293, - "textRun": { - "content": "Entry 92\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 18293 - }, - { - "endIndex": 18491, - "paragraph": { - "elements": [ - { - "endIndex": 18491, - "startIndex": 18302, - "textRun": { - "content": "This is the content paragraph for Entry 92. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 92.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18302 - }, - { - "endIndex": 18500, - "paragraph": { - "elements": [ - { - "endIndex": 18500, - "startIndex": 18491, - "textRun": { - "content": "Entry 93\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 18491 - }, - { - "endIndex": 18689, - "paragraph": { - "elements": [ - { - "endIndex": 18689, - "startIndex": 18500, - "textRun": { - "content": "This is the content paragraph for Entry 93. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 93.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18500 - }, - { - "endIndex": 18698, - "paragraph": { - "elements": [ - { - "endIndex": 18698, - "startIndex": 18689, - "textRun": { - "content": "Entry 94\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 18689 - }, - { - "endIndex": 18887, - "paragraph": { - "elements": [ - { - "endIndex": 18887, - "startIndex": 18698, - "textRun": { - "content": "This is the content paragraph for Entry 94. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 94.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18698 - }, - { - "endIndex": 18896, - "paragraph": { - "elements": [ - { - "endIndex": 18896, - "startIndex": 18887, - "textRun": { - "content": "Entry 95\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 18887 - }, - { - "endIndex": 19085, - "paragraph": { - "elements": [ - { - "endIndex": 19085, - "startIndex": 18896, - "textRun": { - "content": "This is the content paragraph for Entry 95. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 95.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18896 - }, - { - "endIndex": 19094, - "paragraph": { - "elements": [ - { - "endIndex": 19094, - "startIndex": 19085, - "textRun": { - "content": "Entry 96\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 19085 - }, - { - "endIndex": 19283, - "paragraph": { - "elements": [ - { - "endIndex": 19283, - "startIndex": 19094, - "textRun": { - "content": "This is the content paragraph for Entry 96. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 96.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19094 - }, - { - "endIndex": 19292, - "paragraph": { - "elements": [ - { - "endIndex": 19292, - "startIndex": 19283, - "textRun": { - "content": "Entry 97\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 19283 - }, - { - "endIndex": 19481, - "paragraph": { - "elements": [ - { - "endIndex": 19481, - "startIndex": 19292, - "textRun": { - "content": "This is the content paragraph for Entry 97. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 97.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19292 - }, - { - "endIndex": 19490, - "paragraph": { - "elements": [ - { - "endIndex": 19490, - "startIndex": 19481, - "textRun": { - "content": "Entry 98\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 19481 - }, - { - "endIndex": 19679, - "paragraph": { - "elements": [ - { - "endIndex": 19679, - "startIndex": 19490, - "textRun": { - "content": "This is the content paragraph for Entry 98. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 98.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19490 - }, - { - "endIndex": 19688, - "paragraph": { - "elements": [ - { - "endIndex": 19688, - "startIndex": 19679, - "textRun": { - "content": "Entry 99\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 19679 - }, - { - "endIndex": 19877, - "paragraph": { - "elements": [ - { - "endIndex": 19877, - "startIndex": 19688, - "textRun": { - "content": "This is the content paragraph for Entry 99. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 99.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19688 - }, - { - "endIndex": 19887, - "paragraph": { - "elements": [ - { - "endIndex": 19887, - "startIndex": 19877, - "textRun": { - "content": "Entry 100\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 19877 - }, - { - "endIndex": 20078, - "paragraph": { - "elements": [ - { - "endIndex": 20078, - "startIndex": 19887, - "textRun": { - "content": "This is the content paragraph for Entry 100. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 100.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19887 - }, - { - "endIndex": 20088, - "paragraph": { - "elements": [ - { - "endIndex": 20088, - "startIndex": 20078, - "textRun": { - "content": "Entry 101\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 20078 - }, - { - "endIndex": 20279, - "paragraph": { - "elements": [ - { - "endIndex": 20279, - "startIndex": 20088, - "textRun": { - "content": "This is the content paragraph for Entry 101. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 101.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20088 - }, - { - "endIndex": 20289, - "paragraph": { - "elements": [ - { - "endIndex": 20289, - "startIndex": 20279, - "textRun": { - "content": "Entry 102\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 20279 - }, - { - "endIndex": 20480, - "paragraph": { - "elements": [ - { - "endIndex": 20480, - "startIndex": 20289, - "textRun": { - "content": "This is the content paragraph for Entry 102. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 102.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20289 - }, - { - "endIndex": 20490, - "paragraph": { - "elements": [ - { - "endIndex": 20490, - "startIndex": 20480, - "textRun": { - "content": "Entry 103\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 20480 - }, - { - "endIndex": 20681, - "paragraph": { - "elements": [ - { - "endIndex": 20681, - "startIndex": 20490, - "textRun": { - "content": "This is the content paragraph for Entry 103. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 103.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20490 - }, - { - "endIndex": 20691, - "paragraph": { - "elements": [ - { - "endIndex": 20691, - "startIndex": 20681, - "textRun": { - "content": "Entry 104\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 20681 - }, - { - "endIndex": 20882, - "paragraph": { - "elements": [ - { - "endIndex": 20882, - "startIndex": 20691, - "textRun": { - "content": "This is the content paragraph for Entry 104. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 104.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20691 - }, - { - "endIndex": 20892, - "paragraph": { - "elements": [ - { - "endIndex": 20892, - "startIndex": 20882, - "textRun": { - "content": "Entry 105\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 20882 - }, - { - "endIndex": 21083, - "paragraph": { - "elements": [ - { - "endIndex": 21083, - "startIndex": 20892, - "textRun": { - "content": "This is the content paragraph for Entry 105. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 105.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20892 - }, - { - "endIndex": 21093, - "paragraph": { - "elements": [ - { - "endIndex": 21093, - "startIndex": 21083, - "textRun": { - "content": "Entry 106\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 21083 - }, - { - "endIndex": 21284, - "paragraph": { - "elements": [ - { - "endIndex": 21284, - "startIndex": 21093, - "textRun": { - "content": "This is the content paragraph for Entry 106. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 106.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21093 - }, - { - "endIndex": 21294, - "paragraph": { - "elements": [ - { - "endIndex": 21294, - "startIndex": 21284, - "textRun": { - "content": "Entry 107\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 21284 - }, - { - "endIndex": 21485, - "paragraph": { - "elements": [ - { - "endIndex": 21485, - "startIndex": 21294, - "textRun": { - "content": "This is the content paragraph for Entry 107. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 107.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21294 - }, - { - "endIndex": 21495, - "paragraph": { - "elements": [ - { - "endIndex": 21495, - "startIndex": 21485, - "textRun": { - "content": "Entry 108\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 21485 - }, - { - "endIndex": 21686, - "paragraph": { - "elements": [ - { - "endIndex": 21686, - "startIndex": 21495, - "textRun": { - "content": "This is the content paragraph for Entry 108. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 108.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21495 - }, - { - "endIndex": 21696, - "paragraph": { - "elements": [ - { - "endIndex": 21696, - "startIndex": 21686, - "textRun": { - "content": "Entry 109\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 21686 - }, - { - "endIndex": 21887, - "paragraph": { - "elements": [ - { - "endIndex": 21887, - "startIndex": 21696, - "textRun": { - "content": "This is the content paragraph for Entry 109. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 109.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21696 - }, - { - "endIndex": 21897, - "paragraph": { - "elements": [ - { - "endIndex": 21897, - "startIndex": 21887, - "textRun": { - "content": "Entry 110\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 21887 - }, - { - "endIndex": 22088, - "paragraph": { - "elements": [ - { - "endIndex": 22088, - "startIndex": 21897, - "textRun": { - "content": "This is the content paragraph for Entry 110. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 110.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21897 - }, - { - "endIndex": 22098, - "paragraph": { - "elements": [ - { - "endIndex": 22098, - "startIndex": 22088, - "textRun": { - "content": "Entry 111\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 22088 - }, - { - "endIndex": 22289, - "paragraph": { - "elements": [ - { - "endIndex": 22289, - "startIndex": 22098, - "textRun": { - "content": "This is the content paragraph for Entry 111. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 111.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22098 - }, - { - "endIndex": 22299, - "paragraph": { - "elements": [ - { - "endIndex": 22299, - "startIndex": 22289, - "textRun": { - "content": "Entry 112\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 22289 - }, - { - "endIndex": 22490, - "paragraph": { - "elements": [ - { - "endIndex": 22490, - "startIndex": 22299, - "textRun": { - "content": "This is the content paragraph for Entry 112. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 112.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22299 - }, - { - "endIndex": 22500, - "paragraph": { - "elements": [ - { - "endIndex": 22500, - "startIndex": 22490, - "textRun": { - "content": "Entry 113\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 22490 - }, - { - "endIndex": 22691, - "paragraph": { - "elements": [ - { - "endIndex": 22691, - "startIndex": 22500, - "textRun": { - "content": "This is the content paragraph for Entry 113. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 113.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22500 - }, - { - "endIndex": 22701, - "paragraph": { - "elements": [ - { - "endIndex": 22701, - "startIndex": 22691, - "textRun": { - "content": "Entry 114\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 22691 - }, - { - "endIndex": 22892, - "paragraph": { - "elements": [ - { - "endIndex": 22892, - "startIndex": 22701, - "textRun": { - "content": "This is the content paragraph for Entry 114. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 114.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22701 - }, - { - "endIndex": 22902, - "paragraph": { - "elements": [ - { - "endIndex": 22902, - "startIndex": 22892, - "textRun": { - "content": "Entry 115\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 22892 - }, - { - "endIndex": 23093, - "paragraph": { - "elements": [ - { - "endIndex": 23093, - "startIndex": 22902, - "textRun": { - "content": "This is the content paragraph for Entry 115. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 115.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22902 - }, - { - "endIndex": 23103, - "paragraph": { - "elements": [ - { - "endIndex": 23103, - "startIndex": 23093, - "textRun": { - "content": "Entry 116\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 23093 - }, - { - "endIndex": 23294, - "paragraph": { - "elements": [ - { - "endIndex": 23294, - "startIndex": 23103, - "textRun": { - "content": "This is the content paragraph for Entry 116. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 116.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23103 - }, - { - "endIndex": 23304, - "paragraph": { - "elements": [ - { - "endIndex": 23304, - "startIndex": 23294, - "textRun": { - "content": "Entry 117\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 23294 - }, - { - "endIndex": 23495, - "paragraph": { - "elements": [ - { - "endIndex": 23495, - "startIndex": 23304, - "textRun": { - "content": "This is the content paragraph for Entry 117. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 117.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23304 - }, - { - "endIndex": 23505, - "paragraph": { - "elements": [ - { - "endIndex": 23505, - "startIndex": 23495, - "textRun": { - "content": "Entry 118\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 23495 - }, - { - "endIndex": 23696, - "paragraph": { - "elements": [ - { - "endIndex": 23696, - "startIndex": 23505, - "textRun": { - "content": "This is the content paragraph for Entry 118. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 118.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23505 - }, - { - "endIndex": 23706, - "paragraph": { - "elements": [ - { - "endIndex": 23706, - "startIndex": 23696, - "textRun": { - "content": "Entry 119\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 23696 - }, - { - "endIndex": 23897, - "paragraph": { - "elements": [ - { - "endIndex": 23897, - "startIndex": 23706, - "textRun": { - "content": "This is the content paragraph for Entry 119. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 119.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23706 - }, - { - "endIndex": 23907, - "paragraph": { - "elements": [ - { - "endIndex": 23907, - "startIndex": 23897, - "textRun": { - "content": "Entry 120\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 23897 - }, - { - "endIndex": 24098, - "paragraph": { - "elements": [ - { - "endIndex": 24098, - "startIndex": 23907, - "textRun": { - "content": "This is the content paragraph for Entry 120. It contains a few sentences of text meant to simulate real document data. The quick brown fox jumps over the lazy dog \u2014 example content line 120.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23907 - }, - { - "endIndex": 24115, - "paragraph": { - "elements": [ - { - "endIndex": 24115, - "startIndex": 24098, - "textRun": { - "content": "Expected Outcome\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 24098 - }, - { - "endIndex": 24328, - "paragraph": { - "elements": [ - { - "endIndex": 24328, - "startIndex": 24115, - "textRun": { - "content": "The importer should successfully process all 120 entries without timing out or exceeding API rate limits. If rate limiting occurs, retries should be handled gracefully, and all entries should import successfully.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24115 - } - ] - }, - "documentStyle": { - "background": { - "color": {} - }, - "documentFormat": { - "documentMode": "PAGES" - }, - "marginBottom": { - "magnitude": 72, - "unit": "PT" - }, - "marginFooter": { - "magnitude": 36, - "unit": "PT" - }, - "marginHeader": { - "magnitude": 36, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 90, - "unit": "PT" - }, - "marginRight": { - "magnitude": 90, - "unit": "PT" - }, - "marginTop": { - "magnitude": 72, - "unit": "PT" - }, - "pageNumberStart": 1, - "pageSize": { - "height": { - "magnitude": 792, - "unit": "PT" - }, - "width": { - "magnitude": 612, - "unit": "PT" - } - }, - "useCustomHeaderFooterMargins": true - }, - "lists": { - "kix.list.1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.3": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 36, - "unit": "PT" - }, - "indentStart": { - "magnitude": 54, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 36, - "unit": "PT" - }, - "indentStart": { - "magnitude": 54, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 72, - "unit": "PT" - }, - "indentStart": { - "magnitude": 90, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - } - }, - "namedStyles": { - "styles": [ - { - "namedStyleType": "NORMAL_TEXT", - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 10, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Cambria", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_1", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 24, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 14, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5686275, - "green": 0.3764706, - "red": 0.21176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_2", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 13, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_3", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_4", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_5", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.38039216, - "green": 0.24705882, - "red": 0.14117648 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_6", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.38039216, - "green": 0.24705882, - "red": 0.14117648 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "TITLE", - "paragraphStyle": { - "borderBottom": { - "color": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "dashStyle": "SOLID", - "padding": { - "magnitude": 4, - "unit": "PT" - }, - "width": { - "magnitude": 1, - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "spaceBelow": { - "magnitude": 15, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "fontSize": { - "magnitude": 26, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.3647059, - "green": 0.21176471, - "red": 0.09019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "SUBTITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - }, - "textStyle": { - "fontSize": { - "magnitude": 12, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - } - ] - } - }, - "tabProperties": { - "index": 0, - "tabId": "t.0", - "title": "Tab 1" - } - } - ], - "title": "Doc_5_Bulk_Entry_Stress_Test" -} \ No newline at end of file diff --git a/apps/google-docs/src/utils/test_docs_json/Doc_6_Multilingual_Test.json b/apps/google-docs/src/utils/test_docs_json/Doc_6_Multilingual_Test.json deleted file mode 100644 index 2ff02e069e..0000000000 --- a/apps/google-docs/src/utils/test_docs_json/Doc_6_Multilingual_Test.json +++ /dev/null @@ -1,1875 +0,0 @@ -{ - "documentId": "1a4tbal0Xva7ezmEslgQCZGUMC15OFRqh-XQEBbyWGlU", - "suggestionsViewMode": "PREVIEW_WITHOUT_SUGGESTIONS", - "tabs": [ - { - "documentTab": { - "body": { - "content": [ - { - "endIndex": 1, - "sectionBreak": { - "sectionStyle": { - "columnSeparatorStyle": "NONE", - "contentDirection": "LEFT_TO_RIGHT", - "sectionType": "CONTINUOUS" - } - } - }, - { - "endIndex": 37, - "paragraph": { - "elements": [ - { - "endIndex": 37, - "startIndex": 1, - "textRun": { - "content": "Document Import \u2014 Multilingual Test\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 1 - }, - { - "endIndex": 46, - "paragraph": { - "elements": [ - { - "endIndex": 46, - "startIndex": 37, - "textRun": { - "content": "Overview\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 37 - }, - { - "endIndex": 327, - "paragraph": { - "elements": [ - { - "endIndex": 327, - "startIndex": 46, - "textRun": { - "content": "This document tests the importer's ability to handle multiple languages and encodings within a single document. It includes content in English, French, Spanish, Japanese, and Arabic. The importer must preserve text direction, special characters, and Unicode formatting accurately.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 46 - }, - { - "endIndex": 343, - "paragraph": { - "elements": [ - { - "endIndex": 343, - "startIndex": 327, - "textRun": { - "content": "English Section\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 327 - }, - { - "endIndex": 427, - "paragraph": { - "elements": [ - { - "endIndex": 427, - "startIndex": 343, - "textRun": { - "content": "Hello! This is an English paragraph meant to validate basic Latin character import.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 343 - }, - { - "endIndex": 445, - "paragraph": { - "elements": [ - { - "endIndex": 445, - "startIndex": 427, - "textRun": { - "content": "Section Fran\u00e7aise\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 427 - }, - { - "endIndex": 555, - "paragraph": { - "elements": [ - { - "endIndex": 555, - "startIndex": 445, - "textRun": { - "content": "Bonjour ! Ceci est un paragraphe en fran\u00e7ais pour valider l'importation des caract\u00e8res accentu\u00e9s et sp\u00e9ciaux.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 445 - }, - { - "endIndex": 574, - "paragraph": { - "elements": [ - { - "endIndex": 574, - "startIndex": 555, - "textRun": { - "content": "Secci\u00f3n en Espa\u00f1ol\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 555 - }, - { - "endIndex": 673, - "paragraph": { - "elements": [ - { - "endIndex": 673, - "startIndex": 574, - "textRun": { - "content": "\u00a1Hola! Este es un p\u00e1rrafo en espa\u00f1ol con signos de exclamaci\u00f3n invertidos y caracteres como \u00f1 y \u00e1.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 574 - }, - { - "endIndex": 683, - "paragraph": { - "elements": [ - { - "endIndex": 683, - "startIndex": 673, - "textRun": { - "content": "\u65e5\u672c\u8a9e\u306e\u30bb\u30af\u30b7\u30e7\u30f3\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 673 - }, - { - "endIndex": 733, - "paragraph": { - "elements": [ - { - "endIndex": 733, - "startIndex": 683, - "textRun": { - "content": "\u3053\u3093\u306b\u3061\u306f\uff01\u3053\u308c\u306f\u65e5\u672c\u8a9e\u306e\u6bb5\u843d\u3067\u3001\u30a4\u30f3\u30dd\u30fc\u30c8\u6642\u306bUnicode\u306e\u6b63\u78ba\u6027\u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306e\u30c6\u30b9\u30c8\u3067\u3059\u3002\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 683 - }, - { - "endIndex": 746, - "paragraph": { - "elements": [ - { - "endIndex": 746, - "startIndex": 733, - "textRun": { - "content": "\u0627\u0644\u0642\u0633\u0645 \u0627\u0644\u0639\u0631\u0628\u064a\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 733 - }, - { - "endIndex": 835, - "paragraph": { - "elements": [ - { - "endIndex": 835, - "startIndex": 746, - "textRun": { - "content": "\u0645\u0631\u062d\u0628\u064b\u0627! \u0647\u0630\u0647 \u0641\u0642\u0631\u0629 \u0628\u0627\u0644\u0644\u063a\u0629 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0644\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u062f\u0639\u0645 \u0627\u0644\u0646\u0635 \u0645\u0646 \u0627\u0644\u064a\u0645\u064a\u0646 \u0625\u0644\u0649 \u0627\u0644\u064a\u0633\u0627\u0631 \u0623\u062b\u0646\u0627\u0621 \u0627\u0644\u0627\u0633\u062a\u064a\u0631\u0627\u062f.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 746 - }, - { - "endIndex": 858, - "paragraph": { - "elements": [ - { - "endIndex": 858, - "startIndex": 835, - "textRun": { - "content": "Mixed Language Example\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 835 - }, - { - "endIndex": 1021, - "paragraph": { - "elements": [ - { - "endIndex": 1021, - "startIndex": 858, - "textRun": { - "content": "This paragraph mixes languages: Bonjour, this is an English-French hybrid. \u00a1Hola! \u3053\u3093\u306b\u3061\u306f! \u0645\u0631\u062d\u0628\u064b\u0627! Each script should maintain its formatting and display correctly.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 858 - }, - { - "endIndex": 1038, - "paragraph": { - "elements": [ - { - "endIndex": 1038, - "startIndex": 1021, - "textRun": { - "content": "Expected Outcome\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 1021 - }, - { - "endIndex": 1266, - "paragraph": { - "elements": [ - { - "endIndex": 1266, - "startIndex": 1038, - "textRun": { - "content": "All multilingual content should appear correctly encoded and displayed. The importer must support both left-to-right and right-to-left scripts without data loss, ensuring that accented characters and Unicode text are preserved.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1038 - } - ] - }, - "documentStyle": { - "background": { - "color": {} - }, - "documentFormat": { - "documentMode": "PAGES" - }, - "marginBottom": { - "magnitude": 72, - "unit": "PT" - }, - "marginFooter": { - "magnitude": 36, - "unit": "PT" - }, - "marginHeader": { - "magnitude": 36, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 90, - "unit": "PT" - }, - "marginRight": { - "magnitude": 90, - "unit": "PT" - }, - "marginTop": { - "magnitude": 72, - "unit": "PT" - }, - "pageNumberStart": 1, - "pageSize": { - "height": { - "magnitude": 792, - "unit": "PT" - }, - "width": { - "magnitude": 612, - "unit": "PT" - } - }, - "useCustomHeaderFooterMargins": true - }, - "lists": { - "kix.list.1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.3": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 36, - "unit": "PT" - }, - "indentStart": { - "magnitude": 54, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 36, - "unit": "PT" - }, - "indentStart": { - "magnitude": 54, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 72, - "unit": "PT" - }, - "indentStart": { - "magnitude": 90, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - } - }, - "namedStyles": { - "styles": [ - { - "namedStyleType": "NORMAL_TEXT", - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 10, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Cambria", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_1", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 24, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 14, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5686275, - "green": 0.3764706, - "red": 0.21176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_2", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 13, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_3", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_4", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_5", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.38039216, - "green": 0.24705882, - "red": 0.14117648 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_6", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.38039216, - "green": 0.24705882, - "red": 0.14117648 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "TITLE", - "paragraphStyle": { - "borderBottom": { - "color": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "dashStyle": "SOLID", - "padding": { - "magnitude": 4, - "unit": "PT" - }, - "width": { - "magnitude": 1, - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "spaceBelow": { - "magnitude": 15, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "fontSize": { - "magnitude": 26, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.3647059, - "green": 0.21176471, - "red": 0.09019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "SUBTITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - }, - "textStyle": { - "fontSize": { - "magnitude": 12, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - } - ] - } - }, - "tabProperties": { - "index": 0, - "tabId": "t.0", - "title": "Tab 1" - } - } - ], - "title": "Doc_6_Multilingual_Test" -} \ No newline at end of file diff --git a/apps/google-docs/src/utils/test_docs_json/Doc_7_Edge_Cases_Test.json b/apps/google-docs/src/utils/test_docs_json/Doc_7_Edge_Cases_Test.json deleted file mode 100644 index b7c5178502..0000000000 --- a/apps/google-docs/src/utils/test_docs_json/Doc_7_Edge_Cases_Test.json +++ /dev/null @@ -1,5063 +0,0 @@ -{ - "documentId": "1kL_humdui_KBfXbKj5bkTM29MjGRfykHPdZBz5TbZrE", - "suggestionsViewMode": "PREVIEW_WITHOUT_SUGGESTIONS", - "tabs": [ - { - "documentTab": { - "body": { - "content": [ - { - "endIndex": 1, - "sectionBreak": { - "sectionStyle": { - "columnSeparatorStyle": "NONE", - "contentDirection": "LEFT_TO_RIGHT", - "sectionType": "CONTINUOUS" - } - } - }, - { - "endIndex": 35, - "paragraph": { - "elements": [ - { - "endIndex": 35, - "startIndex": 1, - "textRun": { - "content": "Document Import \u2014 Edge Cases Test\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 1 - }, - { - "endIndex": 44, - "paragraph": { - "elements": [ - { - "endIndex": 44, - "startIndex": 35, - "textRun": { - "content": "Overview\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 35 - }, - { - "endIndex": 290, - "paragraph": { - "elements": [ - { - "endIndex": 290, - "startIndex": 44, - "textRun": { - "content": "This document is designed to test the importer\u2019s behavior with unusual or problematic inputs, including empty content, malformed structures, and special characters. The goal is to ensure the importer handles edge cases gracefully without errors.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 44 - }, - { - "endIndex": 316, - "paragraph": { - "elements": [ - { - "endIndex": 316, - "startIndex": 290, - "textRun": { - "content": "Malformed Content Example\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 290 - }, - { - "endIndex": 411, - "paragraph": { - "elements": [ - { - "endIndex": 411, - "startIndex": 316, - "textRun": { - "content": "This section contains intentionally malformed list and table examples to test error tolerance.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 316 - }, - { - "endIndex": 459, - "paragraph": { - "elements": [ - { - "endIndex": 459, - "startIndex": 411, - "textRun": { - "content": "Improper list start without bullets or numbers:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 411 - }, - { - "endIndex": 474, - "paragraph": { - "elements": [ - { - "endIndex": 474, - "startIndex": 459, - "textRun": { - "content": "- - - Item one\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 459 - }, - { - "endIndex": 487, - "paragraph": { - "elements": [ - { - "endIndex": 487, - "startIndex": 474, - "textRun": { - "content": "1.. Item two\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 474 - }, - { - "endIndex": 518, - "paragraph": { - "elements": [ - { - "endIndex": 518, - "startIndex": 487, - "textRun": { - "content": "\u2022 Mixed bullet character usage\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 487 - }, - { - "endIndex": 556, - "paragraph": { - "elements": [ - { - "endIndex": 556, - "startIndex": 518, - "textRun": { - "content": "Malformed table structure simulation:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 518 - }, - { - "endIndex": 580, - "paragraph": { - "elements": [ - { - "endIndex": 580, - "startIndex": 556, - "textRun": { - "content": "| Header 1 | Header 2 |\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 556 - }, - { - "endIndex": 627, - "paragraph": { - "elements": [ - { - "endIndex": 627, - "startIndex": 580, - "textRun": { - "content": "| Value 1 | Value 2 | Value 3 (extra column) |\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 580 - }, - { - "endIndex": 645, - "paragraph": { - "elements": [ - { - "endIndex": 645, - "startIndex": 627, - "textRun": { - "content": "| Only one cell |\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 627 - }, - { - "endIndex": 646, - "paragraph": { - "elements": [ - { - "endIndex": 646, - "startIndex": 645, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 645 - }, - { - "endIndex": 700, - "startIndex": 646, - "table": { - "columns": 6, - "rows": 4, - "tableRows": [ - { - "endIndex": 660, - "startIndex": 647, - "tableCells": [ - { - "content": [ - { - "endIndex": 650, - "paragraph": { - "elements": [ - { - "endIndex": 650, - "startIndex": 649, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 649 - } - ], - "endIndex": 650, - "startIndex": 648, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 652, - "paragraph": { - "elements": [ - { - "endIndex": 652, - "startIndex": 651, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 651 - } - ], - "endIndex": 652, - "startIndex": 650, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 654, - "paragraph": { - "elements": [ - { - "endIndex": 654, - "startIndex": 653, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 653 - } - ], - "endIndex": 654, - "startIndex": 652, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 656, - "paragraph": { - "elements": [ - { - "endIndex": 656, - "startIndex": 655, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 655 - } - ], - "endIndex": 656, - "startIndex": 654, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 658, - "paragraph": { - "elements": [ - { - "endIndex": 658, - "startIndex": 657, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 657 - } - ], - "endIndex": 658, - "startIndex": 656, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 660, - "paragraph": { - "elements": [ - { - "endIndex": 660, - "startIndex": 659, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 659 - } - ], - "endIndex": 660, - "startIndex": 658, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 673, - "startIndex": 660, - "tableCells": [ - { - "content": [ - { - "endIndex": 663, - "paragraph": { - "elements": [ - { - "endIndex": 663, - "startIndex": 662, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 662 - } - ], - "endIndex": 663, - "startIndex": 661, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 665, - "paragraph": { - "elements": [ - { - "endIndex": 665, - "startIndex": 664, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 664 - } - ], - "endIndex": 665, - "startIndex": 663, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 667, - "paragraph": { - "elements": [ - { - "endIndex": 667, - "startIndex": 666, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 666 - } - ], - "endIndex": 667, - "startIndex": 665, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 669, - "paragraph": { - "elements": [ - { - "endIndex": 669, - "startIndex": 668, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 668 - } - ], - "endIndex": 669, - "startIndex": 667, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 671, - "paragraph": { - "elements": [ - { - "endIndex": 671, - "startIndex": 670, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 670 - } - ], - "endIndex": 671, - "startIndex": 669, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 673, - "paragraph": { - "elements": [ - { - "endIndex": 673, - "startIndex": 672, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 672 - } - ], - "endIndex": 673, - "startIndex": 671, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 686, - "startIndex": 673, - "tableCells": [ - { - "content": [ - { - "endIndex": 676, - "paragraph": { - "elements": [ - { - "endIndex": 676, - "startIndex": 675, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 675 - } - ], - "endIndex": 676, - "startIndex": 674, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 678, - "paragraph": { - "elements": [ - { - "endIndex": 678, - "startIndex": 677, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 677 - } - ], - "endIndex": 678, - "startIndex": 676, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 680, - "paragraph": { - "elements": [ - { - "endIndex": 680, - "startIndex": 679, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 679 - } - ], - "endIndex": 680, - "startIndex": 678, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 682, - "paragraph": { - "elements": [ - { - "endIndex": 682, - "startIndex": 681, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 681 - } - ], - "endIndex": 682, - "startIndex": 680, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 684, - "paragraph": { - "elements": [ - { - "endIndex": 684, - "startIndex": 683, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 683 - } - ], - "endIndex": 684, - "startIndex": 682, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 686, - "paragraph": { - "elements": [ - { - "endIndex": 686, - "startIndex": 685, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 685 - } - ], - "endIndex": 686, - "startIndex": 684, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 699, - "startIndex": 686, - "tableCells": [ - { - "content": [ - { - "endIndex": 689, - "paragraph": { - "elements": [ - { - "endIndex": 689, - "startIndex": 688, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 688 - } - ], - "endIndex": 689, - "startIndex": 687, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 691, - "paragraph": { - "elements": [ - { - "endIndex": 691, - "startIndex": 690, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 690 - } - ], - "endIndex": 691, - "startIndex": 689, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 693, - "paragraph": { - "elements": [ - { - "endIndex": 693, - "startIndex": 692, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 692 - } - ], - "endIndex": 693, - "startIndex": 691, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 695, - "paragraph": { - "elements": [ - { - "endIndex": 695, - "startIndex": 694, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 694 - } - ], - "endIndex": 695, - "startIndex": 693, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 697, - "paragraph": { - "elements": [ - { - "endIndex": 697, - "startIndex": 696, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 696 - } - ], - "endIndex": 697, - "startIndex": 695, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 699, - "paragraph": { - "elements": [ - { - "endIndex": 699, - "startIndex": 698, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 698 - } - ], - "endIndex": 699, - "startIndex": 697, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - }, - { - "widthType": "EVENLY_DISTRIBUTED" - }, - { - "widthType": "EVENLY_DISTRIBUTED" - }, - { - "widthType": "EVENLY_DISTRIBUTED" - }, - { - "widthType": "EVENLY_DISTRIBUTED" - }, - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 701, - "paragraph": { - "elements": [ - { - "endIndex": 701, - "startIndex": 700, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 700 - }, - { - "endIndex": 732, - "paragraph": { - "elements": [ - { - "endIndex": 732, - "startIndex": 701, - "textRun": { - "content": "Special Characters and Symbols\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 701 - }, - { - "endIndex": 831, - "paragraph": { - "elements": [ - { - "endIndex": 831, - "startIndex": 732, - "textRun": { - "content": "This section includes special characters and emoji to test Unicode handling and parsing stability.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 732 - }, - { - "endIndex": 861, - "paragraph": { - "elements": [ - { - "endIndex": 861, - "startIndex": 831, - "textRun": { - "content": "Emoji test: \ud83d\ude00 \ud83d\ude0e \ud83d\ude80 \ud83c\udf0d \ud83d\udca1 \ud83d\udd25\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 831 - }, - { - "endIndex": 917, - "paragraph": { - "elements": [ - { - "endIndex": 917, - "startIndex": 861, - "textRun": { - "content": "Symbols test: \u00a9 \u00ae \u2122 \u2211 \u221a \u221e \u03a9 \u2248 \u2264 \u2265 \u00b1 \u00f7 \u00d7 \u00b5 \u00a7 \u00b6 \u2022 \u00a2 \u00a3 \u00a5 \u20ac\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 861 - }, - { - "endIndex": 999, - "paragraph": { - "elements": [ - { - "endIndex": 999, - "startIndex": 917, - "textRun": { - "content": "Combined diacritics: a\u0301 e\u0302 i\u0308 o\u0303 u\u0304 \u2014 ensure these remain distinct when imported.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 917 - }, - { - "endIndex": 1025, - "paragraph": { - "elements": [ - { - "endIndex": 1025, - "startIndex": 999, - "textRun": { - "content": "Oversized Content Example\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 999 - }, - { - "endIndex": 1232, - "paragraph": { - "elements": [ - { - "endIndex": 1232, - "startIndex": 1025, - "textRun": { - "content": "This section simulates a document exceeding expected content limits. In production, this would include extremely long text blocks or deeply nested JSON-like content to trigger import size handling. Example:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1025 - }, - { - "endIndex": 6249, - "paragraph": { - "elements": [ - { - "endIndex": 6249, - "startIndex": 1232, - "textRun": { - "content": "{ 'sample': 'data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data data ' }\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1232 - }, - { - "endIndex": 6266, - "paragraph": { - "elements": [ - { - "endIndex": 6266, - "startIndex": 6249, - "textRun": { - "content": "Expected Outcome\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 6249 - }, - { - "endIndex": 6470, - "paragraph": { - "elements": [ - { - "endIndex": 6470, - "startIndex": 6266, - "textRun": { - "content": "Importer should successfully process malformed and special content without throwing unhandled exceptions. Empty or oversized documents should be logged and skipped gracefully, preserving diagnostic data.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6266 - } - ] - }, - "documentStyle": { - "background": { - "color": {} - }, - "documentFormat": { - "documentMode": "PAGES" - }, - "marginBottom": { - "magnitude": 72, - "unit": "PT" - }, - "marginFooter": { - "magnitude": 36, - "unit": "PT" - }, - "marginHeader": { - "magnitude": 36, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 90, - "unit": "PT" - }, - "marginRight": { - "magnitude": 90, - "unit": "PT" - }, - "marginTop": { - "magnitude": 72, - "unit": "PT" - }, - "pageNumberStart": 1, - "pageSize": { - "height": { - "magnitude": 792, - "unit": "PT" - }, - "width": { - "magnitude": 612, - "unit": "PT" - } - }, - "useCustomHeaderFooterMargins": true - }, - "lists": { - "kix.list.1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.3": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 36, - "unit": "PT" - }, - "indentStart": { - "magnitude": 54, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Noto Sans Symbols", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "magnitude": 18, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 36, - "unit": "PT" - }, - "indentStart": { - "magnitude": 54, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - }, - "kix.list.9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 72, - "unit": "PT" - }, - "indentStart": { - "magnitude": 90, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - }, - { - "bulletAlignment": "START", - "glyphType": "NONE", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "startNumber": 1, - "textStyle": {} - } - ] - } - } - }, - "namedStyles": { - "styles": [ - { - "namedStyleType": "NORMAL_TEXT", - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 10, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Cambria", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_1", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 24, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 14, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5686275, - "green": 0.3764706, - "red": 0.21176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_2", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 13, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_3", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_4", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_5", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.38039216, - "green": 0.24705882, - "red": 0.14117648 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_6", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.38039216, - "green": 0.24705882, - "red": 0.14117648 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "TITLE", - "paragraphStyle": { - "borderBottom": { - "color": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "dashStyle": "SOLID", - "padding": { - "magnitude": 4, - "unit": "PT" - }, - "width": { - "magnitude": 1, - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT", - "spaceBelow": { - "magnitude": 15, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "fontSize": { - "magnitude": 26, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.3647059, - "green": 0.21176471, - "red": 0.09019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - }, - { - "namedStyleType": "SUBTITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - }, - "textStyle": { - "fontSize": { - "magnitude": 12, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7411765, - "green": 0.5058824, - "red": 0.30980393 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Calibri", - "weight": 400 - } - } - } - ] - } - }, - "tabProperties": { - "index": 0, - "tabId": "t.0", - "title": "Tab 1" - } - } - ], - "title": "Doc_7_Edge_Cases_Test" -} \ No newline at end of file diff --git a/apps/google-docs/src/utils/test_docs_json/Doc_8_DXP_benefits - Sample.json b/apps/google-docs/src/utils/test_docs_json/Doc_8_DXP_benefits - Sample.json deleted file mode 100644 index c40c90d553..0000000000 --- a/apps/google-docs/src/utils/test_docs_json/Doc_8_DXP_benefits - Sample.json +++ /dev/null @@ -1,7791 +0,0 @@ -{ - "documentId": "1JixZUQYGXe7ajWXdod-mweSJgFaEu-sC3so8O-fPmJM", - "suggestionsViewMode": "PREVIEW_WITHOUT_SUGGESTIONS", - "tabs": [ - { - "documentTab": { - "body": { - "content": [ - { - "endIndex": 1, - "sectionBreak": { - "sectionStyle": { - "columnSeparatorStyle": "NONE", - "contentDirection": "LEFT_TO_RIGHT", - "sectionType": "CONTINUOUS" - } - } - }, - { - "endIndex": 2, - "paragraph": { - "elements": [ - { - "endIndex": 2, - "startIndex": 1, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "green": 1 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1 - }, - { - "endIndex": 493, - "startIndex": 2, - "table": { - "columns": 2, - "rows": 6, - "tableRows": [ - { - "endIndex": 32, - "startIndex": 3, - "tableCells": [ - { - "content": [ - { - "endIndex": 8, - "paragraph": { - "elements": [ - { - "endIndex": 8, - "startIndex": 5, - "textRun": { - "content": "KW\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 120.00001, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 5 - }, - { - "endIndex": 9, - "paragraph": { - "elements": [ - { - "endIndex": 9, - "startIndex": 8, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 8 - } - ], - "endIndex": 9, - "startIndex": 4, - "tableCellStyle": { - "borderBottom": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderLeft": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderRight": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderTop": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 31, - "paragraph": { - "elements": [ - { - "endIndex": 31, - "startIndex": 10, - "textRun": { - "content": "benefits of dxp (10)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "CENTER", - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10 - }, - { - "endIndex": 32, - "paragraph": { - "elements": [ - { - "endIndex": 32, - "startIndex": 31, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "CENTER", - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31 - } - ], - "endIndex": 32, - "startIndex": 9, - "tableCellStyle": { - "borderBottom": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderLeft": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderRight": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderTop": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 63.75, - "unit": "PT" - } - } - }, - { - "endIndex": 223, - "startIndex": 32, - "tableCells": [ - { - "content": [ - { - "endIndex": 57, - "paragraph": { - "elements": [ - { - "endIndex": 57, - "startIndex": 34, - "textRun": { - "content": "Meta description (new)\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 120.00001, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 34 - } - ], - "endIndex": 57, - "startIndex": 33, - "tableCellStyle": { - "borderBottom": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderLeft": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderRight": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderTop": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 222, - "paragraph": { - "elements": [ - { - "endIndex": 222, - "startIndex": 58, - "textRun": { - "content": "Learn what we think the benefits of a DXP should be, why some DXPs fall short, and how to pick a platform to deliver the digital experiences that customers expect.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 58 - }, - { - "endIndex": 223, - "paragraph": { - "elements": [ - { - "endIndex": 223, - "startIndex": 222, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 120.00001, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 222 - } - ], - "endIndex": 223, - "startIndex": 57, - "tableCellStyle": { - "borderBottom": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderLeft": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderRight": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderTop": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 50.25, - "unit": "PT" - } - } - }, - { - "endIndex": 235, - "startIndex": 223, - "tableCells": [ - { - "content": [ - { - "endIndex": 230, - "paragraph": { - "elements": [ - { - "endIndex": 230, - "startIndex": 225, - "textRun": { - "content": "Slug\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 120.00001, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 225 - } - ], - "endIndex": 230, - "startIndex": 224, - "tableCellStyle": { - "borderBottom": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderLeft": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderRight": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderTop": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 235, - "paragraph": { - "elements": [ - { - "endIndex": 234, - "startIndex": 231, - "textRun": { - "content": "TBD", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 235, - "startIndex": 234, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 231 - } - ], - "endIndex": 235, - "startIndex": 230, - "tableCellStyle": { - "borderBottom": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderLeft": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderRight": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderTop": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 37.5, - "unit": "PT" - } - } - }, - { - "endIndex": 388, - "startIndex": 235, - "tableCells": [ - { - "content": [ - { - "endIndex": 250, - "paragraph": { - "elements": [ - { - "endIndex": 250, - "startIndex": 237, - "textRun": { - "content": "Header image\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 120.00001, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 237 - } - ], - "endIndex": 250, - "startIndex": 236, - "tableCellStyle": { - "borderBottom": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderLeft": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderRight": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderTop": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 253, - "paragraph": { - "elements": [ - { - "endIndex": 252, - "inlineObjectElement": { - "inlineObjectId": "kix.nbcfdc81186i", - "textStyle": {} - }, - "startIndex": 251 - }, - { - "endIndex": 253, - "startIndex": 252, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 120.00001, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 251 - }, - { - "endIndex": 254, - "paragraph": { - "elements": [ - { - "endIndex": 254, - "startIndex": 253, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 120.00001, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 253 - }, - { - "endIndex": 388, - "paragraph": { - "elements": [ - { - "endIndex": 388, - "startIndex": 254, - "textRun": { - "content": "https://www.figma.com/design/gMCLiAW4j4oacoC0l6czCl/Contentful---Article-illustrations---Design?node-id=1749-929&t=NjCfvWzE17RHoCJy-0\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 120.00001, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 254 - } - ], - "endIndex": 388, - "startIndex": 250, - "tableCellStyle": { - "borderBottom": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderLeft": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderRight": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderTop": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 24, - "unit": "PT" - } - } - }, - { - "endIndex": 409, - "startIndex": 388, - "tableCells": [ - { - "content": [ - { - "endIndex": 394, - "paragraph": { - "elements": [ - { - "endIndex": 394, - "startIndex": 390, - "textRun": { - "content": "SME\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 120.00001, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 390 - } - ], - "endIndex": 394, - "startIndex": 389, - "tableCellStyle": { - "borderBottom": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderLeft": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderRight": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderTop": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 409, - "paragraph": { - "elements": [ - { - "endIndex": 409, - "startIndex": 395, - "textRun": { - "content": "Taylor Wagner\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 120.00001, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 395 - } - ], - "endIndex": 409, - "startIndex": 394, - "tableCellStyle": { - "borderBottom": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderLeft": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderRight": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderTop": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 24, - "unit": "PT" - } - } - }, - { - "endIndex": 492, - "startIndex": 409, - "tableCells": [ - { - "content": [ - { - "endIndex": 423, - "paragraph": { - "elements": [ - { - "endIndex": 423, - "startIndex": 411, - "textRun": { - "content": "Surfer page\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 120.00001, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 411 - } - ], - "endIndex": 423, - "startIndex": 410, - "tableCellStyle": { - "borderBottom": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderLeft": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderRight": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderTop": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 492, - "paragraph": { - "elements": [ - { - "endIndex": 491, - "startIndex": 424, - "textRun": { - "content": "https://app.surferseo.com/drafts/s/NpNIHs1elgXUosNwUYYxjHaOCxTUQbO4", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://app.surferseo.com/drafts/s/NpNIHs1elgXUosNwUYYxjHaOCxTUQbO4" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 492, - "startIndex": 491, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 424 - } - ], - "endIndex": 492, - "startIndex": 423, - "tableCellStyle": { - "borderBottom": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderLeft": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderRight": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "borderTop": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "width": { - "magnitude": 0.75, - "unit": "PT" - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 24, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "width": { - "magnitude": 86.25, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - }, - { - "width": { - "magnitude": 357, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - } - ] - } - } - }, - { - "endIndex": 510, - "paragraph": { - "elements": [ - { - "endIndex": 509, - "startIndex": 493, - "textRun": { - "content": "Draft - approved", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 15, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "red": 1 - } - } - } - } - } - }, - { - "endIndex": 510, - "startIndex": 509, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 24, - "unit": "PT" - } - } - }, - "startIndex": 493 - }, - { - "endIndex": 511, - "paragraph": { - "elements": [ - { - "endIndex": 511, - "startIndex": 510, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 510 - }, - { - "endIndex": 527, - "paragraph": { - "elements": [ - { - "endIndex": 527, - "startIndex": 511, - "textRun": { - "content": "Title options: \n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 24, - "unit": "PT" - } - } - }, - "startIndex": 511 - }, - { - "endIndex": 589, - "paragraph": { - "bullet": { - "listId": "kix.vdrltauyvi44", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 589, - "startIndex": 527, - "textRun": { - "content": "Want the full benefits of a DXP? Choose a composable platform\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 24, - "unit": "PT" - } - } - }, - "startIndex": 527 - }, - { - "endIndex": 625, - "paragraph": { - "bullet": { - "listId": "kix.vdrltauyvi44", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 625, - "startIndex": 589, - "textRun": { - "content": "The real benefits of adopting a DXP\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 24, - "unit": "PT" - } - } - }, - "startIndex": 589 - }, - { - "endIndex": 683, - "paragraph": { - "bullet": { - "listId": "kix.vdrltauyvi44", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "green": 1, - "red": 1 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 682, - "startIndex": 625, - "textRun": { - "content": "Composability is the key to reaping the benefits of a DXP", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "green": 1, - "red": 1 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 683, - "startIndex": 682, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "green": 1, - "red": 1 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "red": 1 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 24, - "unit": "PT" - } - } - }, - "startIndex": 625 - }, - { - "endIndex": 684, - "paragraph": { - "elements": [ - { - "endIndex": 684, - "startIndex": 683, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 683 - }, - { - "endIndex": 691, - "paragraph": { - "elements": [ - { - "endIndex": 690, - "startIndex": 684, - "textRun": { - "content": "Intro:", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 691, - "startIndex": 690, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.kbkjud7wkhui", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 684 - }, - { - "endIndex": 1037, - "paragraph": { - "elements": [ - { - "endIndex": 1037, - "startIndex": 691, - "textRun": { - "content": "Imagine going through an RFP process, picking a vendor, and spending a year implementing a new digital experience platform (DXP), only to find out that you\u2019re still unable to do everything you want. This is the nightmare some marketing leaders face. They\u2019ve invested time and money in a new platform but have failed to get the benefits of a DXP.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 691 - }, - { - "endIndex": 1038, - "paragraph": { - "elements": [ - { - "endIndex": 1038, - "startIndex": 1037, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1037 - }, - { - "endIndex": 1107, - "paragraph": { - "elements": [ - { - "endIndex": 1107, - "startIndex": 1038, - "textRun": { - "content": "So, what went wrong, and how can you avoid making a similar mistake?\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1038 - }, - { - "endIndex": 1108, - "paragraph": { - "elements": [ - { - "endIndex": 1108, - "startIndex": 1107, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1107 - }, - { - "endIndex": 1324, - "paragraph": { - "elements": [ - { - "endIndex": 1324, - "startIndex": 1108, - "textRun": { - "content": "In this post, you\u2019ll learn what we think the benefits of a DXP should be, why some DXPs fall short, and how to pick a platform that will empower your business to create the digital experiences that customers expect.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1108 - }, - { - "endIndex": 1365, - "paragraph": { - "elements": [ - { - "endIndex": 1365, - "startIndex": 1324, - "textRun": { - "content": "What benefits can you expect from a DXP?\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.w2lv6ljnowy6", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 1324 - }, - { - "endIndex": 1633, - "paragraph": { - "elements": [ - { - "endIndex": 1393, - "startIndex": 1365, - "textRun": { - "content": "Most analysts and companies ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 1405, - "startIndex": 1393, - "textRun": { - "content": "define a DXP", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.contentful.com/blog/whats-a-digital-experience-platform/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 1633, - "startIndex": 1405, - "textRun": { - "content": " as a set of technologies that lets you create, manage, and deliver customer experiences across digital channels. That sounds simple enough, but it takes multiple capabilities to produce truly seamless, omnichannel experiences.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1365 - }, - { - "endIndex": 1634, - "paragraph": { - "elements": [ - { - "endIndex": 1634, - "startIndex": 1633, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1633 - }, - { - "endIndex": 1703, - "paragraph": { - "elements": [ - { - "endIndex": 1703, - "startIndex": 1634, - "textRun": { - "content": "At Contentful, we believe the core benefits of a DXP should include:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1634 - }, - { - "endIndex": 1704, - "paragraph": { - "elements": [ - { - "endIndex": 1704, - "startIndex": 1703, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1703 - }, - { - "endIndex": 1878, - "paragraph": { - "bullet": { - "listId": "kix.8x8klvcu13zf", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 1721, - "startIndex": 1704, - "textRun": { - "content": "Brand consistency", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 1817, - "startIndex": 1721, - "textRun": { - "content": " through unified digital content management and modular, reusable content that enables teams to ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 1836, - "startIndex": 1817, - "textRun": { - "content": "assemble consistent", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 1878, - "startIndex": 1836, - "textRun": { - "content": " experiences across regions and channels.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1704 - }, - { - "endIndex": 1993, - "paragraph": { - "bullet": { - "listId": "kix.8x8klvcu13zf", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 1898, - "startIndex": 1878, - "textRun": { - "content": "Omnichannel delivery", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 1993, - "startIndex": 1898, - "textRun": { - "content": " to meet your customers where they are with experiences tailored for every digital touchpoint.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1878 - }, - { - "endIndex": 2117, - "paragraph": { - "bullet": { - "listId": "kix.8x8klvcu13zf", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2014, - "startIndex": 1993, - "textRun": { - "content": "Integrated operations", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 2117, - "startIndex": 2014, - "textRun": { - "content": " that eliminate silos for seamless collaboration that empowers teams to assemble cohesive experiences.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1993 - }, - { - "endIndex": 2327, - "paragraph": { - "bullet": { - "listId": "kix.8x8klvcu13zf", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2144, - "startIndex": 2117, - "textRun": { - "content": "Data-driven personalization", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 2327, - "startIndex": 2144, - "textRun": { - "content": " that drives measurable return on investment (ROI) by enabling teams to experiment, gain valuable insights from customer data, and use those insights to optimize digital experiences.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2117 - }, - { - "endIndex": 2398, - "paragraph": { - "bullet": { - "listId": "kix.8x8klvcu13zf", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2344, - "startIndex": 2327, - "textRun": { - "content": "Speed and agility", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 2398, - "startIndex": 2344, - "textRun": { - "content": " so you can ship faster and act on data in real time.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2327 - }, - { - "endIndex": 2486, - "paragraph": { - "bullet": { - "listId": "kix.8x8klvcu13zf", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2420, - "startIndex": 2398, - "textRun": { - "content": "Increased productivity", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 2486, - "startIndex": 2420, - "textRun": { - "content": " through modular content, automated workflows, and contextual AI.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2398 - }, - { - "endIndex": 2607, - "paragraph": { - "bullet": { - "listId": "kix.8x8klvcu13zf", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2526, - "startIndex": 2486, - "textRun": { - "content": "Enterprise-level security and governance", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 2606, - "startIndex": 2526, - "textRun": { - "content": ", including secure frameworks, reliable infrastructure, and compliance at scale.", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 2607, - "startIndex": 2606, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2486 - }, - { - "endIndex": 2608, - "paragraph": { - "elements": [ - { - "endIndex": 2608, - "startIndex": 2607, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2607 - }, - { - "endIndex": 2682, - "paragraph": { - "elements": [ - { - "endIndex": 2681, - "startIndex": 2608, - "textRun": { - "content": "But not all DXPs provide these benefits to the extent modern brands need.", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 2682, - "startIndex": 2681, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2608 - }, - { - "endIndex": 2749, - "paragraph": { - "elements": [ - { - "endIndex": 2749, - "startIndex": 2682, - "textRun": { - "content": "Monolithic vs. composable: Why the type of DXP you choose matters \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.52jp1v9u9uog", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 2682 - }, - { - "endIndex": 2895, - "paragraph": { - "elements": [ - { - "endIndex": 2895, - "startIndex": 2749, - "textRun": { - "content": "Because the definition of a DXP is so broad, the benefits of a DXP depend on the kind of DXP you choose, the DXP vendor, and the implementation. \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2749 - }, - { - "endIndex": 2896, - "paragraph": { - "elements": [ - { - "endIndex": 2896, - "startIndex": 2895, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2895 - }, - { - "endIndex": 3009, - "paragraph": { - "elements": [ - { - "endIndex": 3009, - "startIndex": 2896, - "textRun": { - "content": "There are two main types of DXP: traditional or monolithic, and composable. Each type offers different benefits.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2896 - }, - { - "endIndex": 3026, - "paragraph": { - "elements": [ - { - "endIndex": 3026, - "startIndex": 3009, - "textRun": { - "content": "Monolithic DXPs \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.8r9w6vhs9j0e", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 3009 - }, - { - "endIndex": 3197, - "paragraph": { - "elements": [ - { - "endIndex": 3197, - "startIndex": 3026, - "textRun": { - "content": "Monolithic or traditional DXPs offer the convenience of an all-in-one solution or suite of tools. However, this convenience comes at the cost of flexibility and control. \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3026 - }, - { - "endIndex": 3198, - "paragraph": { - "elements": [ - { - "endIndex": 3198, - "startIndex": 3197, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3197 - }, - { - "endIndex": 3477, - "paragraph": { - "elements": [ - { - "endIndex": 3324, - "startIndex": 3198, - "textRun": { - "content": "Fewer choices might initially be less overwhelming, but limiting yourself to a single vendor can leave you experiencing vendor", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 3332, - "startIndex": 3324, - "textRun": { - "content": " lock-in", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.contentful.com/blog/vendor-lock-in/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 3334, - "startIndex": 3332, - "textRun": { - "content": ". ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 3477, - "startIndex": 3334, - "textRun": { - "content": "Often, this is associated with paying for features you don\u2019t use and encountering unexpected limitations that necessitate costly integrations.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3198 - }, - { - "endIndex": 3478, - "paragraph": { - "elements": [ - { - "endIndex": 3478, - "startIndex": 3477, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3477 - }, - { - "endIndex": 3654, - "paragraph": { - "elements": [ - { - "endIndex": 3653, - "startIndex": 3478, - "textRun": { - "content": "The inability to right-size your tech stack and the frustration of integrating more tools into something that promised all-in-one bliss negates the benefit of monolithic DXPs.", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 3654, - "startIndex": 3653, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3478 - }, - { - "endIndex": 3670, - "paragraph": { - "elements": [ - { - "endIndex": 3670, - "startIndex": 3654, - "textRun": { - "content": "Composable DXPs\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.9ywz3533b8rm", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 3654 - }, - { - "endIndex": 3930, - "paragraph": { - "elements": [ - { - "endIndex": 3888, - "startIndex": 3670, - "textRun": { - "content": "In contrast, composable DXPs, like Contentful, acknowledge that no single vendor can provide the best tools for everything you need. Instead, we focus on providing a core set of capabilities and making it ridiculously", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 3927, - "startIndex": 3888, - "textRun": { - "content": " easy to integrate your preferred tools", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.contentful.com/products/ecosystem/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 3930, - "startIndex": 3927, - "textRun": { - "content": ". \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3670 - }, - { - "endIndex": 3931, - "paragraph": { - "elements": [ - { - "endIndex": 3931, - "startIndex": 3930, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3930 - }, - { - "endIndex": 4220, - "paragraph": { - "elements": [ - { - "endIndex": 3942, - "startIndex": 3931, - "textRun": { - "content": "Adopting a ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 3965, - "startIndex": 3942, - "textRun": { - "content": "composable architecture", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.contentful.com/composable-content/architecture/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 4012, - "startIndex": 3965, - "textRun": { - "content": " allows modern DXPs to offer the benefit of an ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 4042, - "startIndex": 4012, - "textRun": { - "content": "infinitely extensible platform", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.contentful.com/products/platform/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 4220, - "startIndex": 4042, - "textRun": { - "content": " that meets you where you are now and supports your future needs. It\u2019s like assembling a dream team where you have access to any player you want and can trade them at any time. \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3931 - }, - { - "endIndex": 4221, - "paragraph": { - "elements": [ - { - "endIndex": 4221, - "startIndex": 4220, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4220 - }, - { - "endIndex": 4302, - "paragraph": { - "elements": [ - { - "endIndex": 4302, - "startIndex": 4221, - "textRun": { - "content": "In addition to the core benefits of a DXP, a composable DXP also enables you to:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4221 - }, - { - "endIndex": 4303, - "paragraph": { - "elements": [ - { - "endIndex": 4303, - "startIndex": 4302, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4302 - }, - { - "endIndex": 4478, - "paragraph": { - "bullet": { - "listId": "kix.xn14b7z3imo2", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 4338, - "startIndex": 4303, - "textRun": { - "content": "Maximize existing tech investments.", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 4478, - "startIndex": 4338, - "textRun": { - "content": " Instead of forcing you to give up tools you love, a composable approach lets you combine existing tech with a modern DXP to maximize ROI. \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4303 - }, - { - "endIndex": 4756, - "paragraph": { - "bullet": { - "listId": "kix.xn14b7z3imo2", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 4501, - "startIndex": 4478, - "textRun": { - "content": "Reduce technical debt. ", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 4590, - "startIndex": 4501, - "textRun": { - "content": "Assemble the stack you need from the start without the burden of features you won\u2019t use. ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 4623, - "startIndex": 4590, - "textRun": { - "content": "Everything is modular, so you can", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 4756, - "startIndex": 4623, - "textRun": { - "content": " change and update tools without the fear of breaking things. No more missing page elements or broken tracking tags after an update.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4478 - }, - { - "endIndex": 4953, - "paragraph": { - "bullet": { - "listId": "kix.xn14b7z3imo2", - "textStyle": { - "underline": false, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 4781, - "startIndex": 4756, - "textRun": { - "content": "Choose the best vendors. ", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 4953, - "startIndex": 4781, - "textRun": { - "content": "A composable DXP that integrates tools from multiple vendors into one connected system gives you what you want for each function without the typical integration headaches.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4756 - }, - { - "endIndex": 5235, - "paragraph": { - "bullet": { - "listId": "kix.xn14b7z3imo2", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 4982, - "startIndex": 4953, - "textRun": { - "content": "Create and connect new apps. ", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 5130, - "startIndex": 4982, - "textRun": { - "content": "The Contentful Marketplace has 120+ pre-built integrations, making it easy to get the new features you need. What\u2019s more, you can use Contentful\u2019s ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 5144, - "startIndex": 5130, - "textRun": { - "content": "App Framework ", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.contentful.com/developers/docs/extensibility/app-framework/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 5235, - "startIndex": 5144, - "textRun": { - "content": "to build exactly what you want, turning your platform into a unique competitive advantage.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4953 - }, - { - "endIndex": 5447, - "paragraph": { - "bullet": { - "listId": "kix.xn14b7z3imo2", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 5259, - "startIndex": 5235, - "textRun": { - "content": "Be ready for the future.", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 5447, - "startIndex": 5259, - "textRun": { - "content": " AI has already changed the way businesses create and ship digital experiences. Who knows what will be next? But with a composable platform, you\u2019ll be ready to plug it in and try it out. \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5235 - }, - { - "endIndex": 5499, - "paragraph": { - "elements": [ - { - "endIndex": 5499, - "startIndex": 5447, - "textRun": { - "content": "Contentful makes getting the benefits of a DXP easy\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.7kxzmcz3z54r", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 5447 - }, - { - "endIndex": 5743, - "paragraph": { - "elements": [ - { - "endIndex": 5608, - "startIndex": 5499, - "textRun": { - "content": "A composable approach might sound like too many options, but the right partners make it easy to get started. ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 5640, - "startIndex": 5608, - "textRun": { - "content": "Contentful Professional Services", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.contentful.com/services/professional-services/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 5649, - "startIndex": 5640, - "textRun": { - "content": " and our ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 5674, - "startIndex": 5649, - "textRun": { - "content": "extensive partner network", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.contentful.com/partners/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 5743, - "startIndex": 5674, - "textRun": { - "content": " offer expert guidance to help you get the benefits of a DXP faster.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5499 - }, - { - "endIndex": 5820, - "paragraph": { - "elements": [ - { - "endIndex": 5820, - "startIndex": 5743, - "textRun": { - "content": "BMW uses Contentful to power digital experiences across 160 dealership sites\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.dco7thowqe5c", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 5743 - }, - { - "endIndex": 6263, - "paragraph": { - "elements": [ - { - "endIndex": 6133, - "startIndex": 5820, - "textRun": { - "content": "BMW is a great example of how the right partner can fast-track results. Faced with the rise of online shopping, BMW set out to set a new standard in digital experiences. First, they needed a platform to connect a tangle of backend systems and content management systems (CMSes). In partnership with design agency ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 6137, - "startIndex": 6133, - "textRun": { - "content": "TMWX", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.contentful.com/partners/solutions/tmwx/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 6263, - "startIndex": 6137, - "textRun": { - "content": " (now part of Accenture Song), they chose Contentful to modernize the digital experience across 160 dealer-specific websites.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5820 - }, - { - "endIndex": 6264, - "paragraph": { - "elements": [ - { - "endIndex": 6264, - "startIndex": 6263, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6263 - }, - { - "endIndex": 6540, - "paragraph": { - "elements": [ - { - "endIndex": 6358, - "startIndex": 6264, - "textRun": { - "content": "TMWX designed a digital experience that feels like an extension of the retailer. Contentful\u2019s ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 6373, - "startIndex": 6358, - "textRun": { - "content": "modular content", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.contentful.com/blog/modular-content/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 6540, - "startIndex": 6373, - "textRun": { - "content": " and governance capabilities enabled them to keep brand messaging consistent across dealerships while giving each dealership the flexibility to add personal touches. \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6264 - }, - { - "endIndex": 6541, - "paragraph": { - "elements": [ - { - "endIndex": 6541, - "startIndex": 6540, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6540 - }, - { - "endIndex": 6739, - "paragraph": { - "elements": [ - { - "endIndex": 6706, - "startIndex": 6541, - "textRun": { - "content": "The result is a digital experience that feels as polished and reliable as walking into a showroom \u2014 and it\u2019s paying off with higher customer engagement, including a ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 6737, - "startIndex": 6706, - "textRun": { - "content": "47% jump in test drive bookings", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.contentful.com/case-studies/bmw-tmwx/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 6738, - "startIndex": 6737, - "textRun": { - "content": ".", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 6739, - "startIndex": 6738, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6541 - }, - { - "endIndex": 6740, - "paragraph": { - "elements": [ - { - "endIndex": 6740, - "startIndex": 6739, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6739 - }, - { - "endIndex": 6812, - "paragraph": { - "elements": [ - { - "endIndex": 6812, - "startIndex": 6740, - "textRun": { - "content": "Contentful Personalization lets Ruggable\u2019s small team drive big results\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.o34ya2w0kduu", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 6740 - }, - { - "endIndex": 7346, - "paragraph": { - "elements": [ - { - "endIndex": 7233, - "startIndex": 6812, - "textRun": { - "content": "Ruggable shows how easy it can be to get the benefits of a DXP, even if you have a small team. Ahead of Black Friday, their team used Contentful to quickly spin up modular content components, connect Shopify data, and schedule promotions without heavy developer support. What once took nerve-racking code changes was handled by just three people in four weeks. The payoff was immediate: campaigns went live smoothly, and ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 7248, - "startIndex": 7233, - "textRun": { - "content": "personalization", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.contentful.com/products/personalization/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 7279, - "startIndex": 7248, - "textRun": { - "content": " powered by Contentful drove a ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 7344, - "startIndex": 7279, - "textRun": { - "content": "7x increase in click-through rates and a 25% boost in conversions", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.contentful.com/case-studies/ruggable/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 7345, - "startIndex": 7344, - "textRun": { - "content": ".", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 7346, - "startIndex": 7345, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6812 - }, - { - "endIndex": 7347, - "paragraph": { - "elements": [ - { - "endIndex": 7347, - "startIndex": 7346, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7346 - }, - { - "endIndex": 7392, - "paragraph": { - "elements": [ - { - "endIndex": 7391, - "startIndex": 7347, - "textRun": { - "content": "A Modern DXP plus AI is a slam dunk for FIBA", - "textStyle": {} - } - }, - { - "endIndex": 7392, - "startIndex": 7391, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.92t9jbuy2o48", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 7347 - }, - { - "endIndex": 7714, - "paragraph": { - "elements": [ - { - "endIndex": 7417, - "startIndex": 7392, - "textRun": { - "content": "Contentful made it easy f", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 7714, - "startIndex": 7417, - "textRun": { - "content": "or the International Basketball Federation (FIBA) to scale digital experiences across a global stage. \u201cContentful helps us turn things out like a factory \u2014 we can easily create a website for each event, even if there are 80+ of them in a given year,\u201d shared Yann Th\u00e9z\u00e9nas, Project Manager at FIBA\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12, - "unit": "PT" - } - } - }, - "startIndex": 7392 - }, - { - "endIndex": 7977, - "paragraph": { - "elements": [ - { - "endIndex": 7873, - "startIndex": 7714, - "textRun": { - "content": "That efficiency means fans around the world get timely, localized updates, even during high-pressure live events. Looking ahead, FIBA is beginning to leverage ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 7895, - "startIndex": 7873, - "textRun": { - "content": "Contentful Marketplace", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.contentful.com/marketplace/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 7910, - "startIndex": 7895, - "textRun": { - "content": " apps like the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 7940, - "startIndex": 7910, - "textRun": { - "content": "AI Content Generator by OpenAI", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.contentful.com/marketplace/ai-content-generator/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 7977, - "startIndex": 7940, - "textRun": { - "content": " to speed up and scale translations.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12, - "unit": "PT" - } - } - }, - "startIndex": 7714 - }, - { - "endIndex": 8072, - "paragraph": { - "elements": [ - { - "endIndex": 7993, - "startIndex": 7977, - "textRun": { - "content": "Check out these ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 8004, - "startIndex": 7993, - "textRun": { - "content": "demo videos", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.contentful.com/resources/product-demo-videos/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 8072, - "startIndex": 8004, - "textRun": { - "content": " to learn more about getting the benefits of a DXP from Contentful.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7977 - }, - { - "endIndex": 8073, - "paragraph": { - "elements": [ - { - "endIndex": 8073, - "startIndex": 8072, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8072 - }, - { - "endIndex": 8124, - "paragraph": { - "elements": [ - { - "endIndex": 8124, - "startIndex": 8073, - "textRun": { - "content": "Choose a digital experience platform that fits you\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.c0v7vqvd7bv9", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 8073 - }, - { - "endIndex": 8196, - "paragraph": { - "elements": [ - { - "endIndex": 8196, - "startIndex": 8124, - "textRun": { - "content": "Every business is unique. You know what works for you and what doesn\u2019t.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8124 - }, - { - "endIndex": 8197, - "paragraph": { - "elements": [ - { - "endIndex": 8197, - "startIndex": 8196, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8196 - }, - { - "endIndex": 8402, - "paragraph": { - "elements": [ - { - "endIndex": 8402, - "startIndex": 8197, - "textRun": { - "content": "A composable DXP respects that, enabling you to pick and choose the components you need, connect them to the parts of your system that you already like, and make changes without breaking the entire stack.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8197 - }, - { - "endIndex": 8403, - "paragraph": { - "elements": [ - { - "endIndex": 8403, - "startIndex": 8402, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8402 - }, - { - "endIndex": 8583, - "paragraph": { - "elements": [ - { - "endIndex": 8583, - "startIndex": 8403, - "textRun": { - "content": "Don\u2019t trust your future to outdated platforms. Contentful is a modern DXP with a proven record of achieving measurable results, which you\u2019ll happily share with the executive team.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8403 - }, - { - "endIndex": 8584, - "paragraph": { - "elements": [ - { - "endIndex": 8584, - "startIndex": 8583, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8583 - }, - { - "endIndex": 8711, - "paragraph": { - "elements": [ - { - "endIndex": 8672, - "startIndex": 8584, - "textRun": { - "content": "See how Contentful can help you get the full benefits of a DXP built for your business. ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 8710, - "startIndex": 8672, - "textRun": { - "content": "Contact sales for a personalized demo.", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.contentful.com/contact/sales/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - }, - { - "endIndex": 8711, - "startIndex": 8710, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8584 - }, - { - "endIndex": 8712, - "paragraph": { - "elements": [ - { - "endIndex": 8712, - "startIndex": 8711, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8711 - }, - { - "endIndex": 8713, - "paragraph": { - "elements": [ - { - "endIndex": 8713, - "startIndex": 8712, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Red Hat Display", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 24, - "unit": "PT" - } - } - }, - "startIndex": 8712 - } - ] - }, - "documentStyle": { - "background": { - "color": {} - }, - "documentFormat": { - "documentMode": "PAGES" - }, - "marginBottom": { - "magnitude": 72, - "unit": "PT" - }, - "marginFooter": { - "magnitude": 36, - "unit": "PT" - }, - "marginHeader": { - "magnitude": 36, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 72, - "unit": "PT" - }, - "marginRight": { - "magnitude": 72, - "unit": "PT" - }, - "marginTop": { - "magnitude": 72, - "unit": "PT" - }, - "pageNumberStart": 1, - "pageSize": { - "height": { - "magnitude": 792, - "unit": "PT" - }, - "width": { - "magnitude": 612, - "unit": "PT" - } - }, - "useCustomHeaderFooterMargins": true - }, - "inlineObjects": { - "kix.nbcfdc81186i": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh7-rt.googleusercontent.com/docsz/AD_4nXcT8c4_Feuc71F1U8El-tesEhOk-fWeyKoPtafbMxM9bbmiVobgvbDLWM3EOMP516uLaSpEsWlhHpaoN8h6hpTzAnYGywb_L8w0A1DIC4dKz1MqdLaR09WIIIW4yJcNDqNLYPAcZqoWGNUq3tzwEvn6Cw?key=OBTs76szDX38nr7NbRjhXA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 195, - "unit": "PT" - }, - "width": { - "magnitude": 346.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.nbcfdc81186i" - } - }, - "lists": { - "kix.8x8klvcu13zf": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "\u25cb", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "\u25a0", - "indentFirstLine": { - "magnitude": 90, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 126, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "\u25cb", - "indentFirstLine": { - "magnitude": 162, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "\u25a0", - "indentFirstLine": { - "magnitude": 198, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 234, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "\u25cb", - "indentFirstLine": { - "magnitude": 270, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "\u25a0", - "indentFirstLine": { - "magnitude": 306, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.vdrltauyvi44": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.xn14b7z3imo2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "\u25cb", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "\u25a0", - "indentFirstLine": { - "magnitude": 90, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 126, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "\u25cb", - "indentFirstLine": { - "magnitude": 162, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "\u25a0", - "indentFirstLine": { - "magnitude": 198, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "\u25cf", - "indentFirstLine": { - "magnitude": 234, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "\u25cb", - "indentFirstLine": { - "magnitude": 270, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "\u25a0", - "indentFirstLine": { - "magnitude": 306, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - } - }, - "namedStyles": { - "styles": [ - { - "namedStyleType": "NORMAL_TEXT", - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - }, - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_1", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 20, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 6, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 20, - "unit": "PT" - } - } - }, - { - "namedStyleType": "HEADING_2", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 18, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 6, - "unit": "PT" - } - }, - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16, - "unit": "PT" - } - } - }, - { - "namedStyleType": "HEADING_3", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 16, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4, - "unit": "PT" - } - }, - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 14, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2627451, - "green": 0.2627451, - "red": 0.2627451 - } - } - } - } - }, - { - "namedStyleType": "HEADING_4", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 14, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 12, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - } - } - }, - { - "namedStyleType": "HEADING_5", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - } - } - }, - { - "namedStyleType": "HEADING_6", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "italic": true - } - }, - { - "namedStyleType": "TITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 3, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 26, - "unit": "PT" - } - } - }, - { - "namedStyleType": "SUBTITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 15, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "italic": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - ] - } - }, - "tabProperties": { - "index": 0, - "tabId": "t.0", - "title": "Draft" - } - }, - { - "documentTab": { - "body": { - "content": [ - { - "endIndex": 1, - "sectionBreak": { - "sectionStyle": { - "columnSeparatorStyle": "NONE", - "contentDirection": "LEFT_TO_RIGHT", - "sectionType": "CONTINUOUS" - } - } - }, - { - "endIndex": 111, - "paragraph": { - "elements": [ - { - "endIndex": 111, - "startIndex": 1, - "textRun": { - "content": "Here are some directions for a graphic designer to create a key visual based on the blog post \"DXP benefits\":\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1 - }, - { - "endIndex": 112, - "paragraph": { - "elements": [ - { - "endIndex": 112, - "startIndex": 111, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 111 - }, - { - "endIndex": 157, - "paragraph": { - "elements": [ - { - "endIndex": 157, - "startIndex": 112, - "textRun": { - "content": "Key Visual Concept: The Composable Advantage\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 112 - }, - { - "endIndex": 158, - "paragraph": { - "elements": [ - { - "endIndex": 158, - "startIndex": 157, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 157 - }, - { - "endIndex": 364, - "paragraph": { - "elements": [ - { - "endIndex": 172, - "startIndex": 158, - "textRun": { - "content": "Overall Theme:", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 364, - "startIndex": 172, - "textRun": { - "content": " The visual should convey a sense of flexibility, integration, and future-readiness, highlighting how a composable DXP empowers businesses to build tailored and adaptable digital experiences.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 158 - }, - { - "endIndex": 365, - "paragraph": { - "elements": [ - { - "endIndex": 365, - "startIndex": 364, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 364 - }, - { - "endIndex": 390, - "paragraph": { - "elements": [ - { - "endIndex": 390, - "startIndex": 365, - "textRun": { - "content": "Elements to Incorporate:\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 365 - }, - { - "endIndex": 662, - "paragraph": { - "bullet": { - "listId": "kix.lz2y53co32x0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 415, - "startIndex": 390, - "textRun": { - "content": "Modular & Interconnected:", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 662, - "startIndex": 415, - "textRun": { - "content": " Represent the \"composable\" aspect with distinct, yet seamlessly connected, modules or building blocks. These could be abstract shapes, icons, or even subtle representations of different tools (e.g., a small gear, a chat bubble, a document icon).\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12, - "unit": "PT" - } - } - }, - "startIndex": 390 - }, - { - "endIndex": 870, - "paragraph": { - "bullet": { - "listId": "kix.lz2y53co32x0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 680, - "startIndex": 662, - "textRun": { - "content": "Growth & Progress:", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 870, - "startIndex": 680, - "textRun": { - "content": " Show a clear upward or forward trajectory, symbolizing increased productivity, speed, and agility. This could be a subtle gradient, an arrow motif, or elements that appear to be expanding.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12, - "unit": "PT" - } - } - }, - "startIndex": 662 - }, - { - "endIndex": 1105, - "paragraph": { - "bullet": { - "listId": "kix.lz2y53co32x0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 891, - "startIndex": 870, - "textRun": { - "content": "Central Hub/Platform:", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 1105, - "startIndex": 891, - "textRun": { - "content": " A central, unifying element that demonstrates how Contentful acts as the core, connecting all the composable parts. This could be a subtle glow, a central node, or a foundational element from which others extend.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12, - "unit": "PT" - } - } - }, - "startIndex": 870 - }, - { - "endIndex": 1327, - "paragraph": { - "bullet": { - "listId": "kix.lz2y53co32x0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 1139, - "startIndex": 1105, - "textRun": { - "content": "Digital Experience/Customer Focus:", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 1327, - "startIndex": 1139, - "textRun": { - "content": " Hint at the \"digital experience\" aspect without being overly literal. This could be represented by subtle digital patterns, a faint outline of a device screen, or a sense of interaction.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12, - "unit": "PT" - } - } - }, - "startIndex": 1105 - }, - { - "endIndex": 1453, - "paragraph": { - "bullet": { - "listId": "kix.lz2y53co32x0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 1354, - "startIndex": 1327, - "textRun": { - "content": "Brand Consistency (Subtle):", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 1453, - "startIndex": 1354, - "textRun": { - "content": " A consistent color palette or visual style across the modules to subtly convey brand consistency.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12, - "unit": "PT" - } - } - }, - "startIndex": 1327 - }, - { - "endIndex": 1676, - "paragraph": { - "bullet": { - "listId": "kix.lz2y53co32x0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 1477, - "startIndex": 1453, - "textRun": { - "content": "Future-Ready/Innovation:", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 1676, - "startIndex": 1477, - "textRun": { - "content": " Incorporate subtle elements that suggest innovation and readiness for future technologies like AI. This could be a faint futuristic glow, abstract data streams, or a hint of AI-related iconography.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12, - "unit": "PT" - } - } - }, - "startIndex": 1453 - }, - { - "endIndex": 1691, - "paragraph": { - "elements": [ - { - "endIndex": 1691, - "startIndex": 1676, - "textRun": { - "content": "Color Palette:\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1676 - }, - { - "endIndex": 1927, - "paragraph": { - "bullet": { - "listId": "kix.sfo7zdq8bsnk", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 1927, - "startIndex": 1691, - "textRun": { - "content": "Consider a modern, professional, and slightly vibrant color palette that reflects innovation and growth. Avoid overly corporate or dull colors. Perhaps a primary brand color with complementary secondary colors for the modular elements.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12, - "unit": "PT" - } - } - }, - "startIndex": 1691 - }, - { - "endIndex": 1942, - "paragraph": { - "elements": [ - { - "endIndex": 1942, - "startIndex": 1927, - "textRun": { - "content": "Imagery/Style:\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1927 - }, - { - "endIndex": 2067, - "paragraph": { - "bullet": { - "listId": "kix.yvnb3ezfmvk3", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 1961, - "startIndex": 1942, - "textRun": { - "content": "Abstract and Clean:", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 2067, - "startIndex": 1961, - "textRun": { - "content": " Lean towards abstract, clean, and modern graphics rather than realistic or overly complex illustrations.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12, - "unit": "PT" - } - } - }, - "startIndex": 1942 - }, - { - "endIndex": 2173, - "paragraph": { - "bullet": { - "listId": "kix.yvnb3ezfmvk3", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2087, - "startIndex": 2067, - "textRun": { - "content": "Dynamic Composition:", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 2173, - "startIndex": 2087, - "textRun": { - "content": " Create a dynamic composition that draws the eye through the interconnected elements.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12, - "unit": "PT" - } - } - }, - "startIndex": 2067 - }, - { - "endIndex": 2279, - "paragraph": { - "bullet": { - "listId": "kix.yvnb3ezfmvk3", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2186, - "startIndex": 2173, - "textRun": { - "content": "Subtle Depth:", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 2279, - "startIndex": 2186, - "textRun": { - "content": " Use subtle shadows or gradients to give the visual some depth without making it feel heavy.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12, - "unit": "PT" - } - } - }, - "startIndex": 2173 - }, - { - "endIndex": 2336, - "paragraph": { - "elements": [ - { - "endIndex": 2336, - "startIndex": 2279, - "textRun": { - "content": "Examples of Inspiration (Conceptual, not direct copies):\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2279 - }, - { - "endIndex": 2389, - "paragraph": { - "bullet": { - "listId": "kix.1tfofde9qvse", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2389, - "startIndex": 2336, - "textRun": { - "content": "Infographics that illustrate interconnected systems.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12, - "unit": "PT" - } - } - }, - "startIndex": 2336 - }, - { - "endIndex": 2451, - "paragraph": { - "bullet": { - "listId": "kix.1tfofde9qvse", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2451, - "startIndex": 2389, - "textRun": { - "content": "Abstract representations of data flow or network connections.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12, - "unit": "PT" - } - } - }, - "startIndex": 2389 - }, - { - "endIndex": 2525, - "paragraph": { - "bullet": { - "listId": "kix.1tfofde9qvse", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2525, - "startIndex": 2451, - "textRun": { - "content": "Modern tech company branding that emphasizes flexibility and integration.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12, - "unit": "PT" - } - } - }, - "startIndex": 2451 - }, - { - "endIndex": 2532, - "paragraph": { - "elements": [ - { - "endIndex": 2532, - "startIndex": 2525, - "textRun": { - "content": "Avoid:\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2525 - }, - { - "endIndex": 2591, - "paragraph": { - "bullet": { - "listId": "kix.wiitwhreylki", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2591, - "startIndex": 2532, - "textRun": { - "content": "Overly literal depictions of specific software interfaces.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12, - "unit": "PT" - } - } - }, - "startIndex": 2532 - }, - { - "endIndex": 2670, - "paragraph": { - "bullet": { - "listId": "kix.wiitwhreylki", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2670, - "startIndex": 2591, - "textRun": { - "content": "Cluttered or chaotic designs that contradict the idea of seamless integration.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12, - "unit": "PT" - } - } - }, - "startIndex": 2591 - }, - { - "endIndex": 2705, - "paragraph": { - "bullet": { - "listId": "kix.wiitwhreylki", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2705, - "startIndex": 2670, - "textRun": { - "content": "Outdated or generic stock imagery.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12, - "unit": "PT" - } - } - }, - "startIndex": 2670 - }, - { - "endIndex": 2876, - "paragraph": { - "elements": [ - { - "endIndex": 2724, - "startIndex": 2705, - "textRun": { - "content": "Overall Impression:", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 2876, - "startIndex": 2724, - "textRun": { - "content": " The key visual should feel sophisticated, forward-thinking, and clearly communicate the benefits of a composable DXP in an engaging and memorable way.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2705 - } - ] - }, - "documentStyle": { - "background": { - "color": {} - }, - "documentFormat": { - "documentMode": "PAGES" - }, - "marginBottom": { - "magnitude": 72, - "unit": "PT" - }, - "marginFooter": { - "magnitude": 36, - "unit": "PT" - }, - "marginHeader": { - "magnitude": 36, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 72, - "unit": "PT" - }, - "marginRight": { - "magnitude": 72, - "unit": "PT" - }, - "marginTop": { - "magnitude": 72, - "unit": "PT" - }, - "pageNumberStart": 1, - "pageSize": { - "height": { - "magnitude": 792, - "unit": "PT" - }, - "width": { - "magnitude": 612, - "unit": "PT" - } - }, - "useCustomHeaderFooterMargins": true - }, - "lists": { - "kix.1tfofde9qvse": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.lz2y53co32x0": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.sfo7zdq8bsnk": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.wiitwhreylki": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.yvnb3ezfmvk3": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - } - }, - "namedStyles": { - "styles": [ - { - "namedStyleType": "NORMAL_TEXT", - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - }, - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_1", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 20, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 6, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 20, - "unit": "PT" - } - } - }, - { - "namedStyleType": "HEADING_2", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 18, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 6, - "unit": "PT" - } - }, - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16, - "unit": "PT" - } - } - }, - { - "namedStyleType": "HEADING_3", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 16, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4, - "unit": "PT" - } - }, - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 14, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2627451, - "green": 0.2627451, - "red": 0.2627451 - } - } - } - } - }, - { - "namedStyleType": "HEADING_4", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 14, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 12, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - } - } - }, - { - "namedStyleType": "HEADING_5", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - } - } - }, - { - "namedStyleType": "HEADING_6", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 12, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 11, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "italic": true - } - }, - { - "namedStyleType": "TITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 3, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 26, - "unit": "PT" - } - } - }, - { - "namedStyleType": "SUBTITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 15, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "italic": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - ] - } - }, - "tabProperties": { - "index": 1, - "tabId": "t.6pnw08u81r", - "title": "GPT Direction" - } - } - ], - "title": "Doc_8_DXP_benefits - Sample" -} \ No newline at end of file diff --git a/apps/google-docs/src/utils/test_docs_json/index.ts b/apps/google-docs/src/utils/test_docs_json/index.ts deleted file mode 100644 index 1cc46b8598..0000000000 --- a/apps/google-docs/src/utils/test_docs_json/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -// Import all test documents -import Doc1 from './Doc_1_Basic_Structure_Test.json'; -import Doc2 from './Doc_2_Rich_Text_Formatting_Test.json'; -import Doc3 from './Doc_3_Nested_Structures_And_References_Test.json'; -import Doc4 from './Doc_4_Media_Embeds_Test.json'; -import Doc5 from './Doc_5_Bulk_Entry_Stress_Test.json'; -import Doc6 from './Doc_6_Multilingual_Test.json'; -import Doc7 from './Doc_7_Edge_Cases_Test.json'; -import Doc8 from './Doc_8_DXP_benefits - Sample.json'; - -// Optional import: Doc9 may not exist in all environments (e.g., S3 hosted app) -const doc9Modules = (import.meta as any).glob('./Doc_9_Customer_Example_Doc.json', { eager: true }); -const Doc9 = doc9Modules?.['./Doc_9_Customer_Example_Doc.json']?.default || null; - -// Export test documents array -export const TEST_DOCUMENTS = [ - { id: 'doc1', title: 'Doc 1: Basic Structure Test', data: Doc1 }, - { id: 'doc2', title: 'Doc 2: Rich Text Formatting Test', data: Doc2 }, - { id: 'doc3', title: 'Doc 3: Nested Structures And References Test', data: Doc3 }, - { id: 'doc4', title: 'Doc 4: Media Embeds Test', data: Doc4 }, - { id: 'doc5', title: 'Doc 5: Bulk Entry Stress Test', data: Doc5 }, - { id: 'doc6', title: 'Doc 6: Multilingual Test', data: Doc6 }, - { id: 'doc7', title: 'Doc 7: Edge Cases Test', data: Doc7 }, - { id: 'doc8', title: 'Doc 8: DXP Benefits Sample', data: Doc8 }, - { id: 'doc9', title: 'Doc 9: Customer Example Doc', data: Doc9 }, -]; From 557a21bdfa48925f4adb97030c03b0425e93ba21 Mon Sep 17 00:00:00 2001 From: harika kondur Date: Thu, 18 Dec 2025 14:56:39 -0700 Subject: [PATCH 15/16] cleanup --- .../src/components/page/ViewPreviewModal.tsx | 9 ------- .../src/hooks/useDocumentSubmission.ts | 15 ++++++----- apps/google-docs/src/locations/Page.tsx | 26 +++++++++---------- 3 files changed, 20 insertions(+), 30 deletions(-) diff --git a/apps/google-docs/src/components/page/ViewPreviewModal.tsx b/apps/google-docs/src/components/page/ViewPreviewModal.tsx index e8118b2cec..897b5842f2 100644 --- a/apps/google-docs/src/components/page/ViewPreviewModal.tsx +++ b/apps/google-docs/src/components/page/ViewPreviewModal.tsx @@ -87,15 +87,6 @@ export const ViewPreviewModal: React.FC = ({ Based off the document, the following entries are being suggested: - - - {totalEntries} {totalEntries === 1 ? 'entry' : 'entries'} - - - {Object.keys(entriesByContentType).length} content{' '} - {Object.keys(entriesByContentType).length === 1 ? 'type' : 'types'} - - diff --git a/apps/google-docs/src/hooks/useDocumentSubmission.ts b/apps/google-docs/src/hooks/useDocumentSubmission.ts index 06f9b76c22..345678077d 100644 --- a/apps/google-docs/src/hooks/useDocumentSubmission.ts +++ b/apps/google-docs/src/hooks/useDocumentSubmission.ts @@ -1,11 +1,12 @@ import { useState, useCallback } from 'react'; import { PageAppSDK } from '@contentful/app-sdk'; import { analyzeContentTypesAction, createPreviewAction } from '../utils/appActionUtils'; -import { ERROR_MESSAGES, SUCCESS_MESSAGES } from '../constants/messages'; +import { ERROR_MESSAGES } from '../constants/messages'; +import { EntryToCreate } from '../../functions/agents/documentParserAgent/schema'; interface UseDocumentSubmissionReturn { isSubmitting: boolean; - result: any; + previewEntries: EntryToCreate[]; errorMessage: string | null; successMessage: string | null; submit: (contentTypeIds: string[]) => Promise; @@ -18,7 +19,7 @@ export const useDocumentSubmission = ( oauthToken: string ): UseDocumentSubmissionReturn => { const [isSubmitting, setIsSubmitting] = useState(false); - const [result, setResult] = useState(null); + const [previewEntries, setPreviewEntries] = useState([]); const [errorMessage, setErrorMessage] = useState(null); const [successMessage, setSuccessMessage] = useState(null); @@ -55,7 +56,7 @@ export const useDocumentSubmission = ( setIsSubmitting(true); setErrorMessage(null); setSuccessMessage(null); - setResult(null); + setPreviewEntries([]); try { const analyzeContentTypesResponse = await analyzeContentTypesAction( @@ -73,7 +74,7 @@ export const useDocumentSubmission = ( ); console.log('processDocumentResponse', processDocumentResponse); - setResult(processDocumentResponse); + setPreviewEntries((processDocumentResponse as any).sys.result.entries); } catch (error) { setErrorMessage(error instanceof Error ? error.message : ERROR_MESSAGES.SUBMISSION_FAILED); } finally { @@ -84,14 +85,14 @@ export const useDocumentSubmission = ( ); const clearMessages = useCallback(() => { - setResult(null); + setPreviewEntries([]); setSuccessMessage(null); setErrorMessage(null); }, []); return { isSubmitting, - result, + previewEntries, errorMessage, successMessage, submit, diff --git a/apps/google-docs/src/locations/Page.tsx b/apps/google-docs/src/locations/Page.tsx index 2a421a2bcc..7128b8da98 100644 --- a/apps/google-docs/src/locations/Page.tsx +++ b/apps/google-docs/src/locations/Page.tsx @@ -32,8 +32,11 @@ const Page = () => { pendingCloseAction, setPendingCloseAction, } = useProgressTracking(); - const { result, successMessage, errorMessage, submit, clearMessages, isSubmitting } = - useDocumentSubmission(sdk, documentId, oauthToken); + const { previewEntries, submit, clearMessages, isSubmitting } = useDocumentSubmission( + sdk, + documentId, + oauthToken + ); // Track previous submission state to detect completion const prevIsSubmittingRef = useRef(false); @@ -117,9 +120,7 @@ const Page = () => { }; const handlePreviewModalConfirm = async (contentTypes: SelectedContentType[]) => { - const entries = result?.sys?.result?.entries; - - if (!entries || entries.length === 0) { + if (!previewEntries || previewEntries.length === 0) { sdk.notifier.error('No entries to create'); return; } @@ -127,7 +128,7 @@ const Page = () => { setIsCreatingEntries(true); try { const ids = contentTypes.map((ct) => ct.id); - const entryResult: any = await createEntriesAction(sdk, entries, ids); + const entryResult: any = await createEntriesAction(sdk, previewEntries, ids); if (entryResult.errorCount > 0) { sdk.notifier.warning( @@ -155,21 +156,18 @@ const Page = () => { const submissionJustCompleted = prevIsSubmittingRef.current && !isSubmitting; if (submissionJustCompleted && modalStates.isContentTypePickerOpen) { - console.log('Document processing completed, result:', result); + console.log('Document processing completed, previewEntries:', previewEntries); closeModal(ModalType.CONTENT_TYPE_PICKER); // Open preview modal if we have entries - const entries = result?.sys?.result?.entries; - if (entries && entries.length > 0) { - console.log('Opening preview modal with', entries.length, 'entries'); + if (previewEntries && previewEntries.length > 0) { + console.log('Opening preview modal with', previewEntries.length, 'entries'); openModal(ModalType.PREVIEW); - } else { - console.log('No entries to preview. Full result:', result); } } prevIsSubmittingRef.current = isSubmitting; - }, [isSubmitting, modalStates.isContentTypePickerOpen, closeModal, openModal, result]); + }, [isSubmitting, modalStates.isContentTypePickerOpen, closeModal, openModal, previewEntries]); // Show getting started page if not started yet if (!hasStarted) { @@ -208,7 +206,7 @@ const Page = () => { closeModal(ModalType.PREVIEW)} - entries={result?.sys?.result?.entries || null} + entries={previewEntries} onConfirm={() => handlePreviewModalConfirm(selectedContentTypes)} isSubmitting={isCreatingEntries} /> From 33921a08ff0db2dedf035e3b54b8b0c957fff4b9 Mon Sep 17 00:00:00 2001 From: harika kondur Date: Thu, 18 Dec 2025 15:01:24 -0700 Subject: [PATCH 16/16] rename handler for consistency --- apps/google-docs/contentful-app-manifest.json | 4 ++-- ...lyzeContentTypes.ts => analyzeContentTypesHandler.ts} | 9 --------- .../functions/handlers/createEntriesHandler.ts | 1 - 3 files changed, 2 insertions(+), 12 deletions(-) rename apps/google-docs/functions/handlers/{analyzeContentTypes.ts => analyzeContentTypesHandler.ts} (83%) diff --git a/apps/google-docs/contentful-app-manifest.json b/apps/google-docs/contentful-app-manifest.json index e9178bcf4f..424e4c3c0a 100644 --- a/apps/google-docs/contentful-app-manifest.json +++ b/apps/google-docs/contentful-app-manifest.json @@ -41,8 +41,8 @@ "id": "analyzeContentTypes", "name": "Analyze Content Types", "description": "Analyzes content type structure and relationships using AI.", - "path": "functions/handlers/analyzeContentTypes.js", - "entryFile": "functions/handlers/analyzeContentTypes.ts", + "path": "functions/handlers/analyzeContentTypesHandler.js", + "entryFile": "functions/handlers/analyzeContentTypesHandler.ts", "allowNetworks": [ "https://api.openai.com" ], diff --git a/apps/google-docs/functions/handlers/analyzeContentTypes.ts b/apps/google-docs/functions/handlers/analyzeContentTypesHandler.ts similarity index 83% rename from apps/google-docs/functions/handlers/analyzeContentTypes.ts rename to apps/google-docs/functions/handlers/analyzeContentTypesHandler.ts index 702d61373f..456ee64a52 100644 --- a/apps/google-docs/functions/handlers/analyzeContentTypes.ts +++ b/apps/google-docs/functions/handlers/analyzeContentTypesHandler.ts @@ -16,13 +16,6 @@ interface AppInstallationParameters { openAiApiKey: string; } -/** - * App Action: Analyze Content Types - * - * Analyzes the structure and relationships of selected content types - * using AI to understand their fields, validations, and relationships. - * - */ export const handler: FunctionEventHandler< FunctionTypeEnum.AppActionCall, AnalyzeContentTypesParameters @@ -37,8 +30,6 @@ export const handler: FunctionEventHandler< throw new Error('At least one content type ID is required'); } - console.log('contentTypeIds', contentTypeIds); - console.log('In analyzeContentTypes handler'); const cma = initContentfulManagementClient(context); const contentTypes = await fetchContentTypes(cma, new Set(contentTypeIds)); diff --git a/apps/google-docs/functions/handlers/createEntriesHandler.ts b/apps/google-docs/functions/handlers/createEntriesHandler.ts index 6257be1b97..301d3f8079 100644 --- a/apps/google-docs/functions/handlers/createEntriesHandler.ts +++ b/apps/google-docs/functions/handlers/createEntriesHandler.ts @@ -38,7 +38,6 @@ export const handler: FunctionEventHandler< throw new Error('No matching content types found'); } - // Create entries const result = await createEntries(cma, entries, { spaceId: context.spaceId, environmentId: context.environmentId,