@gjsify/adwaita-web 0.53.0 → 0.55.0

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 (440) hide show
  1. package/dist/adwaita-web.css +8070 -3037
  2. package/dist/adwaita-web.css.map +1 -1
  3. package/lib/types/adw-application-window.spec.d.ts +1 -0
  4. package/lib/types/adw-bin.spec.d.ts +1 -0
  5. package/lib/types/adw-breakpoint-bin.spec.d.ts +1 -0
  6. package/lib/types/adw-clamp-scrollable.spec.d.ts +1 -0
  7. package/lib/types/adw-multi-layout-view.spec.d.ts +1 -0
  8. package/lib/types/adw-preferences-row.spec.d.ts +1 -0
  9. package/lib/types/adw-shortcuts.spec.d.ts +1 -0
  10. package/lib/types/adw-tab-bar.spec.d.ts +1 -0
  11. package/lib/types/adw-tab-button.spec.d.ts +1 -0
  12. package/lib/types/adw-tab-overview.spec.d.ts +1 -0
  13. package/lib/types/adw-view-switcher-sidebar.spec.d.ts +1 -0
  14. package/lib/types/adw-window.spec.d.ts +1 -0
  15. package/lib/types/breakpoints.d.ts +14 -3
  16. package/lib/types/construct-vectors.spec.d.ts +1 -0
  17. package/lib/types/elements/adw-application-window.d.ts +27 -0
  18. package/lib/types/elements/adw-bin.d.ts +17 -0
  19. package/lib/types/elements/adw-breakpoint-bin.d.ts +67 -0
  20. package/lib/types/elements/adw-clamp-scrollable.d.ts +38 -0
  21. package/lib/types/elements/adw-dialog.d.ts +10 -0
  22. package/lib/types/elements/adw-layout-slot.d.ts +19 -0
  23. package/lib/types/elements/adw-multi-layout-view.d.ts +101 -0
  24. package/lib/types/elements/adw-preferences-row.d.ts +31 -0
  25. package/lib/types/elements/adw-shortcuts-dialog.d.ts +13 -0
  26. package/lib/types/elements/adw-shortcuts-item.d.ts +36 -0
  27. package/lib/types/elements/adw-shortcuts-section.d.ts +14 -0
  28. package/lib/types/elements/adw-sidebar.d.ts +5 -0
  29. package/lib/types/elements/adw-switch-row.d.ts +3 -0
  30. package/lib/types/elements/adw-tab-bar.d.ts +108 -0
  31. package/lib/types/elements/adw-tab-button.d.ts +32 -0
  32. package/lib/types/elements/adw-tab-overview.d.ts +199 -0
  33. package/lib/types/elements/adw-tab-view.d.ts +19 -23
  34. package/lib/types/elements/adw-view-switcher-sidebar.d.ts +84 -0
  35. package/lib/types/elements/adw-window.d.ts +40 -0
  36. package/lib/types/elements/gtk-about-dialog.d.ts +146 -0
  37. package/lib/types/elements/gtk-application-window.d.ts +34 -0
  38. package/lib/types/elements/gtk-aspect-frame.d.ts +27 -0
  39. package/lib/types/elements/gtk-button.d.ts +9 -0
  40. package/lib/types/elements/gtk-calendar.d.ts +159 -0
  41. package/lib/types/elements/gtk-center-box.d.ts +39 -0
  42. package/lib/types/elements/gtk-color-dialog-button.d.ts +69 -0
  43. package/lib/types/elements/gtk-column-view.d.ts +50 -0
  44. package/lib/types/elements/gtk-drag-icon.d.ts +78 -0
  45. package/lib/types/elements/gtk-drawing-area.d.ts +95 -0
  46. package/lib/types/elements/gtk-editable-label.d.ts +33 -0
  47. package/lib/types/elements/gtk-emoji-chooser.d.ts +84 -0
  48. package/lib/types/elements/gtk-entry.d.ts +20 -1
  49. package/lib/types/elements/gtk-expander.d.ts +49 -0
  50. package/lib/types/elements/gtk-fixed.d.ts +13 -0
  51. package/lib/types/elements/gtk-flow-box-child.d.ts +14 -0
  52. package/lib/types/elements/gtk-flow-box.d.ts +87 -0
  53. package/lib/types/elements/gtk-font-dialog-button.d.ts +83 -0
  54. package/lib/types/elements/gtk-frame.d.ts +24 -0
  55. package/lib/types/elements/gtk-gl-area.d.ts +136 -0
  56. package/lib/types/elements/gtk-graphics-offload.d.ts +24 -0
  57. package/lib/types/elements/gtk-grid-view.d.ts +39 -0
  58. package/lib/types/elements/gtk-grid.d.ts +27 -0
  59. package/lib/types/elements/gtk-header-bar.d.ts +60 -0
  60. package/lib/types/elements/gtk-inscription.d.ts +64 -0
  61. package/lib/types/elements/gtk-label.d.ts +3 -0
  62. package/lib/types/elements/gtk-level-bar.d.ts +59 -0
  63. package/lib/types/elements/gtk-link-button.d.ts +29 -0
  64. package/lib/types/elements/gtk-list-box-row.d.ts +54 -0
  65. package/lib/types/elements/gtk-list-box.d.ts +100 -0
  66. package/lib/types/elements/gtk-list-view.d.ts +73 -0
  67. package/lib/types/elements/gtk-media-controls.d.ts +142 -0
  68. package/lib/types/elements/gtk-notebook.d.ts +148 -0
  69. package/lib/types/elements/gtk-overlay.d.ts +22 -0
  70. package/lib/types/elements/gtk-page-setup-unix-dialog.d.ts +87 -0
  71. package/lib/types/elements/gtk-paned.d.ts +121 -0
  72. package/lib/types/elements/gtk-password-entry.d.ts +27 -0
  73. package/lib/types/elements/gtk-picture.d.ts +66 -0
  74. package/lib/types/elements/gtk-popover-bin.d.ts +82 -0
  75. package/lib/types/elements/gtk-popover-menu-bar.d.ts +66 -0
  76. package/lib/types/elements/gtk-popover-menu.d.ts +83 -0
  77. package/lib/types/elements/gtk-popover.d.ts +28 -3
  78. package/lib/types/elements/gtk-print-unix-dialog.d.ts +167 -0
  79. package/lib/types/elements/gtk-revealer.d.ts +55 -0
  80. package/lib/types/elements/gtk-scale-button.d.ts +59 -0
  81. package/lib/types/elements/gtk-scale.d.ts +98 -0
  82. package/lib/types/elements/gtk-scrollbar.d.ts +124 -0
  83. package/lib/types/elements/gtk-scrolled-window.d.ts +121 -0
  84. package/lib/types/elements/gtk-search-bar.d.ts +39 -0
  85. package/lib/types/elements/gtk-search-entry.d.ts +27 -0
  86. package/lib/types/elements/gtk-separator.d.ts +10 -0
  87. package/lib/types/elements/gtk-spin-button.d.ts +94 -0
  88. package/lib/types/elements/gtk-spinner.d.ts +14 -0
  89. package/lib/types/elements/gtk-stack-sidebar.d.ts +43 -0
  90. package/lib/types/elements/gtk-stack-switcher.d.ts +58 -0
  91. package/lib/types/elements/gtk-stack.d.ts +154 -0
  92. package/lib/types/elements/gtk-switch.d.ts +4 -1
  93. package/lib/types/elements/gtk-text-view.d.ts +62 -0
  94. package/lib/types/elements/gtk-text.d.ts +45 -0
  95. package/lib/types/elements/gtk-toggle-button.d.ts +45 -0
  96. package/lib/types/elements/gtk-tree-expander.d.ts +38 -0
  97. package/lib/types/elements/gtk-video.d.ts +97 -0
  98. package/lib/types/elements/gtk-viewport.d.ts +84 -0
  99. package/lib/types/elements/gtk-window-controls.d.ts +80 -0
  100. package/lib/types/elements/gtk-window-handle.d.ts +39 -0
  101. package/lib/types/elements/gtk-window.d.ts +97 -0
  102. package/lib/types/elements/justification.d.ts +2 -0
  103. package/lib/types/elements/popover-menu.d.ts +18 -0
  104. package/lib/types/elements/roving-focus.d.ts +29 -1
  105. package/lib/types/emoji-data.d.ts +38 -0
  106. package/lib/types/font-description.d.ts +96 -0
  107. package/lib/types/gtk-about-dialog.spec.d.ts +1 -0
  108. package/lib/types/gtk-action-bar.spec.d.ts +1 -0
  109. package/lib/types/gtk-application-window.spec.d.ts +1 -0
  110. package/lib/types/gtk-aspect-frame.spec.d.ts +1 -0
  111. package/lib/types/gtk-calendar.spec.d.ts +1 -0
  112. package/lib/types/gtk-center-box.spec.d.ts +1 -0
  113. package/lib/types/gtk-color-dialog-button.spec.d.ts +1 -0
  114. package/lib/types/gtk-column-view.spec.d.ts +1 -0
  115. package/lib/types/gtk-drag-icon.spec.d.ts +1 -0
  116. package/lib/types/gtk-drawing-area.spec.d.ts +1 -0
  117. package/lib/types/gtk-editable-label.spec.d.ts +1 -0
  118. package/lib/types/gtk-emoji-chooser.spec.d.ts +1 -0
  119. package/lib/types/gtk-expander.spec.d.ts +1 -0
  120. package/lib/types/gtk-fixed.spec.d.ts +1 -0
  121. package/lib/types/gtk-flow-box.spec.d.ts +1 -0
  122. package/lib/types/gtk-font-dialog-button.spec.d.ts +1 -0
  123. package/lib/types/gtk-frame.spec.d.ts +1 -0
  124. package/lib/types/gtk-gl-area.spec.d.ts +1 -0
  125. package/lib/types/gtk-graphics-offload.spec.d.ts +1 -0
  126. package/lib/types/gtk-grid-view.spec.d.ts +1 -0
  127. package/lib/types/gtk-grid.spec.d.ts +1 -0
  128. package/lib/types/gtk-header-bar.spec.d.ts +1 -0
  129. package/lib/types/gtk-inscription.spec.d.ts +1 -0
  130. package/lib/types/gtk-level-bar.spec.d.ts +1 -0
  131. package/lib/types/gtk-link-button.spec.d.ts +1 -0
  132. package/lib/types/gtk-list-box.spec.d.ts +1 -0
  133. package/lib/types/gtk-list-view.spec.d.ts +1 -0
  134. package/lib/types/gtk-media-controls.spec.d.ts +1 -0
  135. package/lib/types/gtk-notebook.spec.d.ts +1 -0
  136. package/lib/types/gtk-overlay.spec.d.ts +1 -0
  137. package/lib/types/gtk-paned.spec.d.ts +1 -0
  138. package/lib/types/gtk-password-entry.spec.d.ts +1 -0
  139. package/lib/types/gtk-picture.spec.d.ts +1 -0
  140. package/lib/types/gtk-popover-bin.spec.d.ts +1 -0
  141. package/lib/types/gtk-popover-menu-bar.spec.d.ts +1 -0
  142. package/lib/types/gtk-popover-menu.spec.d.ts +1 -0
  143. package/lib/types/gtk-popover-role.spec.d.ts +1 -0
  144. package/lib/types/gtk-popover.spec.d.ts +1 -0
  145. package/lib/types/gtk-print-dialogs.spec.d.ts +1 -0
  146. package/lib/types/gtk-revealer.spec.d.ts +1 -0
  147. package/lib/types/gtk-scale-button.spec.d.ts +1 -0
  148. package/lib/types/gtk-scale.spec.d.ts +1 -0
  149. package/lib/types/gtk-scrollbar.spec.d.ts +1 -0
  150. package/lib/types/gtk-scrolled-window.spec.d.ts +1 -0
  151. package/lib/types/gtk-search-bar.spec.d.ts +1 -0
  152. package/lib/types/gtk-search-entry.spec.d.ts +1 -0
  153. package/lib/types/gtk-separator.spec.d.ts +1 -0
  154. package/lib/types/gtk-spin-button.spec.d.ts +1 -0
  155. package/lib/types/gtk-spinner.spec.d.ts +1 -0
  156. package/lib/types/gtk-stack-sidebar.spec.d.ts +1 -0
  157. package/lib/types/gtk-stack-switcher.spec.d.ts +1 -0
  158. package/lib/types/gtk-stack.spec.d.ts +1 -0
  159. package/lib/types/gtk-text-view.spec.d.ts +1 -0
  160. package/lib/types/gtk-text.spec.d.ts +1 -0
  161. package/lib/types/gtk-toggle-button.spec.d.ts +1 -0
  162. package/lib/types/gtk-tree-expander.spec.d.ts +1 -0
  163. package/lib/types/gtk-video.spec.d.ts +1 -0
  164. package/lib/types/gtk-viewport.spec.d.ts +1 -0
  165. package/lib/types/gtk-window-controls.spec.d.ts +1 -0
  166. package/lib/types/gtk-window-handle.spec.d.ts +1 -0
  167. package/lib/types/gtk-window.spec.d.ts +1 -0
  168. package/lib/types/index.d.ts +4 -1
  169. package/lib/types/list-view-dom.d.ts +44 -0
  170. package/lib/types/namespace/adw.d.ts +12 -0
  171. package/lib/types/namespace/gtk.d.ts +61 -0
  172. package/lib/types/page-setup.d.ts +100 -0
  173. package/lib/types/scroll-shading.d.ts +15 -1
  174. package/lib/types/shared-tree-builder.d.ts +30 -2
  175. package/lib/types/signals.d.ts +4 -0
  176. package/lib/types/styles.generated.d.ts +1 -1
  177. package/lib/types/tab-chip.d.ts +73 -0
  178. package/lib/types/template-classes.d.ts +11 -0
  179. package/package.json +12 -8
  180. package/scss/_action_row.scss +2 -2
  181. package/scss/_application_window.scss +26 -0
  182. package/scss/_aspect_frame.scss +25 -0
  183. package/scss/_bin.scss +26 -0
  184. package/scss/_button.scss +45 -0
  185. package/scss/_calendar.scss +176 -0
  186. package/scss/_center_box.scss +25 -0
  187. package/scss/_checks.scss +6 -1
  188. package/scss/_clamp_scrollable.scss +28 -0
  189. package/scss/_color_button.scss +67 -0
  190. package/scss/_column_view.scss +126 -0
  191. package/scss/_drag_icon.scss +55 -0
  192. package/scss/_drawing.scss +85 -0
  193. package/scss/_emoji_chooser.scss +213 -0
  194. package/scss/_entry.scss +13 -5
  195. package/scss/_entry_row.scss +1 -1
  196. package/scss/_expander.scss +113 -0
  197. package/scss/_fixed.scss +29 -0
  198. package/scss/_flow_box.scss +94 -0
  199. package/scss/_font_button.scss +63 -0
  200. package/scss/_frame.scss +41 -0
  201. package/scss/_grid.scss +19 -0
  202. package/scss/_grid_view.scss +46 -0
  203. package/scss/_gtk_about_dialog.scss +186 -0
  204. package/scss/_headerbar.scss +132 -0
  205. package/scss/_icons.generated.scss +186 -0
  206. package/scss/_inscription.scss +125 -0
  207. package/scss/_level_bar.scss +190 -0
  208. package/scss/_link.scss +82 -0
  209. package/scss/_list_box.scss +88 -0
  210. package/scss/_list_view.scss +96 -0
  211. package/scss/_media_controls.scss +139 -0
  212. package/scss/_overlay.scss +68 -0
  213. package/scss/_paned.scss +130 -0
  214. package/scss/_password_entry.scss +83 -0
  215. package/scss/_picture.scss +80 -0
  216. package/scss/_popover_bin.scss +53 -0
  217. package/scss/_popover_menu_bar.scss +104 -0
  218. package/scss/_preferences_row.scss +51 -0
  219. package/scss/_print_dialogs.scss +328 -0
  220. package/scss/_reset.scss +21 -19
  221. package/scss/_revealer.scss +37 -0
  222. package/scss/_row.scss +20 -5
  223. package/scss/_scale.scss +298 -0
  224. package/scss/_scale_button.scss +167 -0
  225. package/scss/_scrollbar.scss +230 -0
  226. package/scss/_scrolled_window.scss +131 -0
  227. package/scss/_search_bar.scss +118 -0
  228. package/scss/_search_entry.scss +86 -0
  229. package/scss/_separator.scss +44 -0
  230. package/scss/_shortcuts_dialog.scss +100 -0
  231. package/scss/_spin_button.scss +172 -0
  232. package/scss/_spin_row.scss +56 -8
  233. package/scss/_spinner.scss +85 -4
  234. package/scss/_stack.scss +729 -0
  235. package/scss/_switch.scss +13 -5
  236. package/scss/_switch_row.scss +10 -0
  237. package/scss/_tab_bar.scss +317 -0
  238. package/scss/_tab_button.scss +98 -0
  239. package/scss/_tab_overview.scss +483 -0
  240. package/scss/_text.scss +182 -0
  241. package/scss/_theme.scss +1 -1
  242. package/scss/_tree_expander.scss +62 -0
  243. package/scss/_variables.scss +43 -21
  244. package/scss/_video.scss +146 -0
  245. package/scss/_view_switcher_sidebar.scss +112 -0
  246. package/scss/_viewport.scss +50 -0
  247. package/scss/_window.scss +118 -1
  248. package/scss/_window_handle.scss +20 -0
  249. package/scss/adwaita-skin.scss +109 -0
  250. package/src/adw-action-rows.spec.ts +76 -0
  251. package/src/adw-application-window.spec.ts +118 -0
  252. package/src/adw-bin.spec.ts +75 -0
  253. package/src/adw-breakpoint-bin.spec.ts +324 -0
  254. package/src/adw-clamp-scrollable.spec.ts +189 -0
  255. package/src/adw-multi-layout-view.spec.ts +243 -0
  256. package/src/adw-preferences-row.spec.ts +164 -0
  257. package/src/adw-row-state.spec.ts +142 -0
  258. package/src/adw-shortcuts.spec.ts +155 -0
  259. package/src/adw-tab-bar.spec.ts +287 -0
  260. package/src/adw-tab-button.spec.ts +101 -0
  261. package/src/adw-tab-overview.spec.ts +443 -0
  262. package/src/adw-view-switcher-sidebar.spec.ts +281 -0
  263. package/src/adw-window.spec.ts +129 -0
  264. package/src/breakpoints.ts +25 -8
  265. package/src/capabilities.d.mts +3 -0
  266. package/src/capabilities.mjs +18 -0
  267. package/src/connect-lifecycle.spec.ts +12 -0
  268. package/src/construct-vectors.spec.ts +175 -0
  269. package/src/elements/adw-application-window.ts +154 -0
  270. package/src/elements/adw-bin.ts +101 -0
  271. package/src/elements/adw-breakpoint-bin.ts +287 -0
  272. package/src/elements/adw-clamp-scrollable.ts +207 -0
  273. package/src/elements/adw-dialog.ts +19 -0
  274. package/src/elements/adw-layout-slot.ts +95 -0
  275. package/src/elements/adw-multi-layout-view.ts +326 -0
  276. package/src/elements/adw-preferences-row.ts +150 -0
  277. package/src/elements/adw-shortcuts-dialog.ts +52 -0
  278. package/src/elements/adw-shortcuts-item.ts +171 -0
  279. package/src/elements/adw-shortcuts-section.ts +86 -0
  280. package/src/elements/adw-sidebar.ts +42 -3
  281. package/src/elements/adw-switch-row.ts +28 -1
  282. package/src/elements/adw-tab-bar.ts +529 -0
  283. package/src/elements/adw-tab-button.ts +194 -0
  284. package/src/elements/adw-tab-overview.ts +1011 -0
  285. package/src/elements/adw-tab-view.ts +66 -145
  286. package/src/elements/adw-toggle-group.ts +20 -5
  287. package/src/elements/adw-view-stack.ts +18 -0
  288. package/src/elements/adw-view-switcher-sidebar.ts +332 -0
  289. package/src/elements/adw-window.ts +185 -11
  290. package/src/elements/checks.ts +35 -8
  291. package/src/elements/gtk-about-dialog.ts +811 -0
  292. package/src/elements/gtk-application-window.ts +108 -0
  293. package/src/elements/gtk-aspect-frame.ts +160 -0
  294. package/src/elements/gtk-button.ts +12 -0
  295. package/src/elements/gtk-calendar.ts +757 -0
  296. package/src/elements/gtk-center-box.ts +184 -0
  297. package/src/elements/gtk-color-dialog-button.ts +278 -0
  298. package/src/elements/gtk-column-view.ts +320 -0
  299. package/src/elements/gtk-drag-icon.ts +257 -0
  300. package/src/elements/gtk-drawing-area.ts +303 -0
  301. package/src/elements/gtk-editable-label.ts +204 -0
  302. package/src/elements/gtk-emoji-chooser.ts +542 -0
  303. package/src/elements/gtk-entry.ts +39 -5
  304. package/src/elements/gtk-expander.ts +301 -0
  305. package/src/elements/gtk-fixed.ts +99 -0
  306. package/src/elements/gtk-flow-box-child.ts +68 -0
  307. package/src/elements/gtk-flow-box.ts +480 -0
  308. package/src/elements/gtk-font-dialog-button.ts +432 -0
  309. package/src/elements/gtk-frame.ts +174 -0
  310. package/src/elements/gtk-gl-area.ts +476 -0
  311. package/src/elements/gtk-graphics-offload.ts +130 -0
  312. package/src/elements/gtk-grid-view.ts +168 -0
  313. package/src/elements/gtk-grid.ts +127 -0
  314. package/src/elements/gtk-header-bar.ts +273 -0
  315. package/src/elements/gtk-inscription.ts +387 -0
  316. package/src/elements/gtk-label.ts +19 -11
  317. package/src/elements/gtk-level-bar.ts +323 -0
  318. package/src/elements/gtk-link-button.ts +138 -0
  319. package/src/elements/gtk-list-box-row.ts +195 -0
  320. package/src/elements/gtk-list-box.ts +413 -0
  321. package/src/elements/gtk-list-view.ts +370 -0
  322. package/src/elements/gtk-media-controls.ts +509 -0
  323. package/src/elements/gtk-notebook.ts +664 -0
  324. package/src/elements/gtk-overlay.ts +149 -0
  325. package/src/elements/gtk-page-setup-unix-dialog.ts +420 -0
  326. package/src/elements/gtk-paned.ts +597 -0
  327. package/src/elements/gtk-password-entry.ts +170 -0
  328. package/src/elements/gtk-picture.ts +254 -0
  329. package/src/elements/gtk-popover-bin.ts +332 -0
  330. package/src/elements/gtk-popover-menu-bar.ts +355 -0
  331. package/src/elements/gtk-popover-menu.ts +339 -0
  332. package/src/elements/gtk-popover.ts +92 -10
  333. package/src/elements/gtk-print-unix-dialog.ts +989 -0
  334. package/src/elements/gtk-progress-bar.ts +24 -11
  335. package/src/elements/gtk-revealer.ts +406 -0
  336. package/src/elements/gtk-scale-button.ts +358 -0
  337. package/src/elements/gtk-scale.ts +492 -0
  338. package/src/elements/gtk-scrollbar.ts +528 -0
  339. package/src/elements/gtk-scrolled-window.ts +642 -0
  340. package/src/elements/gtk-search-bar.ts +200 -0
  341. package/src/elements/gtk-search-entry.ts +172 -0
  342. package/src/elements/gtk-separator.ts +52 -0
  343. package/src/elements/gtk-spin-button.ts +475 -0
  344. package/src/elements/gtk-spinner.ts +126 -0
  345. package/src/elements/gtk-stack-sidebar.ts +212 -0
  346. package/src/elements/gtk-stack-switcher.ts +279 -0
  347. package/src/elements/gtk-stack.ts +748 -0
  348. package/src/elements/gtk-switch.ts +52 -19
  349. package/src/elements/gtk-text-view.ts +290 -0
  350. package/src/elements/gtk-text.ts +219 -0
  351. package/src/elements/gtk-toggle-button.ts +239 -0
  352. package/src/elements/gtk-tree-expander.ts +243 -0
  353. package/src/elements/gtk-video.ts +423 -0
  354. package/src/elements/gtk-viewport.ts +277 -0
  355. package/src/elements/gtk-window-controls.ts +341 -0
  356. package/src/elements/gtk-window-handle.ts +221 -0
  357. package/src/elements/gtk-window.ts +366 -0
  358. package/src/elements/justification.ts +24 -0
  359. package/src/elements/popover-menu.ts +24 -0
  360. package/src/elements/roving-focus.ts +53 -21
  361. package/src/emoji-data.ts +577 -0
  362. package/src/entry-rows.spec.ts +31 -0
  363. package/src/font-description.ts +238 -0
  364. package/src/gtk-about-dialog.spec.ts +250 -0
  365. package/src/gtk-action-bar.spec.ts +89 -0
  366. package/src/gtk-application-window.spec.ts +107 -0
  367. package/src/gtk-aspect-frame.spec.ts +114 -0
  368. package/src/gtk-calendar.spec.ts +589 -0
  369. package/src/gtk-center-box.spec.ts +125 -0
  370. package/src/gtk-color-dialog-button.spec.ts +141 -0
  371. package/src/gtk-column-view.spec.ts +154 -0
  372. package/src/gtk-drag-icon.spec.ts +190 -0
  373. package/src/gtk-drawing-area.spec.ts +211 -0
  374. package/src/gtk-editable-label.spec.ts +190 -0
  375. package/src/gtk-emoji-chooser.spec.ts +173 -0
  376. package/src/gtk-entry.spec.ts +23 -0
  377. package/src/gtk-expander.spec.ts +170 -0
  378. package/src/gtk-fixed.spec.ts +97 -0
  379. package/src/gtk-flow-box.spec.ts +289 -0
  380. package/src/gtk-font-dialog-button.spec.ts +166 -0
  381. package/src/gtk-frame.spec.ts +119 -0
  382. package/src/gtk-gl-area.spec.ts +361 -0
  383. package/src/gtk-graphics-offload.spec.ts +119 -0
  384. package/src/gtk-grid-view.spec.ts +106 -0
  385. package/src/gtk-grid.spec.ts +122 -0
  386. package/src/gtk-header-bar.spec.ts +202 -0
  387. package/src/gtk-inscription.spec.ts +235 -0
  388. package/src/gtk-level-bar.spec.ts +199 -0
  389. package/src/gtk-link-button.spec.ts +117 -0
  390. package/src/gtk-list-box.spec.ts +422 -0
  391. package/src/gtk-list-view.spec.ts +203 -0
  392. package/src/gtk-media-controls.spec.ts +295 -0
  393. package/src/gtk-notebook.spec.ts +546 -0
  394. package/src/gtk-overlay.spec.ts +141 -0
  395. package/src/gtk-paned.spec.ts +267 -0
  396. package/src/gtk-password-entry.spec.ts +150 -0
  397. package/src/gtk-picture.spec.ts +172 -0
  398. package/src/gtk-popover-bin.spec.ts +229 -0
  399. package/src/gtk-popover-menu-bar.spec.ts +296 -0
  400. package/src/gtk-popover-menu.spec.ts +261 -0
  401. package/src/gtk-popover-role.spec.ts +138 -0
  402. package/src/gtk-popover.spec.ts +264 -0
  403. package/src/gtk-print-dialogs.spec.ts +251 -0
  404. package/src/gtk-revealer.spec.ts +164 -0
  405. package/src/gtk-scale-button.spec.ts +218 -0
  406. package/src/gtk-scale.spec.ts +213 -0
  407. package/src/gtk-scrollbar.spec.ts +244 -0
  408. package/src/gtk-scrolled-window.spec.ts +262 -0
  409. package/src/gtk-search-bar.spec.ts +179 -0
  410. package/src/gtk-search-entry.spec.ts +142 -0
  411. package/src/gtk-separator.spec.ts +74 -0
  412. package/src/gtk-spin-button.spec.ts +186 -0
  413. package/src/gtk-spinner.spec.ts +130 -0
  414. package/src/gtk-stack-sidebar.spec.ts +217 -0
  415. package/src/gtk-stack-switcher.spec.ts +249 -0
  416. package/src/gtk-stack.spec.ts +432 -0
  417. package/src/gtk-text-view.spec.ts +189 -0
  418. package/src/gtk-text.spec.ts +163 -0
  419. package/src/gtk-toggle-button.spec.ts +186 -0
  420. package/src/gtk-tree-expander.spec.ts +201 -0
  421. package/src/gtk-video.spec.ts +240 -0
  422. package/src/gtk-viewport.spec.ts +140 -0
  423. package/src/gtk-window-controls.spec.ts +232 -0
  424. package/src/gtk-window-handle.spec.ts +158 -0
  425. package/src/gtk-window.spec.ts +190 -0
  426. package/src/index.ts +9 -1
  427. package/src/keyboard-operable.spec.ts +33 -1
  428. package/src/list-view-dom.ts +121 -0
  429. package/src/namespace/adw.ts +12 -0
  430. package/src/namespace/gtk.ts +61 -0
  431. package/src/page-setup.ts +222 -0
  432. package/src/scroll-shading.ts +18 -1
  433. package/src/shared-tree-builder.ts +263 -21
  434. package/src/signals.ts +15 -0
  435. package/src/source-view/theme.ts +11 -5
  436. package/src/style-classes.spec.ts +9 -8
  437. package/src/styles.generated.ts +1 -1
  438. package/src/tab-chip.ts +200 -0
  439. package/src/template-classes.ts +45 -0
  440. package/src/test.browser.mts +152 -0
