xmlui 0.10.13 → 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 (186) hide show
  1. package/dist/lib/{index-Db5iQkFp.mjs → index-779mp2Bm.mjs} +943 -736
  2. package/dist/lib/index.css +1 -1
  3. package/dist/lib/{initMock-B9LtmFJG.mjs → initMock-CAXdczCj.mjs} +1 -1
  4. package/dist/lib/xmlui.d.ts +16 -1
  5. package/dist/lib/xmlui.mjs +33 -32
  6. package/dist/metadata/{collectedComponentMetadata-BN8eg9Gr.mjs → collectedComponentMetadata-7DFXlw-J.mjs} +15057 -14865
  7. package/dist/metadata/{initMock-J7pN8owj.mjs → initMock-AFWEftc6.mjs} +1 -1
  8. package/dist/metadata/style.css +1 -1
  9. package/dist/metadata/xmlui-metadata.mjs +1 -1
  10. package/dist/metadata/xmlui-metadata.umd.js +3 -3
  11. package/dist/scripts/bin/build-lib.js +21 -13
  12. package/dist/scripts/bin/viteConfig.js +3 -1
  13. package/dist/scripts/package.json +1 -1
  14. package/dist/scripts/src/abstractions/scripting/Token.js +2 -0
  15. package/dist/scripts/src/abstractions/scripting/TryScope.js +2 -0
  16. package/dist/scripts/src/abstractions/scripting/modules.js +2 -0
  17. package/dist/scripts/src/components/APICall/APICall.spec.js +910 -0
  18. package/dist/scripts/src/components/Accordion/Accordion.spec.js +969 -0
  19. package/dist/scripts/src/components/Animation/Animation.js +50 -0
  20. package/dist/scripts/src/components/App/App.spec.js +219 -0
  21. package/dist/scripts/src/components/AppHeader/AppHeader.spec.js +169 -0
  22. package/dist/scripts/src/components/AppState/AppState.spec.js +268 -0
  23. package/dist/scripts/src/components/AutoComplete/AutoComplete.spec.js +383 -0
  24. package/dist/scripts/src/components/Avatar/Avatar.spec.js +1543 -0
  25. package/dist/scripts/src/components/Backdrop/Backdrop.spec.js +131 -0
  26. package/dist/scripts/src/components/Badge/Badge.spec.js +2214 -0
  27. package/dist/scripts/src/components/Bookmark/Bookmark.spec.js +230 -0
  28. package/dist/scripts/src/components/Breakout/Breakout.spec.js +56 -0
  29. package/dist/scripts/src/components/Button/Button-style.spec.js +274 -0
  30. package/dist/scripts/src/components/Button/Button.spec.js +454 -0
  31. package/dist/scripts/src/components/Card/Card.spec.js +150 -0
  32. package/dist/scripts/src/components/Carousel/Carousel.spec.js +343 -0
  33. package/dist/scripts/src/components/Carousel/CarouselNative.js +2 -2
  34. package/dist/scripts/src/components/ChangeListener/ChangeListener.spec.js +169 -0
  35. package/dist/scripts/src/components/Charts/AreaChart/AreaChart.spec.js +999 -0
  36. package/dist/scripts/src/components/Charts/BarChart/BarChart.spec.js +597 -0
  37. package/dist/scripts/src/components/Charts/DonutChart/DonutChart.spec.js +608 -0
  38. package/dist/scripts/src/components/Charts/LabelList/LabelList.spec.js +539 -0
  39. package/dist/scripts/src/components/Charts/Legend/Legend.spec.js +558 -0
  40. package/dist/scripts/src/components/Charts/LineChart/LineChart.spec.js +450 -0
  41. package/dist/scripts/src/components/Charts/PieChart/PieChart.spec.js +584 -0
  42. package/dist/scripts/src/components/Charts/RadarChart/RadarChart.spec.js +571 -0
  43. package/dist/scripts/src/components/Charts/Tooltip/TooltipContent.spec.js +449 -0
  44. package/dist/scripts/src/components/Checkbox/Checkbox.spec.js +964 -0
  45. package/dist/scripts/src/components/CodeBlock/CodeBlock.spec.js +196 -0
  46. package/dist/scripts/src/components/ColorPicker/ColorPicker.spec.js +283 -0
  47. package/dist/scripts/src/components/ColorPicker/ColorPickerNative.js +9 -26
  48. package/dist/scripts/src/components/Column/doc-resources/list-component-data.js +53 -0
  49. package/dist/scripts/src/components/ComponentProvider.js +6 -2
  50. package/dist/scripts/src/components/ContentSeparator/ContentSeparator.spec.js +338 -0
  51. package/dist/scripts/src/components/DateInput/DateInput.spec.js +918 -0
  52. package/dist/scripts/src/components/DatePicker/DatePicker.spec.js +362 -0
  53. package/dist/scripts/src/components/DatePicker/DatePickerNative.js +3 -3
  54. package/dist/scripts/src/components/DropdownMenu/DropdownMenu.spec.js +331 -0
  55. package/dist/scripts/src/components/EmojiSelector/EmojiSelector.spec.js +29 -0
  56. package/dist/scripts/src/components/ExpandableItem/ExpandableItem.spec.js +435 -0
  57. package/dist/scripts/src/components/FileInput/FileInput.spec.js +249 -0
  58. package/dist/scripts/src/components/FileUploadDropZone/FileUploadDropZone.spec.js +296 -0
  59. package/dist/scripts/src/components/FlowLayout/FlowLayout.spec.js +518 -0
  60. package/dist/scripts/src/components/Footer/Footer.spec.js +991 -0
  61. package/dist/scripts/src/components/Form/Form.spec.js +1257 -0
  62. package/dist/scripts/src/components/FormItem/FormItem.spec.js +723 -0
  63. package/dist/scripts/src/components/FormSection/FormSection.js +6 -31
  64. package/dist/scripts/src/components/Fragment/Fragment.spec.js +50 -0
  65. package/dist/scripts/src/components/Heading/H1.spec.js +66 -0
  66. package/dist/scripts/src/components/Heading/H2.spec.js +66 -0
  67. package/dist/scripts/src/components/Heading/H3.spec.js +66 -0
  68. package/dist/scripts/src/components/Heading/H4.spec.js +66 -0
  69. package/dist/scripts/src/components/Heading/H5.spec.js +66 -0
  70. package/dist/scripts/src/components/Heading/H6.spec.js +66 -0
  71. package/dist/scripts/src/components/Heading/Heading.spec.js +897 -0
  72. package/dist/scripts/src/components/HtmlTags/HtmlTags.spec.js +69 -0
  73. package/dist/scripts/src/components/IFrame/IFrame.spec.js +527 -0
  74. package/dist/scripts/src/components/Icon/ArrowDropDown.js +11 -0
  75. package/dist/scripts/src/components/Icon/ArrowDropUp.js +11 -0
  76. package/dist/scripts/src/components/Icon/ArrowLeft.js +11 -0
  77. package/dist/scripts/src/components/Icon/ArrowRight.js +11 -0
  78. package/dist/scripts/src/components/Icon/ChevronDownIcon.js +7 -0
  79. package/dist/scripts/src/components/Icon/ChevronUpIcon.js +7 -0
  80. package/dist/scripts/src/components/Icon/Icon.spec.js +527 -0
  81. package/dist/scripts/src/components/Icon/SunIcon.js +10 -0
  82. package/dist/scripts/src/components/Image/Image.js +2 -1
  83. package/dist/scripts/src/components/Image/Image.spec.js +198 -0
  84. package/dist/scripts/src/components/Image/ImageNative.js +30 -2
  85. package/dist/scripts/src/components/Input/InputLabel.js +25 -0
  86. package/dist/scripts/src/components/Input/index.js +5 -0
  87. package/dist/scripts/src/components/Items/Items.spec.js +397 -0
  88. package/dist/scripts/src/components/Link/Link.spec.js +894 -0
  89. package/dist/scripts/src/components/List/List.spec.js +927 -0
  90. package/dist/scripts/src/components/List/doc-resources/list-component-data.js +53 -0
  91. package/dist/scripts/src/components/Markdown/Markdown.spec.js +188 -0
  92. package/dist/scripts/src/components/ModalDialog/ModalDialog.spec.js +162 -0
  93. package/dist/scripts/src/components/NavGroup/NavGroup.spec.js +153 -0
  94. package/dist/scripts/src/components/NavGroup/NavGroupNative.js +2 -2
  95. package/dist/scripts/src/components/NavLink/NavLink.spec.js +864 -0
  96. package/dist/scripts/src/components/NavPanel/NavPanel.spec.js +864 -0
  97. package/dist/scripts/src/components/NoResult/NoResult.spec.js +863 -0
  98. package/dist/scripts/src/components/NumberBox/NumberBox.spec.js +1231 -0
  99. package/dist/scripts/src/components/Option/Option.spec.js +472 -0
  100. package/dist/scripts/src/components/PageMetaTitle/PageMetaTitle.spec.js +80 -0
  101. package/dist/scripts/src/components/Pagination/Pagination.spec.js +1003 -0
  102. package/dist/scripts/src/components/ProfileMenu/ProfileMenu.js +20 -0
  103. package/dist/scripts/src/components/ProgressBar/ProgressBar.spec.js +166 -0
  104. package/dist/scripts/src/components/Queue/Queue.spec.js +626 -0
  105. package/dist/scripts/src/components/RadioGroup/RadioGroup.spec.js +479 -0
  106. package/dist/scripts/src/components/Redirect/Redirect.spec.js +527 -0
  107. package/dist/scripts/src/components/ResponsiveBar/ResponsiveBar.spec.js +76 -0
  108. package/dist/scripts/src/components/Select/Select.spec.js +527 -0
  109. package/dist/scripts/src/components/Slider/Slider.js +2 -0
  110. package/dist/scripts/src/components/Slider/Slider.spec.js +574 -0
  111. package/dist/scripts/src/components/Slider/SliderNative.js +62 -25
  112. package/dist/scripts/src/components/Slot/Slot.spec.js +368 -0
  113. package/dist/scripts/src/components/SpaceFiller/SpaceFiller.spec.js +184 -0
  114. package/dist/scripts/src/components/Spinner/Spinner.spec.js +161 -0
  115. package/dist/scripts/src/components/Splitter/HSplitter.spec.js +104 -0
  116. package/dist/scripts/src/components/Splitter/Splitter.spec.js +543 -0
  117. package/dist/scripts/src/components/Splitter/VSplitter.spec.js +104 -0
  118. package/dist/scripts/src/components/Stack/CHStack.spec.js +86 -0
  119. package/dist/scripts/src/components/Stack/CVStack.spec.js +86 -0
  120. package/dist/scripts/src/components/Stack/HStack.spec.js +67 -0
  121. package/dist/scripts/src/components/Stack/Stack.spec.js +654 -0
  122. package/dist/scripts/src/components/Stack/VStack.spec.js +67 -0
  123. package/dist/scripts/src/components/Switch/Switch.spec.js +829 -0
  124. package/dist/scripts/src/components/Table/Table.spec.js +555 -0
  125. package/dist/scripts/src/components/Table/doc-resources/list-component-data.js +53 -0
  126. package/dist/scripts/src/components/TableOfContents/TableOfContents.spec.js +838 -0
  127. package/dist/scripts/src/components/Tabs/Tabs.spec.js +875 -0
  128. package/dist/scripts/src/components/Text/Text.spec.js +1075 -0
  129. package/dist/scripts/src/components/TextArea/TextArea.spec.js +714 -0
  130. package/dist/scripts/src/components/TextBox/TextBox.spec.js +643 -0
  131. package/dist/scripts/src/components/Theme/Theme.spec.js +124 -0
  132. package/dist/scripts/src/components/TimeInput/TimeInput.spec.js +1122 -0
  133. package/dist/scripts/src/components/Timer/Timer.spec.js +358 -0
  134. package/dist/scripts/src/components/ToneChangerButton/ToneChangerButton.spec.js +414 -0
  135. package/dist/scripts/src/components/ToneSwitch/ToneSwitch.spec.js +89 -0
  136. package/dist/scripts/src/components/Tooltip/Tooltip.spec.js +418 -0
  137. package/dist/scripts/src/components/chart-color-schemes.js +43 -0
  138. package/dist/scripts/src/components-core/CompoundComponent.js +1 -1
  139. package/dist/scripts/src/components-core/RestApiProxy.js +85 -8
  140. package/dist/scripts/src/components-core/devtools/InspectorDialogVisibilityContext.js +8 -0
  141. package/dist/scripts/src/components-core/renderers.js +31 -0
  142. package/dist/scripts/src/components-core/script-runner/simplify-expression.js +386 -0
  143. package/dist/scripts/src/components-core/theming/component-layout-resolver.js +153 -0
  144. package/dist/scripts/src/components-core/theming/parse-layout-props.js +98 -0
  145. package/dist/scripts/src/components-core/theming/themes/solid.js +16 -0
  146. package/dist/scripts/src/components-core/utils/audio-utils.js +83 -0
  147. package/dist/scripts/src/index-standalone.js +61 -0
  148. package/dist/scripts/src/index.js +2 -1
  149. package/dist/scripts/src/language-server/server-common.js +151 -0
  150. package/dist/scripts/src/language-server/server-web-worker.js +47 -0
  151. package/dist/scripts/src/language-server/server.js +42 -0
  152. package/dist/scripts/src/language-server/services/common/docs-generation.js +73 -0
  153. package/dist/scripts/src/language-server/services/common/lsp-utils.js +9 -0
  154. package/dist/scripts/src/language-server/services/common/syntax-node-utilities.js +135 -0
  155. package/dist/scripts/src/language-server/services/completion.js +270 -0
  156. package/dist/scripts/src/language-server/services/diagnostic.js +19 -0
  157. package/dist/scripts/src/language-server/services/format.js +430 -0
  158. package/dist/scripts/src/language-server/services/hover.js +164 -0
  159. package/dist/scripts/src/language-server/xmlui-metadata-generated.mjs +16266 -0
  160. package/dist/scripts/src/logging/xmlui.js +21 -0
  161. package/dist/scripts/src/parsers/common/utils.js +19 -0
  162. package/dist/scripts/src/syntax/monaco/grammar.monacoLanguage.js +286 -0
  163. package/dist/scripts/src/syntax/monaco/index.js +14 -0
  164. package/dist/scripts/src/syntax/monaco/xmlui-dark.js +25 -0
  165. package/dist/scripts/src/syntax/monaco/xmlui-light.js +25 -0
  166. package/dist/scripts/src/syntax/monaco/xmluiscript.monacoLanguage.js +310 -0
  167. package/dist/scripts/src/syntax/textMate/index.js +14 -0
  168. package/dist/scripts/src/syntax/textMate/xmlui-dark.json +631 -0
  169. package/dist/scripts/src/syntax/textMate/xmlui-light.json +565 -0
  170. package/dist/scripts/src/syntax/textMate/xmlui.json +564 -0
  171. package/dist/scripts/src/syntax/textMate/xmlui.tmLanguage.json +341 -0
  172. package/dist/scripts/src/testing/ComponentDrivers.js +1355 -0
  173. package/dist/scripts/src/testing/assertions.js +444 -0
  174. package/dist/scripts/src/testing/component-test-helpers.js +389 -0
  175. package/dist/scripts/src/testing/drivers/DateInputDriver.js +19 -0
  176. package/dist/scripts/src/testing/drivers/ModalDialogDriver.js +10 -0
  177. package/dist/scripts/src/testing/drivers/TimeInputDriver.js +22 -0
  178. package/dist/scripts/src/testing/drivers/TimerDriver.js +64 -0
  179. package/dist/scripts/src/testing/fixtures.js +487 -0
  180. package/dist/scripts/src/testing/infrastructure/TestBed.js +17 -0
  181. package/dist/scripts/src/testing/infrastructure/main.js +9 -0
  182. package/dist/scripts/src/testing/infrastructure/public/mockServiceWorker.js +266 -0
  183. package/dist/scripts/src/testing/themed-app-test-helpers.js +139 -0
  184. package/dist/standalone/xmlui-standalone.es.d.ts +18 -1
  185. package/dist/standalone/xmlui-standalone.umd.js +36 -36
  186. package/package.json +1 -1
