Create Rich Text in a Workspace

Objective: Create Rich Text elements which can be customized and stylized at creation time in order to add more depth to the Workspace. To perform this, the user only needs the workspaceId of where they want the text Element to be added.

All GraphQL API endpoints share the same base URL:

https://api.apps.us.bluescape.com/v3/graphql

Implementation using GraphQL APIs

Query createText
Comments Only workspaceId is needed for this call

Example Query:

mutation addRichTextExample($workspaceId: String!, $input: CreateTextInput!) {
        createText(workspaceId: $workspaceId, input: $input) {
            id
            transform {x y scaleX scaleY}
            pinned
            zIndex
            text
            style { textTransform fontSize fontFamily verticalAlign color {r g b a }}
            blocks {
                ...on TextBlock { align content}
            }
        }
    }

This mutation can be called with the following variables:

{
    "workspaceId": <workspaceId>,
    "input": {
        "blocks": {
            "block": {
            "align": "left",
            "content": {
                "span": {
                    "text": "Rich Text Example...",
                    "fontSize": 30,
                    "fontFamily": "Helvetica",
                    "fontWeight": "normal",
                    "fontStyle": "italic",
                    "textDecoration": "underline",
                    "color": { "r": 255, "g": 255, "b":255, "a": 1},
                    "backgroundColor": { "r": 0, "g": 0, "b": 200, "a": 1}
                        }
                    }
                }
            } 
        }
    }

And this is the text you see created in your workspace:

Code sample

See below for full code examples of this implementation in cURL, Python, and Node.js.

cURL
curl --location --request POST 'https://api.apps.us.bluescape.com/v3/graphql/' \
--header 'Authorization: Bearer <SET_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{"query":"mutation addRichTextExample($workspaceId: String!, $input: CreateTextInput!) {\n        createText(workspaceId: $workspaceId, input: $input) {\n            ... on Text {\n            id\n            transform {x y scaleX scaleY}\n            pinned\n            zIndex\n            text\n            style { textTransform fontSize fontFamily verticalAlign color {r g b a }}\n            blocks {\n                ...on TextBlock {\n                align content}}\n                }\n            }\n    }","variables":{"workspaceId":{workspaceId},"input":{"blocks":{"block":{"align":"left","content":{"span":{"text":"Rich Text Example...","fontSize":30,"fontFamily":"Helvetica","fontWeight":"normal","fontStyle":"italic","textDecoration":"underline","color":{"r":23,"g":56,"b":100,"a":1},"backgroundColor":{"r":223,"g":156,"b":200,"a":1}}}}}}}}'
Node.js
const axios = require('axios');

const url = "https://api.apps.us.bluescape.com/v3/graphql/"
const token = "<SET_TOKEN>"
const workspaceId = "<WORKSPACE_ID>";
const createTextQuery = 
    `mutation addRichTextExample($workspaceId: String!, $input: CreateTextInput!) {
        createText(workspaceId: $workspaceId, input: $input) {
            ... on Text {
              id
              transform {x y scaleX scaleY}
              pinned
              zIndex
              text
              style { textTransform fontSize fontFamily verticalAlign color {r g b a }}
              blocks {
                ...on TextBlock {
                  align content}}
                }
              }
            }`

const textParams = {
    "workspaceId": workspaceId,
    "input": {
        "blocks": {
            "block": {
            "align": "left",
            "content": {
                "span": {
                    "text": "Rich Text Example...",
                    "fontSize": 30,
                    "fontFamily": "Helvetica",
                    "fontWeight": "normal",
                    "fontStyle": "italic",
                    "textDecoration": "underline",
                    "color": { "r": 255, "g": 255, "b":255, "a": 1},
                    "backgroundColor": { "r": 0, "g": 0, "b": 200, "a": 1}
                        }
                    }
                }
            } 
        }
    }
const createText = async () => {
    try {
        const response = await axios.post(url,
            {query: createTextQuery, variables: textParams}, 
            {headers: {"Authorization": "Bearer " + token}})
        
        console.log(response.data);
        return response
    }
    catch(error) {
        console.error(error)
    }
}

createText();
Python
import requests
import pprint

url = "https://api.apps.us.bluescape.com/v3/graphql/"
token = "<SET_TOKEN>"
workspaceId = "<WORKSPACE_ID>";
query = """
    mutation addRichTextExample($workspaceId: String!, $input: CreateTextInput!) {
        createText(workspaceId: $workspaceId, input: $input) {
            ... on Text {
            id
            transform {x y scaleX scaleY}
            pinned
            zIndex
            text
            style { textTransform fontSize fontFamily verticalAlign color {r g b a }}
            blocks {
                ...on TextBlock {
                align content}}
                }
            }
    }
    """