@@ -0,0 +1,172 @@
1
+ // DOM-level tests for <gtk-picture>. The four scalar properties all have a GIR default
2
+ // that is TRUE, so most of what matters here is the ABSENCE cases: an attribute that is not
3
+ // written has to read back as the C's default, not as `false`. The other half is
4
+ // `keep-aspect-ratio`, which is a deprecated MAPPING rather than a stored boolean, and whose
5
+ // getter is the inverse test over `content-fit` — so `cover` and `scale-down` both read it
6
+ // back `true` and only `fill` reads `false`.
7
+ import { describe, expect, it } from '@gjsify/unit';
8
+
9
+ import type { GtkPicture } from './elements/gtk-picture.js';
10
+
11
+ function mount(attrs: Record<string, string> = {}): { el: GtkPicture; host: HTMLElement } {
12
+ const host = document.createElement('div');
13
+ document.body.appendChild(host);
14
+ const el = document.createElement('gtk-picture') as GtkPicture;
15
+ for (const [name, value] of Object.entries(attrs)) el.setAttribute(name, value);
16
+ host.appendChild(el);
17
+ return { el, host };
18
+ }
19
+
20
+ export const GtkPictureTest = async () => {
21
+ await describe('<gtk-picture> content-fit', async () => {
22
+ await it('defaults to CONTAIN, which is what the C installs in init', () => {
23
+ // gtkpicture.c:555 — `self->content_fit = GTK_CONTENT_FIT_CONTAIN`.
24
+ const { el, host } = mount();
25
+ expect(el.contentFit).toBe('contain');
26
+ host.remove();
27
+ });
28
+
29
+ await it('an unrecognised nick stays CONTAIN rather than becoming FILL', () => {
30
+ // FILL is the one value that would silently distort every picture a page writes,
31
+ // so the default is the safe arm — not a coercion to the first enum member.
32
+ const { el, host } = mount({ 'content-fit': 'squeeze' });
33
+ expect(el.contentFit).toBe('contain');
34
+ host.remove();
35
+ });
36
+
37
+ await it('holds all four GtkContentFit members, scale-down included', () => {
38
+ // gtkpicture.c:162-167 — SCALE_DOWN is the member `GtkContentFit` added and CSS
39
+ // already had, so this mapping is exact rather than approximate.
40
+ for (const mode of ['fill', 'contain', 'cover', 'scale-down'] as const) {
41
+ const { el, host } = mount({ 'content-fit': mode });
42
+ expect(el.contentFit).toBe(mode);
43
+ host.remove();
44
+ }
45
+ });
46
+
47
+ await it('reaches the replaced child as object-fit, which is not inherited', () => {
48
+ const { el, host } = mount({ 'content-fit': 'cover' });
49
+ expect(el.style.getPropertyValue('--gtk-picture-content-fit')).toBe('cover');
50
+ host.remove();
51
+ });
52
+ });
53
+
54
+ await describe('<gtk-picture> keep-aspect-ratio', async () => {
55
+ await it('the setter MAPS onto content-fit rather than storing a boolean', async () => {
56
+ // gtkpicture.c:1017-1021 — TRUE sets CONTAIN, FALSE sets FILL.
57
+ const { el, host } = mount();
58
+ el.keepAspectRatio = true;
59
+ expect(el.contentFit).toBe('contain');
60
+ el.keepAspectRatio = false;
61
+ expect(el.contentFit).toBe('fill');
62
+ host.remove();
63
+ });
64
+
65
+ await it('the getter is the INVERSE test, so cover and scale-down read TRUE', () => {
66
+ // gtkpicture.c:1040 — `return self->content_fit != GTK_CONTENT_FIT_FILL`. Both
67
+ // preserve the ratio, so answering FALSE for either would be a lie.
68
+ for (const mode of ['contain', 'cover', 'scale-down'] as const) {
69
+ const { el, host } = mount({ 'content-fit': mode });
70
+ expect(el.keepAspectRatio).toBe(true);
71
+ host.remove();
72
+ }
73
+ const fill = mount({ 'content-fit': 'fill' });
74
+ expect(fill.el.keepAspectRatio).toBe(false);
75
+ fill.host.remove();
76
+ });
77
+
78
+ await it('notifies the deprecated property only when a FILL arm is involved', () => {
79
+ // gtkpicture.c:1114-1115 — `notify_keep_aspect_ratio` is computed as "the new
80
+ // mode or the old one is FILL", so a write between two non-FILL modes leaves the
81
+ // deprecated property's VALUE unchanged and must stay silent.
82
+ const { el, host } = mount({ 'content-fit': 'contain' });
83
+ const events: unknown[] = [];
84
+ el.addEventListener('notify::keep-aspect-ratio', (e) => events.push((e as CustomEvent).detail));
85
+ el.contentFit = 'cover';
86
+ expect(events.length).toBe(0);
87
+ el.contentFit = 'fill';
88
+ expect(events).toStrictEqual([{ 'keep-aspect-ratio': false }]);
89
+ el.contentFit = 'contain';
90
+ expect(events).toStrictEqual([{ 'keep-aspect-ratio': false }, { 'keep-aspect-ratio': true }]);
91
+ host.remove();
92
+ });
93
+ });
94
+
95
+ await describe('<gtk-picture> the two TRUE-defaulted booleans', async () => {
96
+ await it('can-shrink and isolate-contents read TRUE when the attribute is ABSENT', () => {
97
+ // gtkpicture.c:554-555 — both are installed TRUE in `init`, before any attribute
98
+ // is read. An absent attribute therefore has to mean TRUE, or every picture on a
99
+ // declarative page would be un-shrinkable and non-isolated.
100
+ const { el, host } = mount();
101
+ expect(el.canShrink).toBe(true);
102
+ expect(el.isolateContents).toBe(true);
103
+ host.remove();
104
+ });
105
+
106
+ await it('presence alone means TRUE; only the string "false" is FALSE', () => {
107
+ const { el, host } = mount({ 'can-shrink': '', 'isolate-contents': '' });
108
+ expect(el.canShrink).toBe(true);
109
+ expect(el.isolateContents).toBe(true);
110
+ host.remove();
111
+ });
112
+
113
+ await it('setting FALSE writes the attribute and TRUE REMOVES it', () => {
114
+ // The property's own boolean needs three states, not two: absent is TRUE.
115
+ const { el, host } = mount();
116
+ el.canShrink = false;
117
+ expect(el.getAttribute('can-shrink')).toBe('false');
118
+ el.canShrink = true;
119
+ expect(el.hasAttribute('can-shrink')).toBe(false);
120
+ host.remove();
121
+ });
122
+
123
+ await it('a programmatic set notifies once per real change', () => {
124
+ const { el, host } = mount();
125
+ const events: unknown[] = [];
126
+ el.addEventListener('notify::can-shrink', (e) => events.push((e as CustomEvent).detail));
127
+ el.canShrink = false;
128
+ el.canShrink = false;
129
+ el.canShrink = true;
130
+ expect(events).toStrictEqual([{ 'can-shrink': false }, { 'can-shrink': true }]);
131
+ host.remove();
132
+ });
133
+ });
134
+
135
+ await describe('<gtk-picture> accessibility and isolation', async () => {
136
+ await it('carries the IMG role and the alternative text as its accessible name', () => {
137
+ // gtkpicture.c:553 — `GTK_ACCESSIBLE_ROLE_IMG`, set for every picture whether or
138
+ // not it has a name; :474-483 — `alternative-text` is that name.
139
+ const { el, host } = mount({ 'alternative-text': 'A tangerine' });
140
+ expect(el.getAttribute('role')).toBe('img');
141
+ expect(el.getAttribute('aria-label')).toBe('A tangerine');
142
+ host.remove();
143
+ });
144
+
145
+ await it('an empty alternative text REMOVES the name rather than emptying it', () => {
146
+ const { el, host } = mount({ 'alternative-text': 'A tangerine' });
147
+ el.alternativeText = '';
148
+ expect(el.hasAttribute('aria-label')).toBe(false);
149
+ host.remove();
150
+ });
151
+
152
+ await it('establishes a stacking context without becoming a containing block', () => {
153
+ // `gtk_snapshot_push_isolation` (gtkpicture.c:148-149) stops the paintable's alpha
154
+ // compositing against what is behind it. `contain: paint` would also isolate and
155
+ // would ADDITIONALLY make the element a containing block for fixed and absolutely
156
+ // positioned descendants, which the C's isolation does not do.
157
+ const { el, host } = mount();
158
+ const style = getComputedStyle(el);
159
+ expect(style.isolation).toBe('isolate');
160
+ expect(style.contain).not.toContain('paint');
161
+ host.remove();
162
+ });
163
+
164
+ await it('clips its overflow, which is what makes cover clip rather than spill', () => {
165
+ // gtkpicture.c:557 — `gtk_widget_set_overflow (widget, GTK_OVERFLOW_HIDDEN)` in
166
+ // `init`, not a style class an application opts into.
167
+ const { el, host } = mount();
168
+ expect(getComputedStyle(el).overflow).toBe('hidden');
169
+ host.remove();
170
+ });
171
+ });
172
+ };
@@ -0,0 +1,229 @@
1
+ // `<gtk-popover-bin>` — one child, and a popover to present from it. Every behaviour here is
2
+ // one of the four gtkpopoverbin.c has, and each of them is a rule about WHEN the popover
3
+ // appears or what it leaves behind:
4
+ //
5
+ // · `menu-model` and `popover` are ONE slot (each setter clears the other);
6
+ // · `handle-input` claims a CONTEXT MENU and a LONG PRESS, and denies a plain click so it
7
+ // reaches the child;
8
+ // · the child wears `.has-open-popup` while the popover is mapped;
9
+ // · `menu.popup` is an ACTION, so the element exposes it as an event too.
10
+
11
+ import { describe, expect, it } from '@gjsify/unit';
12
+ import type { AdwMenuInput } from '@gjsify/adwaita-core';
13
+
14
+ interface PopoverBinElement extends HTMLElement {
15
+ menuModel: AdwMenuInput;
16
+ // `popoverElement`, not `popover`: `HTMLElement` already declares a `popover` STRING
17
+ // attribute for the DOM Popover API, and an interface cannot narrow that to a widget.
18
+ popoverElement: HTMLElement | null;
19
+ handleInput: boolean;
20
+ actions: Record<string, { enabled?: boolean; state?: string }> | null;
21
+ childElement: HTMLElement | null;
22
+ popup(): void;
23
+ popdown(): void;
24
+ }
25
+
26
+ const MENU = [{ label: 'Cut' }, { label: 'Copy' }, { label: 'Paste' }];
27
+
28
+ function mount(json?: string): { el: PopoverBinElement; child: HTMLElement } {
29
+ const el = document.createElement('gtk-popover-bin') as PopoverBinElement;
30
+ const child = document.createElement('gtk-button');
31
+ child.setAttribute('label', 'row');
32
+ el.appendChild(child);
33
+ if (json !== undefined) el.setAttribute('menu-model', json);
34
+ document.body.appendChild(el);
35
+ return { el, child };
36
+ }
37
+
38
+ const popoverOf = (el: HTMLElement): HTMLElement | null => el.querySelector('gtk-popover-menu');
39
+
40
+ function unmountAll(): void {
41
+ for (const el of Array.from(document.querySelectorAll('gtk-popover-bin'))) el.remove();
42
+ }
43
+
44
+ export const GtkPopoverBinTest = async () => {
45
+ await describe('<gtk-popover-bin> the model builds the popover', async () => {
46
+ await it('a menu-model creates the popover, pinned to the bottom', () => {
47
+ const { el } = mount(JSON.stringify(MENU));
48
+ const popover = popoverOf(el);
49
+ expect(popover).not.toBeNull();
50
+ // `gtk_popover_set_position (popover, GTK_POS_BOTTOM)` in the same function
51
+ // (gtkpopoverbin.c:493).
52
+ expect(popover?.getAttribute('position')).toBe('bottom');
53
+ expect([...el.querySelectorAll('.adw-popover-menu-item-label')].map((n) => n.textContent)).toStrictEqual([
54
+ 'Cut',
55
+ 'Copy',
56
+ 'Paste',
57
+ ]);
58
+ unmountAll();
59
+ });
60
+
61
+ await it('an empty model leaves NO popover, as set_menu_model(NULL) does', () => {
62
+ const { el } = mount();
63
+ expect(popoverOf(el)).toBeNull();
64
+ unmountAll();
65
+ });
66
+
67
+ await it('setting the model REPLACES the popover', () => {
68
+ const { el } = mount(JSON.stringify(MENU));
69
+ const before = popoverOf(el);
70
+ el.menuModel = [{ label: 'Only' }];
71
+ expect(popoverOf(el)).not.toBe(before);
72
+ expect(before?.isConnected).toBe(false);
73
+ unmountAll();
74
+ });
75
+
76
+ await it('setting a popover DROPS the model — one slot, two directions', () => {
77
+ const { el } = mount(JSON.stringify(MENU));
78
+ // `set_popover` does `g_clear_object (&self->menu_model)`
79
+ // (gtkpopoverbin.c:548) — the two properties are one field, and this is the half
80
+ // that is easy to get wrong by keeping them apart.
81
+ const replacement = document.createElement('gtk-popover') as unknown as HTMLElement;
82
+ el.popoverElement = replacement;
83
+ expect(el.menuModel).toStrictEqual([]);
84
+ expect(el.popoverElement).toBe(replacement);
85
+ // The old popover is unparented rather than left behind as a second surface:
86
+ // `gtk_popover_bin_set_popover` unparents the one it displaces.
87
+ expect(popoverOf(el)).toBeNull();
88
+ unmountAll();
89
+ });
90
+
91
+ await it('notifies both properties when the model changes', () => {
92
+ const { el } = mount();
93
+ const seen: unknown[] = [];
94
+ el.addEventListener('notify::menu-model', (event) => seen.push((event as CustomEvent).detail));
95
+ el.menuModel = MENU;
96
+ // GTK notifies `:popover` AND `:menu-model` from BOTH setters
97
+ // (gtkpopoverbin.c:502, :586-587), so one event carrying both is the faithful
98
+ // reading rather than two that can disagree.
99
+ expect(seen.length).toBe(1);
100
+ expect(Object.keys(seen[0] as object).sort()).toStrictEqual(['menuModel', 'popover']);
101
+ unmountAll();
102
+ });
103
+ });
104
+
105
+ await describe('<gtk-popover-bin> the child wears .has-open-popup', async () => {
106
+ await it('while the popover is open, and not while it is closed', () => {
107
+ const { el, child } = mount(JSON.stringify(MENU));
108
+ const popover = popoverOf(el) as HTMLElement & { open: boolean };
109
+ // `on_popover_map` / `on_popover_unmap` (gtkpopoverbin.c:117-126) — the class is
110
+ // how libadwaita says WHICH row generated the popup (`_lists.scss:57`).
111
+ expect(child.classList.contains('has-open-popup')).toBe(false);
112
+ popover.open = true;
113
+ expect(child.classList.contains('has-open-popup')).toBe(true);
114
+ popover.open = false;
115
+ expect(child.classList.contains('has-open-popup')).toBe(false);
116
+ unmountAll();
117
+ });
118
+
119
+ await it('the class is on the CHILD, never on the bin', () => {
120
+ const { el, child } = mount(JSON.stringify(MENU));
121
+ (popoverOf(el) as HTMLElement & { open: boolean }).open = true;
122
+ expect(el.classList.contains('has-open-popup')).toBe(false);
123
+ expect(child.classList.contains('has-open-popup')).toBe(true);
124
+ unmountAll();
125
+ });
126
+
127
+ await it('`childElement` is the child, not the popover', () => {
128
+ const { el, child } = mount(JSON.stringify(MENU));
129
+ // The popover is also an element child of the bin, so a `firstElementChild`
130
+ // that did not skip it would paint `.has-open-popup` on the popup.
131
+ expect(el.childElement).toBe(child);
132
+ unmountAll();
133
+ });
134
+ });
135
+
136
+ await describe('<gtk-popover-bin> handle-input', async () => {
137
+ await it('defaults to FALSE, so a right click does nothing', () => {
138
+ const { el } = mount(JSON.stringify(MENU));
139
+ // `g_param_spec_boolean ("handle-input", NULL, NULL, FALSE, …)`
140
+ // (gtkpopoverbin.c:370-374).
141
+ expect(el.handleInput).toBe(false);
142
+ el.dispatchEvent(new MouseEvent('contextmenu', { bubbles: true, cancelable: true }));
143
+ expect((popoverOf(el) as HTMLElement & { open: boolean }).open).toBe(false);
144
+ unmountAll();
145
+ });
146
+
147
+ await it('with it on, a context menu opens the popover and is consumed', () => {
148
+ const { el } = mount(JSON.stringify(MENU));
149
+ el.handleInput = true;
150
+ const event = new MouseEvent('contextmenu', { bubbles: true, cancelable: true });
151
+ el.dispatchEvent(event);
152
+ // `pressed_cb` only claims when `gdk_event_triggers_context_menu`, and then
153
+ // CLAIMS + resets the controller (gtkpopoverbin.c:165-175) — so the browser's
154
+ // own context menu must not also appear.
155
+ expect(event.defaultPrevented).toBe(true);
156
+ expect((popoverOf(el) as HTMLElement & { open: boolean }).open).toBe(true);
157
+ unmountAll();
158
+ });
159
+
160
+ await it('a plain click still reaches the child', () => {
161
+ const { el } = mount(JSON.stringify(MENU));
162
+ el.handleInput = true;
163
+ const event = new MouseEvent('click', { bubbles: true, cancelable: true });
164
+ el.dispatchEvent(event);
165
+ // The gesture DENIES any sequence it does not claim (gtkpopoverbin.c:185-186),
166
+ // which in the DOM is doing nothing at all.
167
+ expect(event.defaultPrevented).toBe(false);
168
+ expect((popoverOf(el) as HTMLElement & { open: boolean }).open).toBe(false);
169
+ unmountAll();
170
+ });
171
+
172
+ await it('a mouse long press does NOT open it — GTK’s is touch-only', async () => {
173
+ const { el } = mount(JSON.stringify(MENU));
174
+ el.handleInput = true;
175
+ el.dispatchEvent(new PointerEvent('pointerdown', { pointerType: 'mouse', bubbles: true }));
176
+ await new Promise((resolve) => setTimeout(resolve, 600));
177
+ // `gtk_gesture_single_set_touch_only (…, TRUE)` (gtkpopoverbin.c:657).
178
+ expect((popoverOf(el) as HTMLElement & { open: boolean }).open).toBe(false);
179
+ unmountAll();
180
+ });
181
+
182
+ await it('turning it OFF cancels a long press already under way', async () => {
183
+ const { el } = mount(JSON.stringify(MENU));
184
+ el.handleInput = true;
185
+ el.dispatchEvent(new PointerEvent('pointerdown', { pointerType: 'touch', bubbles: true }));
186
+ el.handleInput = false;
187
+ await new Promise((resolve) => setTimeout(resolve, 600));
188
+ // `set_handle_input (FALSE)` removes both gestures (gtkpopoverbin.c:668-672), so
189
+ // the timer it armed must not survive the turn-off.
190
+ expect((popoverOf(el) as HTMLElement & { open: boolean }).open).toBe(false);
191
+ unmountAll();
192
+ });
193
+ });
194
+
195
+ await describe('<gtk-popover-bin> menu.popup is an ACTION', async () => {
196
+ await it('the method opens the popover and announces the activation', () => {
197
+ const { el } = mount(JSON.stringify(MENU));
198
+ let announced = false;
199
+ el.addEventListener('menu.popup', () => {
200
+ announced = true;
201
+ });
202
+ el.popup();
203
+ // `gtk_widget_class_install_action (widget_class, "menu.popup", NULL,
204
+ // popup_action)` (gtkpopoverbin.c:381) — an action is GTK plumbing a browser
205
+ // cannot host, so the activation is an event and the call is `popup()`.
206
+ expect(announced).toBe(true);
207
+ expect((popoverOf(el) as HTMLElement & { open: boolean }).open).toBe(true);
208
+ unmountAll();
209
+ });
210
+
211
+ await it('the Menu key opens it, which is the shortcut beside the gestures', () => {
212
+ const { el } = mount(JSON.stringify(MENU));
213
+ el.dispatchEvent(new KeyboardEvent('keydown', { key: 'ContextMenu', bubbles: true, cancelable: true }));
214
+ // `gtk_shortcut_trigger_create_for_menu` (gtkpopoverbin.c:643-649) beside the
215
+ // named action, so a keyboard can reach the same popup the gesture does.
216
+ expect((popoverOf(el) as HTMLElement & { open: boolean }).open).toBe(true);
217
+ el.popdown();
218
+ expect((popoverOf(el) as HTMLElement & { open: boolean }).open).toBe(false);
219
+ unmountAll();
220
+ });
221
+
222
+ await it('without a popover there is nothing to activate', () => {
223
+ const { el } = mount();
224
+ el.popup();
225
+ expect(popoverOf(el)).toBeNull();
226
+ unmountAll();
227
+ });
228
+ });
229
+ };