diff --git a/queries/angular/indents.scm b/queries/angular/indents.scm
index 448e94275..2f46aa5bc 100644
--- a/queries/angular/indents.scm
+++ b/queries/angular/indents.scm
@@ -1 +1,16 @@
; inherits: html_tags
+
+[
+ (statement_block)
+ (switch_statement)
+] @indent.begin
+
+(statement_block
+ "{" @indent.branch)
+
+(statement_block
+ "}" @indent.end)
+
+"}" @indent.branch
+
+"}" @indent.end
diff --git a/tests/indent/angular/defer.html b/tests/indent/angular/defer.html
new file mode 100644
index 000000000..a85313986
--- /dev/null
+++ b/tests/indent/angular/defer.html
@@ -0,0 +1,9 @@
+@defer (on viewport) {
+
+} @placeholder (minimum 100ms) {
+
+} @loading (after 100s; minimum 200ms){
+
+} @error {
+
+}
diff --git a/tests/indent/angular/for.html b/tests/indent/angular/for.html
new file mode 100644
index 000000000..591472e23
--- /dev/null
+++ b/tests/indent/angular/for.html
@@ -0,0 +1,5 @@
+@for (item of items; track item.id) {
+
{{ item.name }}
+} @empty {
+ No items
+}
diff --git a/tests/indent/angular/if-else.html b/tests/indent/angular/if-else.html
new file mode 100644
index 000000000..7854e1bc8
--- /dev/null
+++ b/tests/indent/angular/if-else.html
@@ -0,0 +1,15 @@
+@if (someCondition) {
+ someCondition is true
+} @else {
+ someCondition is false
+}
+
+
+ @if (someOther) {
+ True
+
+ @if (nestedCondition) {
+ Nested
+ }
+ }
+
diff --git a/tests/indent/angular/switch-case.html b/tests/indent/angular/switch-case.html
new file mode 100644
index 000000000..17df96609
--- /dev/null
+++ b/tests/indent/angular/switch-case.html
@@ -0,0 +1,13 @@
+
+ @switch (obj.property) {
+ @case (1) {
+
Case 1
+ }
+ @case (2) {
+
Case 2
+ }
+ @default {
+
Default
+ }
+ }
+
diff --git a/tests/indent/angular_spec.lua b/tests/indent/angular_spec.lua
new file mode 100644
index 000000000..2090420ce
--- /dev/null
+++ b/tests/indent/angular_spec.lua
@@ -0,0 +1,70 @@
+local Runner = require("tests.indent.common").Runner
+local runner = Runner:new(it, "tests/indent/angular", {
+ tabstop = 2,
+ shiftwidth = 2,
+ expandtab = true,
+ filetype = "htmlangular",
+})
+
+describe("indent HTML Angular:", function()
+ describe("whole file:", function()
+ runner:whole_file "."
+ end)
+
+ describe("new line:", function()
+ for _, info in ipairs {
+ { 1, 2 },
+ { 2, 2 },
+ { 3, 2 },
+ { 4, 2 },
+ { 6, 0 },
+ { 7, 2 },
+ { 8, 4 },
+ { 10, 4 },
+ { 11, 6 },
+ { 12, 6 },
+ { 13, 4 },
+ { 14, 2 },
+ } do
+ runner:new_line("if-else.html", { on_line = info[1], text = "//", indent = info[2] })
+ end
+
+ for _, info in ipairs {
+ { 1, 2 },
+ { 2, 4 },
+ { 3, 6 },
+ { 4, 6 },
+ { 6, 6 },
+ { 7, 6 },
+ { 9, 6 },
+ { 10, 6 },
+ { 12, 2 },
+ } do
+ runner:new_line("switch-case.html", { on_line = info[1], text = "//", indent = info[2] })
+ end
+
+ for _, info in ipairs {
+ { 1, 2 },
+ { 2, 2 },
+ { 3, 2 },
+ { 4, 2 },
+ { 5, 0 },
+ } do
+ runner:new_line("for.html", { on_line = info[1], text = "//", indent = info[2] })
+ end
+
+ for _, info in ipairs {
+ { 1, 2 },
+ { 2, 2 },
+ { 3, 2 },
+ { 4, 2 },
+ { 5, 2 },
+ { 6, 2 },
+ { 7, 2 },
+ { 8, 2 },
+ { 9, 0 },
+ } do
+ runner:new_line("defer.html", { on_line = info[1], text = "//", indent = info[2] })
+ end
+ end)
+end)