@@ -0,0 +1,435 @@
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
+ (0, fixtures_1.test)("component renders with basic props", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
17
+ yield initTestBed(`<ExpandableItem summary="Test Summary">Content here</ExpandableItem>`, {});
18
+ const driver = yield createExpandableItemDriver();
19
+ yield (0, fixtures_1.expect)(driver.component).toBeVisible();
20
+ yield (0, fixtures_1.expect)(driver.getSummaryContent()).toContainText("Test Summary");
21
+ yield (0, fixtures_1.expect)(driver.getContent()).not.toBeVisible(); // Initially collapsed
22
+ }));
23
+ (0, fixtures_1.test)("component displays summary content correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
24
+ yield initTestBed(`<ExpandableItem summary="My Summary">Content</ExpandableItem>`, {});
25
+ const driver = yield createExpandableItemDriver();
26
+ yield (0, fixtures_1.expect)(driver.getSummaryContent()).toContainText("My Summary");
27
+ yield (0, fixtures_1.expect)(driver.getSummary()).toBeVisible();
28
+ }));
29
+ (0, fixtures_1.test)("component handles initiallyExpanded prop", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
30
+ yield initTestBed(`<ExpandableItem summary="Test" initiallyExpanded="true">Content here</ExpandableItem>`, {});
31
+ const driver = yield createExpandableItemDriver();
32
+ yield (0, fixtures_1.expect)(driver.getContent()).toBeVisible();
33
+ yield (0, fixtures_1.expect)(driver.getContent()).toContainText("Content here");
34
+ }));
35
+ (0, fixtures_1.test)("component toggles on summary click", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
36
+ yield initTestBed(`<ExpandableItem summary="Click me">Hidden content</ExpandableItem>`, {});
37
+ const driver = yield createExpandableItemDriver();
38
+ // Initially collapsed
39
+ yield (0, fixtures_1.expect)(driver.getContent()).not.toBeVisible();
40
+ // Click to expand
41
+ yield driver.getSummary().click();
42
+ yield (0, fixtures_1.expect)(driver.getContent()).toBeVisible();
43
+ // Click to collapse
44
+ yield driver.getSummary().click();
45
+ yield (0, fixtures_1.expect)(driver.getContent()).not.toBeVisible();
46
+ }));
47
+ (0, fixtures_1.test)("component displays correct icons for collapsed and expanded states", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
48
+ yield initTestBed(`<ExpandableItem summary="Test">Content</ExpandableItem>`, {});
49
+ const driver = yield createExpandableItemDriver();
50
+ // Initially collapsed - should show chevronright icon
51
+ yield (0, fixtures_1.expect)(driver.getIcon()).toBeVisible();
52
+ // Expand and check icon changes
53
+ yield driver.getSummary().click();
54
+ yield (0, fixtures_1.expect)(driver.getIcon()).toBeVisible();
55
+ }));
56
+ (0, fixtures_1.test)("component handles custom icons", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
57
+ yield initTestBed(`
58
+ <ExpandableItem
59
+ summary="Test"
60
+ iconCollapsed="plus"
61
+ iconExpanded="minus">
62
+ Content
63
+ </ExpandableItem>
64
+ `, {});
65
+ const driver = yield createExpandableItemDriver();
66
+ yield (0, fixtures_1.expect)(driver.getIcon()).toBeVisible();
67
+ // Expand to see expanded icon
68
+ yield driver.getSummary().click();
69
+ yield (0, fixtures_1.expect)(driver.getIcon()).toBeVisible();
70
+ }));
71
+ (0, fixtures_1.test)("component supports iconPosition prop", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
72
+ yield initTestBed(`<ExpandableItem summary="Test" iconPosition="start">Content</ExpandableItem>`, {});
73
+ const driver = yield createExpandableItemDriver();
74
+ const className = yield driver.getSummary().getAttribute('class');
75
+ (0, fixtures_1.expect)(className).toMatch(/iconStart/);
76
+ yield (0, fixtures_1.expect)(driver.getIcon()).toBeVisible();
77
+ }));
78
+ (0, fixtures_1.test)("component handles withSwitch prop", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
79
+ yield initTestBed(`<ExpandableItem summary="Test" withSwitch="true">Content</ExpandableItem>`, {});
80
+ const driver = yield createExpandableItemDriver();
81
+ // Check that the switch container (aria-hidden div) is present
82
+ const switchContainer = driver.getSummary().locator('[aria-hidden="true"]');
83
+ yield (0, fixtures_1.expect)(switchContainer).toBeVisible();
84
+ yield (0, fixtures_1.expect)(driver.getIcon()).not.toBeVisible();
85
+ }));
86
+ // =============================================================================
87
+ // ACCESSIBILITY TESTS
88
+ // =============================================================================
89
+ (0, fixtures_1.test)("component has correct accessibility attributes", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver, page }) {
90
+ yield initTestBed(`<ExpandableItem summary="Test Summary">Content here</ExpandableItem>`, {});
91
+ const driver = yield createExpandableItemDriver();
92
+ const summary = driver.getSummary();
93
+ // Summary should have proper button role and ARIA attributes
94
+ yield (0, fixtures_1.expect)(summary).toHaveRole("button");
95
+ yield (0, fixtures_1.expect)(summary).toHaveAttribute("aria-expanded", "false");
96
+ yield (0, fixtures_1.expect)(summary).toHaveAttribute("aria-disabled", "false");
97
+ yield (0, fixtures_1.expect)(summary).toHaveAttribute("tabindex", "0");
98
+ yield (0, fixtures_1.expect)(summary).toHaveAttribute("aria-controls");
99
+ yield (0, fixtures_1.expect)(summary).toHaveAttribute("id");
100
+ }));
101
+ (0, fixtures_1.test)("component ARIA attributes update with expansion state", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver, page }) {
102
+ yield initTestBed(`<ExpandableItem summary="Test Summary">Content here</ExpandableItem>`, {});
103
+ const driver = yield createExpandableItemDriver();
104
+ const summary = driver.getSummary();
105
+ // Initially collapsed
106
+ yield (0, fixtures_1.expect)(summary).toHaveAttribute("aria-expanded", "false");
107
+ // Expand
108
+ yield summary.click();
109
+ yield (0, fixtures_1.expect)(summary).toHaveAttribute("aria-expanded", "true");
110
+ // Collapse
111
+ yield summary.click();
112
+ yield (0, fixtures_1.expect)(summary).toHaveAttribute("aria-expanded", "false");
113
+ }));
114
+ (0, fixtures_1.test)("component content region has correct ARIA attributes", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver, page }) {
115
+ yield initTestBed(`<ExpandableItem summary="Test Summary" initiallyExpanded="true">Content here</ExpandableItem>`, {});
116
+ const driver = yield createExpandableItemDriver();
117
+ const summary = driver.getSummary();
118
+ const content = driver.getContent();
119
+ // Content should have region role and proper labeling
120
+ yield (0, fixtures_1.expect)(content).toHaveRole("region");
121
+ yield (0, fixtures_1.expect)(content).toHaveAttribute("aria-labelledby");
122
+ yield (0, fixtures_1.expect)(content).toHaveAttribute("id");
123
+ // Verify ARIA relationship between summary and content
124
+ const summaryId = yield summary.getAttribute("id");
125
+ const contentAriaLabelledBy = yield content.getAttribute("aria-labelledby");
126
+ const summaryAriaControls = yield summary.getAttribute("aria-controls");
127
+ const contentId = yield content.getAttribute("id");
128
+ (0, fixtures_1.expect)(contentAriaLabelledBy).toBe(summaryId);
129
+ (0, fixtures_1.expect)(summaryAriaControls).toBe(contentId);
130
+ }));
131
+ (0, fixtures_1.test)("component is keyboard accessible with Enter key", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver, page }) {
132
+ const { testStateDriver } = yield initTestBed(`<ExpandableItem summary="Test" onExpandedChange="arg => testState = arg">Content</ExpandableItem>`, {});
133
+ const driver = yield createExpandableItemDriver();
134
+ const summary = driver.getSummary();
135
+ // Focus the summary button
136
+ yield summary.focus();
137
+ yield (0, fixtures_1.expect)(summary).toBeFocused();
138
+ // Press Enter to toggle
139
+ yield summary.press("Enter");
140
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual(true);
141
+ yield (0, fixtures_1.expect)(driver.getContent()).toBeVisible();
142
+ // Press Enter again to collapse
143
+ yield summary.press("Enter");
144
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual(false);
145
+ yield (0, fixtures_1.expect)(driver.getContent()).not.toBeVisible();
146
+ }));
147
+ (0, fixtures_1.test)("component is keyboard accessible with Space key", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver, page }) {
148
+ const { testStateDriver } = yield initTestBed(`<ExpandableItem summary="Test" onExpandedChange="arg => testState = arg">Content</ExpandableItem>`, {});
149
+ const driver = yield createExpandableItemDriver();
150
+ const summary = driver.getSummary();
151
+ // Focus the summary button
152
+ yield summary.focus();
153
+ yield (0, fixtures_1.expect)(summary).toBeFocused();
154
+ // Press Space to toggle
155
+ yield summary.press(" ");
156
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual(true);
157
+ yield (0, fixtures_1.expect)(driver.getContent()).toBeVisible();
158
+ // Press Space again to collapse
159
+ yield summary.press(" ");
160
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual(false);
161
+ yield (0, fixtures_1.expect)(driver.getContent()).not.toBeVisible();
162
+ }));
163
+ (0, fixtures_1.test)("component maintains focus after keyboard toggle", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver, page }) {
164
+ yield initTestBed(`<ExpandableItem summary="Test">Content</ExpandableItem>`, {});
165
+ const driver = yield createExpandableItemDriver();
166
+ const summary = driver.getSummary();
167
+ // Focus and expand with keyboard
168
+ yield summary.focus();
169
+ yield (0, fixtures_1.expect)(summary).toBeFocused();
170
+ yield summary.press("Enter");
171
+ yield (0, fixtures_1.expect)(driver.getContent()).toBeVisible();
172
+ yield (0, fixtures_1.expect)(summary).toBeFocused(); // Focus should remain
173
+ // Collapse with keyboard
174
+ yield summary.press("Space");
175
+ yield (0, fixtures_1.expect)(driver.getContent()).not.toBeVisible();
176
+ yield (0, fixtures_1.expect)(summary).toBeFocused(); // Focus should still remain
177
+ }));
178
+ (0, fixtures_1.test)("component is focusable only when enabled", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver, page }) {
179
+ yield initTestBed(`<ExpandableItem summary="Test" enabled="false">Content</ExpandableItem>`, {});
180
+ const driver = yield createExpandableItemDriver();
181
+ const summary = driver.getSummary();
182
+ // Disabled component should not be focusable (no tabindex attribute)
183
+ yield (0, fixtures_1.expect)(summary).not.toHaveAttribute("tabindex");
184
+ yield (0, fixtures_1.expect)(summary).toHaveAttribute("aria-disabled", "true");
185
+ }));
186
+ (0, fixtures_1.test)("component keyboard interaction works with switch variant", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver, page }) {
187
+ const { testStateDriver } = yield initTestBed(`<ExpandableItem summary="Test" withSwitch="true" onExpandedChange="arg => testState = arg">Content</ExpandableItem>`, {});
188
+ const driver = yield createExpandableItemDriver();
189
+ const summary = driver.getSummary();
190
+ // Focus and activate with Enter
191
+ yield summary.focus();
192
+ yield summary.press("Enter");
193
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual(true);
194
+ yield (0, fixtures_1.expect)(driver.getContent()).toBeVisible();
195
+ // Deactivate with Space
196
+ yield summary.press(" ");
197
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual(false);
198
+ yield (0, fixtures_1.expect)(driver.getContent()).not.toBeVisible();
199
+ }));
200
+ (0, fixtures_1.test)("component icon/switch container is hidden from screen readers", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver, page }) {
201
+ yield initTestBed(`<ExpandableItem summary="Test">Content</ExpandableItem>`, {});
202
+ const driver = yield createExpandableItemDriver();
203
+ // Icon container should be aria-hidden
204
+ const iconContainer = driver.getSummary().locator('[class*="icon"]');
205
+ yield (0, fixtures_1.expect)(iconContainer).toHaveAttribute("aria-hidden", "true");
206
+ }));
207
+ (0, fixtures_1.test)("component supports screen reader navigation", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
208
+ yield initTestBed(`<ExpandableItem summary="Accessible Summary">Screen reader content</ExpandableItem>`, {});
209
+ const driver = yield createExpandableItemDriver();
210
+ // Summary should be properly announced as a button
211
+ const summary = driver.getSummary();
212
+ yield (0, fixtures_1.expect)(summary).toHaveRole("button");
213
+ yield summary.click();
214
+ yield (0, fixtures_1.expect)(driver.getContent()).toBeVisible();
215
+ }));
216
+ // =============================================================================
217
+ // VISUAL STATE TESTS
218
+ // =============================================================================
219
+ (0, fixtures_1.test)("component applies theme variables", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
220
+ yield initTestBed(`<ExpandableItem summary="Test">Content</ExpandableItem>`, {
221
+ testThemeVars: { "backgroundColor-ExpandableItem": "rgb(255, 0, 0)" }
222
+ });
223
+ const driver = yield createExpandableItemDriver();
224
+ yield (0, fixtures_1.expect)(driver.component).toHaveCSS("background-color", "rgb(255, 0, 0)");
225
+ }));
226
+ (0, fixtures_1.test)("component applies disabled visual state", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
227
+ yield initTestBed(`<ExpandableItem summary="Test" enabled="false">Content</ExpandableItem>`, {});
228
+ const driver = yield createExpandableItemDriver();
229
+ const className = yield driver.component.getAttribute('class');
230
+ (0, fixtures_1.expect)(className).toMatch(/disabled/);
231
+ }));
232
+ (0, fixtures_1.test)("component applies expanded visual state", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
233
+ yield initTestBed(`<ExpandableItem summary="Test" initiallyExpanded="true">Content</ExpandableItem>`, {});
234
+ const driver = yield createExpandableItemDriver();
235
+ // Instead of checking for CSS class, check that content is visible when initially expanded
236
+ yield (0, fixtures_1.expect)(driver.getContent()).toBeVisible();
237
+ yield (0, fixtures_1.expect)(driver.getContent()).toContainText("Content");
238
+ }));
239
+ (0, fixtures_1.test)("component applies withSwitch visual state", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
240
+ yield initTestBed(`<ExpandableItem summary="Test" withSwitch="true">Content</ExpandableItem>`, {});
241
+ const driver = yield createExpandableItemDriver();
242
+ const className = yield driver.component.getAttribute('class');
243
+ (0, fixtures_1.expect)(className).toMatch(/withSwitch/);
244
+ }));
245
+ (0, fixtures_1.test)("component handles icon position styling", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
246
+ yield initTestBed(`<ExpandableItem summary="Test" iconPosition="end">Content</ExpandableItem>`, {});
247
+ const driver = yield createExpandableItemDriver();
248
+ const className = yield driver.getSummary().getAttribute('class');
249
+ (0, fixtures_1.expect)(className).toMatch(/iconEnd/);
250
+ }));
251
+ // =============================================================================
252
+ // EDGE CASE TESTS
253
+ // =============================================================================
254
+ (0, fixtures_1.test)("component handles null and undefined props gracefully", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
255
+ yield initTestBed(`<ExpandableItem>Content without summary</ExpandableItem>`, {});
256
+ const driver = yield createExpandableItemDriver();
257
+ yield (0, fixtures_1.expect)(driver.component).toBeVisible();
258
+ yield (0, fixtures_1.expect)(driver.getSummary()).toBeVisible();
259
+ }));
260
+ (0, fixtures_1.test)("component handles empty summary", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
261
+ yield initTestBed(`<ExpandableItem summary="">Content</ExpandableItem>`, {});
262
+ const driver = yield createExpandableItemDriver();
263
+ yield (0, fixtures_1.expect)(driver.component).toBeVisible();
264
+ yield (0, fixtures_1.expect)(driver.getSummary()).toBeVisible();
265
+ }));
266
+ (0, fixtures_1.test)("component handles empty content", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
267
+ yield initTestBed(`<ExpandableItem summary="Test"></ExpandableItem>`, {});
268
+ const driver = yield createExpandableItemDriver();
269
+ yield (0, fixtures_1.expect)(driver.component).toBeVisible();
270
+ yield driver.getSummary().click();
271
+ yield (0, fixtures_1.expect)(driver.getContent()).toBeVisible();
272
+ }));
273
+ (0, fixtures_1.test)("component handles special characters in summary", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
274
+ yield initTestBed(`<ExpandableItem summary="Test with émojis 🚀 & quotes">Content</ExpandableItem>`, {});
275
+ const driver = yield createExpandableItemDriver();
276
+ yield (0, fixtures_1.expect)(driver.getSummaryContent()).toContainText("Test with émojis 🚀 & quotes");
277
+ }));
278
+ (0, fixtures_1.test)("component handles complex summary content", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
279
+ yield initTestBed(`
280
+ <ExpandableItem summary="Complex Summary">
281
+ Content here
282
+ </ExpandableItem>
283
+ `, {});
284
+ const driver = yield createExpandableItemDriver();
285
+ yield (0, fixtures_1.expect)(driver.getSummary()).toBeVisible();
286
+ yield (0, fixtures_1.expect)(driver.getSummaryContent()).toContainText("Complex Summary");
287
+ }));
288
+ (0, fixtures_1.test)("component handles disabled state interaction", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
289
+ yield initTestBed(`<ExpandableItem summary="Test" enabled="false">Content</ExpandableItem>`, {});
290
+ const driver = yield createExpandableItemDriver();
291
+ // Should not expand when disabled - use force click since the element is aria-disabled
292
+ yield driver.getSummary().click({ force: true });
293
+ yield (0, fixtures_1.expect)(driver.getContent()).not.toBeVisible();
294
+ }));
295
+ // =============================================================================
296
+ // PERFORMANCE TESTS
297
+ // =============================================================================
298
+ (0, fixtures_1.test)("component memoization prevents unnecessary re-renders", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
299
+ const { testStateDriver } = yield initTestBed(`
300
+ <ExpandableItem
301
+ summary="Test"
302
+ onExpandedChange="testState = (testState || 0) + 1">
303
+ Content
304
+ </ExpandableItem>
305
+ `, {});
306
+ const driver = yield createExpandableItemDriver();
307
+ // Expand
308
+ yield driver.getSummary().click();
309
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual(1);
310
+ // Collapse
311
+ yield driver.getSummary().click();
312
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual(2);
313
+ }));
314
+ (0, fixtures_1.test)("component handles rapid toggling", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
315
+ yield initTestBed(`<ExpandableItem summary="Test">Content</ExpandableItem>`, {});
316
+ const driver = yield createExpandableItemDriver();
317
+ // Rapid clicks
318
+ yield driver.getSummary().click();
319
+ yield driver.getSummary().click();
320
+ yield driver.getSummary().click();
321
+ // Should end up collapsed (odd number of clicks)
322
+ yield (0, fixtures_1.expect)(driver.getContent()).toBeVisible();
323
+ }));
324
+ (0, fixtures_1.test)("component handles large content efficiently", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
325
+ const largeContent = "Very long content ".repeat(100);
326
+ yield initTestBed(`<ExpandableItem summary="Test">${largeContent}</ExpandableItem>`, {});
327
+ const driver = yield createExpandableItemDriver();
328
+ yield driver.getSummary().click();
329
+ yield (0, fixtures_1.expect)(driver.getContent()).toBeVisible();
330
+ yield (0, fixtures_1.expect)(driver.getContent()).toContainText("Very long content");
331
+ }));
332
+ // =============================================================================
333
+ // INTEGRATION TESTS
334
+ // =============================================================================
335
+ (0, fixtures_1.test)("component works in layout contexts", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
336
+ yield initTestBed(`
337
+ <VStack gap="2">
338
+ <ExpandableItem summary="First Item">First content</ExpandableItem>
339
+ <ExpandableItem summary="Second Item">Second content</ExpandableItem>
340
+ </VStack>
341
+ `, {});
342
+ const driver = yield createExpandableItemDriver();
343
+ yield (0, fixtures_1.expect)(driver.component).toBeVisible();
344
+ // Use first() to get the first ExpandableItem's summary content
345
+ yield (0, fixtures_1.expect)(driver.getSummaryContent().first()).toContainText("First Item");
346
+ }));
347
+ (0, fixtures_1.test)("component API methods work correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
348
+ yield initTestBed(`
349
+ <Fragment>
350
+ <ExpandableItem id="expandable" summary="Test">Content</ExpandableItem>
351
+ <Button testId="expandBtn" onClick="expandable.expand()">Expand</Button>
352
+ <Button testId="collapseBtn" onClick="expandable.collapse()">Collapse</Button>
353
+ <Button testId="toggleBtn" onClick="expandable.toggle()">Toggle</Button>
354
+ <Button testId="checkBtn" onClick="testState = expandable.isExpanded()">Check</Button>
355
+ </Fragment>
356
+ `, {});
357
+ const { testStateDriver } = yield initTestBed(`
358
+ <Fragment>
359
+ <ExpandableItem id="expandable" summary="Test">Content</ExpandableItem>
360
+ <Button testId="expandBtn" onClick="expandable.expand()">Expand</Button>
361
+ <Button testId="collapseBtn" onClick="expandable.collapse()">Collapse</Button>
362
+ <Button testId="toggleBtn" onClick="expandable.toggle()">Toggle</Button>
363
+ <Button testId="checkBtn" onClick="testState = expandable.isExpanded()">Check</Button>
364
+ </Fragment>
365
+ `, {});
366
+ // Test expand API
367
+ yield page.getByTestId("expandBtn").click();
368
+ yield (0, fixtures_1.expect)(page.locator('[class*="_content_"]')).toBeVisible();
369
+ // Test isExpanded API
370
+ yield page.getByTestId("checkBtn").click();
371
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual(true);
372
+ // Test collapse API
373
+ yield page.getByTestId("collapseBtn").click();
374
+ yield (0, fixtures_1.expect)(page.locator('[class*="_content_"]')).not.toBeVisible();
375
+ // Test toggle API
376
+ yield page.getByTestId("toggleBtn").click();
377
+ yield (0, fixtures_1.expect)(page.locator('[class*="_content_"]')).toBeVisible();
378
+ }));
379
+ (0, fixtures_1.test)("component works with forms", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
380
+ yield initTestBed(`
381
+ <Form>
382
+ <ExpandableItem summary="Advanced Options">
383
+ <FormItem label="Advanced Setting">
384
+ <TextBox name="advanced" />
385
+ </FormItem>
386
+ </ExpandableItem>
387
+ </Form>
388
+ `, {});
389
+ const driver = yield createExpandableItemDriver();
390
+ yield driver.getSummary().click();
391
+ yield (0, fixtures_1.expect)(driver.getContent()).toBeVisible();
392
+ yield (0, fixtures_1.expect)(driver.getContent()).toContainText("Advanced Setting");
393
+ }));
394
+ (0, fixtures_1.test)("component event handlers work correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
395
+ const { testStateDriver } = yield initTestBed(`
396
+ <ExpandableItem
397
+ summary="Test"
398
+ onExpandedChange="arg =>testState = arg">
399
+ Content
400
+ </ExpandableItem>
401
+ `, {});
402
+ const driver = yield createExpandableItemDriver();
403
+ // Click to expand - should set testState to true
404
+ yield driver.getSummary().click();
405
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual(true);
406
+ // Click to collapse - should set testState to false
407
+ yield driver.getSummary().click();
408
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual(false);
409
+ }));
410
+ (0, fixtures_1.test)("component works with switch variant", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver, page }) {
411
+ yield initTestBed(`<ExpandableItem summary="Test" withSwitch="true">Content</ExpandableItem>`, {});
412
+ const driver = yield createExpandableItemDriver();
413
+ // With switch variant, users should click the summary (button) to toggle
414
+ // The switch itself is decorative and aria-hidden
415
+ yield driver.getSummary().click();
416
+ yield (0, fixtures_1.expect)(driver.getContent()).toBeVisible();
417
+ // Click the summary again to toggle back
418
+ yield driver.getSummary().click();
419
+ yield (0, fixtures_1.expect)(driver.getContent()).not.toBeVisible();
420
+ }));
421
+ (0, fixtures_1.test)("component works in nested scenarios", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createExpandableItemDriver }) {
422
+ yield initTestBed(`
423
+ <ExpandableItem summary="Parent">
424
+ <ExpandableItem summary="Child">
425
+ Nested content
426
+ </ExpandableItem>
427
+ </ExpandableItem>
428
+ `, {});
429
+ const driver = yield createExpandableItemDriver();
430
+ // Expand parent
431
+ yield driver.getSummary().click();
432
+ yield (0, fixtures_1.expect)(driver.getContent()).toBeVisible();
433
+ // Should see nested expandable item
434
+ yield (0, fixtures_1.expect)(driver.getContent()).toContainText("Child");
435
+ }));