{
    "name": "slint",
    "scopeName": "source.slint",
    "patterns": [
        {
            "include": "#document"
        }
    ],
    "repository": {
        "document": {
            "patterns": [
                {
                    "include": "#general"
                },
                {
                    "match": "(?<!-)\\b(from|export)\\b(?!-)",
                    "name": "keyword"
                },
                {
                    "match": "(?<!-)\\b(animate|states|transitions|private|public|pure|function|in|out|in-out)\\b(?!-)",
                    "name": "keyword.other"
                },
                {
                    "match": "(?<!-)\\b(if|for|return)\\b(?!-)",
                    "name": "keyword.control"
                },
                {
                    "match": "(?<!-)\\b(root|parent|this|self)\\b(?!-)",
                    "name": "variable.language"
                },
                {
                    "match": "\\b([A-Z][a-zA-Z0-9_-]*)\\s*\\{",
                    "captures": {
                        "1": {
                            "name": "entity.name.type"
                        }
                    }
                },
                {
                    "match": "(?<!-)\\b(import)\\s*\\{\\s*(([a-zA-Z_][a-zA-Z0-9_-]*)(\\s*,\\s*([a-zA-Z_][a-zA-Z0-9_-]*))*)\\s*\\}",
                    "captures": {
                        "1": {
                            "name": "keyword.other"
                        },
                        "3": {
                            "name": "entity.name.type"
                        },
                        "5": {
                            "name": "entity.name.type"
                        }
                    }
                },
                {
                    "match": "(?<!-)\\b([a-zA-Z_][a-zA-Z0-9_-]*)\\s*:",
                    "captures": {
                        "1": {
                            "name": "variable.parameter"
                        }
                    }
                },
                {
                    "match": "(?<!-)\\b([a-zA-Z_][a-zA-Z0-9_-]*)\\s*\\(.*\\)\\s*=>",
                    "captures": {
                        "1": {
                            "name": "entity.name.function"
                        }
                    }
                },
                {
                    "match": "(?<!-)\\b(callback)\\s+([a-zA-Z_][a-zA-Z0-9_-]*)\\s*",
                    "captures": {
                        "1": {
                            "name": "entity.name.function"
                        },
                        "2": {
                            "name": "entity.name.type"
                        }
                    }
                },
                {
                    "begin": "(?<!-)\\b(struct)\\s+([a-zA-Z_][a-zA-Z0-9_-]*)\\s*\\{",
                    "end": "\\}",
                    "beginCaptures": {
                        "1": {
                            "name": "storage.type"
                        },
                        "2": {
                            "name": "entity.name.type"
                        }
                    },
                    "patterns": [
                        {
                            "match": "([a-zA-Z_][a-zA-Z0-9_-]*)\\s*:\\s*([a-zA-Z_][a-zA-Z0-9_-]*)\\s*,?",
                            "captures": {
                                "1": {
                                    "name": "variable.parameter"
                                },
                                "2": {
                                    "name": "entity.name.type"
                                }
                            }
                        }
                    ]
                },
                {
                    "begin": "(?<!-)\\b(global)\\s+([a-zA-Z_][a-zA-Z0-9_-]*)\\s*\\{",
                    "end": "\\}",
                    "beginCaptures": {
                        "1": {
                            "name": "storage.type"
                        },
                        "2": {
                            "name": "entity.name.type"
                        }
                    },
                    "patterns": [
                        {
                            "include": "#property"
                        }
                    ]
                },
                {
                    "begin": "(?<!-)\\b(enum)\\s+([a-zA-Z_][a-zA-Z0-9_-]*)\\s*\\{",
                    "end": "\\}",
                    "beginCaptures": {
                        "1": {
                            "name": "storage.type"
                        },
                        "2": {
                            "name": "entity.name.type"
                        }
                    },
                    "patterns": [
                        {
                            "match": "([a-zA-Z_][a-zA-Z0-9_-]*)\\s*,?",
                            "name": "entity.name.type"
                        }
                    ]
                },
                {
                    "match": "(?<!-)\\b(component|inherits)\\s+([a-zA-Z_][a-zA-Z0-9_-]*)",
                    "captures": {
                        "1": {
                            "name": "storage.type"
                        },
                        "2": {
                            "name": "entity.name.type"
                        }
                    }
                },
                {
                    "match": "([a-zA-Z_][a-zA-Z0-9_-])*\\s*(:=)\\s*([a-zA-Z_][a-zA-Z0-9_-]*)",
                    "captures": {
                        "1": {
                            "name": "variable.parameter"
                        },
                        "2": {
                            "name": "keyword.operator"
                        },
                        "3": {
                            "name": "entity.name.type"
                        }
                    }
                },
                {
                    "match": "(?<!-)\\b(blue|red|green|yellow|red|black|linear|ease-in-quad|ease-out-quad|ease-in-out-quad|ease|ease-in|ease-out|ease-in-out|ease-in-quart|ease-out-quart|ease-in-out-quart|ease-in-quint|ease-out-quint|ease-in-out-quint|ease-in-expo|ease-out-expo|ease-in-out-expo|ease-in-sine|ease-out-sine|ease-in-out-sine|ease-in-back|ease-out-back|ease-in-out-back|ease-in-circ|ease-out-circ|ease-in-out-circ|ease-in-elastic|ease-out-elastic|ease-in-out-elastic|ease-in-bounce|ease-out-bounce|ease-in-out-bounce|cubic-bezier)\\b(?!-)",
                    "name": "support.constant"
                },
                {
                    "include": "#property"
                }
            ]
        },
        "general": {
            "patterns": [
                {
                    "include": "#block-comments"
                },
                {
                    "match": "//.*$",
                    "name": "comment.line"
                },
                {
                    "name": "string.quoted.double",
                    "begin": "\"",
                    "end": "\"",
                    "patterns": [
                        {
                            "name": "constant.character.escape.untitled",
                            "match": "\\\\(n|\\\\|u\\{\\d+\\}|\\{[^\\}]+\\})"
                        }
                    ]
                },
                {
                    "match": "#([a-fA-F0-9]){3,8}",
                    "name": "constant.other"
                },
                {
                    "match": "\\b\\d+(\\.\\d*)?(%|px|phx|pt|in|mm|cm|ms|s|deg|rad|turn)?\\b",
                    "name": "constant.numeric"
                }
            ]
        },
        "property": {
            "patterns": [
                {
                    "begin": "\\b(property)\\b",
                    "end": "(;|:|<=>)",
                    "beginCaptures": {
                        "1": {
                            "name": "keyword.other"
                        }
                    },
                    "patterns": [
                        {
                            "match": "<([a-zA-Z_][a-zA-Z0-9_-]*)>",
                            "captures": {
                                "1": {
                                    "name": "entity.name.type"
                                }
                            }
                        },
                        {
                            "match": "[a-zA-Z_][a-zA-Z0-9_-]*",
                            "name": "variable.parameter"
                        },
                        {
                            "match": "\\b(<=>|:)\\b",
                            "name": "keyword.operator"
                        }
                    ]
                }
            ]
        },
        "block-comments": {
            "patterns": [
                {
                    "name": "comment.block",
                    "begin": "/\\*",
                    "end": "\\*/",
                    "comment": "Block comment.",
                    "patterns": [
                        {
                            "include": "#block-comments"
                        }
                    ]
                }
            ]
        }
    }
}
