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,558 @@
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
+ // Test data helpers - using proper XMLUI data format
14
+ const sampleData = `[
15
+ { name: 'Desktop', value: 400, fill: '#8884d8' },
16
+ { name: 'Mobile', value: 300, fill: '#82ca9d' },
17
+ { name: 'Tablet', value: 200, fill: '#ffc658' },
18
+ { name: 'Other', value: 100, fill: '#ff7300' }
19
+ ]`;
20
+ const emptyData = `[]`;
21
+ const singlePointData = `[
22
+ { name: 'Desktop', value: 400 }
23
+ ]`;
24
+ const largeDataset = `[
25
+ { name: 'Category A', value: 400 },
26
+ { name: 'Category B', value: 300 },
27
+ { name: 'Category C', value: 200 },
28
+ { name: 'Category D', value: 100 },
29
+ { name: 'Category E', value: 150 },
30
+ { name: 'Category F', value: 250 },
31
+ { name: 'Category G', value: 180 },
32
+ { name: 'Category H', value: 320 },
33
+ { name: 'Category I', value: 275 },
34
+ { name: 'Category J', value: 190 }
35
+ ]`;
36
+ // Chart selectors - Legend specific
37
+ const chartRoot = ".recharts-responsive-container";
38
+ const chartSvg = ".recharts-surface";
39
+ const legendSelector = ".recharts-legend-wrapper";
40
+ const legendItemSelector = ".recharts-legend-item";
41
+ const legendTextSelector = ".recharts-legend-item-text";
42
+ // =============================================================================
43
+ // BASIC FUNCTIONALITY TESTS
44
+ // =============================================================================
45
+ fixtures_1.test.describe("Basic Functionality", () => {
46
+ // Smoke tests
47
+ fixtures_1.test.describe("smoke tests", { tag: "@smoke" }, () => {
48
+ (0, fixtures_1.test)("Legend renders within PieChart", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
49
+ yield initTestBed(`
50
+ <PieChart
51
+ nameKey="name"
52
+ dataKey="value"
53
+ data="{${sampleData}}"
54
+ width="400px"
55
+ height="400px"
56
+ >
57
+ <Legend />
58
+ </PieChart>
59
+ `);
60
+ yield page.waitForSelector(chartRoot, { timeout: 10000 });
61
+ yield (0, fixtures_1.expect)(page.locator(chartRoot)).toBeVisible();
62
+ yield (0, fixtures_1.expect)(page.locator(legendSelector)).toBeVisible();
63
+ }));
64
+ (0, fixtures_1.test)("Legend renders within BarChart", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
65
+ yield initTestBed(`
66
+ <BarChart
67
+ xKey="name"
68
+ yKeys="{['value']}"
69
+ data="{${sampleData}}"
70
+ width="600px"
71
+ height="400px"
72
+ showLegend
73
+ >
74
+ <Legend />
75
+ </BarChart>
76
+ `);
77
+ yield page.waitForSelector(chartRoot, { timeout: 10000 });
78
+ yield (0, fixtures_1.expect)(page.locator(chartRoot)).toBeVisible();
79
+ yield (0, fixtures_1.expect)(page.locator(legendSelector)).toBeVisible();
80
+ }));
81
+ });
82
+ // Align prop tests
83
+ fixtures_1.test.describe("align prop", () => {
84
+ (0, fixtures_1.test)("handles 'left' alignment", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
85
+ yield initTestBed(`
86
+ <PieChart
87
+ nameKey="name"
88
+ dataKey="value"
89
+ data="{${sampleData}}"
90
+ width="400px"
91
+ height="400px"
92
+ >
93
+ <Legend align="left" />
94
+ </PieChart>
95
+ `);
96
+ yield page.waitForSelector(legendSelector, { timeout: 10000 });
97
+ const legend = page.locator(legendSelector);
98
+ yield (0, fixtures_1.expect)(legend).toBeVisible();
99
+ // Legend should be visible with left alignment
100
+ // Note: Actual positioning may vary based on chart implementation
101
+ yield (0, fixtures_1.expect)(legend).toBeVisible();
102
+ }));
103
+ (0, fixtures_1.test)("handles 'center' alignment (default)", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
104
+ yield initTestBed(`
105
+ <PieChart
106
+ nameKey="name"
107
+ dataKey="value"
108
+ data="{${sampleData}}"
109
+ width="400px"
110
+ height="400px"
111
+ >
112
+ <Legend />
113
+ </PieChart>
114
+ `);
115
+ yield page.waitForSelector(legendSelector, { timeout: 10000 });
116
+ const legend = page.locator(legendSelector);
117
+ yield (0, fixtures_1.expect)(legend).toBeVisible();
118
+ }));
119
+ (0, fixtures_1.test)("handles 'right' alignment", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
120
+ yield initTestBed(`
121
+ <PieChart
122
+ nameKey="name"
123
+ dataKey="value"
124
+ data="{${sampleData}}"
125
+ width="400px"
126
+ height="400px"
127
+ >
128
+ <Legend align="right" />
129
+ </PieChart>
130
+ `);
131
+ yield page.waitForSelector(legendSelector, { timeout: 10000 });
132
+ const legend = page.locator(legendSelector);
133
+ yield (0, fixtures_1.expect)(legend).toBeVisible();
134
+ // Legend should be visible with right alignment
135
+ // Note: Actual positioning may vary based on chart implementation
136
+ yield (0, fixtures_1.expect)(legend).toBeVisible();
137
+ }));
138
+ });
139
+ // VerticalAlign prop tests
140
+ fixtures_1.test.describe("verticalAlign prop", () => {
141
+ (0, fixtures_1.test)("handles 'top' vertical alignment", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
142
+ yield initTestBed(`
143
+ <PieChart
144
+ nameKey="name"
145
+ dataKey="value"
146
+ data="{${sampleData}}"
147
+ width="400px"
148
+ height="400px"
149
+ >
150
+ <Legend verticalAlign="top" />
151
+ </PieChart>
152
+ `);
153
+ yield page.waitForSelector(legendSelector, { timeout: 10000 });
154
+ const legend = page.locator(legendSelector);
155
+ yield (0, fixtures_1.expect)(legend).toBeVisible();
156
+ // Legend should be visible with top alignment
157
+ // Note: Actual positioning may vary based on chart implementation
158
+ yield (0, fixtures_1.expect)(legend).toBeVisible();
159
+ }));
160
+ (0, fixtures_1.test)("handles 'bottom' vertical alignment (default)", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
161
+ yield initTestBed(`
162
+ <PieChart
163
+ nameKey="name"
164
+ dataKey="value"
165
+ data="{${sampleData}}"
166
+ width="400px"
167
+ height="400px"
168
+ >
169
+ <Legend />
170
+ </PieChart>
171
+ `);
172
+ yield page.waitForSelector(legendSelector, { timeout: 10000 });
173
+ const legend = page.locator(legendSelector);
174
+ yield (0, fixtures_1.expect)(legend).toBeVisible();
175
+ }));
176
+ (0, fixtures_1.test)("handles 'middle' vertical alignment", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
177
+ yield initTestBed(`
178
+ <PieChart
179
+ nameKey="name"
180
+ dataKey="value"
181
+ data="{${sampleData}}"
182
+ width="400px"
183
+ height="400px"
184
+ >
185
+ <Legend verticalAlign="middle" />
186
+ </PieChart>
187
+ `);
188
+ yield page.waitForSelector(legendSelector, { timeout: 10000 });
189
+ const legend = page.locator(legendSelector);
190
+ yield (0, fixtures_1.expect)(legend).toBeVisible();
191
+ // Legend should be visible with middle alignment
192
+ // Note: Actual positioning may vary based on chart implementation
193
+ yield (0, fixtures_1.expect)(legend).toBeVisible();
194
+ }));
195
+ });
196
+ // Combined alignment tests
197
+ fixtures_1.test.describe("combined alignment", () => {
198
+ (0, fixtures_1.test)("handles top-left alignment", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
199
+ yield initTestBed(`
200
+ <PieChart
201
+ nameKey="name"
202
+ dataKey="value"
203
+ data="{${sampleData}}"
204
+ width="400px"
205
+ height="400px"
206
+ >
207
+ <Legend align="left" verticalAlign="top" />
208
+ </PieChart>
209
+ `);
210
+ yield page.waitForSelector(legendSelector, { timeout: 10000 });
211
+ yield (0, fixtures_1.expect)(page.locator(legendSelector)).toBeVisible();
212
+ }));
213
+ (0, fixtures_1.test)("handles bottom-right alignment", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
214
+ yield initTestBed(`
215
+ <PieChart
216
+ nameKey="name"
217
+ dataKey="value"
218
+ data="{${sampleData}}"
219
+ width="400px"
220
+ height="400px"
221
+ >
222
+ <Legend align="right" verticalAlign="bottom" />
223
+ </PieChart>
224
+ `);
225
+ yield page.waitForSelector(legendSelector, { timeout: 10000 });
226
+ yield (0, fixtures_1.expect)(page.locator(legendSelector)).toBeVisible();
227
+ }));
228
+ (0, fixtures_1.test)("handles center-middle alignment", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
229
+ yield initTestBed(`
230
+ <PieChart
231
+ nameKey="name"
232
+ dataKey="value"
233
+ data="{${sampleData}}"
234
+ width="400px"
235
+ height="400px"
236
+ >
237
+ <Legend align="center" verticalAlign="middle" />
238
+ </PieChart>
239
+ `);
240
+ yield page.waitForSelector(legendSelector, { timeout: 10000 });
241
+ yield (0, fixtures_1.expect)(page.locator(legendSelector)).toBeVisible();
242
+ }));
243
+ });
244
+ // Data handling tests
245
+ fixtures_1.test.describe("data handling", () => {
246
+ (0, fixtures_1.test)("displays legend items for all data entries", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
247
+ yield initTestBed(`
248
+ <PieChart
249
+ nameKey="name"
250
+ dataKey="value"
251
+ data="{${sampleData}}"
252
+ width="400px"
253
+ height="400px"
254
+ >
255
+ <Legend />
256
+ </PieChart>
257
+ `);
258
+ yield page.waitForSelector(legendSelector, { timeout: 10000 });
259
+ const legendItems = page.locator(legendItemSelector);
260
+ yield (0, fixtures_1.expect)(legendItems).toHaveCount(4); // Desktop, Mobile, Tablet, Other
261
+ // Check that legend text matches data names
262
+ yield (0, fixtures_1.expect)(page.locator(legendTextSelector).filter({ hasText: "Desktop" })).toBeVisible();
263
+ yield (0, fixtures_1.expect)(page.locator(legendTextSelector).filter({ hasText: "Mobile" })).toBeVisible();
264
+ yield (0, fixtures_1.expect)(page.locator(legendTextSelector).filter({ hasText: "Tablet" })).toBeVisible();
265
+ yield (0, fixtures_1.expect)(page.locator(legendTextSelector).filter({ hasText: "Other" })).toBeVisible();
266
+ }));
267
+ (0, fixtures_1.test)("handles single data point", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
268
+ yield initTestBed(`
269
+ <PieChart
270
+ nameKey="name"
271
+ dataKey="value"
272
+ data="{${singlePointData}}"
273
+ width="400px"
274
+ height="400px"
275
+ >
276
+ <Legend />
277
+ </PieChart>
278
+ `);
279
+ yield page.waitForSelector(legendSelector, { timeout: 10000 });
280
+ const legendItems = page.locator(legendItemSelector);
281
+ yield (0, fixtures_1.expect)(legendItems).toHaveCount(1);
282
+ yield (0, fixtures_1.expect)(page.locator(legendTextSelector).filter({ hasText: "Desktop" })).toBeVisible();
283
+ }));
284
+ (0, fixtures_1.test)("handles empty data gracefully", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
285
+ yield initTestBed(`
286
+ <PieChart
287
+ nameKey="name"
288
+ dataKey="value"
289
+ data="{${emptyData}}"
290
+ width="400px"
291
+ height="400px"
292
+ >
293
+ <Legend />
294
+ </PieChart>
295
+ `);
296
+ yield page.waitForSelector(chartRoot, { timeout: 10000 });
297
+ // Legend should still be present but with no items
298
+ const legendItems = page.locator(legendItemSelector);
299
+ yield (0, fixtures_1.expect)(legendItems).toHaveCount(0);
300
+ }));
301
+ (0, fixtures_1.test)("handles large datasets", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
302
+ yield initTestBed(`
303
+ <PieChart
304
+ nameKey="name"
305
+ dataKey="value"
306
+ data="{${largeDataset}}"
307
+ width="400px"
308
+ height="400px"
309
+ >
310
+ <Legend />
311
+ </PieChart>
312
+ `);
313
+ yield page.waitForSelector(legendSelector, { timeout: 10000 });
314
+ const legendItems = page.locator(legendItemSelector);
315
+ yield (0, fixtures_1.expect)(legendItems).toHaveCount(10);
316
+ }));
317
+ });
318
+ // Integration with different chart types
319
+ fixtures_1.test.describe("chart type integration", () => {
320
+ (0, fixtures_1.test)("works with LineChart", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
321
+ yield initTestBed(`
322
+ <LineChart
323
+ xKey="name"
324
+ yKeys="{['value']}"
325
+ data="{${sampleData}}"
326
+ width="400px"
327
+ height="400px"
328
+ showLegend
329
+ >
330
+ <Legend />
331
+ </LineChart>
332
+ `);
333
+ yield page.waitForSelector(chartRoot, { timeout: 10000 });
334
+ yield (0, fixtures_1.expect)(page.locator(legendSelector)).toBeVisible();
335
+ }));
336
+ (0, fixtures_1.test)("works with DonutChart", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
337
+ yield initTestBed(`
338
+ <DonutChart
339
+ nameKey="name"
340
+ dataKey="value"
341
+ data="{${sampleData}}"
342
+ width="400px"
343
+ height="400px"
344
+ >
345
+ <Legend />
346
+ </DonutChart>
347
+ `);
348
+ yield page.waitForSelector(chartRoot, { timeout: 10000 });
349
+ yield (0, fixtures_1.expect)(page.locator(legendSelector)).toBeVisible();
350
+ }));
351
+ });
352
+ });
353
+ // =============================================================================
354
+ // ACCESSIBILITY TESTS
355
+ // =============================================================================
356
+ fixtures_1.test.describe("Accessibility", () => {
357
+ (0, fixtures_1.test)("legend has proper ARIA structure", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
358
+ yield initTestBed(`
359
+ <PieChart
360
+ nameKey="name"
361
+ dataKey="value"
362
+ data="{${sampleData}}"
363
+ width="400px"
364
+ height="400px"
365
+ >
366
+ <Legend />
367
+ </PieChart>
368
+ `);
369
+ yield page.waitForSelector(legendSelector, { timeout: 10000 });
370
+ const legend = page.locator(legendSelector);
371
+ yield (0, fixtures_1.expect)(legend).toBeVisible();
372
+ // Legend should be accessible to screen readers
373
+ const legendItems = page.locator(legendItemSelector);
374
+ yield (0, fixtures_1.expect)(legendItems.first()).toBeVisible();
375
+ }));
376
+ (0, fixtures_1.test)("legend items are keyboard accessible", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
377
+ yield initTestBed(`
378
+ <PieChart
379
+ nameKey="name"
380
+ dataKey="value"
381
+ data="{${sampleData}}"
382
+ width="400px"
383
+ height="400px"
384
+ >
385
+ <Legend />
386
+ </PieChart>
387
+ `);
388
+ yield page.waitForSelector(legendSelector, { timeout: 10000 });
389
+ // Tab navigation should work through legend items
390
+ yield page.keyboard.press("Tab");
391
+ const focusedElement = page.locator(":focus");
392
+ yield (0, fixtures_1.expect)(focusedElement).toBeVisible();
393
+ }));
394
+ (0, fixtures_1.test)("legend text is readable and properly contrasted", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
395
+ yield initTestBed(`
396
+ <PieChart
397
+ nameKey="name"
398
+ dataKey="value"
399
+ data="{${sampleData}}"
400
+ width="400px"
401
+ height="400px"
402
+ >
403
+ <Legend />
404
+ </PieChart>
405
+ `);
406
+ yield page.waitForSelector(legendSelector, { timeout: 10000 });
407
+ const legendText = page.locator(legendTextSelector).first();
408
+ yield (0, fixtures_1.expect)(legendText).toBeVisible();
409
+ // Text should have readable font size
410
+ yield (0, fixtures_1.expect)(legendText).toHaveCSS("font-size", /\d+px/);
411
+ }));
412
+ (0, fixtures_1.test)("supports screen reader navigation", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
413
+ yield initTestBed(`
414
+ <PieChart
415
+ nameKey="name"
416
+ dataKey="value"
417
+ data="{${sampleData}}"
418
+ width="400px"
419
+ height="400px"
420
+ >
421
+ <Legend />
422
+ </PieChart>
423
+ `);
424
+ yield page.waitForSelector(legendSelector, { timeout: 10000 });
425
+ // Legend should be announced properly by screen readers
426
+ const legendItems = page.locator(legendItemSelector);
427
+ for (let i = 0; i < (yield legendItems.count()); i++) {
428
+ const item = legendItems.nth(i);
429
+ yield (0, fixtures_1.expect)(item).toBeVisible();
430
+ }
431
+ }));
432
+ });
433
+ // =============================================================================
434
+ // PERFORMANCE AND EDGE CASES
435
+ // =============================================================================
436
+ fixtures_1.test.describe("Performance and Edge Cases", () => {
437
+ (0, fixtures_1.test)("handles rapid prop changes efficiently", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
438
+ const { testStateDriver } = yield initTestBed(`
439
+ <PieChart
440
+ nameKey="name"
441
+ dataKey="value"
442
+ data="{${sampleData}}"
443
+ width="400px"
444
+ height="400px"
445
+ >
446
+ <Legend align="{testState || 'center'}" />
447
+ </PieChart>
448
+ <Button onClick="testState = testState === 'center' ? 'left' : 'center'">Toggle Align</Button>
449
+ `);
450
+ yield page.waitForSelector(legendSelector, { timeout: 10000 });
451
+ // Rapidly change alignment
452
+ for (let i = 0; i < 5; i++) {
453
+ yield page.getByRole("button", { name: "Toggle Align" }).click();
454
+ yield page.waitForTimeout(100);
455
+ }
456
+ // Legend should still be visible and functional
457
+ yield (0, fixtures_1.expect)(page.locator(legendSelector)).toBeVisible();
458
+ }));
459
+ (0, fixtures_1.test)("maintains performance with large datasets", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
460
+ yield initTestBed(`
461
+ <PieChart
462
+ nameKey="name"
463
+ dataKey="value"
464
+ data="{${largeDataset}}"
465
+ width="400px"
466
+ height="400px"
467
+ >
468
+ <Legend />
469
+ </PieChart>
470
+ `);
471
+ yield page.waitForSelector(legendSelector, { timeout: 10000 });
472
+ const legendItems = page.locator(legendItemSelector);
473
+ yield (0, fixtures_1.expect)(legendItems).toHaveCount(10);
474
+ // All legend items should be visible
475
+ for (let i = 0; i < 10; i++) {
476
+ yield (0, fixtures_1.expect)(legendItems.nth(i)).toBeVisible();
477
+ }
478
+ }));
479
+ (0, fixtures_1.test)("handles responsive container changes", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
480
+ const { testStateDriver } = yield initTestBed(`
481
+ <PieChart
482
+ nameKey="name"
483
+ dataKey="value"
484
+ data="{${sampleData}}"
485
+ width="{testState || '400px'}"
486
+ height="400px"
487
+ >
488
+ <Legend />
489
+ </PieChart>
490
+ <Button onClick="testState = testState === '400px' ? '200px' : '400px'">Toggle Size</Button>
491
+ `);
492
+ yield page.waitForSelector(legendSelector, { timeout: 10000 });
493
+ // Change container size
494
+ yield page.getByRole("button", { name: "Toggle Size" }).click();
495
+ yield page.waitForTimeout(500);
496
+ // Legend should still be visible and properly positioned
497
+ yield (0, fixtures_1.expect)(page.locator(legendSelector)).toBeVisible();
498
+ }));
499
+ (0, fixtures_1.test)("handles Unicode and special characters in legend text", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
500
+ const unicodeData = `[
501
+ { name: 'Desktop 🖥️', value: 400 },
502
+ { name: 'Mobile 📱', value: 300 },
503
+ { name: 'Tablet 📟', value: 200 },
504
+ { name: 'Other ⚡', value: 100 }
505
+ ]`;
506
+ yield initTestBed(`
507
+ <PieChart
508
+ nameKey="name"
509
+ dataKey="value"
510
+ data="{${unicodeData}}"
511
+ width="400px"
512
+ height="400px"
513
+ >
514
+ <Legend />
515
+ </PieChart>
516
+ `);
517
+ yield page.waitForSelector(legendSelector, { timeout: 10000 });
518
+ // Check that Unicode characters are displayed correctly
519
+ yield (0, fixtures_1.expect)(page.locator(legendTextSelector).filter({ hasText: "🖥️" })).toBeVisible();
520
+ yield (0, fixtures_1.expect)(page.locator(legendTextSelector).filter({ hasText: "📱" })).toBeVisible();
521
+ yield (0, fixtures_1.expect)(page.locator(legendTextSelector).filter({ hasText: "📟" })).toBeVisible();
522
+ yield (0, fixtures_1.expect)(page.locator(legendTextSelector).filter({ hasText: "⚡" })).toBeVisible();
523
+ }));
524
+ (0, fixtures_1.test)("handles null and undefined prop values gracefully", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
525
+ yield initTestBed(`
526
+ <PieChart
527
+ nameKey="name"
528
+ dataKey="value"
529
+ data="{${sampleData}}"
530
+ width="400px"
531
+ height="400px"
532
+ >
533
+ <Legend align="{null}" verticalAlign="{undefined}" />
534
+ </PieChart>
535
+ `);
536
+ yield page.waitForSelector(chartRoot, { timeout: 10000 });
537
+ // Should fall back to default values and still render
538
+ yield (0, fixtures_1.expect)(page.locator(legendSelector)).toBeVisible();
539
+ }));
540
+ (0, fixtures_1.test)("works correctly when multiple Legend components are present", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
541
+ yield initTestBed(`
542
+ <PieChart
543
+ nameKey="name"
544
+ dataKey="value"
545
+ data="{${sampleData}}"
546
+ width="400px"
547
+ height="400px"
548
+ >
549
+ <Legend align="left" />
550
+ <Legend align="right" />
551
+ </PieChart>
552
+ `);
553
+ yield page.waitForSelector(chartRoot, { timeout: 10000 });
554
+ // Only one legend should be rendered (last one wins)
555
+ const legends = page.locator(legendSelector);
556
+ yield (0, fixtures_1.expect)(legends).toHaveCount(1);
557
+ }));
558
+ });