xmlui 0.10.12 → 0.10.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/dist/lib/{index-CDOoBf2R.mjs → index-779mp2Bm.mjs} +1508 -1287
  2. package/dist/lib/index.css +1 -1
  3. package/dist/lib/{initMock-BAV9RKui.mjs → initMock-CAXdczCj.mjs} +1 -1
  4. package/dist/lib/scss/components-core/theming/_themes.scss +1 -1
  5. package/dist/lib/xmlui.d.ts +17 -2
  6. package/dist/lib/xmlui.mjs +33 -32
  7. package/dist/metadata/{collectedComponentMetadata-Dp8BqWQO.mjs → collectedComponentMetadata-7DFXlw-J.mjs} +14957 -14751
  8. package/dist/metadata/{initMock-BvEO8W8r.mjs → initMock-AFWEftc6.mjs} +1 -1
  9. package/dist/metadata/style.css +1 -1
  10. package/dist/metadata/xmlui-metadata.mjs +1 -1
  11. package/dist/metadata/xmlui-metadata.umd.js +3 -3
  12. package/dist/scripts/bin/build-lib.js +21 -13
  13. package/dist/scripts/bin/viteConfig.js +3 -1
  14. package/dist/scripts/package.json +1 -1
  15. package/dist/scripts/src/abstractions/scripting/Token.js +2 -0
  16. package/dist/scripts/src/abstractions/scripting/TryScope.js +2 -0
  17. package/dist/scripts/src/abstractions/scripting/modules.js +2 -0
  18. package/dist/scripts/src/components/APICall/APICall.spec.js +910 -0
  19. package/dist/scripts/src/components/Accordion/Accordion.spec.js +969 -0
  20. package/dist/scripts/src/components/Animation/Animation.js +50 -0
  21. package/dist/scripts/src/components/App/App.spec.js +219 -0
  22. package/dist/scripts/src/components/AppHeader/AppHeader.spec.js +169 -0
  23. package/dist/scripts/src/components/AppState/AppState.spec.js +268 -0
  24. package/dist/scripts/src/components/AutoComplete/AutoComplete.spec.js +383 -0
  25. package/dist/scripts/src/components/Avatar/Avatar.spec.js +1543 -0
  26. package/dist/scripts/src/components/Backdrop/Backdrop.spec.js +131 -0
  27. package/dist/scripts/src/components/Badge/Badge.spec.js +2214 -0
  28. package/dist/scripts/src/components/Bookmark/Bookmark.spec.js +230 -0
  29. package/dist/scripts/src/components/Breakout/Breakout.spec.js +56 -0
  30. package/dist/scripts/src/components/Button/Button-style.spec.js +274 -0
  31. package/dist/scripts/src/components/Button/Button.spec.js +454 -0
  32. package/dist/scripts/src/components/Card/Card.spec.js +150 -0
  33. package/dist/scripts/src/components/Carousel/Carousel.spec.js +343 -0
  34. package/dist/scripts/src/components/Carousel/CarouselNative.js +2 -2
  35. package/dist/scripts/src/components/ChangeListener/ChangeListener.spec.js +169 -0
  36. package/dist/scripts/src/components/Charts/AreaChart/AreaChart.spec.js +999 -0
  37. package/dist/scripts/src/components/Charts/BarChart/BarChart.spec.js +597 -0
  38. package/dist/scripts/src/components/Charts/DonutChart/DonutChart.spec.js +608 -0
  39. package/dist/scripts/src/components/Charts/LabelList/LabelList.spec.js +539 -0
  40. package/dist/scripts/src/components/Charts/Legend/Legend.spec.js +558 -0
  41. package/dist/scripts/src/components/Charts/LineChart/LineChart.spec.js +450 -0
  42. package/dist/scripts/src/components/Charts/PieChart/PieChart.spec.js +584 -0
  43. package/dist/scripts/src/components/Charts/RadarChart/RadarChart.spec.js +571 -0
  44. package/dist/scripts/src/components/Charts/Tooltip/TooltipContent.spec.js +449 -0
  45. package/dist/scripts/src/components/Checkbox/Checkbox.spec.js +964 -0
  46. package/dist/scripts/src/components/CodeBlock/CodeBlock.spec.js +196 -0
  47. package/dist/scripts/src/components/ColorPicker/ColorPicker.js +3 -3
  48. package/dist/scripts/src/components/ColorPicker/ColorPicker.spec.js +283 -0
  49. package/dist/scripts/src/components/ColorPicker/ColorPickerNative.js +16 -5
  50. package/dist/scripts/src/components/Column/doc-resources/list-component-data.js +53 -0
  51. package/dist/scripts/src/components/ComponentProvider.js +6 -6
  52. package/dist/scripts/src/components/ContentSeparator/ContentSeparator.spec.js +338 -0
  53. package/dist/scripts/src/components/DateInput/DateInput.spec.js +918 -0
  54. package/dist/scripts/src/components/DatePicker/DatePicker.spec.js +362 -0
  55. package/dist/scripts/src/components/DatePicker/DatePickerNative.js +3 -3
  56. package/dist/scripts/src/components/DropdownMenu/DropdownMenu.spec.js +331 -0
  57. package/dist/scripts/src/components/DropdownMenu/DropdownMenuNative.js +1 -1
  58. package/dist/scripts/src/components/EmojiSelector/EmojiSelector.spec.js +29 -0
  59. package/dist/scripts/src/components/ExpandableItem/ExpandableItem.spec.js +435 -0
  60. package/dist/scripts/src/components/FileInput/FileInput.spec.js +249 -0
  61. package/dist/scripts/src/components/FileInput/FileInputNative.js +14 -10
  62. package/dist/scripts/src/components/FileUploadDropZone/FileUploadDropZone.spec.js +296 -0
  63. package/dist/scripts/src/components/FileUploadDropZone/FileUploadDropZoneNative.js +1 -1
  64. package/dist/scripts/src/components/FlowLayout/FlowLayout.spec.js +518 -0
  65. package/dist/scripts/src/components/Footer/Footer.spec.js +991 -0
  66. package/dist/scripts/src/components/Form/Form.js +6 -0
  67. package/dist/scripts/src/components/Form/Form.spec.js +1257 -0
  68. package/dist/scripts/src/components/Form/FormNative.js +13 -3
  69. package/dist/scripts/src/components/FormItem/FormItem.spec.js +723 -0
  70. package/dist/scripts/src/components/FormItem/ItemWithLabel.js +2 -2
  71. package/dist/scripts/src/components/FormSection/FormSection.js +6 -31
  72. package/dist/scripts/src/components/Fragment/Fragment.js +5 -1
  73. package/dist/scripts/src/components/Fragment/Fragment.spec.js +50 -0
  74. package/dist/scripts/src/components/Heading/H1.spec.js +66 -0
  75. package/dist/scripts/src/components/Heading/H2.spec.js +66 -0
  76. package/dist/scripts/src/components/Heading/H3.spec.js +66 -0
  77. package/dist/scripts/src/components/Heading/H4.spec.js +66 -0
  78. package/dist/scripts/src/components/Heading/H5.spec.js +66 -0
  79. package/dist/scripts/src/components/Heading/H6.spec.js +66 -0
  80. package/dist/scripts/src/components/Heading/Heading.js +0 -12
  81. package/dist/scripts/src/components/Heading/Heading.spec.js +897 -0
  82. package/dist/scripts/src/components/HtmlTags/HtmlTags.spec.js +69 -0
  83. package/dist/scripts/src/components/IFrame/IFrame.spec.js +527 -0
  84. package/dist/scripts/src/components/Icon/ArrowDropDown.js +11 -0
  85. package/dist/scripts/src/components/Icon/ArrowDropUp.js +11 -0
  86. package/dist/scripts/src/components/Icon/ArrowLeft.js +11 -0
  87. package/dist/scripts/src/components/Icon/ArrowRight.js +11 -0
  88. package/dist/scripts/src/components/Icon/ChevronDownIcon.js +7 -0
  89. package/dist/scripts/src/components/Icon/ChevronUpIcon.js +7 -0
  90. package/dist/scripts/src/components/Icon/Icon.spec.js +527 -0
  91. package/dist/scripts/src/components/Icon/SunIcon.js +10 -0
  92. package/dist/scripts/src/components/Image/Image.js +2 -1
  93. package/dist/scripts/src/components/Image/Image.spec.js +198 -0
  94. package/dist/scripts/src/components/Image/ImageNative.js +30 -2
  95. package/dist/scripts/src/components/Input/InputLabel.js +25 -0
  96. package/dist/scripts/src/components/Input/index.js +5 -0
  97. package/dist/scripts/src/components/Items/Items.spec.js +397 -0
  98. package/dist/scripts/src/components/Link/Link.spec.js +894 -0
  99. package/dist/scripts/src/components/List/List.spec.js +927 -0
  100. package/dist/scripts/src/components/List/doc-resources/list-component-data.js +53 -0
  101. package/dist/scripts/src/components/Markdown/Markdown.spec.js +188 -0
  102. package/dist/scripts/src/components/ModalDialog/ModalDialog.js +1 -1
  103. package/dist/scripts/src/components/ModalDialog/ModalDialog.spec.js +162 -0
  104. package/dist/scripts/src/components/ModalDialog/ModalDialogNative.js +1 -1
  105. package/dist/scripts/src/components/NavGroup/NavGroup.spec.js +153 -0
  106. package/dist/scripts/src/components/NavGroup/NavGroupNative.js +2 -2
  107. package/dist/scripts/src/components/NavLink/NavLink.spec.js +864 -0
  108. package/dist/scripts/src/components/NavPanel/NavPanel.spec.js +864 -0
  109. package/dist/scripts/src/components/NoResult/NoResult.spec.js +863 -0
  110. package/dist/scripts/src/components/NumberBox/NumberBox.spec.js +1231 -0
  111. package/dist/scripts/src/components/Option/Option.spec.js +472 -0
  112. package/dist/scripts/src/components/PageMetaTitle/PageMetaTitle.spec.js +80 -0
  113. package/dist/scripts/src/components/Pagination/Pagination.spec.js +1003 -0
  114. package/dist/scripts/src/components/ProfileMenu/ProfileMenu.js +20 -0
  115. package/dist/scripts/src/components/ProgressBar/ProgressBar.spec.js +166 -0
  116. package/dist/scripts/src/components/Queue/Queue.spec.js +626 -0
  117. package/dist/scripts/src/components/RadioGroup/RadioGroup.spec.js +479 -0
  118. package/dist/scripts/src/components/RadioGroup/RadioGroupNative.js +17 -1
  119. package/dist/scripts/src/components/Redirect/Redirect.spec.js +527 -0
  120. package/dist/scripts/src/components/ResponsiveBar/ResponsiveBar.spec.js +76 -0
  121. package/dist/scripts/src/components/Select/Select.spec.js +527 -0
  122. package/dist/scripts/src/components/Slider/Slider.js +2 -0
  123. package/dist/scripts/src/components/Slider/Slider.spec.js +574 -0
  124. package/dist/scripts/src/components/Slider/SliderNative.js +62 -25
  125. package/dist/scripts/src/components/Slot/Slot.spec.js +368 -0
  126. package/dist/scripts/src/components/SpaceFiller/SpaceFiller.spec.js +184 -0
  127. package/dist/scripts/src/components/Spinner/Spinner.spec.js +161 -0
  128. package/dist/scripts/src/components/Splitter/HSplitter.spec.js +104 -0
  129. package/dist/scripts/src/components/Splitter/Splitter.spec.js +543 -0
  130. package/dist/scripts/src/components/Splitter/VSplitter.spec.js +104 -0
  131. package/dist/scripts/src/components/Stack/CHStack.spec.js +86 -0
  132. package/dist/scripts/src/components/Stack/CVStack.spec.js +86 -0
  133. package/dist/scripts/src/components/Stack/HStack.spec.js +67 -0
  134. package/dist/scripts/src/components/Stack/Stack.spec.js +654 -0
  135. package/dist/scripts/src/components/Stack/VStack.spec.js +67 -0
  136. package/dist/scripts/src/components/Switch/Switch.spec.js +829 -0
  137. package/dist/scripts/src/components/Table/Table.js +8 -5
  138. package/dist/scripts/src/components/Table/Table.spec.js +555 -0
  139. package/dist/scripts/src/components/Table/TableNative.js +1 -1
  140. package/dist/scripts/src/components/Table/doc-resources/list-component-data.js +53 -0
  141. package/dist/scripts/src/components/TableOfContents/TableOfContents.spec.js +838 -0
  142. package/dist/scripts/src/components/Tabs/Tabs.spec.js +875 -0
  143. package/dist/scripts/src/components/Text/Text.js +0 -13
  144. package/dist/scripts/src/components/Text/Text.spec.js +1075 -0
  145. package/dist/scripts/src/components/TextArea/TextArea.spec.js +714 -0
  146. package/dist/scripts/src/components/TextArea/TextAreaNative.js +8 -1
  147. package/dist/scripts/src/components/TextBox/TextBox.spec.js +643 -0
  148. package/dist/scripts/src/components/Theme/NotificationToast.js +4 -1
  149. package/dist/scripts/src/components/Theme/Theme.spec.js +124 -0
  150. package/dist/scripts/src/components/TimeInput/TimeInput.spec.js +1122 -0
  151. package/dist/scripts/src/components/Timer/Timer.spec.js +358 -0
  152. package/dist/scripts/src/components/ToneChangerButton/ToneChangerButton.spec.js +414 -0
  153. package/dist/scripts/src/components/ToneSwitch/ToneSwitch.spec.js +89 -0
  154. package/dist/scripts/src/components/Tooltip/Tooltip.spec.js +418 -0
  155. package/dist/scripts/src/components/chart-color-schemes.js +43 -0
  156. package/dist/scripts/src/components-core/CompoundComponent.js +5 -5
  157. package/dist/scripts/src/components-core/RestApiProxy.js +89 -11
  158. package/dist/scripts/src/components-core/devtools/InspectorDialogVisibilityContext.js +8 -0
  159. package/dist/scripts/src/components-core/renderers.js +31 -0
  160. package/dist/scripts/src/components-core/rendering/ComponentAdapter.js +1 -1
  161. package/dist/scripts/src/components-core/rendering/Container.js +19 -8
  162. package/dist/scripts/src/components-core/rendering/reducer.js +1 -1
  163. package/dist/scripts/src/components-core/script-runner/simplify-expression.js +386 -0
  164. package/dist/scripts/src/components-core/theming/component-layout-resolver.js +153 -0
  165. package/dist/scripts/src/components-core/theming/parse-layout-props.js +98 -0
  166. package/dist/scripts/src/components-core/theming/themes/root.js +13 -20
  167. package/dist/scripts/src/components-core/theming/themes/solid.js +16 -0
  168. package/dist/scripts/src/components-core/utils/audio-utils.js +83 -0
  169. package/dist/scripts/src/index-standalone.js +61 -0
  170. package/dist/scripts/src/index.js +2 -1
  171. package/dist/scripts/src/language-server/server-common.js +151 -0
  172. package/dist/scripts/src/language-server/server-web-worker.js +47 -0
  173. package/dist/scripts/src/language-server/server.js +42 -0
  174. package/dist/scripts/src/language-server/services/common/docs-generation.js +73 -0
  175. package/dist/scripts/src/language-server/services/common/lsp-utils.js +9 -0
  176. package/dist/scripts/src/language-server/services/common/syntax-node-utilities.js +135 -0
  177. package/dist/scripts/src/language-server/services/completion.js +270 -0
  178. package/dist/scripts/src/language-server/services/diagnostic.js +19 -0
  179. package/dist/scripts/src/language-server/services/format.js +430 -0
  180. package/dist/scripts/src/language-server/services/hover.js +164 -0
  181. package/dist/scripts/src/language-server/xmlui-metadata-generated.mjs +16266 -0
  182. package/dist/scripts/src/logging/xmlui.js +21 -0
  183. package/dist/scripts/src/parsers/common/utils.js +19 -0
  184. package/dist/scripts/src/syntax/monaco/grammar.monacoLanguage.js +286 -0
  185. package/dist/scripts/src/syntax/monaco/index.js +14 -0
  186. package/dist/scripts/src/syntax/monaco/xmlui-dark.js +25 -0
  187. package/dist/scripts/src/syntax/monaco/xmlui-light.js +25 -0
  188. package/dist/scripts/src/syntax/monaco/xmluiscript.monacoLanguage.js +310 -0
  189. package/dist/scripts/src/syntax/textMate/index.js +14 -0
  190. package/dist/scripts/src/syntax/textMate/xmlui-dark.json +631 -0
  191. package/dist/scripts/src/syntax/textMate/xmlui-light.json +565 -0
  192. package/dist/scripts/src/syntax/textMate/xmlui.json +564 -0
  193. package/dist/scripts/src/syntax/textMate/xmlui.tmLanguage.json +341 -0
  194. package/dist/scripts/src/testing/ComponentDrivers.js +1355 -0
  195. package/dist/scripts/src/testing/assertions.js +444 -0
  196. package/dist/scripts/src/testing/component-test-helpers.js +389 -0
  197. package/dist/scripts/src/testing/drivers/DateInputDriver.js +19 -0
  198. package/dist/scripts/src/testing/drivers/ModalDialogDriver.js +10 -0
  199. package/dist/scripts/src/testing/drivers/TimeInputDriver.js +22 -0
  200. package/dist/scripts/src/testing/drivers/TimerDriver.js +64 -0
  201. package/dist/scripts/src/testing/fixtures.js +487 -0
  202. package/dist/scripts/src/testing/infrastructure/TestBed.js +17 -0
  203. package/dist/scripts/src/testing/infrastructure/main.js +9 -0
  204. package/dist/scripts/src/testing/infrastructure/public/mockServiceWorker.js +266 -0
  205. package/dist/scripts/src/testing/themed-app-test-helpers.js +139 -0
  206. package/dist/standalone/xmlui-standalone.es.d.ts +19 -2
  207. package/dist/standalone/xmlui-standalone.umd.js +36 -36
  208. package/package.json +1 -1
  209. package/dist/scripts/src/components/RadioGroup/RadioItem.js +0 -28
