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,331 @@
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)("renders with basic props", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createDropdownMenuDriver }) {
17
+ yield initTestBed(`<DropdownMenu label="Menu" />`);
18
+ const driver = yield createDropdownMenuDriver();
19
+ yield (0, fixtures_1.expect)(driver.component).toBeVisible();
20
+ }));
21
+ (0, fixtures_1.test)("renders with menu items", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createDropdownMenuDriver, page }) {
22
+ yield initTestBed(`
23
+ <DropdownMenu label="Menu">
24
+ <MenuItem>Item 1</MenuItem>
25
+ <MenuItem>Item 2</MenuItem>
26
+ </DropdownMenu>
27
+ `);
28
+ const driver = yield createDropdownMenuDriver();
29
+ yield (0, fixtures_1.expect)(driver.component).toBeVisible();
30
+ yield driver.open();
31
+ yield (0, fixtures_1.expect)(page.getByRole("menuitem", { name: "Item 1" })).toBeVisible();
32
+ yield (0, fixtures_1.expect)(page.getByRole("menuitem", { name: "Item 2" })).toBeVisible();
33
+ }));
34
+ (0, fixtures_1.test)("opens and closes menu correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createDropdownMenuDriver, page }) {
35
+ yield initTestBed(`
36
+ <DropdownMenu label="Menu">
37
+ <MenuItem>Item 1</MenuItem>
38
+ </DropdownMenu>
39
+ `);
40
+ const driver = yield createDropdownMenuDriver();
41
+ yield (0, fixtures_1.expect)(page.getByRole("menuitem")).not.toBeVisible();
42
+ yield driver.open();
43
+ yield (0, fixtures_1.expect)(page.getByRole("menuitem")).toBeVisible();
44
+ yield driver.close();
45
+ yield (0, fixtures_1.expect)(page.getByRole("menuitem")).not.toBeVisible();
46
+ }));
47
+ (0, fixtures_1.test)("handles menu item clicks", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createDropdownMenuDriver, page }) {
48
+ const { testStateDriver } = yield initTestBed(`
49
+ <DropdownMenu label="Menu">
50
+ <MenuItem onClick="testState = 'item1-clicked'">Item 1</MenuItem>
51
+ <MenuItem onClick="testState = 'item2-clicked'">Item 2</MenuItem>
52
+ </DropdownMenu>
53
+ `);
54
+ const driver = yield createDropdownMenuDriver();
55
+ yield driver.open();
56
+ yield driver.clickMenuItem("Item 1");
57
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual("item1-clicked");
58
+ // Menu should close after click
59
+ yield (0, fixtures_1.expect)(page.getByRole("menuitem", { name: "Item 1" })).not.toBeVisible();
60
+ yield (0, fixtures_1.expect)(page.getByRole("menuitem", { name: "Item 2" })).not.toBeVisible();
61
+ }));
62
+ (0, fixtures_1.test)("alignment='start' aligns popup menu left", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createDropdownMenuDriver, page, }) {
63
+ yield initTestBed(`
64
+ <HStack width="50%">
65
+ <DropdownMenu alignment="start" label="Menu">
66
+ <MenuItem >Item 1</MenuItem>
67
+ <MenuItem >Item 2</MenuItem>
68
+ </DropdownMenu>
69
+ </HStack>
70
+ `);
71
+ const driver = yield createDropdownMenuDriver();
72
+ yield driver.open();
73
+ const { x: triggerX } = yield driver.component.boundingBox();
74
+ const { x: menuX } = yield page.getByRole("menu").boundingBox();
75
+ (0, fixtures_1.expect)(menuX).toBeCloseTo(triggerX);
76
+ }));
77
+ (0, fixtures_1.test)("alignment='end' aligns popup menu right", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createDropdownMenuDriver, page, }) {
78
+ yield initTestBed(`
79
+ <HStack width="50%" reverse="true">
80
+ <DropdownMenu alignment="end" label="Menu">
81
+ <MenuItem >Item 1</MenuItem>
82
+ <MenuItem >Item 2</MenuItem>
83
+ </DropdownMenu>
84
+ </HStack>
85
+ `);
86
+ const driver = yield createDropdownMenuDriver();
87
+ yield driver.open();
88
+ const { width: triggerWidth, x: triggerX } = yield driver.component.boundingBox();
89
+ const { width: menuWidth, x: menuX } = yield page.getByRole("menu").boundingBox();
90
+ const menuEndX = menuX + menuWidth;
91
+ const triggerEndX = triggerX + triggerWidth;
92
+ (0, fixtures_1.expect)(menuEndX).toBeCloseTo(triggerEndX);
93
+ }));
94
+ (0, fixtures_1.test)("supports submenu functionality", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createDropdownMenuDriver, page }) {
95
+ yield initTestBed(`
96
+ <DropdownMenu label="Menu">
97
+ <MenuItem>Regular Item</MenuItem>
98
+ <SubMenuItem label="Submenu">
99
+ <MenuItem>Submenu Item 1</MenuItem>
100
+ <MenuItem>Submenu Item 2</MenuItem>
101
+ </SubMenuItem>
102
+ </DropdownMenu>
103
+ `);
104
+ const driver = yield createDropdownMenuDriver();
105
+ // Open main menu
106
+ yield driver.open();
107
+ yield (0, fixtures_1.expect)(page.getByText("Regular Item")).toBeVisible();
108
+ yield (0, fixtures_1.expect)(page.getByText("Submenu")).toBeVisible();
109
+ // Open submenu using driver method
110
+ yield driver.openSubMenu("Submenu");
111
+ yield (0, fixtures_1.expect)(page.getByRole("menuitem", { name: "Submenu Item 1" })).toBeVisible();
112
+ yield (0, fixtures_1.expect)(page.getByRole("menuitem", { name: "Submenu Item 2" })).toBeVisible();
113
+ }));
114
+ (0, fixtures_1.test)("supports menu separators", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createDropdownMenuDriver, page }) {
115
+ yield initTestBed(`
116
+ <DropdownMenu label="Menu">
117
+ <MenuItem>Item 1</MenuItem>
118
+ <MenuSeparator />
119
+ <MenuItem>Item 2</MenuItem>
120
+ </DropdownMenu>
121
+ `);
122
+ const driver = yield createDropdownMenuDriver();
123
+ yield driver.open();
124
+ yield (0, fixtures_1.expect)(page.getByRole("menuitem", { name: "Item 1" })).toBeVisible();
125
+ yield (0, fixtures_1.expect)(page.getByRole("menuitem", { name: "Item 2" })).toBeVisible();
126
+ // Check that separator is rendered using driver method
127
+ const separators = driver.getMenuSeparators();
128
+ yield (0, fixtures_1.expect)(separators).toHaveCount(1);
129
+ }));
130
+ // =============================================================================
131
+ // ACCESSIBILITY TESTS
132
+ // =============================================================================
133
+ (0, fixtures_1.test)("has correct accessibility attributes", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createDropdownMenuDriver, page, }) {
134
+ yield initTestBed(`
135
+ <DropdownMenu label="Accessible Menu">
136
+ <MenuItem>Item 1</MenuItem>
137
+ </DropdownMenu>
138
+ `);
139
+ const driver = yield createDropdownMenuDriver();
140
+ let btn = page.getByRole("button", { name: "Accessible Menu" });
141
+ yield (0, fixtures_1.expect)(btn).toHaveAttribute("aria-haspopup", "menu");
142
+ yield (0, fixtures_1.expect)(btn).toHaveAttribute("aria-expanded", "false");
143
+ yield driver.open();
144
+ page.getByRole("button", { includeHidden: true, expanded: true }).waitFor();
145
+ yield page.getByRole("menu").waitFor();
146
+ }));
147
+ (0, fixtures_1.test)("is keyboard accessible", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createDropdownMenuDriver, page }) {
148
+ const { testStateDriver } = yield initTestBed(`
149
+ <DropdownMenu label="Keyboard Menu">
150
+ <MenuItem onClick="testState = 'keyboard-activated'">Item 1</MenuItem>
151
+ </DropdownMenu>
152
+ `);
153
+ const btn = page.getByRole("button");
154
+ page.keyboard.press("Tab");
155
+ yield (0, fixtures_1.expect)(btn).toBeFocused();
156
+ // Open with Enter
157
+ page.keyboard.press("Enter");
158
+ yield (0, fixtures_1.expect)(page.getByRole("menuitem", { name: "Item 1" })).toBeVisible();
159
+ // Navigate and select with keyboard
160
+ yield page.keyboard.press("ArrowDown");
161
+ yield page.keyboard.press("Enter");
162
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual("keyboard-activated");
163
+ }));
164
+ (0, fixtures_1.test)("disabled DropdownMenu can't be focused", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
165
+ yield initTestBed(`<DropdownMenu label="Disabled Menu" enabled="false" />`);
166
+ const btn = page.getByRole("button");
167
+ yield (0, fixtures_1.expect)(btn).toBeDisabled();
168
+ // Should not be focusable when disabled
169
+ yield btn.focus();
170
+ yield (0, fixtures_1.expect)(btn).not.toBeFocused();
171
+ }));
172
+ // =============================================================================
173
+ // VISUAL STATE TESTS
174
+ // =============================================================================
175
+ (0, fixtures_1.test)("applies theme variables correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createDropdownMenuDriver }) {
176
+ yield initTestBed(`<DropdownMenu label="Themed Menu">
177
+ <MenuItem>Item 1</MenuItem>
178
+ </DropdownMenu>`, {
179
+ testThemeVars: {
180
+ "backgroundColor-DropdownMenu": "rgb(255, 0, 0)",
181
+ "minWidth-DropdownMenu": "200px",
182
+ },
183
+ });
184
+ const driver = yield createDropdownMenuDriver();
185
+ // Open menu to see styled content
186
+ yield driver.open();
187
+ // Check theme variables are applied to menu content
188
+ const menuContent = driver.getMenuContent();
189
+ yield (0, fixtures_1.expect)(menuContent).toBeVisible();
190
+ yield (0, fixtures_1.expect)(menuContent).toHaveCSS("background-color", "rgb(255, 0, 0)");
191
+ yield (0, fixtures_1.expect)(menuContent).toHaveCSS("min-width", "200px");
192
+ }));
193
+ // =============================================================================
194
+ // EDGE CASE TESTS
195
+ // =============================================================================
196
+ (0, fixtures_1.test)("handles null label gracefully", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
197
+ yield initTestBed(`<DropdownMenu label="{null}" />`);
198
+ yield (0, fixtures_1.expect)(page.getByRole("button")).toBeVisible();
199
+ }));
200
+ (0, fixtures_1.test)("handles special characters in labels", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createDropdownMenuDriver, page, }) {
201
+ yield initTestBed(`
202
+ <DropdownMenu label="Menu with émojis 🚀">
203
+ <MenuItem>Item with ñ and ü</MenuItem>
204
+ <MenuItem>Item with &amp; &lt; &gt; quotes</MenuItem>
205
+ </DropdownMenu>
206
+ `);
207
+ const driver = yield createDropdownMenuDriver();
208
+ yield (0, fixtures_1.expect)(driver.component).toBeVisible();
209
+ yield (0, fixtures_1.expect)(driver.component).toContainText("Menu with émojis 🚀");
210
+ yield driver.open();
211
+ yield (0, fixtures_1.expect)(page.getByText("Item with ñ and ü")).toBeVisible();
212
+ yield (0, fixtures_1.expect)(page.getByText("Item with & < > quotes")).toBeVisible();
213
+ }));
214
+ (0, fixtures_1.test)("doesn't show empty menu with no MenuItem", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createDropdownMenuDriver, page, }) {
215
+ yield initTestBed(`<DropdownMenu label="Empty Menu" />`);
216
+ const driver = yield createDropdownMenuDriver();
217
+ yield driver.open();
218
+ yield (0, fixtures_1.expect)(page.getByRole("menu")).not.toBeVisible();
219
+ }));
220
+ (0, fixtures_1.test)("handles disabled menu items", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createDropdownMenuDriver, page }) {
221
+ const { testStateDriver } = yield initTestBed(`
222
+ <DropdownMenu label="Menu">
223
+ <MenuItem enabled="true" onClick="testState = 'enabled-clicked'">Enabled Item</MenuItem>
224
+ <MenuItem enabled="false" onClick="testState = 'disabled-clicked'">Disabled Item</MenuItem>
225
+ </DropdownMenu>
226
+ `);
227
+ const driver = yield createDropdownMenuDriver();
228
+ yield driver.open();
229
+ // Enabled item should work
230
+ yield driver.clickMenuItem("Enabled Item");
231
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual("enabled-clicked");
232
+ // Reopen menu
233
+ yield driver.open();
234
+ yield page.getByText("Disabled Item").click();
235
+ yield fixtures_1.expect.poll(testStateDriver.testState).not.toEqual("disabled-clicked");
236
+ }));
237
+ // =============================================================================
238
+ // INTEGRATION TESTS
239
+ // =============================================================================
240
+ (0, fixtures_1.test)("supports custom trigger template", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, page }) {
241
+ yield initTestBed(`
242
+ <DropdownMenu>
243
+ <property name="triggerTemplate">
244
+ <Button variant="solid" themeColor="secondary">Custom Trigger</Button>
245
+ </property>
246
+ <MenuItem>Item 1</MenuItem>
247
+ <MenuItem>Item 2</MenuItem>
248
+ </DropdownMenu>
249
+ `);
250
+ const btn = page.getByRole("button", { name: "Custom Trigger" });
251
+ yield (0, fixtures_1.expect)(btn).toBeVisible();
252
+ yield btn.click();
253
+ yield (0, fixtures_1.expect)(page.getByRole("menuitem", { name: "Item 1" })).toBeVisible();
254
+ yield (0, fixtures_1.expect)(page.getByRole("menuitem", { name: "Item 2" })).toBeVisible();
255
+ }));
256
+ (0, fixtures_1.test)("handles onWillOpen event correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createDropdownMenuDriver, page, }) {
257
+ const { testStateDriver } = yield initTestBed(`
258
+ <DropdownMenu label="Event Menu" onWillOpen="testState = 'willOpen-fired'">
259
+ <MenuItem>Item 1</MenuItem>
260
+ </DropdownMenu>
261
+ `);
262
+ const driver = yield createDropdownMenuDriver();
263
+ // Click to trigger onWillOpen event
264
+ yield driver.open();
265
+ // Event should have fired
266
+ yield fixtures_1.expect.poll(testStateDriver.testState).toEqual("willOpen-fired");
267
+ // Menu should be open
268
+ yield (0, fixtures_1.expect)(page.getByRole("menuitem", { name: "Item 1" })).toBeVisible();
269
+ }));
270
+ (0, fixtures_1.test)("prevents opening when onWillOpen returns false", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createDropdownMenuDriver, page, }) {
271
+ yield initTestBed(`
272
+ <DropdownMenu label="Prevented Menu" onWillOpen="return false">
273
+ <MenuItem>Item 1</MenuItem>
274
+ </DropdownMenu>
275
+ `);
276
+ const driver = yield createDropdownMenuDriver();
277
+ // Click should not open menu due to onWillOpen returning false
278
+ yield driver.open();
279
+ yield (0, fixtures_1.expect)(page.getByText("Item 1")).not.toBeVisible();
280
+ }));
281
+ (0, fixtures_1.test)("API methods work correctly", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createDropdownMenuDriver, page }) {
282
+ yield initTestBed(`
283
+ <HStack>
284
+ <DropdownMenu id="apiMenu" label="API Menu">
285
+ <MenuItem>Item 1</MenuItem>
286
+ <MenuItem><Button testId="closeBtn" onGotFocus="apiMenu.close()" label="Close Menu" /></MenuItem>
287
+ </DropdownMenu>
288
+ <Button testId="openBtn" onClick="apiMenu.open()">Open Menu</Button>
289
+ </HStack>
290
+ `);
291
+ const menuItem = page.getByRole("menuitem", { name: "Item 1" });
292
+ yield (0, fixtures_1.expect)(menuItem).not.toBeVisible();
293
+ yield page.getByTestId("openBtn").click();
294
+ yield (0, fixtures_1.expect)(menuItem).toBeVisible();
295
+ yield page.getByTestId("closeBtn").focus();
296
+ yield (0, fixtures_1.expect)(menuItem).not.toBeVisible();
297
+ }));
298
+ (0, fixtures_1.test)("works with nested menu structures", (_a) => __awaiter(void 0, [_a], void 0, function* ({ initTestBed, createDropdownMenuDriver, page, }) {
299
+ yield initTestBed(`
300
+ <DropdownMenu label="Main Menu">
301
+ <MenuItem>Top Level Item</MenuItem>
302
+ <SubMenuItem label="Category 1">
303
+ <MenuItem>Category 1 Item 1</MenuItem>
304
+ <SubMenuItem label="Subcategory">
305
+ <MenuItem>Deep Item 1</MenuItem>
306
+ <MenuItem>Deep Item 2</MenuItem>
307
+ </SubMenuItem>
308
+ </SubMenuItem>
309
+ <MenuSeparator />
310
+ <SubMenuItem label="Category 2">
311
+ <MenuItem>Category 2 Item 1</MenuItem>
312
+ <MenuItem>Category 2 Item 2</MenuItem>
313
+ </SubMenuItem>
314
+ </DropdownMenu>
315
+ `);
316
+ const driver = yield createDropdownMenuDriver();
317
+ // Open main menu
318
+ yield driver.open();
319
+ yield (0, fixtures_1.expect)(page.getByText("Top Level Item")).toBeVisible();
320
+ yield (0, fixtures_1.expect)(page.getByText("Category 1")).toBeVisible();
321
+ // Navigate to submenu using driver method
322
+ yield (0, fixtures_1.expect)(page.getByText("Category 1 Item 1")).not.toBeVisible();
323
+ yield driver.openSubMenu("Category 1");
324
+ yield (0, fixtures_1.expect)(page.getByText("Category 1 Item 1")).toBeVisible();
325
+ yield (0, fixtures_1.expect)(page.getByText("Subcategory")).toBeVisible();
326
+ // Navigate to nested submenu
327
+ yield (0, fixtures_1.expect)(page.getByText("Deep Item 1")).not.toBeVisible();
328
+ yield driver.openSubMenu("Subcategory");
329
+ yield (0, fixtures_1.expect)(page.getByText("Deep Item 1")).toBeVisible();
330
+ yield (0, fixtures_1.expect)(page.getByText("Deep Item 2")).toBeVisible();
331
+ }));
@@ -56,9 +56,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
56
56
  return (mod && mod.__esModule) ? mod : { "default": mod };
