xmlui 0.10.13 → 0.10.15

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 (217) hide show
  1. package/dist/lib/{index-Db5iQkFp.mjs → index-axjeT2uJ.mjs} +1626 -1080
  2. package/dist/lib/index.css +1 -1
  3. package/dist/lib/{initMock-B9LtmFJG.mjs → initMock-BoTWMs19.mjs} +1 -1
  4. package/dist/lib/language-server-web-worker.mjs +1 -1
  5. package/dist/lib/language-server.mjs +1 -1
  6. package/dist/lib/{metadata-utils-D90qqMGc.mjs → metadata-utils-CtY0QcvH.mjs} +2 -1
  7. package/dist/lib/{server-common-lmBDLpUh.mjs → server-common-Cine5nRR.mjs} +1 -1
  8. package/dist/lib/xmlui.d.ts +99 -6
  9. package/dist/lib/xmlui.mjs +78 -42
  10. package/dist/metadata/{collectedComponentMetadata-BN8eg9Gr.mjs → collectedComponentMetadata-CQywuPDB.mjs} +17448 -16984
  11. package/dist/metadata/{initMock-J7pN8owj.mjs → initMock-Bi5kF5Af.mjs} +1 -1
  12. package/dist/metadata/style.css +1 -1
  13. package/dist/metadata/xmlui-metadata.mjs +1 -1
  14. package/dist/metadata/xmlui-metadata.umd.js +3 -3
  15. package/dist/scripts/bin/build-lib.js +21 -13
  16. package/dist/scripts/bin/viteConfig.js +3 -1
  17. package/dist/scripts/package.json +2 -3
  18. package/dist/scripts/src/abstractions/scripting/Token.js +2 -0
  19. package/dist/scripts/src/abstractions/scripting/TryScope.js +2 -0
  20. package/dist/scripts/src/abstractions/scripting/modules.js +2 -0
  21. package/dist/scripts/src/components/APICall/APICall.spec.js +910 -0
  22. package/dist/scripts/src/components/Accordion/Accordion.spec.js +969 -0
  23. package/dist/scripts/src/components/Animation/Animation.js +50 -0
  24. package/dist/scripts/src/components/App/App.spec.js +219 -0
  25. package/dist/scripts/src/components/AppHeader/AppHeader.spec.js +169 -0
  26. package/dist/scripts/src/components/AppState/AppState.js +32 -2
  27. package/dist/scripts/src/components/AppState/AppState.spec.js +268 -0
  28. package/dist/scripts/src/components/AppState/AppStateNative.js +27 -3
  29. package/dist/scripts/src/components/AutoComplete/AutoComplete.spec.js +383 -0
  30. package/dist/scripts/src/components/Avatar/Avatar.spec.js +1543 -0
  31. package/dist/scripts/src/components/Backdrop/Backdrop.spec.js +131 -0
  32. package/dist/scripts/src/components/Badge/Badge.spec.js +2214 -0
  33. package/dist/scripts/src/components/Bookmark/Bookmark.spec.js +230 -0
  34. package/dist/scripts/src/components/Breakout/Breakout.spec.js +56 -0
  35. package/dist/scripts/src/components/Button/Button-style.spec.js +274 -0
  36. package/dist/scripts/src/components/Button/Button.js +5 -1
  37. package/dist/scripts/src/components/Button/Button.spec.js +454 -0
  38. package/dist/scripts/src/components/Card/Card.spec.js +150 -0
  39. package/dist/scripts/src/components/Carousel/Carousel.spec.js +343 -0
  40. package/dist/scripts/src/components/Carousel/CarouselNative.js +2 -2
  41. package/dist/scripts/src/components/ChangeListener/ChangeListener.spec.js +169 -0
  42. package/dist/scripts/src/components/Charts/AreaChart/AreaChart.spec.js +999 -0
  43. package/dist/scripts/src/components/Charts/BarChart/BarChart.spec.js +597 -0
  44. package/dist/scripts/src/components/Charts/DonutChart/DonutChart.spec.js +608 -0
  45. package/dist/scripts/src/components/Charts/LabelList/LabelList.spec.js +539 -0
  46. package/dist/scripts/src/components/Charts/Legend/Legend.spec.js +558 -0
  47. package/dist/scripts/src/components/Charts/LineChart/LineChart.spec.js +450 -0
  48. package/dist/scripts/src/components/Charts/PieChart/PieChart.spec.js +584 -0
  49. package/dist/scripts/src/components/Charts/PieChart/PieChartNative.js +41 -2
  50. package/dist/scripts/src/components/Charts/RadarChart/RadarChart.spec.js +571 -0
  51. package/dist/scripts/src/components/Charts/Tooltip/TooltipContent.spec.js +449 -0
  52. package/dist/scripts/src/components/Checkbox/Checkbox.spec.js +964 -0
  53. package/dist/scripts/src/components/CodeBlock/CodeBlock.spec.js +196 -0
  54. package/dist/scripts/src/components/ColorPicker/ColorPicker.spec.js +283 -0
  55. package/dist/scripts/src/components/ColorPicker/ColorPickerNative.js +9 -26
  56. package/dist/scripts/src/components/Column/doc-resources/list-component-data.js +53 -0
  57. package/dist/scripts/src/components/ComponentProvider.js +6 -2
  58. package/dist/scripts/src/components/ContentSeparator/ContentSeparator.spec.js +338 -0
  59. package/dist/scripts/src/components/DateInput/DateInput.spec.js +918 -0
  60. package/dist/scripts/src/components/DatePicker/DatePicker.spec.js +362 -0
  61. package/dist/scripts/src/components/DatePicker/DatePickerNative.js +3 -3
  62. package/dist/scripts/src/components/DropdownMenu/DropdownMenu.spec.js +331 -0
  63. package/dist/scripts/src/components/DropdownMenu/DropdownMenuNative.js +7 -9
  64. package/dist/scripts/src/components/EmojiSelector/EmojiSelector.spec.js +29 -0
  65. package/dist/scripts/src/components/ExpandableItem/ExpandableItem.spec.js +435 -0
  66. package/dist/scripts/src/components/FileInput/FileInput.spec.js +249 -0
  67. package/dist/scripts/src/components/FileUploadDropZone/FileUploadDropZone.spec.js +296 -0
  68. package/dist/scripts/src/components/FlowLayout/FlowLayout.spec.js +518 -0
  69. package/dist/scripts/src/components/Footer/Footer.spec.js +991 -0
  70. package/dist/scripts/src/components/Form/Form.spec.js +1257 -0
  71. package/dist/scripts/src/components/FormItem/FormItem.spec.js +723 -0
  72. package/dist/scripts/src/components/FormItem/ItemWithLabel.js +3 -3
  73. package/dist/scripts/src/components/FormSection/FormSection.js +6 -31
  74. package/dist/scripts/src/components/Fragment/Fragment.spec.js +50 -0
  75. package/dist/scripts/src/components/Heading/H1.spec.js +66 -0
  76. package/dist/scripts/src/components/Heading/H2.spec.js +66 -0
  77. package/dist/scripts/src/components/Heading/H3.spec.js +66 -0
  78. package/dist/scripts/src/components/Heading/H4.spec.js +66 -0
  79. package/dist/scripts/src/components/Heading/H5.spec.js +66 -0
  80. package/dist/scripts/src/components/Heading/H6.spec.js +66 -0
  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.spec.js +162 -0
  103. package/dist/scripts/src/components/NavGroup/NavGroup.spec.js +212 -0
  104. package/dist/scripts/src/components/NavGroup/NavGroupNative.js +15 -7
  105. package/dist/scripts/src/components/NavLink/NavLink.spec.js +864 -0
  106. package/dist/scripts/src/components/NavPanel/NavPanel.spec.js +864 -0
  107. package/dist/scripts/src/components/NoResult/NoResult.spec.js +863 -0
  108. package/dist/scripts/src/components/NumberBox/NumberBox.spec.js +1237 -0
  109. package/dist/scripts/src/components/Option/Option.spec.js +472 -0
  110. package/dist/scripts/src/components/PageMetaTitle/PageMetaTitle.spec.js +80 -0
  111. package/dist/scripts/src/components/Pagination/Pagination.spec.js +1003 -0
  112. package/dist/scripts/src/components/ProfileMenu/ProfileMenu.js +20 -0
  113. package/dist/scripts/src/components/ProgressBar/ProgressBar.spec.js +166 -0
  114. package/dist/scripts/src/components/Queue/Queue.spec.js +626 -0
  115. package/dist/scripts/src/components/RadioGroup/RadioGroup.spec.js +479 -0
  116. package/dist/scripts/src/components/Redirect/Redirect.spec.js +527 -0
  117. package/dist/scripts/src/components/ResponsiveBar/ResponsiveBar.spec.js +76 -0
  118. package/dist/scripts/src/components/Select/Select.spec.js +527 -0
  119. package/dist/scripts/src/components/SelectionStore/SelectionStoreNative.js +3 -1
  120. package/dist/scripts/src/components/Slider/Slider.js +2 -0
  121. package/dist/scripts/src/components/Slider/Slider.spec.js +574 -0
  122. package/dist/scripts/src/components/Slider/SliderNative.js +63 -26
  123. package/dist/scripts/src/components/Slot/Slot.spec.js +368 -0
  124. package/dist/scripts/src/components/SpaceFiller/SpaceFiller.spec.js +184 -0
  125. package/dist/scripts/src/components/Spinner/Spinner.spec.js +161 -0
  126. package/dist/scripts/src/components/Splitter/HSplitter.spec.js +104 -0
  127. package/dist/scripts/src/components/Splitter/Splitter.spec.js +543 -0
  128. package/dist/scripts/src/components/Splitter/VSplitter.spec.js +104 -0
  129. package/dist/scripts/src/components/Stack/CHStack.spec.js +86 -0
  130. package/dist/scripts/src/components/Stack/CVStack.spec.js +86 -0
  131. package/dist/scripts/src/components/Stack/HStack.spec.js +67 -0
  132. package/dist/scripts/src/components/Stack/Stack.spec.js +654 -0
  133. package/dist/scripts/src/components/Stack/VStack.spec.js +67 -0
  134. package/dist/scripts/src/components/Switch/Switch.spec.js +829 -0
  135. package/dist/scripts/src/components/Table/Table.js +7 -1
  136. package/dist/scripts/src/components/Table/Table.spec.js +555 -0
  137. package/dist/scripts/src/components/Table/TableNative.js +4 -1
  138. package/dist/scripts/src/components/Table/doc-resources/list-component-data.js +53 -0
  139. package/dist/scripts/src/components/Table/useRowSelection.js +215 -1
  140. package/dist/scripts/src/components/TableOfContents/TableOfContents.spec.js +838 -0
  141. package/dist/scripts/src/components/Tabs/Tabs.spec.js +875 -0
  142. package/dist/scripts/src/components/Text/Text.spec.js +1075 -0
  143. package/dist/scripts/src/components/TextArea/TextArea.spec.js +714 -0
  144. package/dist/scripts/src/components/TextBox/TextBox.js +1 -5
  145. package/dist/scripts/src/components/TextBox/TextBox.spec.js +687 -0
  146. package/dist/scripts/src/components/TextBox/TextBoxNative.js +10 -15
  147. package/dist/scripts/src/components/Theme/Theme.spec.js +124 -0
  148. package/dist/scripts/src/components/Theme/ThemeNative.js +2 -6
  149. package/dist/scripts/src/components/TimeInput/TimeInput.js +1 -5
  150. package/dist/scripts/src/components/TimeInput/TimeInput.spec.js +1122 -0
  151. package/dist/scripts/src/components/TimeInput/TimeInputNative.js +2 -9
  152. package/dist/scripts/src/components/Timer/Timer.spec.js +358 -0
  153. package/dist/scripts/src/components/ToneChangerButton/ToneChangerButton.spec.js +414 -0
  154. package/dist/scripts/src/components/ToneSwitch/ToneSwitch.spec.js +89 -0
  155. package/dist/scripts/src/components/Tooltip/Tooltip.spec.js +418 -0
  156. package/dist/scripts/src/components/chart-color-schemes.js +43 -0
  157. package/dist/scripts/src/components-core/ApiBoundComponent.js +38 -24
  158. package/dist/scripts/src/components-core/CompoundComponent.js +1 -1
  159. package/dist/scripts/src/components-core/RestApiProxy.js +84 -8
  160. package/dist/scripts/src/components-core/behaviors/BehaviorContext.js +54 -0
  161. package/dist/scripts/src/components-core/behaviors/CoreBehaviors.js +80 -0
  162. package/dist/scripts/src/components-core/descriptorHelper.js +1 -0
  163. package/dist/scripts/src/components-core/devtools/InspectorDialogVisibilityContext.js +8 -0
  164. package/dist/scripts/src/components-core/parts.js +4 -1
  165. package/dist/scripts/src/components-core/renderers.js +31 -0
  166. package/dist/scripts/src/components-core/rendering/AppRoot.js +2 -1
  167. package/dist/scripts/src/components-core/rendering/ComponentAdapter.js +31 -46
  168. package/dist/scripts/src/components-core/rendering/nodeUtils.js +6 -0
  169. package/dist/scripts/src/components-core/script-runner/simplify-expression.js +386 -0
  170. package/dist/scripts/src/components-core/theming/component-layout-resolver.js +153 -0
  171. package/dist/scripts/src/components-core/theming/layout-resolver.js +2 -0
  172. package/dist/scripts/src/components-core/theming/parse-layout-props.js +98 -0
  173. package/dist/scripts/src/components-core/theming/themes/solid.js +16 -0
  174. package/dist/scripts/src/components-core/utils/audio-utils.js +83 -0
  175. package/dist/scripts/src/index-standalone.js +61 -0
  176. package/dist/scripts/src/index.js +39 -1
  177. package/dist/scripts/src/language-server/server-common.js +151 -0
  178. package/dist/scripts/src/language-server/server-web-worker.js +47 -0
  179. package/dist/scripts/src/language-server/server.js +42 -0
  180. package/dist/scripts/src/language-server/services/common/docs-generation.js +73 -0
  181. package/dist/scripts/src/language-server/services/common/lsp-utils.js +9 -0
  182. package/dist/scripts/src/language-server/services/common/syntax-node-utilities.js +135 -0
  183. package/dist/scripts/src/language-server/services/completion.js +270 -0
  184. package/dist/scripts/src/language-server/services/diagnostic.js +19 -0
  185. package/dist/scripts/src/language-server/services/format.js +430 -0
  186. package/dist/scripts/src/language-server/services/hover.js +164 -0
  187. package/dist/scripts/src/language-server/xmlui-metadata-generated.mjs +16266 -0
  188. package/dist/scripts/src/logging/xmlui.js +21 -0
  189. package/dist/scripts/src/parsers/common/utils.js +19 -0
  190. package/dist/scripts/src/syntax/monaco/grammar.monacoLanguage.js +286 -0
  191. package/dist/scripts/src/syntax/monaco/index.js +14 -0
  192. package/dist/scripts/src/syntax/monaco/xmlui-dark.js +25 -0
  193. package/dist/scripts/src/syntax/monaco/xmlui-light.js +25 -0
  194. package/dist/scripts/src/syntax/monaco/xmluiscript.monacoLanguage.js +310 -0
  195. package/dist/scripts/src/syntax/textMate/index.js +14 -0
  196. package/dist/scripts/src/syntax/textMate/xmlui-dark.json +631 -0
  197. package/dist/scripts/src/syntax/textMate/xmlui-light.json +565 -0
  198. package/dist/scripts/src/syntax/textMate/xmlui.json +564 -0
  199. package/dist/scripts/src/syntax/textMate/xmlui.tmLanguage.json +341 -0
  200. package/dist/scripts/src/testing/ComponentDrivers.js +1327 -0
  201. package/dist/scripts/src/testing/assertions.js +444 -0
  202. package/dist/scripts/src/testing/component-test-helpers.js +389 -0
  203. package/dist/scripts/src/testing/drivers/DateInputDriver.js +19 -0
  204. package/dist/scripts/src/testing/drivers/ModalDialogDriver.js +10 -0
  205. package/dist/scripts/src/testing/drivers/NumberBoxDriver.js +44 -0
  206. package/dist/scripts/src/testing/drivers/SliderDriver.js +20 -0
  207. package/dist/scripts/src/testing/drivers/TextBoxDriver.js +20 -0
  208. package/dist/scripts/src/testing/drivers/TimeInputDriver.js +22 -0
  209. package/dist/scripts/src/testing/drivers/TimerDriver.js +64 -0
  210. package/dist/scripts/src/testing/fixtures.js +513 -0
  211. package/dist/scripts/src/testing/infrastructure/TestBed.js +17 -0
  212. package/dist/scripts/src/testing/infrastructure/main.js +9 -0
  213. package/dist/scripts/src/testing/infrastructure/public/mockServiceWorker.js +266 -0
  214. package/dist/scripts/src/testing/themed-app-test-helpers.js +139 -0
  215. package/dist/standalone/xmlui-standalone.es.d.ts +172 -10
  216. package/dist/standalone/xmlui-standalone.umd.js +36 -36
  217. package/package.json +2 -3