@@ -0,0 +1,875 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const fixtures_1 = require("../../testing/fixtures");
13
+ // =============================================================================
14
+ // SMOKE TESTS
15
+ // =============================================================================
16
+ fixtures_1.test.describe("smoke tests", { tag: "@smoke" }, () => {
17
+ (0, fixtures_1.test)("component renders", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
18
+ yield initTestBed(`
19
+ <Tabs>
20
+ <TabItem label="Tab 1">Content 1</TabItem>
21
+ <TabItem label="Tab 2">Content 2</TabItem>
22
+ </Tabs>
23
+ `);
24
+ // Check that tabs component is rendered
25
+ yield (0, fixtures_1.expect)(page.getByRole('tablist')).toBeAttached();
26
+ }));
27
+ (0, fixtures_1.test)("renders tab labels correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
28
+ yield initTestBed(`
29
+ <Tabs>
30
+ <TabItem label="First Tab">Content 1</TabItem>
31
+ <TabItem label="Second Tab">Content 2</TabItem>
32
+ <TabItem label="Third Tab">Content 3</TabItem>
33
+ </Tabs>
34
+ `);
35
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "First Tab" })).toBeVisible();
36
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Second Tab" })).toBeVisible();
37
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Third Tab" })).toBeVisible();
38
+ }));
39
+ (0, fixtures_1.test)("shows first tab content by default", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
40
+ yield initTestBed(`
41
+ <Tabs>
42
+ <TabItem label="Tab 1">First content</TabItem>
43
+ <TabItem label="Tab 2">Second content</TabItem>
44
+ </Tabs>
45
+ `);
46
+ yield (0, fixtures_1.expect)(page.getByText("First content")).toBeVisible();
47
+ yield (0, fixtures_1.expect)(page.getByText("Second content")).not.toBeVisible();
48
+ }));
49
+ });
50
+ // =============================================================================
51
+ // BASIC FUNCTIONALITY TESTS
52
+ // =============================================================================
53
+ fixtures_1.test.describe("basic functionality", () => {
54
+ (0, fixtures_1.test)("switches tabs when clicked", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
55
+ yield initTestBed(`
56
+ <Tabs>
57
+ <TabItem label="Tab 1">First content</TabItem>
58
+ <TabItem label="Tab 2">Second content</TabItem>
59
+ <TabItem label="Tab 3">Third content</TabItem>
60
+ </Tabs>
61
+ `);
62
+ // Wait for tabs to be fully rendered
63
+ yield (0, fixtures_1.expect)(page.getByRole('tablist')).toBeAttached();
64
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 1" })).toBeVisible();
65
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 2" })).toBeVisible();
66
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 3" })).toBeVisible();
67
+ // Initially first tab is active
68
+ yield (0, fixtures_1.expect)(page.getByText("First content")).toBeVisible();
69
+ yield (0, fixtures_1.expect)(page.getByText("Second content")).not.toBeVisible();
70
+ yield (0, fixtures_1.expect)(page.getByText("Third content")).not.toBeVisible();
71
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 1" })).toHaveAttribute("aria-selected", "true");
72
+ // Click second tab and wait for transition
73
+ yield page.getByRole("tab", { name: "Tab 2" }).click();
74
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 2" })).toHaveAttribute("aria-selected", "true");
75
+ yield (0, fixtures_1.expect)(page.getByText("First content")).not.toBeVisible();
76
+ yield (0, fixtures_1.expect)(page.getByText("Second content")).toBeVisible();
77
+ yield (0, fixtures_1.expect)(page.getByText("Third content")).not.toBeVisible();
78
+ // Click third tab and wait for transition
79
+ yield page.getByRole("tab", { name: "Tab 3" }).click();
80
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 3" })).toHaveAttribute("aria-selected", "true");
81
+ yield (0, fixtures_1.expect)(page.getByText("First content")).not.toBeVisible();
82
+ yield (0, fixtures_1.expect)(page.getByText("Second content")).not.toBeVisible();
83
+ yield (0, fixtures_1.expect)(page.getByText("Third content")).toBeVisible();
84
+ }));
85
+ (0, fixtures_1.test)("activeTab prop sets initial active tab", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
86
+ yield initTestBed(`
87
+ <Tabs activeTab="{1}">
88
+ <TabItem label="Tab 1">First content</TabItem>
89
+ <TabItem label="Tab 2">Second content</TabItem>
90
+ <TabItem label="Tab 3">Third content</TabItem>
91
+ </Tabs>
92
+ `);
93
+ yield (0, fixtures_1.expect)(page.getByText("First content")).not.toBeVisible();
94
+ yield (0, fixtures_1.expect)(page.getByText("Second content")).toBeVisible();
95
+ yield (0, fixtures_1.expect)(page.getByText("Third content")).not.toBeVisible();
96
+ }));
97
+ (0, fixtures_1.test)("orientation prop changes tab layout", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
98
+ yield initTestBed(`
99
+ <Tabs orientation="vertical" testId="vertical-tabs">
100
+ <TabItem label="Tab 1">Content 1</TabItem>
101
+ <TabItem label="Tab 2">Content 2</TabItem>
102
+ </Tabs>
103
+ `);
104
+ // Check that tabs component has vertical orientation
105
+ const tabsRoot = page.getByTestId("vertical-tabs");
106
+ yield (0, fixtures_1.expect)(tabsRoot).toHaveAttribute("data-orientation", "vertical");
107
+ }));
108
+ });
109
+ // =============================================================================
110
+ // HEADER TEMPLATE TESTS
111
+ // =============================================================================
112
+ fixtures_1.test.describe("headerTemplate functionality", () => {
113
+ (0, fixtures_1.test)("renders custom headerTemplate instead of label", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
114
+ yield initTestBed(`
115
+ <Tabs>
116
+ <TabItem label="Simple Label">
117
+ <property name="headerTemplate">
118
+ <VStack gap="$space-1">
119
+ <Text>Custom</Text>
120
+ <Text>Header</Text>
121
+ </VStack>
122
+ </property>
123
+ Content 1
124
+ </TabItem>
125
+ <TabItem label="Tab 2">Content 2</TabItem>
126
+ </Tabs>
127
+ `);
128
+ // Custom header content should be visible
129
+ yield (0, fixtures_1.expect)(page.getByText("Custom")).toBeVisible();
130
+ yield (0, fixtures_1.expect)(page.getByText("Header")).toBeVisible();
131
+ // Simple label should be visible for second tab
132
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 2" })).toBeVisible();
133
+ }));
134
+ (0, fixtures_1.test)("headerTemplate takes priority over global headerTemplate", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
135
+ yield initTestBed(`
136
+ <Tabs>
137
+ <property name="headerTemplate">
138
+ <Text>Global: {$header.label}</Text>
139
+ </property>
140
+ <TabItem label="Tab 1">
141
+ <property name="headerTemplate">
142
+ <Text>Custom Content</Text>
143
+ </property>
144
+ Content 1
145
+ </TabItem>
146
+ <TabItem label="Tab 2">Content 2</TabItem>
147
+ </Tabs>
148
+ `);
149
+ // First tab should use individual headerTemplate
150
+ yield (0, fixtures_1.expect)(page.getByText("Custom Content")).toBeVisible();
151
+ // Second tab should use global headerTemplate
152
+ yield (0, fixtures_1.expect)(page.getByText("Global: Tab 2")).toBeVisible();
153
+ }));
154
+ (0, fixtures_1.test)("complex headerTemplate with icons and badges", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
155
+ yield initTestBed(`
156
+ <Tabs>
157
+ <TabItem label="Tab 1">
158
+ <property name="headerTemplate">
159
+ <HStack gap="$space-2" alignItems="center">
160
+ <Text>Custom: {$header.label}</Text>
161
+ <Badge>{$header.isActive ? 'Active' : ''}</Badge>
162
+ </HStack>
163
+ </property>
164
+ Content 1
165
+ </TabItem>
166
+ <TabItem label="Tab 2">Content 2</TabItem>
167
+ </Tabs>
168
+ `);
169
+ yield (0, fixtures_1.expect)(page.getByText("Custom: Tab 1")).toBeVisible();
170
+ yield (0, fixtures_1.expect)(page.getByText("Active")).toBeVisible();
171
+ }));
172
+ (0, fixtures_1.test)("headerTemplate receives correct context props", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
173
+ yield initTestBed(`
174
+ <Tabs>
175
+ <TabItem label="First Tab">
176
+ <property name="headerTemplate">
177
+ <VStack gap="$space-1">
178
+ <Text>Index: {$header.index}</Text>
179
+ <Text>Label: {$header.label}</Text>
180
+ <Text>Active: {$header.isActive ? 'Yes' : 'No'}</Text>
181
+ </VStack>
182
+ </property>
183
+ Content 1
184
+ </TabItem>
185
+ <TabItem label="Second Tab">Content 2</TabItem>
186
+ </Tabs>
187
+ `);
188
+ yield (0, fixtures_1.expect)(page.getByText("Index: 0")).toBeVisible();
189
+ yield (0, fixtures_1.expect)(page.getByText("Label: First Tab")).toBeVisible();
190
+ yield (0, fixtures_1.expect)(page.getByText("Active: Yes")).toBeVisible();
191
+ }));
192
+ (0, fixtures_1.test)("headerTemplate receives external id when provided", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
193
+ yield initTestBed(`
194
+ <Tabs>
195
+ <TabItem label="First Tab" id="custom-tab-1">
196
+ <property name="headerTemplate">
197
+ <VStack gap="$space-1">
198
+ <Text>ID: {$header.id}</Text>
199
+ <Text>Label: {$header.label}</Text>
200
+ <Text>Has ID: {$header.id ? 'Yes' : 'No'}</Text>
201
+ </VStack>
202
+ </property>
203
+ Content 1
204
+ </TabItem>
205
+ <TabItem label="Second Tab">
206
+ <property name="headerTemplate">
207
+ <VStack gap="$space-1">
208
+ <Text>Label: {$header.label}</Text>
209
+ <Text>Has ID: {$header.id ? 'Yes' : 'No'}</Text>
210
+ </VStack>
211
+ </property>
212
+ Content 2
213
+ </TabItem>
214
+ </Tabs>
215
+ `);
216
+ // First tab should show the external id
217
+ yield (0, fixtures_1.expect)(page.getByText("ID: custom-tab-1")).toBeVisible();
218
+ yield (0, fixtures_1.expect)(page.getByText("Label: First Tab")).toBeVisible();
219
+ yield (0, fixtures_1.expect)(page.getByText("Has ID: Yes")).toBeVisible();
220
+ // Click second tab
221
+ yield page.getByRole("tab", { name: "Second Tab" }).click();
222
+ // Second tab should not have id in context
223
+ yield (0, fixtures_1.expect)(page.getByText("Label: Second Tab")).toBeVisible();
224
+ yield (0, fixtures_1.expect)(page.getByText("Has ID: No")).toBeVisible();
225
+ }));
226
+ });
227
+ // =============================================================================
228
+ // GLOBAL HEADER TEMPLATE TESTS
229
+ // =============================================================================
230
+ fixtures_1.test.describe("global headerTemplate functionality", () => {
231
+ (0, fixtures_1.test)("global headerTemplate customizes all tab headers", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
232
+ yield initTestBed(`
233
+ <Tabs>
234
+ <property name="headerTemplate">
235
+ <Text>Custom: {$header.label}</Text>
236
+ </property>
237
+ <TabItem label="Tab 1">Content 1</TabItem>
238
+ <TabItem label="Tab 2">Content 2</TabItem>
239
+ <TabItem label="Tab 3">Content 3</TabItem>
240
+ </Tabs>
241
+ `);
242
+ yield (0, fixtures_1.expect)(page.getByText("Custom: Tab 1")).toBeVisible();
243
+ yield (0, fixtures_1.expect)(page.getByText("Custom: Tab 2")).toBeVisible();
244
+ yield (0, fixtures_1.expect)(page.getByText("Custom: Tab 3")).toBeVisible();
245
+ }));
246
+ (0, fixtures_1.test)("global headerTemplate receives isActive state", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
247
+ yield initTestBed(`
248
+ <Tabs>
249
+ <property name="headerTemplate">
250
+ <Text>{$header.isActive ? 'Active: ' : ''}{$header.label}</Text>
251
+ </property>
252
+ <TabItem label="Tab 1">Content 1</TabItem>
253
+ <TabItem label="Tab 2">Content 2</TabItem>
254
+ </Tabs>
255
+ `);
256
+ // First tab should be active initially
257
+ yield (0, fixtures_1.expect)(page.getByText("Active: Tab 1")).toBeVisible();
258
+ yield (0, fixtures_1.expect)(page.getByText("Tab 2")).toBeVisible();
259
+ // Click second tab
260
+ yield page.getByText("Tab 2").click();
261
+ yield (0, fixtures_1.expect)(page.getByText("Tab 1")).toBeVisible();
262
+ yield (0, fixtures_1.expect)(page.getByText("Active: Tab 2")).toBeVisible();
263
+ }));
264
+ (0, fixtures_1.test)("global headerTemplate with complex content", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
265
+ yield initTestBed(`
266
+ <Tabs>
267
+ <property name="headerTemplate">
268
+ <HStack>
269
+ <Text>{$header.label} {$header.isActive ? 'active' : ''}</Text>
270
+ </HStack>
271
+ </property>
272
+ <TabItem label="Home">Home content</TabItem>
273
+ <TabItem label="Settings">Settings content</TabItem>
274
+ </Tabs>
275
+ `);
276
+ yield (0, fixtures_1.expect)(page.getByText("Home active")).toBeVisible();
277
+ yield page.getByText("Settings").click();
278
+ yield (0, fixtures_1.expect)(page.getByText("Settings active")).toBeVisible();
279
+ }));
280
+ });
281
+ // =============================================================================
282
+ // FILLER ELEMENT TESTS
283
+ // =============================================================================
284
+ fixtures_1.test.describe("filler element", () => {
285
+ (0, fixtures_1.test)("filler is hidden when distributeEvenly is true", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
286
+ yield initTestBed(`
287
+ <Tabs distributeEvenly>
288
+ <TabItem label="Tab 1">Content 1</TabItem>
289
+ <TabItem label="Tab 2">Content 2</TabItem>
290
+ </Tabs>
291
+ `);
292
+ const filler = page.locator('.filler');
293
+ yield (0, fixtures_1.expect)(filler).not.toBeVisible();
294
+ }));
295
+ (0, fixtures_1.test)("filler is hidden when headerRenderer is used", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
296
+ yield initTestBed(`
297
+ <Tabs headerRenderer="{(item) => item.label}">
298
+ <TabItem label="Tab 1">Content 1</TabItem>
299
+ <TabItem label="Tab 2">Content 2</TabItem>
300
+ </Tabs>
301
+ `);
302
+ const filler = page.locator('.filler');
303
+ yield (0, fixtures_1.expect)(filler).not.toBeVisible();
304
+ }));
305
+ });
306
+ // =============================================================================
307
+ // EDGE CASES AND ERROR HANDLING
308
+ // =============================================================================
309
+ fixtures_1.test.describe("edge cases", () => {
310
+ (0, fixtures_1.test)("handles empty tabs", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
311
+ yield initTestBed(`<Tabs></Tabs>`);
312
+ // Check that empty tabs component is rendered
313
+ yield (0, fixtures_1.expect)(page.getByRole('tablist')).toBeAttached();
314
+ }));
315
+ (0, fixtures_1.test)("handles single tab", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
316
+ yield initTestBed(`
317
+ <Tabs>
318
+ <TabItem label="Only Tab">Only content</TabItem>
319
+ </Tabs>
320
+ `);
321
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Only Tab" })).toBeVisible();
322
+ yield (0, fixtures_1.expect)(page.getByText("Only content")).toBeVisible();
323
+ }));
324
+ (0, fixtures_1.test)("handles tabs with empty content", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
325
+ yield initTestBed(`
326
+ <Tabs>
327
+ <TabItem label="Empty Tab"></TabItem>
328
+ <TabItem label="Tab 2">Content 2</TabItem>
329
+ </Tabs>
330
+ `);
331
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Empty Tab" })).toBeVisible();
332
+ yield page.getByRole("tab", { name: "Tab 2" }).click();
333
+ yield (0, fixtures_1.expect)(page.getByText("Content 2")).toBeVisible();
334
+ }));
335
+ (0, fixtures_1.test)("handles very long tab labels", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
336
+ const longLabel = "This is a very long tab label that might cause layout issues";
337
+ yield initTestBed(`
338
+ <Tabs>
339
+ <TabItem label="${longLabel}">Content 1</TabItem>
340
+ <TabItem label="Short">Content 2</TabItem>
341
+ </Tabs>
342
+ `);
343
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: longLabel })).toBeVisible();
344
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Short" })).toBeVisible();
345
+ }));
346
+ (0, fixtures_1.test)("handles activeTab out of bounds", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
347
+ yield initTestBed(`
348
+ <Tabs activeTab="{5}">
349
+ <TabItem label="Tab 1">Content 1</TabItem>
350
+ <TabItem label="Tab 2">Content 2</TabItem>
351
+ </Tabs>
352
+ `);
353
+ // Should default to first tab when activeTab is out of bounds
354
+ yield (0, fixtures_1.expect)(page.getByText("Content 1")).toBeVisible();
355
+ }));
356
+ });
357
+ // =============================================================================
358
+ // ACCESSIBILITY TESTS
359
+ // =============================================================================
360
+ fixtures_1.test.describe("accessibility", () => {
361
+ (0, fixtures_1.test)("tabs have correct ARIA roles", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
362
+ yield initTestBed(`
363
+ <Tabs>
364
+ <TabItem label="Tab 1">Content 1</TabItem>
365
+ <TabItem label="Tab 2">Content 2</TabItem>
366
+ </Tabs>
367
+ `);
368
+ yield (0, fixtures_1.expect)(page.getByRole("tablist")).toBeVisible();
369
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 1" })).toBeVisible();
370
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 2" })).toBeVisible();
371
+ yield (0, fixtures_1.expect)(page.getByRole("tabpanel")).toBeVisible();
372
+ }));
373
+ (0, fixtures_1.test)("active tab has correct aria-selected", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
374
+ yield initTestBed(`
375
+ <Tabs>
376
+ <TabItem label="Tab 1">Content 1</TabItem>
377
+ <TabItem label="Tab 2">Content 2</TabItem>
378
+ </Tabs>
379
+ `);
380
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 1" })).toHaveAttribute("aria-selected", "true");
381
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 2" })).toHaveAttribute("aria-selected", "false");
382
+ yield page.getByRole("tab", { name: "Tab 2" }).click();
383
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 1" })).toHaveAttribute("aria-selected", "false");
384
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 2" })).toHaveAttribute("aria-selected", "true");
385
+ }));
386
+ (0, fixtures_1.test)("keyboard navigation works", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
387
+ yield initTestBed(`
388
+ <Tabs>
389
+ <TabItem label="Tab 1">Content 1</TabItem>
390
+ <TabItem label="Tab 2">Content 2</TabItem>
391
+ <TabItem label="Tab 3">Content 3</TabItem>
392
+ </Tabs>
393
+ `);
394
+ // Focus first tab
395
+ yield page.getByRole("tab", { name: "Tab 1" }).focus();
396
+ // Arrow right to second tab
397
+ yield page.keyboard.press("ArrowRight");
398
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 2" })).toBeFocused();
399
+ // Arrow right to third tab
400
+ yield page.keyboard.press("ArrowRight");
401
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 3" })).toBeFocused();
402
+ // Arrow left back to second tab
403
+ yield page.keyboard.press("ArrowLeft");
404
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Tab 2" })).toBeFocused();
405
+ }));
406
+ // =============================================================================
407
+ fixtures_1.test.describe("API functionality verification", () => {
408
+ (0, fixtures_1.test)("next() method cycles through all tabs correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
409
+ yield initTestBed(`
410
+ <Fragment>
411
+ <Tabs id="tabs">
412
+ <TabItem label="Account">
413
+ <Text>Account Content</Text>
414
+ </TabItem>
415
+ <TabItem label="Stream">
416
+ <Text>Stream Content</Text>
417
+ </TabItem>
418
+ <TabItem label="Support">
419
+ <Text>Support Content</Text>
420
+ </TabItem>
421
+ </Tabs>
422
+ <Button onClick="tabs.next()" testId="next-btn">
423
+ Next Tab
424
+ </Button>
425
+ </Fragment>
426
+ `);
427
+ // Initially Account tab should be active (first tab)
428
+ yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
429
+ yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
430
+ yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
431
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
432
+ // Call next() - should move to Stream tab
433
+ yield page.getByTestId("next-btn").click();
434
+ yield (0, fixtures_1.expect)(page.getByText("Account Content")).not.toBeVisible();
435
+ yield (0, fixtures_1.expect)(page.getByText("Stream Content")).toBeVisible();
436
+ yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
437
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toHaveAttribute("aria-selected", "true");
438
+ // Call next() again - should move to Support tab
439
+ yield page.getByTestId("next-btn").click();
440
+ yield (0, fixtures_1.expect)(page.getByText("Account Content")).not.toBeVisible();
441
+ yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
442
+ yield (0, fixtures_1.expect)(page.getByText("Support Content")).toBeVisible();
443
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toHaveAttribute("aria-selected", "true");
444
+ // Call next() from last tab - should cycle back to Account tab
445
+ yield page.getByTestId("next-btn").click();
446
+ yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
447
+ yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
448
+ yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
449
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
450
+ }));
451
+ (0, fixtures_1.test)("prev() method cycles through all tabs correctly in reverse", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
452
+ yield initTestBed(`
453
+ <Fragment>
454
+ <Tabs id="tabs">
455
+ <TabItem label="Account">
456
+ <Text>Account Content</Text>
457
+ </TabItem>
458
+ <TabItem label="Stream">
459
+ <Text>Stream Content</Text>
460
+ </TabItem>
461
+ <TabItem label="Support">
462
+ <Text>Support Content</Text>
463
+ </TabItem>
464
+ </Tabs>
465
+ <Button onClick="tabs.prev()" testId="prev-btn">
466
+ Previous Tab
467
+ </Button>
468
+ </Fragment>
469
+ `);
470
+ // Initially Account tab should be active (first tab)
471
+ yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
472
+ yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
473
+ yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
474
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
475
+ // Call prev() from first tab - should cycle to Support tab (last tab)
476
+ yield page.getByTestId("prev-btn").click();
477
+ yield (0, fixtures_1.expect)(page.getByText("Account Content")).not.toBeVisible();
478
+ yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
479
+ yield (0, fixtures_1.expect)(page.getByText("Support Content")).toBeVisible();
480
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toHaveAttribute("aria-selected", "true");
481
+ // Call prev() again - should move to Stream tab
482
+ yield page.getByTestId("prev-btn").click();
483
+ yield (0, fixtures_1.expect)(page.getByText("Account Content")).not.toBeVisible();
484
+ yield (0, fixtures_1.expect)(page.getByText("Stream Content")).toBeVisible();
485
+ yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
486
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toHaveAttribute("aria-selected", "true");
487
+ // Call prev() again - should move to Account tab
488
+ yield page.getByTestId("prev-btn").click();
489
+ yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
490
+ yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
491
+ yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
492
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
493
+ }));
494
+ (0, fixtures_1.test)("next() and prev() methods work together for full navigation", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
495
+ yield initTestBed(`
496
+ <Fragment>
497
+ <Tabs id="tabs">
498
+ <TabItem label="Account">
499
+ <Text>Account Content</Text>
500
+ </TabItem>
501
+ <TabItem label="Stream">
502
+ <Text>Stream Content</Text>
503
+ </TabItem>
504
+ <TabItem label="Support">
505
+ <Text>Support Content</Text>
506
+ </TabItem>
507
+ </Tabs>
508
+ <Button onClick="tabs.next()" testId="next-btn">
509
+ Next Tab
510
+ </Button>
511
+ <Button onClick="tabs.prev()" testId="prev-btn">
512
+ Previous Tab
513
+ </Button>
514
+ </Fragment>
515
+ `);
516
+ // Start at Account tab
517
+ yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
518
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
519
+ // Go forward twice: Account -> Stream -> Support
520
+ yield page.getByTestId("next-btn").click();
521
+ yield (0, fixtures_1.expect)(page.getByText("Stream Content")).toBeVisible();
522
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toHaveAttribute("aria-selected", "true");
523
+ yield page.getByTestId("next-btn").click();
524
+ yield (0, fixtures_1.expect)(page.getByText("Support Content")).toBeVisible();
525
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toHaveAttribute("aria-selected", "true");
526
+ // Go back once: Support -> Stream
527
+ yield page.getByTestId("prev-btn").click();
528
+ yield (0, fixtures_1.expect)(page.getByText("Stream Content")).toBeVisible();
529
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toHaveAttribute("aria-selected", "true");
530
+ // Go forward to cycle: Stream -> Support -> Account
531
+ yield page.getByTestId("next-btn").click();
532
+ yield (0, fixtures_1.expect)(page.getByText("Support Content")).toBeVisible();
533
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toHaveAttribute("aria-selected", "true");
534
+ yield page.getByTestId("next-btn").click();
535
+ yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
536
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
537
+ }));
538
+ (0, fixtures_1.test)("tabs can be navigated programmatically (simulating next() behavior)", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
539
+ yield initTestBed(`
540
+ <Tabs>
541
+ <TabItem label="Tab 1">Content 1</TabItem>
542
+ <TabItem label="Tab 2">Content 2</TabItem>
543
+ <TabItem label="Tab 3">Content 3</TabItem>
544
+ </Tabs>
545
+ `);
546
+ // Initially first tab is active
547
+ yield (0, fixtures_1.expect)(page.getByText("Content 1")).toBeVisible();
548
+ yield (0, fixtures_1.expect)(page.getByText("Content 2")).not.toBeVisible();
549
+ yield (0, fixtures_1.expect)(page.getByText("Content 3")).not.toBeVisible();
550
+ // Simulate next() - move to second tab
551
+ yield page.getByRole("tab", { name: "Tab 2" }).click();
552
+ yield (0, fixtures_1.expect)(page.getByText("Content 1")).not.toBeVisible();
553
+ yield (0, fixtures_1.expect)(page.getByText("Content 2")).toBeVisible();
554
+ yield (0, fixtures_1.expect)(page.getByText("Content 3")).not.toBeVisible();
555
+ // Simulate next() - move to third tab
556
+ yield page.getByRole("tab", { name: "Tab 3" }).click();
557
+ yield (0, fixtures_1.expect)(page.getByText("Content 1")).not.toBeVisible();
558
+ yield (0, fixtures_1.expect)(page.getByText("Content 2")).not.toBeVisible();
559
+ yield (0, fixtures_1.expect)(page.getByText("Content 3")).toBeVisible();
560
+ // Simulate next() - should cycle back to first tab
561
+ yield page.getByRole("tab", { name: "Tab 1" }).click();
562
+ yield (0, fixtures_1.expect)(page.getByText("Content 1")).toBeVisible();
563
+ yield (0, fixtures_1.expect)(page.getByText("Content 2")).not.toBeVisible();
564
+ yield (0, fixtures_1.expect)(page.getByText("Content 3")).not.toBeVisible();
565
+ }));
566
+ (0, fixtures_1.test)("tabs can be navigated backwards programmatically (simulating prev() behavior)", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
567
+ yield initTestBed(`
568
+ <Tabs>
569
+ <TabItem label="Tab 1">Content 1</TabItem>
570
+ <TabItem label="Tab 2">Content 2</TabItem>
571
+ <TabItem label="Tab 3">Content 3</TabItem>
572
+ </Tabs>
573
+ `);
574
+ // Initially first tab is active
575
+ yield (0, fixtures_1.expect)(page.getByText("Content 1")).toBeVisible();
576
+ // Simulate prev() from first tab - should cycle to last tab
577
+ yield page.getByRole("tab", { name: "Tab 3" }).click();
578
+ yield (0, fixtures_1.expect)(page.getByText("Content 1")).not.toBeVisible();
579
+ yield (0, fixtures_1.expect)(page.getByText("Content 2")).not.toBeVisible();
580
+ yield (0, fixtures_1.expect)(page.getByText("Content 3")).toBeVisible();
581
+ // Simulate prev() - move to second tab
582
+ yield page.getByRole("tab", { name: "Tab 2" }).click();
583
+ yield (0, fixtures_1.expect)(page.getByText("Content 1")).not.toBeVisible();
584
+ yield (0, fixtures_1.expect)(page.getByText("Content 2")).toBeVisible();
585
+ yield (0, fixtures_1.expect)(page.getByText("Content 3")).not.toBeVisible();
586
+ // Simulate prev() - move to first tab
587
+ yield page.getByRole("tab", { name: "Tab 1" }).click();
588
+ yield (0, fixtures_1.expect)(page.getByText("Content 1")).toBeVisible();
589
+ yield (0, fixtures_1.expect)(page.getByText("Content 2")).not.toBeVisible();
590
+ yield (0, fixtures_1.expect)(page.getByText("Content 3")).not.toBeVisible();
591
+ }));
592
+ (0, fixtures_1.test)("activeTab prop sets initial tab correctly (simulating setActiveTabIndex())", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
593
+ yield initTestBed(`
594
+ <Tabs activeTab="{2}">
595
+ <TabItem label="Tab 1">Content 1</TabItem>
596
+ <TabItem label="Tab 2">Content 2</TabItem>
597
+ <TabItem label="Tab 3">Content 3</TabItem>
598
+ </Tabs>
599
+ `);
600
+ // Third tab should be active initially (index 2)
601
+ yield (0, fixtures_1.expect)(page.getByText("Content 3")).toBeVisible();
602
+ yield (0, fixtures_1.expect)(page.getByText("Content 1")).not.toBeVisible();
603
+ yield (0, fixtures_1.expect)(page.getByText("Content 2")).not.toBeVisible();
604
+ }));
605
+ (0, fixtures_1.test)("ArrowRight key cycles through all tabs correctly (keyboard navigation)", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
606
+ yield initTestBed(`
607
+ <Tabs>
608
+ <TabItem label="Account">
609
+ <Text>Account Content</Text>
610
+ </TabItem>
611
+ <TabItem label="Stream">
612
+ <Text>Stream Content</Text>
613
+ </TabItem>
614
+ <TabItem label="Support">
615
+ <Text>Support Content</Text>
616
+ </TabItem>
617
+ </Tabs>
618
+ `);
619
+ // Initially Account tab should be active and focused
620
+ yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
621
+ yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
622
+ yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
623
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
624
+ // Focus the first tab
625
+ yield page.getByRole("tab", { name: "Account" }).focus();
626
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toBeFocused();
627
+ // Press ArrowRight - should move to Stream tab
628
+ yield page.keyboard.press("ArrowRight");
629
+ yield (0, fixtures_1.expect)(page.getByText("Account Content")).not.toBeVisible();
630
+ yield (0, fixtures_1.expect)(page.getByText("Stream Content")).toBeVisible();
631
+ yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
632
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toHaveAttribute("aria-selected", "true");
633
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toBeFocused();
634
+ // Press ArrowRight again - should move to Support tab
635
+ yield page.keyboard.press("ArrowRight");
636
+ yield (0, fixtures_1.expect)(page.getByText("Account Content")).not.toBeVisible();
637
+ yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
638
+ yield (0, fixtures_1.expect)(page.getByText("Support Content")).toBeVisible();
639
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toHaveAttribute("aria-selected", "true");
640
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toBeFocused();
641
+ // Press ArrowRight from last tab - should cycle back to Account tab
642
+ yield page.keyboard.press("ArrowRight");
643
+ yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
644
+ yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
645
+ yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
646
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
647
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toBeFocused();
648
+ }));
649
+ (0, fixtures_1.test)("ArrowLeft key cycles through all tabs correctly in reverse (keyboard navigation)", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
650
+ yield initTestBed(`
651
+ <Tabs>
652
+ <TabItem label="Account">
653
+ <Text>Account Content</Text>
654
+ </TabItem>
655
+ <TabItem label="Stream">
656
+ <Text>Stream Content</Text>
657
+ </TabItem>
658
+ <TabItem label="Support">
659
+ <Text>Support Content</Text>
660
+ </TabItem>
661
+ </Tabs>
662
+ `);
663
+ // Initially Account tab should be active
664
+ yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
665
+ yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
666
+ yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
667
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
668
+ // Focus the first tab
669
+ yield page.getByRole("tab", { name: "Account" }).focus();
670
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toBeFocused();
671
+ // Press ArrowLeft from first tab - should cycle to Support tab (last tab)
672
+ yield page.keyboard.press("ArrowLeft");
673
+ yield (0, fixtures_1.expect)(page.getByText("Account Content")).not.toBeVisible();
674
+ yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
675
+ yield (0, fixtures_1.expect)(page.getByText("Support Content")).toBeVisible();
676
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toHaveAttribute("aria-selected", "true");
677
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toBeFocused();
678
+ // Press ArrowLeft again - should move to Stream tab
679
+ yield page.keyboard.press("ArrowLeft");
680
+ yield (0, fixtures_1.expect)(page.getByText("Account Content")).not.toBeVisible();
681
+ yield (0, fixtures_1.expect)(page.getByText("Stream Content")).toBeVisible();
682
+ yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
683
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toHaveAttribute("aria-selected", "true");
684
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toBeFocused();
685
+ // Press ArrowLeft again - should move to Account tab
686
+ yield page.keyboard.press("ArrowLeft");
687
+ yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
688
+ yield (0, fixtures_1.expect)(page.getByText("Stream Content")).not.toBeVisible();
689
+ yield (0, fixtures_1.expect)(page.getByText("Support Content")).not.toBeVisible();
690
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
691
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toBeFocused();
692
+ }));
693
+ (0, fixtures_1.test)("ArrowRight and ArrowLeft keys work together for full keyboard navigation", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
694
+ yield initTestBed(`
695
+ <Tabs>
696
+ <TabItem label="Account">
697
+ <Text>Account Content</Text>
698
+ </TabItem>
699
+ <TabItem label="Stream">
700
+ <Text>Stream Content</Text>
701
+ </TabItem>
702
+ <TabItem label="Support">
703
+ <Text>Support Content</Text>
704
+ </TabItem>
705
+ </Tabs>
706
+ `);
707
+ // Start at Account tab and focus it
708
+ yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
709
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
710
+ yield page.getByRole("tab", { name: "Account" }).focus();
711
+ // Go forward twice: Account -> Stream -> Support
712
+ yield page.keyboard.press("ArrowRight");
713
+ yield (0, fixtures_1.expect)(page.getByText("Stream Content")).toBeVisible();
714
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toHaveAttribute("aria-selected", "true");
715
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toBeFocused();
716
+ yield page.keyboard.press("ArrowRight");
717
+ yield (0, fixtures_1.expect)(page.getByText("Support Content")).toBeVisible();
718
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toHaveAttribute("aria-selected", "true");
719
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toBeFocused();
720
+ // Go back once: Support -> Stream
721
+ yield page.keyboard.press("ArrowLeft");
722
+ yield (0, fixtures_1.expect)(page.getByText("Stream Content")).toBeVisible();
723
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toHaveAttribute("aria-selected", "true");
724
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Stream" })).toBeFocused();
725
+ // Go forward to cycle: Stream -> Support -> Account
726
+ yield page.keyboard.press("ArrowRight");
727
+ yield (0, fixtures_1.expect)(page.getByText("Support Content")).toBeVisible();
728
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toHaveAttribute("aria-selected", "true");
729
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Support" })).toBeFocused();
730
+ yield page.keyboard.press("ArrowRight");
731
+ yield (0, fixtures_1.expect)(page.getByText("Account Content")).toBeVisible();
732
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toHaveAttribute("aria-selected", "true");
733
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Account" })).toBeFocused();
734
+ }));
735
+ (0, fixtures_1.test)("API methods work with headerTemplate (visual verification)", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
736
+ yield initTestBed(`
737
+ <Fragment>
738
+ <Tabs id="tabs">
739
+ <property name="headerTemplate">
740
+ <Text>{$header.isActive ? 'Active: ' : ''}{$header.label}</Text>
741
+ </property>
742
+ <TabItem label="Tab 1">Content 1</TabItem>
743
+ <TabItem label="Tab 2">Content 2</TabItem>
744
+ <TabItem label="Tab 3">Content 3</TabItem>
745
+ </Tabs>
746
+ <Button onClick="tabs.prev()">Prev</Button>
747
+ <Button onClick="tabs.next()">Next</Button>
748
+ </Fragment>
749
+ `);
750
+ // Initially first tab is active
751
+ yield (0, fixtures_1.expect)(page.getByText("Active: Tab 1")).toBeVisible();
752
+ yield (0, fixtures_1.expect)(page.getByText("Tab 2")).toBeVisible();
753
+ yield (0, fixtures_1.expect)(page.getByText("Tab 3")).toBeVisible();
754
+ // Simulate next() behavior by clicking second tab
755
+ yield page.getByRole("button", { name: "Next" }).click();
756
+ yield (0, fixtures_1.expect)(page.getByText("Active: Tab 2")).toBeVisible();
757
+ yield (0, fixtures_1.expect)(page.getByText("Tab 1")).toBeVisible();
758
+ yield (0, fixtures_1.expect)(page.getByText("Tab 3")).toBeVisible();
759
+ // Simulate prev() behavior by clicking first tab
760
+ yield page.getByRole("button", { name: "Prev" }).click();
761
+ yield (0, fixtures_1.expect)(page.getByText("Active: Tab 1")).toBeVisible();
762
+ yield (0, fixtures_1.expect)(page.getByText("Tab 2")).toBeVisible();
763
+ yield (0, fixtures_1.expect)(page.getByText("Tab 3")).toBeVisible();
764
+ }));
765
+ });
766
+ });
767
+ // =============================================================================
768
+ // DYNAMIC CONTENT TESTS
769
+ // =============================================================================
770
+ fixtures_1.test.describe("dynamic content", () => {
771
+ (0, fixtures_1.test)("works with Items component for dynamic tabs", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
772
+ yield initTestBed(`
773
+ <Tabs>
774
+ <Items data="{['First', 'Second', 'Third']}">
775
+ <TabItem label="{$item}">Content for {$item}</TabItem>
776
+ </Items>
777
+ </Tabs>
778
+ `);
779
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "First" })).toBeVisible();
780
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Second" })).toBeVisible();
781
+ yield (0, fixtures_1.expect)(page.getByRole("tab", { name: "Third" })).toBeVisible();
782
+ yield page.getByRole("tab", { name: "Second" }).click();
783
+ yield (0, fixtures_1.expect)(page.getByText("Content for Second")).toBeVisible();
784
+ }));
785
+ (0, fixtures_1.test)("headerTemplate works with dynamic content from Items", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
786
+ yield initTestBed(`
787
+ <Tabs>
788
+ <property name="headerTemplate">
789
+ <Text color="red">Account {$header.label}</Text>
790
+ </property>
791
+ <Items data="{[1, 2, 3, 4, 5]}">
792
+ <TabItem label="Account {$item}">
793
+ <property name="headerTemplate">
794
+ <Text when="true" color="blue">{$header.label} | {$item}</Text>
795
+ </property>
796
+ Content for account {$item}
797
+ </TabItem>
798
+ </Items>
799
+ </Tabs>
800
+ `);
801
+ // Check that individual headerTemplate takes priority and has access to both $header and $item
802
+ yield (0, fixtures_1.expect)(page.getByText("Account 1 | 1")).toBeVisible();
803
+ yield (0, fixtures_1.expect)(page.getByText("Account 2 | 2")).toBeVisible();
804
+ yield (0, fixtures_1.expect)(page.getByText("Account 3 | 3")).toBeVisible();
805
+ yield (0, fixtures_1.expect)(page.getByText("Account 4 | 4")).toBeVisible();
806
+ yield (0, fixtures_1.expect)(page.getByText("Account 5 | 5")).toBeVisible();
807
+ // Test clicking on different tabs
808
+ yield page.getByText("Account 3 | 3").click();
809
+ yield (0, fixtures_1.expect)(page.getByText("Content for account 3")).toBeVisible();
810
+ }));
811
+ });
812
+ fixtures_1.test.describe("onDidChange callback functionality", () => {
813
+ (0, fixtures_1.test)("onDidChange callback is called when tab changes", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
814
+ yield initTestBed(`
815
+ <Fragment var.tabChangeInfo="No change yet">
816
+ <Tabs onDidChange="(index, id, label) => {
817
+ tabChangeInfo = 'Tab: ' + index + ' - ' + label;
818
+ }">
819
+ <TabItem label="First Tab">
820
+ <Text>First tab content</Text>
821
+ </TabItem>
822
+ <TabItem label="Second Tab">
823
+ <Text>Second tab content</Text>
824
+ </TabItem>
825
+ <TabItem label="Third Tab">
826
+ <Text>Third tab content</Text>
827
+ </TabItem>
828
+ </Tabs>
829
+ <Text>{tabChangeInfo}</Text>
830
+ </Fragment>
831
+ `);
832
+ // Initially should show no change
833
+ yield (0, fixtures_1.expect)(page.getByText("No change yet")).toBeVisible();
834
+ yield (0, fixtures_1.expect)(page.getByText("First tab content")).toBeVisible();
835
+ // Click on second tab
836
+ yield page.getByRole("tab", { name: "Second Tab" }).click();
837
+ yield (0, fixtures_1.expect)(page.getByText("Second tab content")).toBeVisible();
838
+ yield (0, fixtures_1.expect)(page.getByText("Tab: 1 - Second Tab")).toBeVisible();
839
+ // Click on third tab
840
+ yield page.getByRole("tab", { name: "Third Tab" }).click();
841
+ yield (0, fixtures_1.expect)(page.getByText("Third tab content")).toBeVisible();
842
+ yield (0, fixtures_1.expect)(page.getByText("Tab: 2 - Third Tab")).toBeVisible();
843
+ // Click back to first tab
844
+ yield page.getByRole("tab", { name: "First Tab" }).click();
845
+ yield (0, fixtures_1.expect)(page.getByText("First tab content")).toBeVisible();
846
+ yield (0, fixtures_1.expect)(page.getByText("Tab: 0 - First Tab")).toBeVisible();
847
+ }));
848
+ (0, fixtures_1.test)("onDidChange callback is not called when same tab is clicked", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
849
+ yield initTestBed(`
850
+ <Fragment var.changeCount="{0}">
851
+ <Tabs onDidChange="(index, id, label) => {
852
+ changeCount = changeCount + 1;
853
+ }">
854
+ <TabItem label="Tab One">
855
+ <Text>Content one</Text>
856
+ </TabItem>
857
+ <TabItem label="Tab Two">
858
+ <Text>Content two</Text>
859
+ </TabItem>
860
+ </Tabs>
861
+ <Text>Changes: {changeCount}</Text>
862
+ </Fragment>
863
+ `);
864
+ // Initially should show 0 changes
865
+ yield (0, fixtures_1.expect)(page.getByText("Changes: 0")).toBeVisible();
866
+ yield (0, fixtures_1.expect)(page.getByText("Content one")).toBeVisible();
867
+ // Click on second tab - should trigger onDidChange
868
+ yield page.getByRole("tab", { name: "Tab Two" }).click();
869
+ yield (0, fixtures_1.expect)(page.getByText("Content two")).toBeVisible();
870
+ yield (0, fixtures_1.expect)(page.getByText("Changes: 1")).toBeVisible();
871
+ // Click on second tab again - should NOT trigger onDidChange
872
+ yield page.getByRole("tab", { name: "Tab Two" }).click();
873
+ yield (0, fixtures_1.expect)(page.getByText("Changes: 1")).toBeVisible(); // Should still be 1
874
+ }));
875
+ });