params = {
    "workspaceId": workspaceId,
    "input": {
        "blocks": {
            "block": {
            "align": "left",
            "content": {
                "span": {
                    "text": "Rich Text Example...",
                    "fontSize": 30,
                    "fontFamily": "Helvetica",
                    "fontWeight": "normal",
                    "fontStyle": "italic",
                    "textDecoration": "underline",
                    "color": { "r": 255, "g": 255, "b":255, "a": 1},
                    "backgroundColor": { "r": 0, "g": 0, "b": 200, "a": 1}
                        }
                    }
                }
            } 
        }
    }
def makeQuery():
    try:
        response = requests.post(url, 
        headers={"Authorization": "Bearer " + token},
        json={'query': query,
            'variables': params})
        response.raise_for_status()
    except requests.exceptions.HTTPError as err:
        raise SystemExit(err)
    
    return response.json()
    

if __name__ == "__main__":
    response = makeQuery()
    pprint.pprint(response)

Output

{
    "data": {
        "createText": {
            "id": "<object_ID>",
            "transform": {
                "x": 0,
                "y": 0,
                "scaleX": 1,
                "scaleY": 1
            },
            "pinned": false,
            "zIndex": 4,
            "text": "Rich Text Example...",
            "style": {
                "textTransform": "none",
                "fontSize": 64,
                "fontFamily": "Dosis",
                "verticalAlign": "top",
                "color": {
                    "r": 255,
                    "g": 255,
                    "b": 255,
                    "a": 1
                }
            },
            "blocks": [
                {
                    "align": "left",
                    "content": [
                        {
                            "span": {
                                "fontFamily": "Helvetica",
                                "fontSize": 30,
                                "fontStyle": "italic",
                                "textDecoration": [
                                    "underline"
                                ],
                                "color": {
                                    "r": 255,
                                    "g": 255,
                                    "b": 255,
                                    "a": 1
                                },
                                "backgroundColor": {
                                    "r": 0,
                                    "g": 0,
                                    "b": 200,
                                    "a": 1
                                },
                                "content": [
                                    {
                                        "text": "Rich Text Example..."
                                    }
                                ]
                            }
                        }
                    ]
                }
            ]
        }
    }
}

After running the mutation above, the Rich Text element is added to the workspace.

If you want to create more complex structures, such as lists and applying specific format to a particular word or group of words, please see the example below.

To generate the following Text element use the graphQL mutation below:

mutation myCreateTextWithBlocks($ws: String! $x: Float! $y: Float!, $width:Float!, $height:Float!) {
        createText(
            workspaceId: $ws
            input: {
                transform: {
                    x:$x 
                    y:$y
                }
                style:{
                    width:$width
                    height:$height
                    fontSize:65
                    fontFamily:"Helvetica"
                    textTransform:none
                    verticalAlign:top
                    color:{ r:255 g:255 b:255 a:1 }
                    backgroundColor:{ r:0 g:0 b:255 a:1 }
                }
                blocks: [
                    {
                        block:{
                            align: left
                            content: [
                                { text: "text block example, line one" }
                            ]
                        }
                    },
                    {
                        block:{
                            align: left
                            content: [
                                { text: "" }
                            ]
                        }
                    },
                    {
                        list:{
                            kind:bullet
                            items: [
                            {
                                indent: 0,
                                content: [
                                    { text: "list 1" }
                                ]
                            },
                            {
                                indent: 1,
                                content: [
                                    { text: "list 2" }
                                ]
                            }
                        ]
                        }
                    },
                    {
                        block:{
                            align: left
                            content: [
                                { text: "" }
                            ]
                        }
                    },
                    {
                        block:{
                            content:[
                                { text:"new " },
                                {
                                    span:{
                                        fontWeight:bold
                                        content:[
                                            { text:"BOLD" }
                                        ]
                                    }
                                },
                                { text:" text" }
                            ]
                        }
                    }       
                ]
            }
        )
        {
            id
            text
            transform {x y}
        }
      }

with these variables:

{
    "ws": "",
    "x": 0,
    "y": 0,
    "width": 900,
    "height":600
}

Query Rich Text in GraphQL

If you want to see the details of the format of Text elements with Rich Text, you can use the query below:

query getTextElementsfromWorkspace ($workspaceId: String!){
    elements(workspaceId: $workspaceId type: Text ) {
        type: __typename        
        id        
        ... on Text {
              id
            transform {
              x y
            }
            style {
                color { r g b a}
            } 
          blocks {
            ... on TextBlock {
              align            
              content               
            }
            ... on TextList {
              align
              kind
              items {
                align
                indent
                content
              }
            }
            
          }
              
        } 
    }
}

use these variables:

{
    "workspaceId": <workspaceId>
}

This query returns a large amount of information on the text element, however, it can be altered to return more or fewer details depending on what is needed.

Where to Next?

Not what you were looking for? Reply below or Search the community and discover more Bluescape.