57
57
  };
58
58
  Object.defineProperty(exports, "__esModule", { value: true });
59
- exports.MenuItem = exports.defaultMenuItemProps = exports.DropdownMenu = exports.defaultDropdownMenuProps = void 0;
60
- exports.SubMenuItem = SubMenuItem;
61
- exports.MenuSeparator = MenuSeparator;
59
+ exports.MenuSeparator = exports.SubMenuItem = exports.MenuItem = exports.defaultMenuItemProps = exports.DropdownMenu = exports.defaultDropdownMenuProps = void 0;
62
60
  const jsx_runtime_1 = require("react/jsx-runtime");
63
61
  const react_1 = require("react");
64
62
  const react_2 = require("react");
@@ -139,10 +137,10 @@ exports.MenuItem = (0, react_1.forwardRef)(function MenuItem({ children, onClick
139
137
  }
140
138
  }, ref: ref, children: [iconToStart && icon, (0, jsx_runtime_1.jsx)("div", { className: DropdownMenu_module_scss_1.default.wrapper, children: label !== null && label !== void 0 ? label : children }), !iconToStart && icon] }));
141
139
  });
142
- function SubMenuItem({ children, label, triggerTemplate }) {
140
+ exports.SubMenuItem = (0, react_1.forwardRef)(function SubMenuItem({ children, label, triggerTemplate }, ref) {
143
141
  const { root } = (0, ThemeContext_1.useTheme)();
144
- return ((0, jsx_runtime_1.jsxs)(ReactDropdownMenu.Sub, { children: [(0, jsx_runtime_1.jsx)(ReactDropdownMenu.SubTrigger, { className: DropdownMenu_module_scss_1.default.DropdownMenuSubTrigger, asChild: true, children: triggerTemplate ? triggerTemplate : (0, jsx_runtime_1.jsx)("div", { children: label }) }), (0, jsx_runtime_1.jsx)(ReactDropdownMenu.Portal, { container: root, children: (0, jsx_runtime_1.jsx)(ReactDropdownMenu.SubContent, { className: DropdownMenu_module_scss_1.default.DropdownMenuSubContent, children: children }) })] }));
145
- }
146
- function MenuSeparator() {
147
- return (0, jsx_runtime_1.jsx)(ReactDropdownMenu.Separator, { className: DropdownMenu_module_scss_1.default.DropdownMenuSeparator });
148
- }
142
+ return ((0, jsx_runtime_1.jsxs)(ReactDropdownMenu.Sub, { children: [(0, jsx_runtime_1.jsx)(ReactDropdownMenu.SubTrigger, { className: DropdownMenu_module_scss_1.default.DropdownMenuSubTrigger, asChild: true, ref: ref, children: triggerTemplate ? triggerTemplate : (0, jsx_runtime_1.jsx)("div", { children: label }) }), (0, jsx_runtime_1.jsx)(ReactDropdownMenu.Portal, { container: root, children: (0, jsx_runtime_1.jsx)(ReactDropdownMenu.SubContent, { className: DropdownMenu_module_scss_1.default.DropdownMenuSubContent, children: children }) })] }));
143
+ });
144
+ exports.MenuSeparator = (0, react_1.forwardRef)(function MenuSeparator(props, ref) {
145
+ return (0, jsx_runtime_1.jsx)(ReactDropdownMenu.Separator, Object.assign({ ref: ref, className: DropdownMenu_module_scss_1.default.DropdownMenuSeparator }, props));
146
+ });
@@ -0,0 +1,29 @@
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 properties", (_a) => __awaiter(void 0, [_a], void 0, function* ({ page, initTestBed }) {
18
+ yield initTestBed(`<EmojiSelector testId="emoji-selector" />`, {});
19
+ yield (0, fixtures_1.expect)(page.getByTestId("emoji-selector")).toBeVisible();
20
+ }));
21
+ (0, fixtures_1.test)("display selected emoji", (_a) => __awaiter(void 0, [_a], void 0, function* ({ page, initTestBed }) {
22
+ const EXPECTED_EMOTICON = "😀";
23
+ const { testStateDriver } = yield initTestBed(`
24
+ <EmojiSelector onSelect="(emoji) => { testState = emoji }" />
25
+ `);
26
+ yield page.getByText(EXPECTED_EMOTICON).click();
27
+ yield fixtures_1.expect.poll(testStateDriver.testState).toBe(EXPECTED_EMOTICON);
28
+ }));
29
+ });