@@ -0,0 +1,472 @@
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
+ // BASIC FUNCTIONALITY TESTS
15
+ // =============================================================================
16
+ fixtures_1.test.describe("Basic Functionality", () => {
17
+ (0, fixtures_1.test)("renders with both label and value properties", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver, }) {
18
+ yield initTestBed(`
19
+ <Select>
20
+ <Option label="Display Text" value="stored_value" />
21
+ </Select>
22
+ `);
23
+ const driver = yield createSelectDriver();
24
+ yield driver.toggleOptionsVisibility();
25
+ const option = page.getByRole("option", { name: "Display Text" });
26
+ yield (0, fixtures_1.expect)(option).toBeVisible();
27
+ }));
28
+ (0, fixtures_1.test)("renders with only label property (uses label as value)", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver, }) {
29
+ yield initTestBed(`
30
+ <Select>
31
+ <Option label="Display Text" />
32
+ </Select>
33
+ `);
34
+ const driver = yield createSelectDriver();
35
+ yield driver.toggleOptionsVisibility();
36
+ const option = page.getByRole("option", { name: "Display Text" });
37
+ yield (0, fixtures_1.expect)(option).toBeVisible();
38
+ }));
39
+ (0, fixtures_1.test)("renders with only value property (uses value as label)", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver, }) {
40
+ yield initTestBed(`
41
+ <Select>
42
+ <Option value="display_value" />
43
+ <Option label="Control Option" value="control" />
44
+ </Select>
45
+ `);
46
+ const driver = yield createSelectDriver();
47
+ yield driver.toggleOptionsVisibility();
48
+ // The option with only value should render (may display as empty)
49
+ yield (0, fixtures_1.expect)(page.getByRole("option")).toHaveCount(2);
50
+ yield (0, fixtures_1.expect)(page.getByRole("option").first()).toBeVisible();
51
+ yield (0, fixtures_1.expect)(page.getByRole("option", { name: "Control Option" })).toBeVisible();
52
+ }));
53
+ (0, fixtures_1.test)("does not render when neither label nor value is provided", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver, }) {
54
+ yield initTestBed(`
55
+ <Select>
56
+ <Option />
57
+ <Option label="Visible Option" value="visible" />
58
+ </Select>
59
+ `);
60
+ const driver = yield createSelectDriver();
61
+ yield driver.toggleOptionsVisibility();
62
+ // Should only see the valid option
63
+ yield (0, fixtures_1.expect)(page.getByRole("option")).toHaveCount(1);
64
+ yield (0, fixtures_1.expect)(page.getByRole("option", { name: "Visible Option" })).toBeVisible();
65
+ }));
66
+ (0, fixtures_1.test)("enabled property defaults to true", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver }) {
67
+ yield initTestBed(`
68
+ <Select>
69
+ <Option label="Default Option" value="default" />
70
+ </Select>
71
+ `);
72
+ const driver = yield createSelectDriver();
73
+ yield driver.toggleOptionsVisibility();
74
+ const option = page.getByRole("option", { name: "Default Option" });
75
+ yield (0, fixtures_1.expect)(option).toBeVisible();
76
+ yield (0, fixtures_1.expect)(option).not.toHaveAttribute("aria-disabled", "true");
77
+ }));
78
+ (0, fixtures_1.test)("enabled set to true", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver }) {
79
+ yield initTestBed(`
80
+ <Select>
81
+ <Option label="Enabled Option" value="enabled" enabled="{true}" />
82
+ </Select>
83
+ `);
84
+ const driver = yield createSelectDriver();
85
+ yield driver.toggleOptionsVisibility();
86
+ const option = page.getByRole("option", { name: "Enabled Option" });
87
+ yield (0, fixtures_1.expect)(option).toBeVisible();
88
+ yield (0, fixtures_1.expect)(option).not.toHaveAttribute("aria-disabled", "true");
89
+ }));
90
+ (0, fixtures_1.test)("enabled set to false", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver }) {
91
+ yield initTestBed(`
92
+ <Select>
93
+ <Option label="Disabled Option" value="disabled" enabled="{false}" />
94
+ <Option label="Enabled Option" value="enabled" enabled="{true}" />
95
+ </Select>
96
+ `);
97
+ const driver = yield createSelectDriver();
98
+ yield driver.toggleOptionsVisibility();
99
+ const disabledOption = page.getByRole("option", { name: "Disabled Option" });
100
+ const enabledOption = page.getByRole("option", { name: "Enabled Option" });
101
+ yield (0, fixtures_1.expect)(disabledOption).toBeVisible();
102
+ yield (0, fixtures_1.expect)(disabledOption).toHaveAttribute("aria-disabled", "true");
103
+ yield (0, fixtures_1.expect)(enabledOption).toBeVisible();
104
+ yield (0, fixtures_1.expect)(enabledOption).not.toHaveAttribute("aria-disabled", "true");
105
+ }));
106
+ (0, fixtures_1.test)("supports text node children as label", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver, }) {
107
+ yield initTestBed(`
108
+ <Select>
109
+ <Option value="text_node">Text Node Label</Option>
110
+ </Select>
111
+ `);
112
+ const driver = yield createSelectDriver();
113
+ yield driver.toggleOptionsVisibility();
114
+ const option = page.getByRole("option", { name: "Text Node Label" });
115
+ yield (0, fixtures_1.expect)(option).toBeVisible();
116
+ }));
117
+ (0, fixtures_1.test)("supports rich content as children", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver }) {
118
+ yield initTestBed(`
119
+ <Select>
120
+ <Option value="rich_content">
121
+ <HStack gap="$space-small">
122
+ <Icon name="user" />
123
+ <Text>Rich Content</Text>
124
+ </HStack>
125
+ </Option>
126
+ </Select>
127
+ `);
128
+ const driver = yield createSelectDriver();
129
+ yield driver.toggleOptionsVisibility();
130
+ const option = page.getByRole("option");
131
+ yield (0, fixtures_1.expect)(option).toBeVisible();
132
+ yield (0, fixtures_1.expect)(option.locator("text=Rich Content")).toBeVisible();
133
+ }));
134
+ (0, fixtures_1.test)("label property takes precedence over text node children", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver, }) {
135
+ yield initTestBed(`
136
+ <Select>
137
+ <Option label="Label Property" value="precedence">Text Node Content</Option>
138
+ </Select>
139
+ `);
140
+ const driver = yield createSelectDriver();
141
+ yield driver.toggleOptionsVisibility();
142
+ const option = page.getByRole("option", { name: "Label Property" });
143
+ yield (0, fixtures_1.expect)(option).toBeVisible();
144
+ // Text node should not be visible since label takes precedence
145
+ yield (0, fixtures_1.expect)(page.getByRole("option", { name: "Text Node Content" })).not.toBeVisible();
146
+ }));
147
+ (0, fixtures_1.test)("works within Select component for selection", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver, }) {
148
+ const { testStateDriver } = yield initTestBed(`
149
+ <Fragment>
150
+ <Select id="testSelect" onDidChange="arg => testState = arg">
151
+ <Option label="First" value="1" />
152
+ <Option label="Second" value="2" />
153
+ </Select>
154
+ </Fragment>
155
+ `);
156
+ const driver = yield createSelectDriver("testSelect");
157
+ yield driver.toggleOptionsVisibility();
158
+ yield driver.selectLabel("Second");
159
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual("2");
160
+ }));
161
+ (0, fixtures_1.test)("works within AutoComplete component for selection", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
162
+ const { testStateDriver } = yield initTestBed(`
163
+ <Fragment>
164
+ <AutoComplete id="testAutoComplete" onDidChange="arg => testState = arg">
165
+ <Option label="Apple" value="apple" />
166
+ <Option label="Banana" value="banana" />
167
+ </AutoComplete>
168
+ </Fragment>
169
+ `);
170
+ const autocomplete = page.getByRole("combobox");
171
+ yield autocomplete.click();
172
+ const appleOption = page.getByRole("option", { name: "Apple" });
173
+ yield appleOption.click();
174
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual("apple");
175
+ }));
176
+ (0, fixtures_1.test)("works within RadioGroup component for selection", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
177
+ const { testStateDriver } = yield initTestBed(`
178
+ <Fragment>
179
+ <RadioGroup id="testRadioGroup" onDidChange="arg => testState = arg">
180
+ <VStack>
181
+ <Option label="Option A" value="a" />
182
+ <Option label="Option B" value="b" />
183
+ </VStack>
184
+ </RadioGroup>
185
+ </Fragment>
186
+ `);
187
+ const optionB = page.getByRole("radio", { name: "Option B" });
188
+ yield optionB.click();
189
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual("b");
190
+ }));
191
+ (0, fixtures_1.test)("handles numeric values correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver }) {
192
+ const { testStateDriver } = yield initTestBed(`
193
+ <Fragment>
194
+ <Select id="numericSelect" onDidChange="arg => testState = arg">
195
+ <Option label="Zero" value="{0}" />
196
+ <Option label="Forty Two" value="{42}" />
197
+ <Option label="Negative" value="{-1}" />
198
+ </Select>
199
+ </Fragment>
200
+ `);
201
+ const driver = yield createSelectDriver("numericSelect");
202
+ yield driver.toggleOptionsVisibility();
203
+ yield driver.selectLabel("Forty Two");
204
+ // Values from Select are returned as strings
205
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual(42);
206
+ }));
207
+ (0, fixtures_1.test)("handles boolean values correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver }) {
208
+ const { testStateDriver } = yield initTestBed(`
209
+ <Fragment>
210
+ <Select id="booleanSelect" onDidChange="arg => testState = arg">
211
+ <Option label="True" value="{true}" />
212
+ <Option label="False" value="{false}" />
213
+ </Select>
214
+ </Fragment>
215
+ `);
216
+ const driver = yield createSelectDriver("booleanSelect");
217
+ yield driver.toggleOptionsVisibility();
218
+ yield driver.selectLabel("False");
219
+ // Values from Select are returned as strings
220
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual(false);
221
+ }));
222
+ (0, fixtures_1.test)("works with dynamic data through Items component", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver, }) {
223
+ const { testStateDriver } = yield initTestBed(`
224
+ <Fragment>
225
+ <Select id="dynamicSelect" onDidChange="arg => testState = arg">
226
+ <Items data="{['apple', 'banana', 'cherry']}">
227
+ <Option label="{$item}" value="{$itemIndex}" />
228
+ </Items>
229
+ </Select>
230
+ </Fragment>
231
+ `);
232
+ const driver = yield createSelectDriver("dynamicSelect");
233
+ yield driver.toggleOptionsVisibility();
234
+ yield (0, fixtures_1.expect)(page.getByRole("option", { name: "apple" })).toBeVisible();
235
+ yield (0, fixtures_1.expect)(page.getByRole("option", { name: "banana" })).toBeVisible();
236
+ yield (0, fixtures_1.expect)(page.getByRole("option", { name: "cherry" })).toBeVisible();
237
+ yield driver.selectLabel("banana");
238
+ // Values from Select are returned as strings
239
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual(1);
240
+ }));
241
+ (0, fixtures_1.test)("handles empty string values", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver }) {
242
+ const { testStateDriver } = yield initTestBed(`
243
+ <Fragment>
244
+ <Select id="emptySelect" onDidChange="arg => testState = arg">
245
+ <Option label="Empty String" value="" />
246
+ <Option label="Space" value=" " />
247
+ </Select>
248
+ </Fragment>
249
+ `);
250
+ const driver = yield createSelectDriver("emptySelect");
251
+ yield driver.toggleOptionsVisibility();
252
+ yield (0, fixtures_1.expect)(page.getByRole("option", { name: "Empty String" })).toBeVisible();
253
+ yield (0, fixtures_1.expect)(page.getByRole("option", { name: "Space" })).toBeVisible();
254
+ yield driver.selectLabel("Empty String");
255
+ // When value is empty string, Select may return the label instead
256
+ const result = yield testStateDriver.testState();
257
+ (0, fixtures_1.expect)(result === "Empty String").toBe(true);
258
+ }));
259
+ (0, fixtures_1.test)("handles null values", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver }) {
260
+ const { testStateDriver } = yield initTestBed(`
261
+ <Fragment>
262
+ <Select id="emptySelect" onDidChange="arg => testState = arg">
263
+ <Option label="Empty String" value="{null}" />
264
+ <Option label="Space" value=" " />
265
+ </Select>
266
+ </Fragment>
267
+ `);
268
+ const driver = yield createSelectDriver("emptySelect");
269
+ yield driver.toggleOptionsVisibility();
270
+ yield (0, fixtures_1.expect)(page.getByRole("option", { name: "Empty String" })).toBeVisible();
271
+ yield (0, fixtures_1.expect)(page.getByRole("option", { name: "Space" })).toBeVisible();
272
+ yield driver.selectLabel("Empty String");
273
+ // When value is empty string, Select may return the label instead
274
+ const result = yield testStateDriver.testState();
275
+ (0, fixtures_1.expect)(result).toBe(null);
276
+ }));
277
+ });
278
+ // =============================================================================
279
+ // ACCESSIBILITY TESTS
280
+ // =============================================================================
281
+ fixtures_1.test.describe("Accessibility", () => {
282
+ (0, fixtures_1.test)("has correct option role within Select", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver, }) {
283
+ yield initTestBed(`
284
+ <Select>
285
+ <Option label="Test Option" value="test" />
286
+ </Select>
287
+ `);
288
+ const driver = yield createSelectDriver();
289
+ yield driver.toggleOptionsVisibility();
290
+ const option = page.getByRole("option", { name: "Test Option" });
291
+ yield (0, fixtures_1.expect)(option).toBeVisible();
292
+ }));
293
+ (0, fixtures_1.test)("has correct radio role within RadioGroup", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
294
+ yield initTestBed(`
295
+ <RadioGroup>
296
+ <Option label="Test Option" value="test" />
297
+ </RadioGroup>
298
+ `);
299
+ const radio = page.getByRole("radio", { name: "Test Option" });
300
+ yield (0, fixtures_1.expect)(radio).toBeVisible();
301
+ }));
302
+ (0, fixtures_1.test)("disabled option has correct aria-disabled attribute", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver, }) {
303
+ yield initTestBed(`
304
+ <Select>
305
+ <Option label="Disabled Option" value="disabled" enabled="{false}" />
306
+ </Select>
307
+ `);
308
+ const driver = yield createSelectDriver();
309
+ yield driver.toggleOptionsVisibility();
310
+ const option = page.getByRole("option", { name: "Disabled Option" });
311
+ yield (0, fixtures_1.expect)(option).toHaveAttribute("aria-disabled", "true");
312
+ }));
313
+ (0, fixtures_1.test)("enabled option does not have aria-disabled attribute", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver, }) {
314
+ yield initTestBed(`
315
+ <Select>
316
+ <Option label="Enabled Option" value="enabled" enabled="{true}" />
317
+ </Select>
318
+ `);
319
+ const driver = yield createSelectDriver();
320
+ yield driver.toggleOptionsVisibility();
321
+ const option = page.getByRole("option", { name: "Enabled Option" });
322
+ yield (0, fixtures_1.expect)(option).not.toHaveAttribute("aria-disabled", "true");
323
+ }));
324
+ (0, fixtures_1.test)("supports keyboard navigation within Select", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver, }) {
325
+ const { testStateDriver } = yield initTestBed(`
326
+ <Fragment>
327
+ <Select id="keyboardSelect" onDidChange="arg => testState = arg">
328
+ <Option label="First Option" value="1" />
329
+ <Option label="Second Option" value="2" />
330
+ <Option label="Third Option" value="3" />
331
+ </Select>
332
+ </Fragment>
333
+ `);
334
+ const driver = yield createSelectDriver("keyboardSelect");
335
+ // Start by clicking to open the dropdown and focus on first option
336
+ yield driver.component.click();
337
+ yield page.waitForTimeout(200);
338
+ // Navigate down to third option step by step with longer waits
339
+ yield page.keyboard.press("ArrowDown");
340
+ yield page.waitForTimeout(200);
341
+ yield page.keyboard.press("ArrowDown");
342
+ yield page.waitForTimeout(200);
343
+ // Select with Enter
344
+ yield page.keyboard.press("Enter");
345
+ yield page.waitForTimeout(200);
346
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual("3");
347
+ }));
348
+ (0, fixtures_1.test)("supports keyboard navigation within RadioGroup", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
349
+ const { testStateDriver } = yield initTestBed(`
350
+ <Fragment>
351
+ <RadioGroup id="keyboardRadio" onDidChange="arg => testState = arg">
352
+ <VStack>
353
+ <Option label="First Option" value="1" />
354
+ <Option label="Second Option" value="2" />
355
+ <Option label="Third Option" value="3" />
356
+ </VStack>
357
+ </RadioGroup>
358
+ </Fragment>
359
+ `);
360
+ const firstRadio = page.getByRole("radio", { name: "First Option" });
361
+ yield firstRadio.focus();
362
+ yield firstRadio.click(); // Start with a selection
363
+ yield page.waitForTimeout(100);
364
+ // Navigate with arrow keys
365
+ yield page.keyboard.press("ArrowDown");
366
+ yield page.waitForTimeout(100);
367
+ yield page.keyboard.press("ArrowDown");
368
+ yield page.waitForTimeout(100);
369
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual("3");
370
+ }));
371
+ });
372
+ // =============================================================================
373
+ // OTHER EDGE CASE TESTS
374
+ // =============================================================================
375
+ fixtures_1.test.describe("Other Edge Cases", () => {
376
+ (0, fixtures_1.test)("handles long unicode characters in label", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver, }) {
377
+ yield initTestBed(`
378
+ <Select>
379
+ <Option label="Family: 👨‍👩‍👧‍👦" value="family" />
380
+ <Option label="Chinese: 你好世界" value="chinese" />
381
+ </Select>
382
+ `);
383
+ const driver = yield createSelectDriver();
384
+ yield driver.toggleOptionsVisibility();
385
+ yield (0, fixtures_1.expect)(page.getByRole("option", { name: "Family: 👨‍👩‍👧‍👦" })).toBeVisible();
386
+ yield (0, fixtures_1.expect)(page.getByRole("option", { name: "Chinese: 你好世界" })).toBeVisible();
387
+ }));
388
+ (0, fixtures_1.test)("handles very long label text", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver }) {
389
+ const longText = "A".repeat(100); // Reduced from 500 to be more reasonable
390
+ yield initTestBed(`
391
+ <Select>
392
+ <Option label="${longText}" value="long" />
393
+ </Select>
394
+ `);
395
+ const driver = yield createSelectDriver();
396
+ yield driver.toggleOptionsVisibility();
397
+ const option = page.getByRole("option", { name: longText });
398
+ yield (0, fixtures_1.expect)(option).toBeVisible();
399
+ }));
400
+ (0, fixtures_1.test)("handles enabled as string value", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver }) {
401
+ yield initTestBed(`
402
+ <Select>
403
+ <Option label="String False" value="string" enabled="false" />
404
+ <Option label="String True" value="string2" enabled="true" />
405
+ <Option label="Valid Option" value="valid" enabled="{true}" />
406
+ </Select>
407
+ `);
408
+ const driver = yield createSelectDriver();
409
+ yield driver.toggleOptionsVisibility();
410
+ // All options should be visible
411
+ yield (0, fixtures_1.expect)(page.getByRole("option")).toHaveCount(3);
412
+ yield (0, fixtures_1.expect)(page.getByRole("option", { name: "String False" })).toBeVisible();
413
+ yield (0, fixtures_1.expect)(page.getByRole("option", { name: "String True" })).toBeVisible();
414
+ yield (0, fixtures_1.expect)(page.getByRole("option", { name: "Valid Option" })).toBeVisible();
415
+ }));
416
+ (0, fixtures_1.test)("disabled option cannot be selected in Select", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver, }) {
417
+ const { testStateDriver } = yield initTestBed(`
418
+ <Fragment>
419
+ <Select id="disabledSelect" onDidChange="arg => testState = arg" initialValue="enabled">
420
+ <Option label="Enabled Option" value="enabled" />
421
+ <Option label="Disabled Option" value="disabled" enabled="{false}" />
422
+ </Select>
423
+ </Fragment>
424
+ `);
425
+ const driver = yield createSelectDriver("disabledSelect");
426
+ yield driver.toggleOptionsVisibility();
427
+ // Try to select the disabled option (driver should not succeed)
428
+ const initialValue = yield testStateDriver.testState();
429
+ yield driver.selectLabel("Disabled Option");
430
+ // Value should not change since option is disabled
431
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual(initialValue);
432
+ }));
433
+ (0, fixtures_1.test)("handles object as label (converts to string)", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver, }) {
434
+ yield initTestBed(`
435
+ <Select>
436
+ <Option label="{{}}" value="object" />
437
+ <Option label="Valid Option" value="valid" />
438
+ </Select>
439
+ `);
440
+ const driver = yield createSelectDriver();
441
+ yield driver.toggleOptionsVisibility();
442
+ // Should see both options - object will be converted to string representation
443
+ yield (0, fixtures_1.expect)(page.getByRole("option")).toHaveCount(2);
444
+ yield (0, fixtures_1.expect)(page.getByRole("option", { name: "Valid Option" })).toBeVisible();
445
+ // The object label should be visible with some string representation
446
+ yield (0, fixtures_1.expect)(page.getByRole("option")).toHaveCount(2);
447
+ }));
448
+ (0, fixtures_1.test)("null values are handled gracefully", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver, }) {
449
+ yield initTestBed(`
450
+ <Select>
451
+ <Option label="{null}" value="null_label" />
452
+ <Option label="Valid Option" value="valid" />
453
+ </Select>
454
+ `);
455
+ const driver = yield createSelectDriver();
456
+ yield driver.toggleOptionsVisibility();
457
+ // The actual behavior might vary - this needs investigation
458
+ yield (0, fixtures_1.expect)(page.getByRole("option", { name: "Valid Option" })).toBeVisible();
459
+ }));
460
+ (0, fixtures_1.test)("undefined values are handled gracefully", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page, createSelectDriver, }) {
461
+ yield initTestBed(`
462
+ <Select>
463
+ <Option label="{undefined}" value="undefined_label" />
464
+ <Option label="Valid Option" value="valid" />
465
+ </Select>
466
+ `);
467
+ const driver = yield createSelectDriver();
468
+ yield driver.toggleOptionsVisibility();
469
+ // The actual behavior might vary - this needs investigation
470
+ yield (0, fixtures_1.expect)(page.getByRole("option", { name: "Valid Option" })).toBeVisible();
471
+ }));
472
+ });
@@ -0,0 +1,80 @@
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
+ // BASIC FUNCTIONALITY TESTS
15
+ // =============================================================================
16
+ fixtures_1.test.describe("Basic Functionality", () => {
17
+ (0, fixtures_1.test)("component renders with default props", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
18
+ yield initTestBed(`<PageMetaTitle />`);
19
+ // PageMetaTitle doesn't render visible DOM elements, it only affects page title
20
+ // Default title should be set in browser with test bed suffix
21
+ yield (0, fixtures_1.expect)(page).toHaveTitle("XMLUI Application | test bed app");
22
+ }));
23
+ (0, fixtures_1.test)("component renders with value property", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
24
+ yield initTestBed(`<PageMetaTitle value="Custom Page Title" />`);
25
+ // Custom title should be set in browser with test bed suffix
26
+ yield (0, fixtures_1.expect)(page).toHaveTitle("Custom Page Title | test bed app");
27
+ }));
28
+ (0, fixtures_1.test)("component handles dynamic value changes", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
29
+ const { testStateDriver } = yield initTestBed(`
30
+ <VStack>
31
+ <PageMetaTitle value="{testState || 'Initial Title'}" />
32
+ <Button onClick="testState = 'Updated Title'">Update Title</Button>
33
+ </VStack>
34
+ `);
35
+ // Initial title should be set
36
+ yield (0, fixtures_1.expect)(page).toHaveTitle("Initial Title | test bed app");
37
+ // Click button to update title
38
+ yield page.getByRole("button").click();
39
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual("Updated Title");
40
+ // Title should be updated in browser
41
+ yield (0, fixtures_1.expect)(page).toHaveTitle("Updated Title | test bed app");
42
+ }));
43
+ (0, fixtures_1.test)("component handles child content as title", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
44
+ yield initTestBed(`
45
+ <PageMetaTitle>
46
+ Child Content Title
47
+ </PageMetaTitle>
48
+ `);
49
+ // Child content should be used as title
50
+ yield (0, fixtures_1.expect)(page).toHaveTitle("Child Content Title | test bed app");
51
+ }));
52
+ (0, fixtures_1.test)("value property takes precedence over child content", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
53
+ yield initTestBed(`
54
+ <PageMetaTitle value="Value Property Title">
55
+ Child Content That Should Be Ignored
56
+ </PageMetaTitle>
57
+ `);
58
+ // Value property should take precedence
59
+ yield (0, fixtures_1.expect)(page).toHaveTitle("Value Property Title | test bed app");
60
+ }));
61
+ (0, fixtures_1.test)("multiple PageMetaTitle components - last one wins", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
62
+ yield initTestBed(`
63
+ <VStack>
64
+ <PageMetaTitle value="First Title" />
65
+ <PageMetaTitle value="Second Title" />
66
+ <PageMetaTitle value="Final Title" />
67
+ </VStack>
68
+ `);
69
+ // Last component should set the final title
70
+ yield (0, fixtures_1.expect)(page).toHaveTitle("Final Title | test bed app");
71
+ }));
72
+ (0, fixtures_1.test)("component updates existing page title", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
73
+ // Set initial title
74
+ yield initTestBed(`<PageMetaTitle value="Initial Title" />`);
75
+ yield (0, fixtures_1.expect)(page).toHaveTitle("Initial Title | test bed app");
76
+ // Update with new component
77
+ yield initTestBed(`<PageMetaTitle value="Updated Title" />`);
78
+ yield (0, fixtures_1.expect)(page).toHaveTitle("Updated Title | test bed app");
79
+ }));
80
+ });