================================================================================
Import statement
================================================================================

import { Button } from "std-widgets.slint";

--------------------------------------------------------------------------------

(source_file
  (import_statement
    (type_identifier)
    (string_literal)))

================================================================================
Global Singleton
================================================================================

global Palette {
    property<color> primary: blue;
}

--------------------------------------------------------------------------------

(source_file
  (global_single
    (type_identifier)
    (define_assign_property
      (type_identifier
        (type_builtin))
      (identifier)
      (identifier
        (constant_builtin)))))

================================================================================
Export statement
================================================================================

export { MathLogic }

--------------------------------------------------------------------------------

(source_file
  (export_statement
    (vis)
    (type_identifier)))

================================================================================
Export as  statement
================================================================================

export { Button as ColorButton }

--------------------------------------------------------------------------------

(source_file
  (export_statement
    (vis)
    (type_identifier)
    (type_identifier)))

================================================================================
More complicated conditional statement
================================================================================

component example inherits Rectangle {
    clicked => {
        if (condition) {
            foo = 42;
        } else if (other-condition) {
            bar = 28;
        } else {
            foo = 4;
        }
    }
}

--------------------------------------------------------------------------------

(source_file
  (component_item
    (type_identifier)
    (type_identifier)
    (comp_body
      (call_back_handler
        (function_identifier)
        (handler_body
          (if_expression
            (identifier)
            (consequence_body
              (assign_expression
                (identifier)
                (int_literal)))
            (if_expression
              (identifier)
              (consequence_body
                (assign_expression
                  (identifier)
                  (int_literal)))
              (consequence_body
                (assign_expression
                  (identifier)
                  (int_literal))))))))))

================================================================================
For-in statement
================================================================================

component Example inherits Window {
    for my-color[index] in [ #e11, #1a2, #23d ]: Rectangle {
        background: my-color;
    }
}

--------------------------------------------------------------------------------

(source_file
  (component_item
    (type_identifier)
    (type_identifier)
    (comp_body
      (for_loop
        (index_expression
          (identifier)
          (identifier))
        (array_literal
          (color_literal)
          (color_literal)
          (color_literal))
        (component_item
          (type_identifier)
          (comp_body
            (assign_property
              (identifier)
              (identifier))))))))

================================================================================
For-in anonymouse statement struct as property
================================================================================

component Example inherits Window {
    property <[{foo: string, col: color}]> model: [
        {foo: "abc", col: #f00 },
        {foo: "def", col: #00f },
    ];
    VerticalLayout {
        for data in root.model: my-repeated-text := Text {
            color: data.col;
            text: data.foo;
        }
    }
}

--------------------------------------------------------------------------------

(source_file
  (component_item
    (type_identifier)
    (type_identifier)
    (comp_body
      (define_assign_property
        (array_literal
          (struct_block_definition
            (identifier)
            (identifier
              (type_builtin))
            (identifier)
            (identifier
              (type_builtin))))
        (identifier)
        (array_literal
          (struct_block_definition
            (identifier)
            (string_literal)
            (identifier)
            (color_literal))
          (struct_block_definition
            (identifier)
            (string_literal)
            (identifier)
            (color_literal))))
      (component_item
        (type_identifier)
        (comp_body
          (for_loop
            (identifier)
            (field_expression
              (identifier
                (variable_builtin))
              (identifier))
            (component_item
              (type_identifier)
              (type_identifier)
              (comp_body
                (assign_property
                  (identifier
                    (type_builtin))
                  (field_expression
                    (identifier)
                    (identifier)))
                (assign_property
                  (identifier)
                  (field_expression
                    (identifier)
                    (identifier)))))))))))

================================================================================
Animation statement
================================================================================

Example := Window {
    animate background {
        duration: 250ms;
    }
}

--------------------------------------------------------------------------------

(source_file
  (component_item
    (type_identifier)
    (type_identifier)
    (comp_body
      (animate_statement
        (identifier)
        (assign_property
          (identifier
            (variable_builtin))
          (num_units
            (int_literal)
            (units)))))))

================================================================================
Animate two variables together statement
================================================================================


component Example inherits Window {
    animate x, y { duration: 100ms; }
}

--------------------------------------------------------------------------------

(source_file
  (component_item
    (type_identifier)
    (type_identifier)
    (comp_body
      (animate_statement
        (identifier)
        (identifier)
        (assign_property
          (identifier
            (variable_builtin))
          (num_units
            (int_literal)
            (units)))))))

================================================================================
State statement
================================================================================


component Example inherits Window {
    states [
        disabled when !is-enabled : {
            background: gray;
        }
        down when pressed : {
            background: blue;
        }
    ]
}

--------------------------------------------------------------------------------

(source_file
  (component_item
    (type_identifier)
    (type_identifier)
    (comp_body
      (state_statement
        (state_expression
          (identifier)
          (unary_expression
            (identifier)))
        (assign_property
          (identifier)
          (identifier
            (constant_builtin)))
        (state_expression
          (identifier)
          (identifier))
        (assign_property
          (identifier)
          (identifier
            (constant_builtin)))))))

================================================================================
Transition statement
================================================================================


Example := Window {
    transitions [
        in down : {
            animate color { duration: 300ms; }
        }
        out disabled : {
            animate * { duration: 800ms; }
        }
    ]
}

--------------------------------------------------------------------------------

(source_file
  (component_item
    (type_identifier)
    (type_identifier)
    (comp_body
      (transition_statement
        (identifier)
        (animate_statement
          (identifier
            (type_builtin))
          (assign_property
            (identifier
              (variable_builtin))
            (num_units
              (int_literal)
              (units))))
        (identifier)
        (animate_statement
          (assign_property
            (identifier
              (variable_builtin))
            (num_units
              (int_literal)
              (units))))))))
